wied03/karma-opal-rspec

View on GitHub
lib/opalSourceMap.js

Summary

Maintainability
A
2 hrs
Test Coverage
const http = require('http');
const translateOpalSourceMap = require('./opalSourceMapTranslator');

const createOpalSourceMapMWare = function (config, logger) {
    const log = logger.create('middleware:opal_sourcemap');

    config.opal = config.opal || {};
    config.opal.sourceMapsEnabled = true;

    return function (request, response, next) {
        if (request.url.endsWith('.rb')) {
            const originalSource = config.sprocketsSrcMapSourcesMap[request.url];
            const newUrl = `${config.opal.rackServer.baseUrl}${originalSource}`;
            log.debug('sending original source query on to ' + newUrl);
            http.get(newUrl, function (sprocketsResponse) {
                response.setHeader('Content-Type', 'text/ruby');
                var originalSource = '';
                sprocketsResponse.on('data', function (chunk) {
                    originalSource += chunk.toString();
                });
                sprocketsResponse.on('end', function () {
                    return response.end(originalSource);
                });
            });
        }
        else if (request.url.endsWith('.map')) {
            log.debug(`initial source map request ${request.url}`);
            const sourceMapUrl = config.sprocketsSrcMap[request.url];
            if (sourceMapUrl === undefined) {
                log.warn(`No opal source map exists for ${request.url}. Is this a non-Opal source map?`);
                next();
                return;
            }
            log.debug(`fetching source maps from ${sourceMapUrl}`);
            http.get(sourceMapUrl, function (sprocketsResponse) {
                if (sprocketsResponse.statusCode === 404) {
                    next();
                    return;
                }
                response.setHeader('Content-Type', 'text/json');
                var rawSourceMap = '';
                sprocketsResponse.on('data', function (chunk) {
                    rawSourceMap += chunk.toString();
                });
                sprocketsResponse.on('end', function () {
                    const asJson = JSON.parse(rawSourceMap);
                    const existingSource = asJson.sources[0];
                    translateOpalSourceMap(asJson, request.url);
                    // we're presenting a "cleaner" source to the browser but we need to know how to get the original from Opal
                    config.sprocketsSrcMapSourcesMap[asJson.sources[0]] = existingSource;
                    const asString = JSON.stringify(asJson);
                    log.debug('cleaned up source map ' + asString);
                    return response.end(asString);
                });
            });
        }
        else {
            next();
            return;
        }
    };
};

createOpalSourceMapMWare.$inject = ['config', 'logger'];

module.exports = {
    'middleware:opal_sourcemap': ['factory', createOpalSourceMapMWare]
};