UNPKG

intern

Version:

Intern. A next-generation code testing stack for JavaScript.

76 lines 3.4 kB
(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