1 | #!/usr/bin/env node
|
2 |
|
3 | 'use strict'
|
4 |
|
5 | // dependencies
|
6 | let cache = require('mako-cache')
|
7 | let config = require('mako-config')
|
8 | let logger = require('mako-logger')
|
9 | let mako = require('mako')
|
10 | let pkg = require('../package.json')
|
11 | let program = require('commander')
|
12 | let Promise = require('bluebird')
|
13 | let utils = require('mako-utils')
|
14 | let Watcher = require('mako-watch')
|
15 |
|
16 | require('bluebird-co')
|
17 |
|
18 | // cli configuration
|
19 | program
|
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
|
29 | if (program.verbose) {
|
30 | logger.setLevel('verbose')
|
31 | } else if (program.quiet) {
|
32 | logger.setLevel('error')
|
33 | }
|
34 |
|
35 | // run!
|
36 | Promise.coroutine(main)().catch(err => logger.fatal(err))
|
37 |
|
38 | /**
|
39 | * The primary behavior for this script.
|
40 | */
|
41 | function * 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 | */
|
83 | function * 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 | }
|