Update gulpfile.js

This commit is contained in:
printempw 2018-08-09 23:36:12 +08:00
parent bb7dee63e4
commit 7c7b8873de
4 changed files with 137 additions and 105 deletions

View File

@ -1,4 +1,3 @@
node_modules/ node_modules/
resources/assets/dist/ resources/assets/dist/
resources/assets/src/vendor/ resources/assets/src/vendor/
gulpfile.js

View File

@ -1,27 +1,29 @@
'use strict'; 'use strict';
var gulp = require('gulp'), const
babel = require('gulp-babel'), babel = require('gulp-babel'),
eslint = require('gulp-eslint'), chalk = require('chalk'),
uglify = require('gulp-uglify'),
stylus = require('gulp-stylus'),
cleanCss = require('gulp-clean-css'), cleanCss = require('gulp-clean-css'),
del = require('del'),
exec = require('child_process').exec,
concat = require('gulp-concat'), concat = require('gulp-concat'),
zip = require('gulp-zip'), del = require('del'),
replace = require('gulp-batch-replace'), eslint = require('gulp-eslint'),
notify = require('gulp-notify'), execSync = require('child_process').execSync,
sourcemaps = require('gulp-sourcemaps'), gulp = require('gulp'),
merge = require('merge2'), merge = require('merge2'),
runSequence = require('run-sequence'); replace = require('gulp-batch-replace'),
runSequence = require('run-sequence'),
sourcemaps = require('gulp-sourcemaps'),
stylus = require('gulp-stylus'),
through2 = require('through2'),
uglify = require('gulp-uglify'),
zip = require('gulp-zip');
var version = require('./package.json').version; const version = require('./package.json').version;
var srcPath = 'resources/assets/src'; const srcPath = 'resources/assets/src';
var distPath = 'resources/assets/dist'; const distPath = 'resources/assets/dist';
var vendorScripts = [ const vendorScripts = [
'jquery/dist/jquery.min.js', 'jquery/dist/jquery.min.js',
'bootstrap/dist/js/bootstrap.min.js', 'bootstrap/dist/js/bootstrap.min.js',
'admin-lte/dist/js/adminlte.min.js', 'admin-lte/dist/js/adminlte.min.js',
@ -33,14 +35,14 @@ var vendorScripts = [
'jqPaginator/dist/1.2.0/jqPaginator.min.js', 'jqPaginator/dist/1.2.0/jqPaginator.min.js',
]; ];
var vendorScriptsToBeMinified = [ const vendorScriptsToBeMinified = [
'regenerator-runtime/runtime.js', 'regenerator-runtime/runtime.js',
'datatables.net/js/jquery.dataTables.js', 'datatables.net/js/jquery.dataTables.js',
'datatables.net-bs/js/dataTables.bootstrap.js', 'datatables.net-bs/js/dataTables.bootstrap.js',
'resources/assets/dist/js/common.js', 'resources/assets/dist/js/common.js',
]; ];
var vendorStyles = [ const vendorStyles = [
'bootstrap/dist/css/bootstrap.min.css', 'bootstrap/dist/css/bootstrap.min.css',
'admin-lte/dist/css/AdminLTE.min.css', 'admin-lte/dist/css/AdminLTE.min.css',
'datatables.net-bs/css/dataTables.bootstrap.css', 'datatables.net-bs/css/dataTables.bootstrap.css',
@ -51,22 +53,22 @@ var vendorStyles = [
'sweetalert2/dist/sweetalert2.min.css', 'sweetalert2/dist/sweetalert2.min.css',
]; ];
var styleReplacements = [ const styleReplacements = [
['blue.png', '"../images/blue.png"'], ['blue.png', '"../images/blue.png"'],
['blue@2x.png', '"../images/blue@2x.png"'], ['blue@2x.png', '"../images/blue@2x.png"'],
['../img/loading.gif', '"../images/loading.gif"'], ['../img/loading.gif', '"../images/loading.gif"'],
['../img/loading-sm.gif', '"../images/loading-sm.gif"'], ['../img/loading-sm.gif', '"../images/loading-sm.gif"'],
]; ];
var scriptReplacements = []; const scriptReplacements = [];
var fonts = [ const fonts = [
'font-awesome/fonts/**', 'font-awesome/fonts/**',
'bootstrap/dist/fonts/**', 'bootstrap/dist/fonts/**',
'resources/assets/src/fonts/**', 'resources/assets/src/fonts/**',
]; ];
var images = [ const images = [
'icheck/skins/square/blue.png', 'icheck/skins/square/blue.png',
'icheck/skins/square/blue@2x.png', 'icheck/skins/square/blue@2x.png',
'resources/assets/src/images/**', 'resources/assets/src/images/**',
@ -74,17 +76,21 @@ var images = [
'bootstrap-fileinput/img/loading-sm.gif', 'bootstrap-fileinput/img/loading-sm.gif',
]; ];
const argv = require('minimist')(process.argv.slice(2));
// Determine if we are in production mode,
// run `gulp [task] --production` to enable.
if (argv.production) {
console.log(chalk.green('>> Running in PRODUCTION mode <<'));
process.env.NODE_ENV = 'production';
}
// aka. `yarn run build` // aka. `yarn run build`
gulp.task('default', ['build']); gulp.task('default', ['build']);
// Build the things! // Build the things!
gulp.task('build', callback => { gulp.task('build', callback => {
runSequence('clean', 'lint', ['compile-es6', 'compile-stylus'], 'publish-vendor', 'notify', callback); runSequence('clean', 'lint', ['compile-scripts', 'compile-stylus'], 'publish-vendor', callback);
});
// Send a notification
gulp.task('notify', () => {
return gulp.src('').pipe(notify('Assets compiled!'));
}); });
// Check JavaScript files with ESLint // Check JavaScript files with ESLint
@ -96,40 +102,39 @@ gulp.task('lint', () => {
}); });
// Concentrate all vendor scripts & styles to one dist file // Concentrate all vendor scripts & styles to one dist file
gulp.task('publish-vendor', ['compile-es6'], callback => { gulp.task('publish-vendor', callback => {
// Collect pre-complied and raw library files
const vendorJs = gulp.src(collect(vendorScripts)).pipe(replace(scriptReplacements));
const rawVendorJs = gulp.src(collect(vendorScriptsToBeMinified)).pipe(uglify());
// JavaScript files // JavaScript files
var js = gulp.src(convertNpmRelativePath(vendorScripts)) merge(vendorJs, rawVendorJs)
.pipe(replace(scriptReplacements));
var jsToBeMinified = gulp.src(convertNpmRelativePath(vendorScriptsToBeMinified))
.pipe(uglify());
merge(js, jsToBeMinified)
.pipe(sourcemaps.init({ loadMaps: true })) .pipe(sourcemaps.init({ loadMaps: true }))
.pipe(concat('app.js')) .pipe(concat('app.js'))
// Remove source mappings in the precompiled files // Remove source mappings in the pre-compiled files
.pipe(sourcemaps.write({ addComment: false })) .pipe(sourcemaps.write({ addComment: false }))
.pipe(gulp.dest(`${distPath}/js/`)); .pipe(gulp.dest(`${distPath}/js/`));
// CSS files // CSS files
gulp.src(convertNpmRelativePath(vendorStyles)) gulp.src(collect(vendorStyles))
.pipe(sourcemaps.init({ loadMaps: true })) .pipe(sourcemaps.init({ loadMaps: true }))
.pipe(concat('style.css')) .pipe(concat('style.css'))
.pipe(replace(styleReplacements)) .pipe(replace(styleReplacements))
.pipe(sourcemaps.write({ addComment: false })) .pipe(sourcemaps.write({ addComment: false }))
.pipe(gulp.dest(`${distPath}/css/`)); .pipe(gulp.dest(`${distPath}/css/`));
// Fonts // Fonts
gulp.src(convertNpmRelativePath(fonts)) gulp.src(collect(fonts))
.pipe(gulp.dest(`${distPath}/fonts/`)); .pipe(gulp.dest(`${distPath}/fonts/`));
// Images // Images
gulp.src(convertNpmRelativePath(images)) gulp.src(collect(images))
.pipe(gulp.dest(`${distPath}/images/`)); .pipe(gulp.dest(`${distPath}/images/`));
// AdminLTE skins // AdminLTE skins
gulp.src(convertNpmRelativePath(['admin-lte/dist/css/skins/*.min.css'])) gulp.src(collect(['admin-lte/dist/css/skins/*.min.css']))
.pipe(gulp.dest(`${distPath}/css/skins/`)); .pipe(gulp.dest(`${distPath}/css/skins/`));
// 3D skin preview // Libraries for 3D skin preview
gulp.src(convertNpmRelativePath(['three/build/three.min.js', 'skinview3d/build/skinview3d.min.js'])) gulp.src(collect(['three/build/three.min.js', 'skinview3d/build/skinview3d.min.js']))
.pipe(concat('skinview3d.js')) .pipe(concat('skinview3d.js'))
.pipe(gulp.dest(`${distPath}/js/`)); .pipe(gulp.dest(`${distPath}/js/`));
// Chart.js // Chart.js
gulp.src(convertNpmRelativePath(['chart.js/dist/Chart.min.js'])) gulp.src(collect(['chart.js/dist/Chart.min.js']))
.pipe(concat('chart.js')) .pipe(concat('chart.js'))
.pipe(gulp.dest(`${distPath}/js/`)); .pipe(gulp.dest(`${distPath}/js/`));
@ -139,99 +144,109 @@ gulp.task('publish-vendor', ['compile-es6'], callback => {
// Compile stylus to css // Compile stylus to css
gulp.task('compile-stylus', () => { gulp.task('compile-stylus', () => {
return gulp.src(`${srcPath}/stylus/*.styl`) return gulp.src(`${srcPath}/stylus/*.styl`)
.pipe(sourcemaps.init()) .pipe(dev(sourcemaps.init()))
.pipe(stylus()) .pipe(stylus())
.pipe(cleanCss()) .pipe(cleanCss())
.pipe(sourcemaps.write('./maps')) .pipe(dev(sourcemaps.write('./maps')))
.pipe(gulp.dest(`${distPath}/css`)); .pipe(gulp.dest(`${distPath}/css`));
}); });
// Compile ES6 scripts to ES5 // Compile ES6 scripts to ES5
gulp.task('compile-es6', callback => { gulp.task('compile-scripts', callback => {
['common', 'admin', 'auth', 'skinlib', 'user'].forEach(moduleName => { ['common', 'admin', 'auth', 'skinlib', 'user'].forEach(moduleName => {
return gulp.src(`${srcPath}/js/${moduleName}/*.js`) return gulp.src(`${srcPath}/js/${moduleName}/*.js`)
.pipe(sourcemaps.init()) .pipe(dev(sourcemaps.init()))
.pipe(babel()) .pipe(babel())
.pipe(concat(`${moduleName}.js`)) .pipe(concat(`${moduleName}.js`))
.pipe(uglify()) .pipe(uglify())
.pipe(sourcemaps.write('./maps')) .pipe(dev(sourcemaps.write('./maps')))
.pipe(gulp.dest(`${distPath}/js`)); .pipe(gulp.dest(`${distPath}/js`));
}); });
callback(); callback();
}); });
// Delete cache files // Delete cache and built files
gulp.task('clean', () => { gulp.task('clean', callback => {
del([`${distPath}/**/*`]);
clearCache(); clearCache();
callback();
return clearDist();
}); });
// Release archive file // Release a zip archive file
// aka. `yarn run release` // aka. `yarn run release`
gulp.task('zip', () => { gulp.task('zip', () => {
console.log(`Don't forget to run ${ chalk.underline.yellow('gulp build --production') } first!`);
console.log('Cleaning cache files');
clearCache(); clearCache();
console.log('Cache file deleted');
exec('composer dump-autoload --no-dev', () => { // Generate autoload files without autoload-dev
console.log('Autoload files generated without autoload-dev'); execSync('composer dump-autoload --no-dev', { stdio: 'inherit' });
});
let zipPath = `blessing-skin-server-v${version}.zip`; const savePath = argv['save-to'] || '..';
const zipFile = `blessing-skin-server-v${version}.zip`;
console.log(`Zip archive will be saved to ${zipPath}.`); console.log('Zip archive will be saved to ' + chalk.underline.blue(
require('path').join(savePath, zipFile)
));
return gulp.src([ return gulp.src([
'**/*', '**/*',
'**/.gitignore', '**/.gitignore',
'**/.htaccess', '**/.htaccess',
'.env.example', '.env.example',
// Exclude unnecessary files // Exclude unnecessary files
'!.gitignore', '!.gitignore',
'!composer.*', '!composer.*',
'!gulpfile.js', '!gulpfile.js',
'!ISSUE_TEMPLATE.md', '!ISSUE_TEMPLATE.md',
'!package.json', '!package.json',
'!phpunit.xml', '!phpunit.xml',
'!yarn.lock', '!yarn.lock',
// Exclud unnecessary directories // Exclude unnecessary directories
'!plugins/**', '!plugins/**',
'!resources/assets/{src,src/**}', '!resources/assets/{src,src/**}',
'!resources/assets/dist/**/{maps,maps/**}', '!resources/assets/dist/**/{maps,maps/**}',
'!resources/lang/overrides/**', '!resources/lang/overrides/**',
'!resources/views/overrides/**', '!resources/views/overrides/**',
'!storage/textures/**', '!storage/textures/**',
'!{coverage,coverage/**}', '!{coverage,coverage/**}',
'!{node_modules,node_modules/**,node_modules/**/.gitignore}', '!{node_modules,node_modules/**,node_modules/**/.gitignore}',
'!{tests,tests/**}', '!{tests,tests/**}',
// Exclude require-dev packages // Exclude require-dev packages
'!vendor/fzaninotto/**', '!vendor/fzaninotto/**',
'!vendor/mikey179/**', '!vendor/mikey179/**',
'!vendor/mockery/**', '!vendor/mockery/**',
'!vendor/phpunit/**', '!vendor/phpunit/**',
'!vendor/symfony/css-selector/**', '!vendor/symfony/css-selector/**',
'!vendor/symfony/dom-crawler/**', '!vendor/symfony/dom-crawler/**',
]) ])
.pipe(zip(zipPath)) .pipe(zip(zipFile))
.pipe(notify('Don\'t forget to build front-end resources before publishing a release!')) .pipe(gulp.dest(savePath))
.pipe(gulp.dest('../')) .pipe(through2.obj(function (chunk, enc, callback) {
.pipe(notify({ message: `Zip archive saved to ${zipPath}!` })); console.log('Zip archive saved!');
// Generate autoload files with autoload-dev
execSync('composer dump-autoload', { stdio: 'inherit' });
callback();
}));
}); });
gulp.task('watch', ['compile-stylus', 'compile-es6'], () => { gulp.task('watch', ['compile-stylus', 'compile-scripts'], () => {
// watch .scss files gulp.watch(`${srcPath}/stylus/*.styl`, ['compile-stylus']);
gulp.watch(`${srcPath}/stylus/*.scss`, ['compile-stylus'], () => notify('Stylus files compiled!')); gulp.watch(`${srcPath}/js/**/*.js`, ['compile-scripts']);
// watch .js files gulp.watch(`${srcPath}/js/common/*.js`, ['publish-vendor']);
gulp.watch(`${srcPath}/js/**/*.js`, ['compile-es6'], () => notify('ES6 scripts compiled!'));
gulp.watch(`${srcPath}/js/general.js`, ['publish-vendor']);
}); });
function convertNpmRelativePath(paths) { function dev(transformFunction) {
return argv.production ? through2.obj() : transformFunction;
}
const collect = function convertNpmRelativePath(paths) {
return paths.map(relativePath => { return paths.map(relativePath => {
return relativePath.startsWith('resources') ? relativePath : `node_modules/${relativePath}`; return relativePath.startsWith('resources') ? relativePath : `node_modules/${relativePath}`;
}); });
} };
function clearCache() { function clearCache() {
return del([ return del([
@ -247,7 +262,3 @@ function clearCache() {
'!storage/framework/sessions/index.html' '!storage/framework/sessions/index.html'
]); ]);
} }
function clearDist() {
return del([`${distPath}/**/*`]);
}

View File

@ -40,6 +40,7 @@
"babel-plugin-transform-inline-environment-variables": "^0.2.0", "babel-plugin-transform-inline-environment-variables": "^0.2.0",
"babel-plugin-transform-remove-console": "^6.9.0", "babel-plugin-transform-remove-console": "^6.9.0",
"babel-preset-env": "^1.6.1", "babel-preset-env": "^1.6.1",
"chalk": "^2.4.1",
"codecov": "^3.0.0", "codecov": "^3.0.0",
"del": "^3.0.0", "del": "^3.0.0",
"gulp": "^3.9.1", "gulp": "^3.9.1",
@ -55,6 +56,7 @@
"gulp-zip": "^4.1.0", "gulp-zip": "^4.1.0",
"jest": "^20.0.4", "jest": "^20.0.4",
"merge2": "^1.2.1", "merge2": "^1.2.1",
"minimist": "^1.2.0",
"run-sequence": "^2.2.1", "run-sequence": "^2.2.1",
"stylus": "^0.54.5" "stylus": "^0.54.5"
}, },

View File

@ -207,6 +207,12 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0:
dependencies: dependencies:
color-convert "^1.9.0" color-convert "^1.9.0"
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
dependencies:
color-convert "^1.9.0"
ansi-wrap@0.1.0, ansi-wrap@^0.1.0: ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
version "0.1.0" version "0.1.0"
resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
@ -1273,6 +1279,14 @@ chalk@^2.0.0, chalk@^2.1.0:
escape-string-regexp "^1.0.5" escape-string-regexp "^1.0.5"
supports-color "^5.2.0" supports-color "^5.2.0"
chalk@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chardet@^0.4.0: chardet@^0.4.0:
version "0.4.2" version "0.4.2"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
@ -4054,7 +4068,7 @@ minimist@0.0.8:
version "0.0.8" version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
minimist@^1.1.0, minimist@^1.1.1: minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
@ -5379,6 +5393,12 @@ supports-color@^5.2.0:
dependencies: dependencies:
has-flag "^3.0.0" has-flag "^3.0.0"
supports-color@^5.3.0:
version "5.4.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
dependencies:
has-flag "^3.0.0"
sweetalert2@^6.11.5: sweetalert2@^6.11.5:
version "6.11.5" version "6.11.5"
resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-6.11.5.tgz#a1ede34089225eb864898f4b613db4fec5dbe334" resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-6.11.5.tgz#a1ede34089225eb864898f4b613db4fec5dbe334"