UNPKG

2.56 kBPlain TextView Raw
1#!/usr/bin/env node
2
3'use strict'
4
5// dependencies
6let cache = require('mako-cache')
7let config = require('mako-config')
8let logger = require('mako-logger')
9let mako = require('mako')
10let pkg = require('../package.json')
11let program = require('commander')
12let Promise = require('bluebird')
13let utils = require('mako-utils')
14let Watcher = require('mako-watch')
15
16require('bluebird-co')
17
18// cli configuration
19program
20 .version(pkg.version)
21 .usage('[options] [entries...]')
22 .option('-C, --cache', 'turn on caching')
23 .option('-q, --quiet', 'only log errors')
24 .option('-v, --verbose', 'turn on verbose logging')
25 .option('-w, --watch', 'rebuild when changes occur')
26 .parse(process.argv)
27
28// set the log output level
29if (program.verbose) {
30 logger.setLevel('verbose')
31} else if (program.quiet) {
32 logger.setLevel('error')
33}
34
35// run!
36Promise.coroutine(main)().catch(err => logger.fatal(err))
37
38/**
39 * The primary behavior for this script.
40 */
41function * main () {
42 let conf = yield config({ overrides: program.args })
43 logger.verbose('config loaded')
44
45 let tree = program.cache ? yield cache.load(conf.root) : null
46 if (tree) logger.verbose('cache loaded')
47
48 let builder = mako({
49 tree: tree,
50 root: conf.root,
51 plugins: conf.plugins
52 })
53
54 yield runBuild(builder, conf.entries)
55
56 if (program.watch) {
57 logger.info('watch starting')
58 let watcher = new Watcher(builder.tree)
59
60 watcher.on('add', file => {
61 logger.info('add detected: %s (reloading config)', utils.relative(file))
62 config({ overrides: program.args }).then((config) => conf = config)
63 })
64
65 watcher.on('remove', file => {
66 logger.info('remove detected: %s (reloading config)', utils.relative(file))
67 config({ overrides: program.args }).then((config) => conf = config)
68 })
69
70 watcher.on('change', (file, tree) => {
71 logger.info('change detected: %s', utils.relative(file.path))
72 Promise.coroutine(runBuild)(builder, conf.entries)
73 })
74 }
75}
76
77/**
78 * Runs a build for the given builder/entries.
79 *
80 * @param {Runner} builder The mako builder/runner.
81 * @param {Array} entries The entries to build.
82 */
83function * runBuild (builder, entries) {
84 logger.verbose('build starting')
85 entries.forEach(entry => logger.info('building %s', utils.relative(entry)))
86 let build = yield builder.build(entries)
87 if (program.cache) {
88 yield cache.save(builder.tree)
89 logger.verbose('cache saved')
90 }
91 build.tree.getFiles().forEach(file => logger.info('built %s', utils.relative(file.path)))
92 logger.info('build complete')
93}