Skip to content

Commit 9e96bb7

Browse files
authored
feat: allow filters to read non-text include files (#3213)
1 parent bb0731f commit 9e96bb7

File tree

5 files changed

+54
-9
lines changed

5 files changed

+54
-9
lines changed

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
"testEnvironment": "node",
2727
"snapshotSerializers": [
2828
"./scripts/filename-serializer.js",
29-
"./scripts/prettier-javascript-serializer.js"
29+
"./scripts/prettier-javascript-serializer.js",
30+
"./scripts/buffer-serializer.js"
3031
]
3132
},
3233
"license": "MIT",

packages/pug-filters/lib/handle-filters.js

+12-4
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@ function handleFilters(ast, filters, options, filterAliases) {
2424
var firstFilter = node.filters.pop();
2525
var attrs = getAttributes(firstFilter, options);
2626
var filename = (attrs.filename = node.file.fullPath);
27-
var str = node.file.str;
2827
node.type = 'Text';
29-
node.val = filterFileWithFallback(firstFilter, filename, str, attrs);
28+
node.val = filterFileWithFallback(
29+
firstFilter,
30+
filename,
31+
node.file,
32+
attrs
33+
);
3034
node.filters
3135
.slice()
3236
.reverse()
@@ -55,10 +59,14 @@ function handleFilters(ast, filters, options, filterAliases) {
5559
}
5660
}
5761

58-
function filterFileWithFallback(filter, filename, text, attrs) {
62+
function filterFileWithFallback(filter, filename, file, attrs) {
5963
var filterName = getFilterName(filter);
6064
if (filters && filters[filterName]) {
61-
return filters[filterName](text, attrs);
65+
if (filters[filterName].renderBuffer) {
66+
return filters[filterName].renderBuffer(file.raw, attrs);
67+
} else {
68+
return filters[filterName](file.str, attrs);
69+
}
6270
} else {
6371
return filterWithFallback(filter, filename, attrs, 'renderFile');
6472
}

packages/pug-load/index.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,18 @@ function load(ast, options) {
2121
if (file.type !== 'FileReference') {
2222
throw new Error('Expected file.type to be "FileReference"');
2323
}
24-
var path, str;
24+
var path, str, raw;
2525
try {
2626
path = options.resolve(file.path, file.filename, options);
2727
file.fullPath = path;
28-
str = options.read(path, options);
28+
raw = options.read(path, options);
29+
str = raw.toString('utf8');
2930
} catch (ex) {
3031
ex.message += '\n at ' + node.filename + ' line ' + node.line;
3132
throw ex;
3233
}
3334
file.str = str;
35+
file.raw = raw;
3436
if (node.type === 'Extends' || node.type === 'Include') {
3537
file.ast = load.string(
3638
str,
@@ -56,7 +58,7 @@ load.file = function loadFile(filename, options) {
5658
options = assign(getOptions(options), {
5759
filename: filename,
5860
});
59-
var str = options.read(filename);
61+
var str = options.read(filename).toString('utf8');
6062
return load.string(str, options);
6163
};
6264

@@ -80,7 +82,7 @@ load.resolve = function resolve(filename, source, options) {
8082
return filename;
8183
};
8284
load.read = function read(filename, options) {
83-
return fs.readFileSync(filename, 'utf8');
85+
return fs.readFileSync(filename);
8486
};
8587

8688
load.validateOptions = function validateOptions(options) {

packages/pug-load/test/__snapshots__/index.test.js.snap

+15
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ Object {
2929
"fullPath": "<dirname>/bar.pug",
3030
"line": 1,
3131
"path": "bar.pug",
32+
"raw": Object {
33+
"hash": "538bf7d4b81ef364b1f2e9d42c11f156",
34+
"size": 11,
35+
"type": "Buffer",
36+
},
3237
"str": "block bing
3338
",
3439
"type": "FileReference",
@@ -99,6 +104,11 @@ Object {
99104
"fullPath": "<dirname>/bing.pug",
100105
"line": 4,
101106
"path": "bing.pug",
107+
"raw": Object {
108+
"hash": "58ecbe086e7a045084cbddac849a2563",
109+
"size": 11,
110+
"type": "Buffer",
111+
},
102112
"str": ".bing bong
103113
",
104114
"type": "FileReference",
@@ -122,6 +132,11 @@ Object {
122132
"fullPath": "<dirname>/script.js",
123133
"line": 6,
124134
"path": "script.js",
135+
"raw": Object {
136+
"hash": "86d4f8e34165faeb09f10255121078f8",
137+
"size": 32,
138+
"type": "Buffer",
139+
},
125140
"str": "document.write('hello world!');
126141
",
127142
"type": "FileReference",

scripts/buffer-serializer.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const crypto = require('crypto');
2+
3+
// Buffer serializer to reduce snapshot gore for Node Buffer type
4+
module.exports = {
5+
test: function(val) {
6+
return val && Buffer.isBuffer(val);
7+
},
8+
print: function(val, serialize, indent) {
9+
const output = {
10+
type: 'Buffer',
11+
size: val.length,
12+
hash: crypto
13+
.createHash('md5')
14+
.update(val)
15+
.digest('hex'),
16+
};
17+
return serialize(output);
18+
},
19+
};

0 commit comments

Comments
 (0)