index.test.js 4.34 KB
var path = require("path");
var fs = require("fs");
var should = require("should");
var loader = require("../");

function execLoader(filename, callback) {
	var async = false;
	var deps = [];
	var warns = [];
	var context = {
		context: path.dirname(filename),
		resolve: function(context, request, callback) {
			process.nextTick(function() {
				var p = path.join(context, request);
				if(fs.existsSync(p))
					callback(null, p);
				else
					callback(new Error("File not found"));
			});
		},
		addDependency: function(dep) {
			deps.push(dep);
		},
		emitWarning: function(warn) {
			warns.push(warn);
		},
		callback: function(err, res, map) {
			async = true;
			callback(err, res, map, deps, warns);
		},
		async: function() {
			async = true;
			return this.callback;
		}
	};
	var res = loader.call(context, fs.readFileSync(filename, "utf-8"));
	if(!async) return callback(null, res, null, deps, warns);
}

describe("source-map-loader", function() {
	it("should leave normal files untouched", function(done) {
		execLoader(path.join(__dirname, "fixtures", "normal-file.js"), function(err, res, map, deps, warns) {
			should.equal(err, null);
			warns.should.be.eql([]);
			should.equal(res, "without SourceMap"),
			should.equal(map, null);
			deps.should.be.eql([]);
			done();
		});
	});
	it("should process inlined SourceMaps", function(done) {
		execLoader(path.join(__dirname, "fixtures", "inline-source-map.js"), function(err, res, map, deps, warns) {
			should.equal(err, null);
			warns.should.be.eql([]);
			should.equal(res, "with SourceMap\n\n// comment"),
			map.should.be.eql({
				"version":3,
				"file":"inline-source-map.js",
				"sources":[
					"inline-source-map.txt"
				],
				"sourcesContent":["with SourceMap"],
				"mappings":"AAAA"
			});
			deps.should.be.eql([]);
			done();
		});
	});
	it("should process external SourceMaps", function(done) {
		execLoader(path.join(__dirname, "fixtures", "external-source-map.js"), function(err, res, map, deps, warns) {
			should.equal(err, null);
			warns.should.be.eql([]);
			should.equal(res, "with SourceMap\n\n// comment"),
			map.should.be.eql({
				"version":3,
				"file":"external-source-map.js",
				"sources":[
					"external-source-map.txt"
				],
				"sourcesContent":["with SourceMap"],
				"mappings":"AAAA"
			});
			deps.should.be.eql([
				path.join(__dirname, "fixtures", "external-source-map.map")
			]);
			done();
		});
	});
	it("should process external SourceMaps (external sources)", function(done) {
		execLoader(path.join(__dirname, "fixtures", "external-source-map2.js"), function(err, res, map, deps, warns) {
			should.equal(err, null);
			warns.should.be.eql([]);
			should.equal(res, "with SourceMap\n\n// comment"),
			map.should.be.eql({
				"version":3,
				"file":"external-source-map2.js",
				"sources":[
					path.join(__dirname, "fixtures", "external-source-map2.txt")
				],
				"sourcesContent":["with SourceMap"],
				"mappings":"AAAA"
			});
			deps.should.be.eql([
				path.join(__dirname, "fixtures", "data", "external-source-map2.map"),
				path.join(__dirname, "fixtures", "external-source-map2.txt")
			]);
			done();
		});
	});
	it("should warn on missing SourceMap", function(done) {
		execLoader(path.join(__dirname, "fixtures", "missing-source-map.js"), function(err, res, map, deps, warns) {
			should.equal(err, null);
			warns.should.be.eql([
				"Cannot find SourceMap 'missing-source-map.map': Error: File not found"
			]);
			should.equal(res, "with SourceMap\n//#sourceMappingURL=missing-source-map.map\n// comment"),
			should.equal(map, null);
			deps.should.be.eql([]);
			done();
		});
	});
	it("should warn on missing source file", function(done) {
		execLoader(path.join(__dirname, "fixtures", "missing-source-map2.js"), function(err, res, map, deps, warns) {
			should.equal(err, null);
			warns.should.be.eql([
				"Cannot find source file 'missing-source-map2.txt': Error: File not found"
			]);
			should.equal(res, "with SourceMap\n\n// comment"),
			map.should.be.eql({
				"version":3,
				"file":"missing-source-map2.js",
				"sources":[
					"missing-source-map2.txt"
				],
				"sourcesContent":[null],
				"mappings":"AAAA"
			});
			deps.should.be.eql([
				path.join(__dirname, "fixtures", "missing-source-map2.map")
			]);
			done();
		});
	});
});