intern
Version:
Intern. A next-generation code testing stack for JavaScript.
76 lines • 3.4 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "tslib", "fs", "http-errors", "mime-types", "path"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var fs_1 = require("fs");
var http_errors_1 = tslib_1.__importDefault(require("http-errors"));
var mime_types_1 = require("mime-types");
var path_1 = require("path");
function instrument(context) {
var codeCache = Object.create(null);
return function (request, response, next) {
var basePath = context.basePath, executor = context.executor;
var wholePath = path_1.resolve(path_1.join(basePath, request.url));
if (!(request.method === 'HEAD' || request.method === 'GET') ||
!executor.shouldInstrumentFile(wholePath)) {
return next();
}
fs_1.stat(wholePath, function (error, stats) {
if (context.stopped) {
return;
}
if (error || !stats.isFile()) {
executor.log('Unable to serve', wholePath, '(unreadable)');
return next(http_errors_1.default(404, error, { expose: false }));
}
executor.log('Serving', wholePath);
var send = function (contentType, data) {
response.writeHead(200, {
'Content-Type': contentType,
'Content-Length': Buffer.byteLength(data),
});
response.end(request.method === 'HEAD' ? '' : data, callback);
};
var callback = function (error) {
if (error) {
executor.emit('error', new Error("Error serving " + wholePath + ": " + error.message));
}
else {
executor.log('Served', wholePath);
}
};
var contentType = mime_types_1.lookup(wholePath) || 'application/octet-stream';
var mtime = stats.mtime.getTime();
if (codeCache[wholePath] && codeCache[wholePath].mtime === mtime) {
send(contentType, codeCache[wholePath].data);
}
else {
fs_1.readFile(wholePath, 'utf8', function (error, data) {
if (context.stopped) {
return;
}
if (error) {
return next(http_errors_1.default(404, error, { expose: false }));
}
data = executor.instrumentCode(data, wholePath);
codeCache[wholePath] = {
mtime: mtime,
data: data,
};
send(contentType, data);
});
}
});
};
}
exports.default = instrument;
});
//# sourceMappingURL=instrument.js.map