diff --git a/package.json b/package.json index 1087ae2d9..5988a3c4f 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "testEnvironment": "node", "snapshotSerializers": [ "./scripts/filename-serializer.js", - "./scripts/prettier-javascript-serializer.js" + "./scripts/prettier-javascript-serializer.js", + "./scripts/buffer-serializer.js" ] }, "license": "MIT", diff --git a/packages/pug-filters/lib/handle-filters.js b/packages/pug-filters/lib/handle-filters.js index 6696290e8..884a50138 100644 --- a/packages/pug-filters/lib/handle-filters.js +++ b/packages/pug-filters/lib/handle-filters.js @@ -24,9 +24,13 @@ function handleFilters(ast, filters, options, filterAliases) { var firstFilter = node.filters.pop(); var attrs = getAttributes(firstFilter, options); var filename = (attrs.filename = node.file.fullPath); - var str = node.file.str; node.type = 'Text'; - node.val = filterFileWithFallback(firstFilter, filename, str, attrs); + node.val = filterFileWithFallback( + firstFilter, + filename, + node.file, + attrs + ); node.filters .slice() .reverse() @@ -55,10 +59,14 @@ function handleFilters(ast, filters, options, filterAliases) { } } - function filterFileWithFallback(filter, filename, text, attrs) { + function filterFileWithFallback(filter, filename, file, attrs) { var filterName = getFilterName(filter); if (filters && filters[filterName]) { - return filters[filterName](text, attrs); + if (filters[filterName].renderBuffer) { + return filters[filterName].renderBuffer(file.raw, attrs); + } else { + return filters[filterName](file.str, attrs); + } } else { return filterWithFallback(filter, filename, attrs, 'renderFile'); } diff --git a/packages/pug-load/index.js b/packages/pug-load/index.js index 1eb1ffcb1..92ae0395c 100644 --- a/packages/pug-load/index.js +++ b/packages/pug-load/index.js @@ -21,16 +21,18 @@ function load(ast, options) { if (file.type !== 'FileReference') { throw new Error('Expected file.type to be "FileReference"'); } - var path, str; + var path, str, raw; try { path = options.resolve(file.path, file.filename, options); file.fullPath = path; - str = options.read(path, options); + raw = options.read(path, options); + str = raw.toString('utf8'); } catch (ex) { ex.message += '\n at ' + node.filename + ' line ' + node.line; throw ex; } file.str = str; + file.raw = raw; if (node.type === 'Extends' || node.type === 'Include') { file.ast = load.string( str, @@ -56,7 +58,7 @@ load.file = function loadFile(filename, options) { options = assign(getOptions(options), { filename: filename, }); - var str = options.read(filename); + var str = options.read(filename).toString('utf8'); return load.string(str, options); }; @@ -80,7 +82,7 @@ load.resolve = function resolve(filename, source, options) { return filename; }; load.read = function read(filename, options) { - return fs.readFileSync(filename, 'utf8'); + return fs.readFileSync(filename); }; load.validateOptions = function validateOptions(options) { diff --git a/packages/pug-load/test/__snapshots__/index.test.js.snap b/packages/pug-load/test/__snapshots__/index.test.js.snap index 1fd0b4beb..6ad59e8c7 100644 --- a/packages/pug-load/test/__snapshots__/index.test.js.snap +++ b/packages/pug-load/test/__snapshots__/index.test.js.snap @@ -29,6 +29,11 @@ Object { "fullPath": "/bar.pug", "line": 1, "path": "bar.pug", + "raw": Object { + "hash": "538bf7d4b81ef364b1f2e9d42c11f156", + "size": 11, + "type": "Buffer", + }, "str": "block bing ", "type": "FileReference", @@ -99,6 +104,11 @@ Object { "fullPath": "/bing.pug", "line": 4, "path": "bing.pug", + "raw": Object { + "hash": "58ecbe086e7a045084cbddac849a2563", + "size": 11, + "type": "Buffer", + }, "str": ".bing bong ", "type": "FileReference", @@ -122,6 +132,11 @@ Object { "fullPath": "/script.js", "line": 6, "path": "script.js", + "raw": Object { + "hash": "86d4f8e34165faeb09f10255121078f8", + "size": 32, + "type": "Buffer", + }, "str": "document.write('hello world!'); ", "type": "FileReference", diff --git a/scripts/buffer-serializer.js b/scripts/buffer-serializer.js new file mode 100644 index 000000000..ace36985d --- /dev/null +++ b/scripts/buffer-serializer.js @@ -0,0 +1,19 @@ +const crypto = require('crypto'); + +// Buffer serializer to reduce snapshot gore for Node Buffer type +module.exports = { + test: function(val) { + return val && Buffer.isBuffer(val); + }, + print: function(val, serialize, indent) { + const output = { + type: 'Buffer', + size: val.length, + hash: crypto + .createHash('md5') + .update(val) + .digest('hex'), + }; + return serialize(output); + }, +};