express-transform-bare-module-specifiers
Version:
Express middleware to transform bare module specifiers on-the-fly.
71 lines • 2.83 kB
JavaScript
;
/**
* Based entirely on:
* https://github.com/Polymer/tools/blob/dd1c8bbb44f37f67974fbabf878b7a495ffeb6f6/packages/polyserve/src/transform-middleware.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
function transformResponse(transformer) {
return (req, res, next) => {
let ended = false;
const chunks = [];
let _shouldTransform = null;
// Note: this function memoizes its result.
function shouldTransform() {
if (_shouldTransform === null) {
const successful = res.statusCode >= 200 && res.statusCode < 300;
_shouldTransform =
successful && Boolean(transformer.shouldTransform(req, res));
}
return _shouldTransform;
}
const _write = res.write;
res.write = function (chunk, cbOrEncoding, cbOrFd) {
if (ended) {
_write.call(this, chunk, cbOrEncoding, cbOrFd);
return false;
}
if (shouldTransform()) {
const buffer = (typeof chunk === 'string') ?
Buffer.from(chunk, cbOrEncoding) :
chunk;
chunks.push(buffer);
return true;
}
return _write.call(this, chunk, cbOrEncoding, cbOrFd);
};
const _end = res.end;
res.end = function (cbOrChunk, cbOrEncoding, cbOrFd) {
if (ended) {
return false;
}
ended = true;
if (shouldTransform()) {
if (Buffer.isBuffer(cbOrChunk)) {
chunks.push(cbOrChunk);
}
else if (typeof cbOrChunk === 'string') {
chunks.push(Buffer.from(cbOrChunk, cbOrEncoding));
}
const body = Buffer.concat(chunks).toString('utf8');
let newBody = body;
try {
newBody = transformer.transform(req, res, body);
}
catch (e) {
console.warn('Error', e);
}
// TODO(justinfagnani): re-enable setting of content-length when we know
// why it was causing truncated files. Could be multi-byte characters.
// Assumes single-byte code points!
// res.setHeader('Content-Length', `${newBody.length}`);
res.removeHeader('Content-Length');
// TODO(aomarks) Shouldn't we call the callbacks?
return _end.call(this, newBody);
}
return _end.call(this, cbOrChunk, cbOrEncoding, cbOrFd);
};
next();
};
}
exports.transformResponse = transformResponse;
//# sourceMappingURL=transform-middleware.js.map