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.
+++ /dev/null
-'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))
-}
+++ /dev/null
-'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))
'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',
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({
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({
const previewPagesTask = task({
name: 'preview:pages',
- call: previewPages(srcDir, destDir, previewSiteSrcDir, previewSiteDestDir, livereload),
+ call: previewPages(srcDir, destDir, previewSrcDir, previewDestDir, livereload),
})
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({
+++ /dev/null
-'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)
+++ /dev/null
-'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)
+++ /dev/null
-'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))
+++ /dev/null
-'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))
-}
+++ /dev/null
-'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)
- })
-}
+++ /dev/null
-'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)))
--- /dev/null
+'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))
+}
--- /dev/null
+'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))
--- /dev/null
+'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)
--- /dev/null
+'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)
--- /dev/null
+'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))
--- /dev/null
+'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))
+}
--- /dev/null
+'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)
+ })
+}
--- /dev/null
+'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)))