diff --git a/gulp/config.js b/gulp/config.js index 7dc9a03..8b5da57 100644 --- a/gulp/config.js +++ b/gulp/config.js @@ -8,6 +8,13 @@ module.exports = { clean: { src: [ 'dist/**/*.html' ], dest: [ 'dist' ], + options: { + collapseWhitespace: true, + keepClosingSlash: true, + minifyCSS: true, + removeComments: true, + processConditionalComments: true, + }, }, }, sass: { @@ -29,6 +36,15 @@ module.exports = { 'src/templates/**/*.html', ], }, + assets: { + clean: { + src: [ 'dist/assets/**/*' ], + }, + copy: { + src: [ 'src/assets/**/*' ], + dest: [ 'dist/assets' ], + }, + }, release: { versionedFiles: [ 'README.md', diff --git a/gulp/tasks/assets.js b/gulp/tasks/assets.js new file mode 100644 index 0000000..0591258 --- /dev/null +++ b/gulp/tasks/assets.js @@ -0,0 +1,20 @@ +var gulp = require( 'gulp' ); +var del = require( 'del' ); + +// Require main configuration file +var config = require( '../config.js' ); + +// Export functions +exports.clean = clean; +exports.copy = copy; + +// Remove old distribution files +function clean() { + return del( config.paths.assets.clean.src ); +} + +// Copy assets to `dist` directory +function copy() { + return gulp.src( config.paths.assets.copy.src ) + .pipe( gulp.dest( config.paths.assets.copy.dest ) ); +} diff --git a/gulp/tasks/html.js b/gulp/tasks/html.js index f376a0f..0e28e6a 100644 --- a/gulp/tasks/html.js +++ b/gulp/tasks/html.js @@ -1,6 +1,6 @@ var gulp = require( 'gulp' ); var juice = require( '@akzhan/gulp-juice' ); -var stripComments = require( 'gulp-strip-comments' ); +var htmlmin = require( 'gulp-htmlmin' ); var connect = require( 'gulp-connect' ); // Require main configuration file @@ -28,13 +28,10 @@ function inline() { .pipe( gulp.dest( config.paths.html.inline.dest ) ); } -// Clean HTML (Removing unwanted comments) +// Clean HTML function clean() { return gulp.src( config.paths.html.clean.src ) - .pipe( stripComments( { - safe: true, - trim: true, - } ) ) + .pipe( htmlmin( config.paths.html.clean.options ) ) .pipe( gulp.dest( config.paths.html.clean.dest ) ) .pipe( connect.reload() ); } diff --git a/gulpfile.js b/gulpfile.js index 3656f59..01d8719 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -8,18 +8,21 @@ var dev = require( './gulp/tasks/dev.js' ); var html = require( './gulp/tasks/html.js' ); var release = require( './gulp/tasks/release.js' ); var sass = require( './gulp/tasks/sass.js' ); +var assets = require( './gulp/tasks/assets.js' ); -// Default task (build) +// Build task gulp.task( - 'default', + 'build', gulp.series( [ sass.lint, sass.build, html.inline, gulp.parallel( [ + assets.clean, sass.clean, html.clean, ] ), + assets.copy, ] ) ); @@ -30,7 +33,13 @@ gulp.task( gulp.watch( config.paths.watch.src, gulp.series( [ - 'default', + sass.lint, + sass.build, + html.inline, + gulp.parallel( [ + sass.clean, + html.clean, + ] ), ] ) ); } @@ -40,7 +49,7 @@ gulp.task( gulp.task( 'dev', gulp.series( [ - 'default', + 'build', gulp.parallel( [ dev.server, 'watch', @@ -48,6 +57,15 @@ gulp.task( ] ) ); +// Copy all the assets to `dist` directory +gulp.task( + 'assets', + gulp.series( [ + assets.clean, + assets.copy, + ] ) +); + // Prepare everything for new version release gulp.task( 'release', diff --git a/package-lock.json b/package-lock.json index 91e098a..37b536f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -716,6 +716,47 @@ "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", "dev": true }, + "bufferstreams": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.1.3.tgz", + "integrity": "sha512-HaJnVuslRF4g2kSDeyl++AaVizoitCpL9PglzCYwy0uHHyvWerfvEb8jWmYbF1z4kiVFolGomnxSGl+GUQp2jg==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -751,6 +792,16 @@ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -909,6 +960,15 @@ } } }, + "clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "dev": true, + "requires": { + "source-map": "0.5.x" + } + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -3628,6 +3688,51 @@ "tiny-lr": "^0.2.1" } }, + "gulp-htmlmin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp-htmlmin/-/gulp-htmlmin-4.0.0.tgz", + "integrity": "sha512-9FX2d4QbSm+4WuXughjZ6GJn4jx0C4BmyK2e+AS6567NPAetNfB+hv2ZL/88AacdC+8OS+TzeIjfKRXPSAgOYw==", + "dev": true, + "requires": { + "bufferstreams": "^1.1.0", + "html-minifier": "^3.0.3", + "plugin-error": "^0.1.2", + "readable-stream": "^2.0.2", + "tryit": "^1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "gulp-replace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.0.0.tgz", @@ -3988,6 +4093,12 @@ "sntp": "2.x.x" } }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, "hoek": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", @@ -4009,6 +4120,29 @@ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", "dev": true }, + "html-minifier": { + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.16.tgz", + "integrity": "sha512-zP5EfLSpiLRp0aAgud4CQXPQZm9kXwWjR/cF0PfdOj+jjWnOaCgeZcll4kYXSvIBPeUMmyaSc7mM4IDtA+kboA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.15.x", + "he": "1.1.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.3.x" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + } + } + }, "html-tags": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", @@ -5297,6 +5431,12 @@ "signal-exit": "^3.0.0" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", @@ -5621,6 +5761,15 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, "node-gyp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", @@ -6171,6 +6320,15 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, "parse-entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.2.tgz", @@ -6861,6 +7019,12 @@ "safe-regex": "^1.1.0" } }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, "remark": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/remark/-/remark-9.0.0.tgz", @@ -8667,6 +8831,12 @@ } } }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -8699,6 +8869,30 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "uglify-js": { + "version": "3.3.26", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.26.tgz", + "integrity": "sha512-XHxutZNxbx0UnqNUrjL/wvABLxirEYpbAnjCWGakPfQRJbbAGF2dI+YYw300F5mYKm7zBtgYiw3kOiQFobzglQ==", + "dev": true, + "requires": { + "commander": "~2.15.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -8932,6 +9126,12 @@ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, "uri-js": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.1.tgz", diff --git a/package.json b/package.json index 6f6f213..b4f4504 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,10 @@ }, "scripts": { "gulp": "node ./node_modules/gulp/bin/gulp.js", - "build": "npm run gulp", + "build": "npm run gulp build", "start": "npm run gulp dev", - "release": "npm run gulp release" + "release": "npm run gulp release", + "assets": "npm run gulp assets" }, "devDependencies": { "@akzhan/gulp-juice": "^0.1.6", @@ -34,12 +35,12 @@ "gulp-connect": "^5.5.0", "gulp-replace": "^1.0.0", "gulp-sass": "^4.0.1", - "gulp-strip-comments": "^2.5.2", "gulp-stylelint": "^7.0.0", "inquirer": "^5.2.0", "stylelint": "^9.2.1", "debug": "^3.1.0", "mime": "^2.3.1", - "fresh": "^0.5.2" + "fresh": "^0.5.2", + "gulp-htmlmin": "^4.0.0" } } diff --git a/src/assets/images/example.png b/src/assets/images/example.png new file mode 100644 index 0000000..299c2af Binary files /dev/null and b/src/assets/images/example.png differ