From: Dan Allen Date: Sun, 30 Dec 2018 10:55:39 +0000 (-0700) Subject: consolidate Gulp build X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=715626c6433878824f36d4b57089b1cd14578b61;p=working%2Feg-antora.git consolidate Gulp build - move task require to gulpfile.js/tasks/index.js - abbreviate variable names - use ospath where appropriate --- diff --git a/README.adoc b/README.adoc index 2e522d9..a4218b7 100644 --- a/README.adoc +++ b/README.adoc @@ -158,6 +158,10 @@ If you need to bundle the UI in order to preview the UI on the real site in loca The UI bundle will be available at [.path]_build/ui-bundle.zip_. You can then point Antora at this bundle using the `--ui-bundle-url` command-line option. +If you have the preview running, and you want to bundle without causing the preview to be clobbered, use: + + $ gulp bundle:pack + == Copyright and License Copyright (C) 2017-2018 OpenDevise Inc. and the Antora Project. diff --git a/gulpfile.js/build.js b/gulpfile.js/build.js deleted file mode 100644 index c12f332..0000000 --- a/gulpfile.js/build.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict' - -const autoprefixer = require('autoprefixer') -const browserify = require('browserify') -const buffer = require('vinyl-buffer') -const concat = require('gulp-concat') -const cssnano = require('cssnano') -const fs = require('fs-extra') -const imagemin = require('gulp-imagemin') -const merge = require('merge-stream') -const { obj: map } = require('through2') -const path = require('path') -const postcss = require('gulp-postcss') -const postcssCalc = require('postcss-calc') -const postcssImport = require('postcss-import') -const postcssUrl = require('postcss-url') -const postcssVar = require('postcss-custom-properties') -const uglify = require('gulp-uglify') -const vfs = require('vinyl-fs') - -module.exports = (src, dest, preview) => () => { - const opts = { base: src, cwd: src } - const postcssPlugins = [ - postcssImport(), - postcssUrl([ - { - filter: '**/~typeface-*/files/*', - url: (asset) => { - const relpath = asset.pathname.substr(1) - const abspath = path.resolve('node_modules', relpath) - const basename = path.basename(abspath) - const destpath = path.join(dest, 'font', basename) - if (!fs.pathExistsSync(destpath)) fs.copySync(abspath, destpath) - return path.join('..', 'font', basename) - }, - }, - ]), - postcssVar({ preserve: preview ? 'preserve-computed' : false }), - postcssCalc(), - autoprefixer({ browsers: ['last 2 versions'] }), - preview ? () => {} : cssnano({ preset: 'default' }), - ] - - return merge( - vfs - .src('js/+([0-9])-*.js', opts) - .pipe(uglify()) - .pipe(concat('js/site.js')), - vfs - .src('js/vendor/*.js', Object.assign({ read: false }, opts)) - .pipe( - // see https://gulpjs.org/recipes/browserify-multiple-destination.html - map((file, enc, next) => { - file.contents = browserify(file.relative, { basedir: src, detectGlobals: false }).bundle() - next(null, file) - }) - ) - .pipe(buffer()) - .pipe(uglify()), - vfs.src('css/site.css', opts).pipe(postcss(postcssPlugins)), - vfs.src('font/*.woff*(2)', opts), - vfs.src('img/**/*.{jpg,ico,png,svg}', opts).pipe(imagemin()), - vfs.src('helpers/*.js', opts), - vfs.src('layouts/*.hbs', opts), - vfs.src('partials/*.hbs', opts) - ).pipe(vfs.dest(dest)) -} diff --git a/gulpfile.js/format.js b/gulpfile.js/format.js deleted file mode 100644 index c95d506..0000000 --- a/gulpfile.js/format.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const prettier = require('./lib/gulp-prettier-eslint') -const vfs = require('vinyl-fs') - -module.exports = (files) => () => - vfs - .src(files) - .pipe(prettier()) - .pipe(vfs.dest((file) => file.base)) diff --git a/gulpfile.js/index.js b/gulpfile.js/index.js index 2adc946..64c4795 100644 --- a/gulpfile.js/index.js +++ b/gulpfile.js/index.js @@ -1,20 +1,22 @@ 'use strict' const { parallel, series, tree } = require('gulp') -const camelCase = (name) => name.replace(/[-]./g, (m) => m.substr(1).toUpperCase()) const task = require('./lib/task') -const tasks = require('require-directory')(module, '.', { recurse: false, rename: camelCase }) const bundleName = 'ui' const buildDir = 'build' -const previewSiteSrcDir = 'preview-site-src' -const previewSiteDestDir = 'public' +const previewSrcDir = 'preview-site-src' +const previewDestDir = 'public' const srcDir = 'src' -const destDir = `${previewSiteDestDir}/_` +const destDir = `${previewDestDir}/_` const { reload: livereload } = process.env.LIVERELOAD === 'true' ? require('gulp-connect') : {} -const glob = { cssFiles: `${srcDir}/css/**/*.css`, jsFiles: ['gulpfile.js/**/*.js', `${srcDir}/{helpers,js}/**/*.js`] } -const { remove, lintCss, lintJs, format, build, pack, previewPages, previewServe } = tasks +const { remove, lintCss, lintJs, format, build, pack, previewPages, previewServe } = require('./tasks') +const glob = { + all: [srcDir, previewSrcDir], + css: `${srcDir}/css/**/*.css`, + js: ['gulpfile.js/**/*.js', `${srcDir}/{helpers,js}/**/*.js`] +} const cleanTask = task({ name: 'clean', @@ -25,13 +27,13 @@ const cleanTask = task({ const lintCssTask = task({ name: 'lint:css', desc: 'Lint the CSS source files using stylelint (standard config)', - call: lintCss(glob.cssFiles), + call: lintCss(glob.css), }) const lintJsTask = task({ name: 'lint:js', desc: 'Lint the JavaScript source files using eslint (JavaScript Standard Style)', - call: lintJs(glob.jsFiles), + call: lintJs(glob.js), }) const lintTask = task({ @@ -43,7 +45,7 @@ const lintTask = task({ const formatTask = task({ name: 'format', desc: 'Format the JavaScript source files using prettify (JavaScript Standard Style)', - call: format(glob.jsFiles), + call: format(glob.js), }) const buildTask = task({ @@ -71,7 +73,7 @@ const bundleTask = task({ const previewPagesTask = task({ name: 'preview:pages', - call: previewPages(srcDir, destDir, previewSiteSrcDir, previewSiteDestDir, livereload), + call: previewPages(srcDir, destDir, previewSrcDir, previewDestDir, livereload), }) const previewBuildTask = task({ @@ -82,11 +84,7 @@ const previewBuildTask = task({ const previewServeTask = task({ name: 'preview:serve', - call: previewServe(previewSiteDestDir, { - port: 5252, - livereload, - watch: { glob: [srcDir, previewSiteSrcDir], call: previewBuildTask }, - }), + call: previewServe(previewDestDir, { port: 5252, livereload, watch: { glob: glob.all, call: previewBuildTask } }), }) const previewTask = task({ diff --git a/gulpfile.js/lint-css.js b/gulpfile.js/lint-css.js deleted file mode 100644 index d684014..0000000 --- a/gulpfile.js/lint-css.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const stylelint = require('gulp-stylelint') -const vfs = require('vinyl-fs') - -module.exports = (files) => (done) => - vfs - .src(files) - .pipe(stylelint({ reporters: [{ formatter: 'string', console: true }], failAfterError: true })) - .on('error', done) diff --git a/gulpfile.js/lint-js.js b/gulpfile.js/lint-js.js deleted file mode 100644 index ef4f3c9..0000000 --- a/gulpfile.js/lint-js.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict' - -const eslint = require('gulp-eslint') -const vfs = require('vinyl-fs') - -module.exports = (files) => (done) => - vfs - .src(files) - .pipe(eslint()) - .pipe(eslint.format()) - .pipe(eslint.failAfterError()) - .on('error', done) diff --git a/gulpfile.js/pack.js b/gulpfile.js/pack.js deleted file mode 100644 index 7c9d3ae..0000000 --- a/gulpfile.js/pack.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const vfs = require('vinyl-fs') -const zip = require('gulp-vinyl-zip') - -module.exports = (src, dest, bundleName) => () => - vfs - .src('**/*', { base: src, cwd: src }) - .pipe(zip.zip(`${bundleName}-bundle.zip`)) - .pipe(vfs.dest(dest)) diff --git a/gulpfile.js/preview-pages.js b/gulpfile.js/preview-pages.js deleted file mode 100644 index 9e704c2..0000000 --- a/gulpfile.js/preview-pages.js +++ /dev/null @@ -1,69 +0,0 @@ -'use strict' - -const fs = require('fs-extra') -const handlebars = require('handlebars') -const { obj: map } = require('through2') -const merge = require('merge-stream') -const path = require('path') -const requireFromString = require('require-from-string') -const vfs = require('vinyl-fs') -const yaml = require('js-yaml') - -module.exports = (src, dest, siteSrc, siteDest, sink = () => map((_0, _1, next) => next()), layouts = {}) => () => - Promise.all([ - loadSampleUiModel(siteSrc), - toPromise(merge(compileLayouts(src, layouts), registerPartials(src), registerHelpers(src))), - ]).then(([uiModel]) => - vfs - .src('**/*.html', { base: siteSrc, cwd: siteSrc }) - .pipe( - map((file, enc, next) => { - const compiledLayout = layouts[file.stem === '404' ? '404.hbs' : 'default.hbs'] - const siteRootPath = path.relative(path.dirname(file.path), path.resolve(siteSrc)) - uiModel.env = process.env - uiModel.siteRootPath = siteRootPath - uiModel.siteRootUrl = path.join(siteRootPath, 'index.html') - uiModel.uiRootPath = path.join(siteRootPath, '_') - uiModel.page.contents = file.contents.toString().trim() - file.contents = Buffer.from(compiledLayout(uiModel)) - next(null, file) - }) - ) - .pipe(vfs.dest(siteDest)) - .pipe(sink()) - ) - -function loadSampleUiModel (siteSrc) { - return fs.readFile(path.join(siteSrc, 'ui-model.yml'), 'utf8').then((contents) => yaml.safeLoad(contents)) -} - -function registerPartials (src) { - return vfs.src('partials/*.hbs', { base: src, cwd: src }).pipe( - map((file, enc, next) => { - handlebars.registerPartial(file.stem, file.contents.toString()) - next() - }) - ) -} - -function registerHelpers (src) { - return vfs.src('helpers/*.js', { base: src, cwd: src }).pipe( - map((file, enc, next) => { - handlebars.registerHelper(file.stem, requireFromString(file.contents.toString())) - next() - }) - ) -} - -function compileLayouts (src, layouts) { - return vfs.src('layouts/*.hbs', { base: src, cwd: src }).pipe( - map((file, enc, next) => { - layouts[file.basename] = handlebars.compile(file.contents.toString(), { preventIndent: true }) - next() - }) - ) -} - -function toPromise (stream) { - return new Promise((resolve, reject) => stream.on('error', reject).on('finish', resolve)) -} diff --git a/gulpfile.js/preview-serve.js b/gulpfile.js/preview-serve.js deleted file mode 100644 index 8ae70cf..0000000 --- a/gulpfile.js/preview-serve.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -const connect = require('gulp-connect') -const { watch } = require('gulp') - -module.exports = (serveDir, opts = {}) => (done) => { - const { glob: watchGlob, call: watchCall } = opts.watch || {} - opts = { ...opts, root: serveDir } - delete opts.watch - connect.server(opts, function () { - this.server.on('close', done) - if (watchGlob && watchCall) watch(watchGlob, watchCall) - }) -} diff --git a/gulpfile.js/remove.js b/gulpfile.js/remove.js deleted file mode 100644 index 3f71eec..0000000 --- a/gulpfile.js/remove.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict' - -const fs = require('fs-extra') -const { obj: map } = require('through2') -const vfs = require('vinyl-fs') - -module.exports = (files) => () => - vfs.src(files, { allowEmpty: true }).pipe(map((file, enc, next) => fs.remove(file.path, next))) diff --git a/gulpfile.js/tasks/build.js b/gulpfile.js/tasks/build.js new file mode 100644 index 0000000..a2997e9 --- /dev/null +++ b/gulpfile.js/tasks/build.js @@ -0,0 +1,68 @@ +'use strict' + +const autoprefixer = require('autoprefixer') +const browserify = require('browserify') +const buffer = require('vinyl-buffer') +const concat = require('gulp-concat') +const cssnano = require('cssnano') +const fs = require('fs-extra') +const imagemin = require('gulp-imagemin') +const merge = require('merge-stream') +const { obj: map } = require('through2') +const ospath = require('path') +const path = ospath.posix +const postcss = require('gulp-postcss') +const postcssCalc = require('postcss-calc') +const postcssImport = require('postcss-import') +const postcssUrl = require('postcss-url') +const postcssVar = require('postcss-custom-properties') +const uglify = require('gulp-uglify') +const vfs = require('vinyl-fs') + +module.exports = (src, dest, preview) => () => { + const opts = { base: src, cwd: src } + const postcssPlugins = [ + postcssImport(), + postcssUrl([ + { + filter: '**/~typeface-*/files/*', + url: (asset) => { + const relpath = asset.pathname.substr(1) + const abspath = ospath.resolve('node_modules', relpath) + const basename = ospath.basename(abspath) + const destpath = ospath.join(dest, 'font', basename) + if (!fs.pathExistsSync(destpath)) fs.copySync(abspath, destpath) + return path.join('..', 'font', basename) + }, + }, + ]), + postcssVar({ preserve: preview ? 'preserve-computed' : false }), + postcssCalc(), + autoprefixer({ browsers: ['last 2 versions'] }), + preview ? () => {} : cssnano({ preset: 'default' }), + ] + + return merge( + vfs + .src('js/+([0-9])-*.js', opts) + .pipe(uglify()) + .pipe(concat('js/site.js')), + vfs + .src('js/vendor/*.js', Object.assign({ read: false }, opts)) + .pipe( + // see https://gulpjs.org/recipes/browserify-multiple-destination.html + map((file, enc, next) => { + file.contents = browserify(file.relative, { basedir: src, detectGlobals: false }).bundle() + next(null, file) + }) + ) + .pipe(buffer()) + .pipe(uglify()), + vfs.src('css/site.css', opts).pipe(postcss(postcssPlugins)), + vfs.src('font/*.woff*(2)', opts), + vfs.src('img/**/*.{jpg,ico,png,svg}', opts).pipe(imagemin()), + vfs.src('helpers/*.js', opts), + vfs.src('layouts/*.hbs', opts), + vfs.src('partials/*.hbs', opts) + ).pipe(vfs.dest(dest)) +} diff --git a/gulpfile.js/tasks/format.js b/gulpfile.js/tasks/format.js new file mode 100644 index 0000000..2d50496 --- /dev/null +++ b/gulpfile.js/tasks/format.js @@ -0,0 +1,10 @@ +'use strict' + +const prettier = require('../lib/gulp-prettier-eslint') +const vfs = require('vinyl-fs') + +module.exports = (files) => () => + vfs + .src(files) + .pipe(prettier()) + .pipe(vfs.dest((file) => file.base)) diff --git a/gulpfile.js/tasks/lint-css.js b/gulpfile.js/tasks/lint-css.js new file mode 100644 index 0000000..d684014 --- /dev/null +++ b/gulpfile.js/tasks/lint-css.js @@ -0,0 +1,10 @@ +'use strict' + +const stylelint = require('gulp-stylelint') +const vfs = require('vinyl-fs') + +module.exports = (files) => (done) => + vfs + .src(files) + .pipe(stylelint({ reporters: [{ formatter: 'string', console: true }], failAfterError: true })) + .on('error', done) diff --git a/gulpfile.js/tasks/lint-js.js b/gulpfile.js/tasks/lint-js.js new file mode 100644 index 0000000..ef4f3c9 --- /dev/null +++ b/gulpfile.js/tasks/lint-js.js @@ -0,0 +1,12 @@ +'use strict' + +const eslint = require('gulp-eslint') +const vfs = require('vinyl-fs') + +module.exports = (files) => (done) => + vfs + .src(files) + .pipe(eslint()) + .pipe(eslint.format()) + .pipe(eslint.failAfterError()) + .on('error', done) diff --git a/gulpfile.js/tasks/pack.js b/gulpfile.js/tasks/pack.js new file mode 100644 index 0000000..7c9d3ae --- /dev/null +++ b/gulpfile.js/tasks/pack.js @@ -0,0 +1,10 @@ +'use strict' + +const vfs = require('vinyl-fs') +const zip = require('gulp-vinyl-zip') + +module.exports = (src, dest, bundleName) => () => + vfs + .src('**/*', { base: src, cwd: src }) + .pipe(zip.zip(`${bundleName}-bundle.zip`)) + .pipe(vfs.dest(dest)) diff --git a/gulpfile.js/tasks/preview-pages.js b/gulpfile.js/tasks/preview-pages.js new file mode 100644 index 0000000..9e704c2 --- /dev/null +++ b/gulpfile.js/tasks/preview-pages.js @@ -0,0 +1,69 @@ +'use strict' + +const fs = require('fs-extra') +const handlebars = require('handlebars') +const { obj: map } = require('through2') +const merge = require('merge-stream') +const path = require('path') +const requireFromString = require('require-from-string') +const vfs = require('vinyl-fs') +const yaml = require('js-yaml') + +module.exports = (src, dest, siteSrc, siteDest, sink = () => map((_0, _1, next) => next()), layouts = {}) => () => + Promise.all([ + loadSampleUiModel(siteSrc), + toPromise(merge(compileLayouts(src, layouts), registerPartials(src), registerHelpers(src))), + ]).then(([uiModel]) => + vfs + .src('**/*.html', { base: siteSrc, cwd: siteSrc }) + .pipe( + map((file, enc, next) => { + const compiledLayout = layouts[file.stem === '404' ? '404.hbs' : 'default.hbs'] + const siteRootPath = path.relative(path.dirname(file.path), path.resolve(siteSrc)) + uiModel.env = process.env + uiModel.siteRootPath = siteRootPath + uiModel.siteRootUrl = path.join(siteRootPath, 'index.html') + uiModel.uiRootPath = path.join(siteRootPath, '_') + uiModel.page.contents = file.contents.toString().trim() + file.contents = Buffer.from(compiledLayout(uiModel)) + next(null, file) + }) + ) + .pipe(vfs.dest(siteDest)) + .pipe(sink()) + ) + +function loadSampleUiModel (siteSrc) { + return fs.readFile(path.join(siteSrc, 'ui-model.yml'), 'utf8').then((contents) => yaml.safeLoad(contents)) +} + +function registerPartials (src) { + return vfs.src('partials/*.hbs', { base: src, cwd: src }).pipe( + map((file, enc, next) => { + handlebars.registerPartial(file.stem, file.contents.toString()) + next() + }) + ) +} + +function registerHelpers (src) { + return vfs.src('helpers/*.js', { base: src, cwd: src }).pipe( + map((file, enc, next) => { + handlebars.registerHelper(file.stem, requireFromString(file.contents.toString())) + next() + }) + ) +} + +function compileLayouts (src, layouts) { + return vfs.src('layouts/*.hbs', { base: src, cwd: src }).pipe( + map((file, enc, next) => { + layouts[file.basename] = handlebars.compile(file.contents.toString(), { preventIndent: true }) + next() + }) + ) +} + +function toPromise (stream) { + return new Promise((resolve, reject) => stream.on('error', reject).on('finish', resolve)) +} diff --git a/gulpfile.js/tasks/preview-serve.js b/gulpfile.js/tasks/preview-serve.js new file mode 100644 index 0000000..8ae70cf --- /dev/null +++ b/gulpfile.js/tasks/preview-serve.js @@ -0,0 +1,14 @@ +'use strict' + +const connect = require('gulp-connect') +const { watch } = require('gulp') + +module.exports = (serveDir, opts = {}) => (done) => { + const { glob: watchGlob, call: watchCall } = opts.watch || {} + opts = { ...opts, root: serveDir } + delete opts.watch + connect.server(opts, function () { + this.server.on('close', done) + if (watchGlob && watchCall) watch(watchGlob, watchCall) + }) +} diff --git a/gulpfile.js/tasks/remove.js b/gulpfile.js/tasks/remove.js new file mode 100644 index 0000000..3f71eec --- /dev/null +++ b/gulpfile.js/tasks/remove.js @@ -0,0 +1,8 @@ +'use strict' + +const fs = require('fs-extra') +const { obj: map } = require('through2') +const vfs = require('vinyl-fs') + +module.exports = (files) => () => + vfs.src(files, { allowEmpty: true }).pipe(map((file, enc, next) => fs.remove(file.path, next)))