consolidate Gulp build
authorDan Allen <dan@opendevise.com>
Sun, 30 Dec 2018 10:55:39 +0000 (03:55 -0700)
committerDan Allen <dan@opendevise.com>
Sun, 30 Dec 2018 10:58:39 +0000 (03:58 -0700)
- move task require to gulpfile.js/tasks/index.js
- abbreviate variable names
- use ospath where appropriate

18 files changed:
README.adoc
gulpfile.js/build.js [deleted file]
gulpfile.js/format.js [deleted file]
gulpfile.js/index.js
gulpfile.js/lint-css.js [deleted file]
gulpfile.js/lint-js.js [deleted file]
gulpfile.js/pack.js [deleted file]
gulpfile.js/preview-pages.js [deleted file]
gulpfile.js/preview-serve.js [deleted file]
gulpfile.js/remove.js [deleted file]
gulpfile.js/tasks/build.js [new file with mode: 0644]
gulpfile.js/tasks/format.js [new file with mode: 0644]
gulpfile.js/tasks/lint-css.js [new file with mode: 0644]
gulpfile.js/tasks/lint-js.js [new file with mode: 0644]
gulpfile.js/tasks/pack.js [new file with mode: 0644]
gulpfile.js/tasks/preview-pages.js [new file with mode: 0644]
gulpfile.js/tasks/preview-serve.js [new file with mode: 0644]
gulpfile.js/tasks/remove.js [new file with mode: 0644]

index 2e522d9..a4218b7 100644 (file)
@@ -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 (file)
index c12f332..0000000
+++ /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 (file)
index c95d506..0000000
+++ /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))
index 2adc946..64c4795 100644 (file)
@@ -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 (file)
index d684014..0000000
+++ /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 (file)
index ef4f3c9..0000000
+++ /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 (file)
index 7c9d3ae..0000000
+++ /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 (file)
index 9e704c2..0000000
+++ /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 (file)
index 8ae70cf..0000000
+++ /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 (file)
index 3f71eec..0000000
+++ /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 (file)
index 0000000..a2997e9
--- /dev/null
@@ -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 (file)
index 0000000..2d50496
--- /dev/null
@@ -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 (file)
index 0000000..d684014
--- /dev/null
@@ -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 (file)
index 0000000..ef4f3c9
--- /dev/null
@@ -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 (file)
index 0000000..7c9d3ae
--- /dev/null
@@ -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 (file)
index 0000000..9e704c2
--- /dev/null
@@ -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 (file)
index 0000000..8ae70cf
--- /dev/null
@@ -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 (file)
index 0000000..3f71eec
--- /dev/null
@@ -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)))