1 | const chalk = require('chalk')
|
2 | const minimatch = require('minimatch')
|
3 | const Metalsmith = require('metalsmith')
|
4 | const util = require('./util')
|
5 | const hbs = require('./hbs')
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | const filter = filters => {
|
11 | return (files, metalsmith, next) => {
|
12 | if (!filters) return next()
|
13 |
|
14 | const metadata = metalsmith.metadata()
|
15 |
|
16 | const filenames = Object.keys(files)
|
17 |
|
18 | Object.keys(filters)
|
19 | .filter(glob => !filters[glob](metadata))
|
20 | .forEach(glob => {
|
21 | const match = minimatch.filter(glob, { dot: true, matchBase: true })
|
22 | filenames.forEach(file => match(file) && delete files[file])
|
23 | })
|
24 |
|
25 | next()
|
26 | }
|
27 | }
|
28 |
|
29 |
|
30 |
|
31 |
|
32 | const render = helpers => {
|
33 | helpers && hbs.registerHelper(helpers)
|
34 |
|
35 | return (files, metalsmith, next) => {
|
36 | const metadata = metalsmith.metadata()
|
37 | for (const item in files) {
|
38 | let contents = files[item].contents.toString()
|
39 | contents = hbs.render(contents, metadata)
|
40 | files[item].contents = Buffer.from(contents)
|
41 | }
|
42 | next()
|
43 | }
|
44 | }
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 | module.exports = (src, dest, data, options) => new Promise((resolve, reject) => {
|
55 | const { metadata, template, filters, helpers } = options || {}
|
56 |
|
57 | Metalsmith(src)
|
58 | .metadata(Object.assign({}, metadata, data))
|
59 | .use(filter(filters))
|
60 | .use(render(helpers))
|
61 | .source(template || 'template')
|
62 | .destination(dest)
|
63 | .clean(false)
|
64 | .build((err, files) => {
|
65 | if (err) return reject(err)
|
66 | console.log(`\n🎉 "${data.name}" generated into ${chalk.yellow(util.tildify(dest))}`)
|
67 | resolve(files)
|
68 | })
|
69 | })
|