UNPKG

3.44 kBJavaScriptView Raw
1'use strict';
2
3var fs = require('fs');
4var path = require('path');
5var debug = require('debug')('metalsmith-changed');
6var mm = require('micromatch');
7var DEFAULTS = {
8 force: false,
9 forcePattern: false,
10 ctimes: 'metalsmith-changed-ctimes.json' // where to store ctimes
11};
12
13module.exports = function (opts) {
14 opts = Object.assign({}, DEFAULTS, opts);
15 debug('options: ' + JSON.stringify(opts));
16
17 /**
18 * Return true if filename does not match `opts.forcePattern`.
19 */
20 var notForced = function notForced(filename) {
21 var pattern = opts.forcePattern;
22 return pattern === false || !mm.isMatch(filename, pattern);
23 };
24
25 /**
26 * Write ctimes to `filename`.
27 *
28 * @param files {object}
29 * @param filename {string}
30 */
31 function createCtimes(files, filename) {
32 // write ctimes to input folder
33 var ctimes = {}; // { 'index.md': 1464763631540, ... }
34 var filenames = Object.keys(files);
35 var _iteratorNormalCompletion = true;
36 var _didIteratorError = false;
37 var _iteratorError = undefined;
38
39 try {
40 for (var _iterator = filenames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
41 var f = _step.value;
42
43 if (!hasCtime(files[f])) {
44 continue;
45 }
46 var ctime = files[f].stats.ctime.getTime();
47 debug('ctime ' + f + ': ' + ctime);
48 ctimes[f] = ctime;
49 }
50 } catch (err) {
51 _didIteratorError = true;
52 _iteratorError = err;
53 } finally {
54 try {
55 if (!_iteratorNormalCompletion && _iterator.return) {
56 _iterator.return();
57 }
58 } finally {
59 if (_didIteratorError) {
60 throw _iteratorError;
61 }
62 }
63 }
64
65 fs.writeFileSync(filename, JSON.stringify(ctimes, null, 2));
66 }
67
68 return function changed(files, metalsmith, done) {
69 // files are already read => safe to write current ctimes
70 createCtimes(files, path.join(metalsmith.source(), opts.ctimes));
71 if (metalsmith.clean() || opts.force || !files[opts.ctimes]) {
72 debug('building all files');
73 } else {
74 var prevCtimes = JSON.parse(files[opts.ctimes].contents.toString());
75 var filenames = Object.keys(files).filter(notForced);
76 var _iteratorNormalCompletion2 = true;
77 var _didIteratorError2 = false;
78 var _iteratorError2 = undefined;
79
80 try {
81 for (var _iterator2 = filenames[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
82 var f = _step2.value;
83
84 if (!hasCtime(files[f])) {
85 debug(f + ' does not have ctime');
86 continue;
87 }
88 // file has not changed
89 if (prevCtimes[f] && files[f].stats.ctime.getTime() === prevCtimes[f]) {
90 debug('skipping ' + f);
91 delete files[f];
92 }
93 }
94 } catch (err) {
95 _didIteratorError2 = true;
96 _iteratorError2 = err;
97 } finally {
98 try {
99 if (!_iteratorNormalCompletion2 && _iterator2.return) {
100 _iterator2.return();
101 }
102 } finally {
103 if (_didIteratorError2) {
104 throw _iteratorError2;
105 }
106 }
107 }
108 }
109 // remove opts.ctimes from the build
110 delete files[opts.ctimes];
111 done();
112 };
113};
114
115function hasCtime(file) {
116 return file.stats && file.stats.ctime;
117}