UNPKG

6.26 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const filter_1 = require("./utils/filter");
4const chalk = require("chalk");
5const async = require("async");
6const Handlebars = require("handlebars");
7const Metalsmith = require("metalsmith");
8const consolidate = require("consolidate");
9const multimatch = require("multimatch");
10const path = require("path");
11const render = consolidate.handlebars.render;
12const filters = {
13 '.eslintrc.js': 'lint',
14 '.eslintignore': 'lint',
15 'configs/webpack.test.conf.js': 'unit',
16 'build/webpack.test.conf.js': "unit && runner === 'karma'",
17 'test/**/*': 'unit',
18 'src/router.js': 'router',
19};
20// register handlebars helper
21Handlebars.registerHelper('if_eq', function (a, b, opts) {
22 return a === b ? opts.fn(this) : opts.inverse(this);
23});
24Handlebars.registerHelper('unless_eq', function (a, b, opts) {
25 return a === b ? opts.inverse(this) : opts.fn(this);
26});
27function default_1(source, dest = './build', metadata) {
28 return new Promise((resolve, reject) => {
29 const metalsmith = Metalsmith(process.cwd());
30 metadata = Object.assign(metalsmith.metadata(), metadata);
31 metadata.helpers && Object.keys(metadata.helpers).map(key => {
32 Handlebars.registerHelper(key, metadata.helpers[key]);
33 });
34 const helpers = { chalk, logger: console };
35 if (metadata.metalsmith && typeof metadata.metalsmith.before === 'function') {
36 metadata.metalsmith.before(metalsmith, metadata, helpers);
37 }
38 if (typeof metadata.metalsmith === 'function') {
39 metadata.metalsmith(metalsmith, metadata, helpers);
40 }
41 else if (metadata.metalsmith && typeof metadata.metalsmith.after === 'function') {
42 metadata.metalsmith.after(metalsmith, metadata, helpers);
43 }
44 metalsmith
45 .source(path.join(source, 'template'))
46 .destination(dest)
47 .clean(true)
48 .metadata(metadata)
49 .use(renderTemplateFiles(metadata.skipInterpolation))
50 .use(filterFiles(metadata.filters || filters))
51 .use(template)
52 .build((err, files) => {
53 if (err)
54 throw err;
55 if (typeof metadata.complete === 'function') {
56 const helpers = { chalk, logger: console, files };
57 metadata.complete(metadata, helpers);
58 }
59 });
60 resolve(metadata);
61 });
62}
63exports.default = default_1;
64/**
65 * Template in place plugin.
66 *
67 * @param {Object} files
68 * @param {Metalsmith} metalsmith
69 * @param {Function} done
70 */
71function template(files, metalsmith, done) {
72 const keys = Object.keys(files);
73 const metalsmithMetadata = metalsmith.metadata();
74 async.each(keys, (file, next) => {
75 const rawFileName = file;
76 const rawBuffer = files[file];
77 const contents = rawBuffer.contents.toString();
78 // do not attempt to render files that do not have mustaches
79 if (!/{{([^{}]+)}}/g.test(contents) && !/{{([^{}]+)}}/g.test(file)) {
80 return next();
81 }
82 // first replace filename
83 render(file, metalsmithMetadata, (err, res) => {
84 if (err) {
85 err.message = `[${file}] ${err.message}`;
86 return next(err);
87 }
88 file = res;
89 // second replace file contents
90 render(contents, metalsmithMetadata, (err, res) => {
91 if (err) {
92 err.message = `[${file}] ${err.message}`;
93 return next(err);
94 }
95 files[file] = rawBuffer;
96 files[file].contents = Buffer.from(res);
97 // delete old buffer
98 if (rawFileName !== file) {
99 files[rawFileName] = null;
100 delete files[rawFileName];
101 }
102 next();
103 });
104 });
105 }, done);
106}
107/**
108 * Create a middleware for filtering files.
109 *
110 * @param {Object} filters
111 * @return {Function}
112 */
113function filterFiles(filters) {
114 return (files, metalsmith, done) => {
115 filter_1.filter(files, filters, metalsmith.metadata(), done);
116 };
117}
118/**
119 * Template in place plugin.
120 *
121 * @param {Object} files
122 * @param {Metalsmith} metalsmith
123 * @param {Function} done
124 */
125function renderTemplateFiles(skipInterpolation) {
126 skipInterpolation = typeof skipInterpolation === 'string'
127 ? [skipInterpolation]
128 : skipInterpolation;
129 return (files, metalsmith, done) => {
130 const keys = Object.keys(files);
131 const metalsmithMetadata = metalsmith.metadata();
132 async.each(keys, (file, next) => {
133 // skipping files with skipInterpolation option
134 if (skipInterpolation && multimatch([file], skipInterpolation, { dot: true }).length) {
135 return next();
136 }
137 const rawFileName = file;
138 const rawBuffer = files[file];
139 const contents = rawBuffer.contents.toString();
140 // do not attempt to render files that do not have mustaches
141 if (!/{{([^{}]+)}}/g.test(contents) && !/{{([^{}]+)}}/g.test(file)) {
142 return next();
143 }
144 // first replace filename
145 render(file, metalsmithMetadata, (err, res) => {
146 if (err) {
147 err.message = `[${file}] ${err.message}`;
148 return next(err);
149 }
150 file = res;
151 // second replace file contents
152 render(contents, metalsmithMetadata, (err, res) => {
153 if (err) {
154 err.message = `[${file}] ${err.message}`;
155 return next(err);
156 }
157 files[file] = rawBuffer;
158 files[file].contents = new Buffer(res);
159 // delete old buffer
160 if (rawFileName !== file) {
161 files[rawFileName] = null;
162 delete files[rawFileName];
163 }
164 next();
165 });
166 });
167 }, done);
168 };
169}
170//# sourceMappingURL=render.js.map
\No newline at end of file