deepsweet/baggage-loader

View on GitHub
compat/legacy-loader.js

Summary

Maintainability
C
7 hrs
Test Coverage
/**
 * Legacy version of baggage-loader (to 0.2.4). Does not support advanced config via JSON.
 * Deprecated; support will likely be removed at some point in the future. Use v1+ JSON-based
 * config instead.
 */

'use strict';

var path = require('path');
var fs = require('fs');
var loaderUtils = require('loader-utils');
var SourceMap = require('source-map');

var util = require('../lib/util');

module.exports = function(source, sourceMap) {
    var query = loaderUtils.parseQuery(this.query);

    // /foo/bar/file.js
    var srcFilepath = this.resourcePath;
    // /foo/bar/file.js -> file
    var srcFilename = path.basename(srcFilepath, path.extname(srcFilepath));
    // /foo/bar/file.js -> /foo/bar
    var srcDirpath = path.dirname(srcFilepath);
    // /foo/bar -> bar
    var srcDirname = srcDirpath.split(path.sep).pop();

    if (this.cacheable) {
        this.cacheable();
    }

    if (Object.keys(query).length) {
        var inject = '\n/* injects from baggage-loader */\n';

        Object.keys(query).forEach(function(baggageFile) {
            var baggageVar = query[baggageFile];

            // TODO: not so quick and dirty validation
            if (typeof baggageVar === 'string' || baggageVar === true) {
                // apply filename placeholders
                baggageFile = util.applyPlaceholders(baggageFile, srcDirname, srcFilename);

                // apply var placeholders
                if (baggageVar.length) {
                    baggageVar = util.applyPlaceholders(baggageVar, srcDirname, srcFilename);
                }

                try {
                    // check if absoluted from srcDirpath + baggageFile path exists
                    var stats = fs.statSync(path.resolve(srcDirpath, baggageFile));

                    if (stats.isFile()) {
                        // assign it to variable
                        if (baggageVar.length) {
                            inject += 'var ' + baggageVar + ' = ';
                        }

                        // and require
                        inject += 'require(\'./' + baggageFile + '\');\n';
                    }
                } catch (e) {}
            }
        });

        inject += '\n';

        // support existing SourceMap
        // https://github.com/mozilla/source-map#sourcenode
        // https://github.com/webpack/imports-loader/blob/master/index.js#L34-L44
        // https://webpack.github.io/docs/loaders.html#writing-a-loader
        if (sourceMap) {
            var currentRequest = loaderUtils.getCurrentRequest(this);
            var SourceNode = SourceMap.SourceNode;
            var SourceMapConsumer = SourceMap.SourceMapConsumer;
            var sourceMapConsumer = new SourceMapConsumer(sourceMap);
            var node = SourceNode.fromStringWithSourceMap(source, sourceMapConsumer);

            node.prepend(inject);

            var result = node.toStringWithSourceMap({
                file: currentRequest
            });

            this.callback(null, result.code, result.map.toJSON());

            return;
        }

        // prepend collected inject at the top of file
        return inject + source;
    }

    // return the original source and sourceMap
    if (sourceMap) {
        this.callback(null, source, sourceMap);
        return;
    }

    // return the original source
    return source;
};