1 | 'use-strict';
|
2 |
|
3 |
|
4 | const path = require('path');
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | const _ = require('lodash');
|
10 | const rrddir = require('recursive-readdir');
|
11 | const mmatch = require('micromatch');
|
12 | const cp = require('cp-file');
|
13 | const write = require('write');
|
14 | const loggerFn = require('eazy-logger').Logger({
|
15 | prefix: '[{blue:penny}] ',
|
16 | useLevelPrefixes: true
|
17 | });
|
18 |
|
19 |
|
20 | const ignoreGlobs = [
|
21 | '!**/_*/**/*.*',
|
22 | '!**/_*.*',
|
23 | '!**/node_modules/**/*',
|
24 | '!**/.DS_Store',
|
25 | '!.DS_Store',
|
26 | ];
|
27 |
|
28 | const extGlobs = {
|
29 | '.pug': ['**/*.pug'],
|
30 | '.html': ['**/*.html'],
|
31 | '.scss': ['**/*.scss'],
|
32 | '.css': ['**/*.css', '!**/*.min.css'],
|
33 | '.js': ['**/*.js', '!**/*.min.js'],
|
34 | };
|
35 |
|
36 | module.exports = function (srcDir, outDir, options) {
|
37 |
|
38 | const { reqSrcExt } = options;
|
39 | const srcOutExt = _.invert(reqSrcExt);
|
40 | const srcExts = Object.keys(srcOutExt);
|
41 | const srcRenderFns = _.mapValues(srcOutExt, (outExt, srcExt) => require(`./render-${srcExt.slice(1)}`)({srcDir, loggerFn, options}));
|
42 | const srcOutReplacers = _.mapValues(srcOutExt, (outExt, srcExt) => {
|
43 | return function(str) { return str.replace(new RegExp(`\\${srcExt}$`), outExt); };
|
44 | });
|
45 |
|
46 | |
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 | rrddir(srcDir).then(files => {
|
53 |
|
54 | |
55 |
|
56 |
|
57 |
|
58 | const filesBySrc = mmatch(files, ['**/*'].concat(ignoreGlobs))
|
59 | .reduce((obj, file) => {
|
60 | const srcExt = srcExts.find(ext => mmatch(file, extGlobs[ext]).length);
|
61 | obj[srcExt||'other'] = obj[srcExt||'other'] || [];
|
62 | obj[srcExt||'other'].push(path.relative(srcDir, file));
|
63 | return obj;
|
64 | }, {});
|
65 |
|
66 | |
67 |
|
68 |
|
69 |
|
70 | const srcRenders = [].concat(...srcExts.map((ext) => {
|
71 | return filesBySrc[ext]
|
72 | .map((file) => srcRenderFns[ext](path.join(srcDir, file))
|
73 | .then((str) => write(path.join(outDir, srcOutReplacers[ext](file)), str))
|
74 | .catch((err) => {
|
75 |
|
76 | |
77 |
|
78 |
|
79 |
|
80 | console.log(err);
|
81 | })
|
82 | );
|
83 | }));
|
84 |
|
85 | const copies = filesBySrc['other'].map((file) => cp(path.join(srcDir, file), path.join(outDir, file)));
|
86 |
|
87 | Promise.all([...copies, ...srcRenders]).then(([...processed]) => {
|
88 |
|
89 | |
90 |
|
91 |
|
92 |
|
93 | console.log(`processed ${processed.length} files`);
|
94 | });
|
95 | });
|
96 | };
|