This repository has been archived by the owner on Oct 30, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
test-twigjs.js
80 lines (71 loc) · 2.84 KB
/
test-twigjs.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
'use strict';
const onlyWhitespace = require('./lib/only-whitespace');
const path = require('path');
const series = require('async').series;
const saveFile = require('./lib/save-file');
const twig = require('twig');
const engine = 'twigjs';
const rootDir = __dirname + '/';
const config = require('./config.json');
const inputDir = rootDir + config.inputDir;
const outputDir = rootDir + config.outputDir + engine + '/';
const templateData = require(rootDir + config.templateDataFile);
// params deducted from https://github.com/twigjs/twig.js/blob/05c7fedede/src/twig.exports.js#L18
const twigSettings = {
autoescape: true,
cache: false,
views: inputDir
};
let errorMessage = '';
const consoleError = console.error;
const storeConsoleErrorToVar = message => { errorMessage = message; };
const restoreConsoleErrorLog = () => { console.error = console.Error; };
const templatesWithMemoryIssues = [
'functions/range/negative-step'
];
renderAllTemplates();
/**
* TwigJS does not pass error to `err` in twig.renderFile(filename, data, (err, html) => ...)
* but instead uses `console.error`. To catch and save (async) render errors, all renderFile calls
* are wrapped and executed in series. We temporarily override `console.error` to write to a var.
* And that var is used to create an error which is saved to file.
*/
function renderAllTemplates() {
console.error = storeConsoleErrorToVar;
series(Object.keys(templateData).map(templateName => {
return renderTemplate(templateName, templateData[templateName]);
}), () => {
restoreConsoleErrorLog();
});
}
function renderTemplate(templateName, data) {
return function(callback) {
if(templatesWithMemoryIssues.indexOf(templateName) >= 0) {
return saveError(templateName, { message: '(out of memory)' })
.then(() => callback());
}
const templateFilename = templateName + config.templateExt;
const options = Object.assign({}, data, { settings: twigSettings });
twig.renderFile(inputDir + templateFilename, options, (err, output) => {
if (!err && onlyWhitespace(output)) {
err = { message: config.noOutputMessage }
}
if (output === 'undefined') {
err = {message: errorMessage};
}
if (err) {
saveError(templateName, err)
.then(() => callback());
} else {
saveFile(path.join(outputDir, templateFilename), output)
.then(() => callback());
}
});
}
}
function saveError(templateName, err) {
const errorFilename = path.join(outputDir, templateName + config.errorExt);
const pattern = new RegExp('\(' + rootDir + '.*\)? at .*', 'g');
const message = err.message.replace(pattern, '');
return saveFile(errorFilename, message);
}