1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const filter_1 = require("./utils/filter");
|
4 | const chalk = require("chalk");
|
5 | const async = require("async");
|
6 | const Handlebars = require("handlebars");
|
7 | const Metalsmith = require("metalsmith");
|
8 | const consolidate = require("consolidate");
|
9 | const multimatch = require("multimatch");
|
10 | const path = require("path");
|
11 | const render = consolidate.handlebars.render;
|
12 | const 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 |
|
21 | Handlebars.registerHelper('if_eq', function (a, b, opts) {
|
22 | return a === b ? opts.fn(this) : opts.inverse(this);
|
23 | });
|
24 | Handlebars.registerHelper('unless_eq', function (a, b, opts) {
|
25 | return a === b ? opts.inverse(this) : opts.fn(this);
|
26 | });
|
27 | function 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 | }
|
63 | exports.default = default_1;
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 | function 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 |
|
79 | if (!/{{([^{}]+)}}/g.test(contents) && !/{{([^{}]+)}}/g.test(file)) {
|
80 | return next();
|
81 | }
|
82 |
|
83 | render(file, metalsmithMetadata, (err, res) => {
|
84 | if (err) {
|
85 | err.message = `[${file}] ${err.message}`;
|
86 | return next(err);
|
87 | }
|
88 | file = res;
|
89 |
|
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 |
|
98 | if (rawFileName !== file) {
|
99 | files[rawFileName] = null;
|
100 | delete files[rawFileName];
|
101 | }
|
102 | next();
|
103 | });
|
104 | });
|
105 | }, done);
|
106 | }
|
107 |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 |
|
113 | function filterFiles(filters) {
|
114 | return (files, metalsmith, done) => {
|
115 | filter_1.filter(files, filters, metalsmith.metadata(), done);
|
116 | };
|
117 | }
|
118 |
|
119 |
|
120 |
|
121 |
|
122 |
|
123 |
|
124 |
|
125 | function 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 |
|
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 |
|
141 | if (!/{{([^{}]+)}}/g.test(contents) && !/{{([^{}]+)}}/g.test(file)) {
|
142 | return next();
|
143 | }
|
144 |
|
145 | render(file, metalsmithMetadata, (err, res) => {
|
146 | if (err) {
|
147 | err.message = `[${file}] ${err.message}`;
|
148 | return next(err);
|
149 | }
|
150 | file = res;
|
151 |
|
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 |
|
160 | if (rawFileName !== file) {
|
161 | files[rawFileName] = null;
|
162 | delete files[rawFileName];
|
163 | }
|
164 | next();
|
165 | });
|
166 | });
|
167 | }, done);
|
168 | };
|
169 | }
|
170 |
|
\ | No newline at end of file |