blob: 470b08a58eb0fa6027c19e84a5deea9dde6f2fb4 [file] [log] [blame]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var async = require("async");
var browserResolve = require("browser-resolve");
var fs = require("fs");
var os = require("os");
var path = require("path");
var bundle_item_1 = require("../bundle-item");
var PathTool = require("../../shared/path-tool");
var Resolver = /** @class */ (function () {
function Resolver(config, dependencyWalker, log, sourceReader) {
this.config = config;
this.dependencyWalker = dependencyWalker;
this.log = log;
this.sourceReader = sourceReader;
this.bowerPackages = {};
this.filenameCache = [];
this.lookupNameCache = {};
}
Resolver.prototype.initialize = function () {
this.shims = this.config.bundlerOptions.addNodeGlobals ?
require("./shims") : undefined;
this.log.debug(this.shims);
this.cacheBowerPackages();
};
Resolver.prototype.resolveModule = function (requiringModule, bundleItem, buffer, onModuleResolved) {
var _this = this;
if (bundleItem.isTypescriptFile() && !bundleItem.isNpmModule()) {
process.nextTick(function () {
onModuleResolved(bundleItem);
});
return;
}
if (bundleItem.isTypingsFile() && !bundleItem.isNpmModule()) {
this.tryResolveTypingAsJavascript(bundleItem, onModuleResolved);
return;
}
bundleItem.lookupName = bundleItem.isNpmModule() ?
bundleItem.moduleName :
path.join(path.dirname(requiringModule), bundleItem.moduleName);
if (this.lookupNameCache[bundleItem.lookupName]) {
bundleItem.filename = this.lookupNameCache[bundleItem.lookupName];
process.nextTick(function () {
onModuleResolved(bundleItem);
});
return;
}
if (this.config.bundlerOptions.exclude.indexOf(bundleItem.moduleName) !== -1) {
this.log.debug("Excluding module %s from %s", bundleItem.moduleName, requiringModule);
process.nextTick(function () {
onModuleResolved(bundleItem);
});
return;
}
var onFilenameResolved = function () {
_this.lookupNameCache[bundleItem.lookupName] = bundleItem.filename;
if (_this.isInFilenameCache(bundleItem) || bundleItem.isTypescriptFile()) {
process.nextTick(function () {
onModuleResolved(bundleItem);
});
}
else {
_this.filenameCache.push(bundleItem.filename);
_this.sourceReader.read(bundleItem, function () {
_this.resolveDependencies(bundleItem, buffer, onDependenciesResolved);
});
}
};
var onDependenciesResolved = function () {
buffer.push(bundleItem);
return onModuleResolved(bundleItem);
};
this.resolveFilename(requiringModule, bundleItem, onFilenameResolved);
};
Resolver.prototype.tryResolveTypingAsJavascript = function (bundleItem, onModuleResolved) {
var _this = this;
var jsfile = bundleItem.filename.replace(/.d.ts$/i, ".js");
fs.stat(jsfile, function (error, stats) {
if (!error && stats) {
_this.log.debug("Resolving %s to %s", bundleItem.filename, jsfile);
bundleItem.filename = jsfile;
}
onModuleResolved(bundleItem);
});
};
Resolver.prototype.cacheBowerPackages = function () {
var _this = this;
try {
var bower = require("bower");
bower.commands
.list({ map: true }, { offline: true })
.on("end", function (map) {
Object.keys(map.dependencies).forEach(function (moduleName) {
var pkg = map.dependencies[moduleName];
var files = ["index.js", moduleName + ".js"];
if (pkg.pkgMeta && pkg.pkgMeta.main) {
if (Array.isArray(pkg.pkgMeta.main)) {
pkg.pkgMeta.main.forEach(function (file) {
files.push(file);
});
}
else {
files.push(pkg.pkgMeta.main);
}
}
files.forEach(function (file) {
try {
var main = path.join(pkg.canonicalDir, file);
fs.statSync(main);
_this.bowerPackages[moduleName] = main;
}
catch (error) {
// noop
}
});
});
_this.log.debug("Cached bower packages: %s %s", os.EOL, JSON.stringify(_this.bowerPackages, null, 2));
});
}
catch (error) {
this.log.debug("No bower detected, skipping");
}
};
Resolver.prototype.isInFilenameCache = function (bundleItem) {
return this.filenameCache.indexOf(bundleItem.filename) !== -1;
};
Resolver.prototype.resolveCompilerPathModulename = function (bundleItem) {
var moduleName = bundleItem.moduleName;
if (bundleItem.isNpmModule() && bundleItem.isTypingsFile() &&
bundleItem.filename.indexOf(bundleItem.moduleName) === -1) {
var filename = PathTool.fixWindowsPath(bundleItem.filename);
var matches = filename.match(/\/node_modules\/(.*)\//);
if (matches && matches[1]) {
moduleName = matches[1];
this.log.debug("Resolved module name [%s] to [%s]", bundleItem.moduleName, moduleName);
}
}
return moduleName;
};
Resolver.prototype.resolveFilename = function (requiringModule, bundleItem, onFilenameResolved) {
var _this = this;
var moduleName = this.resolveCompilerPathModulename(bundleItem);
if (this.bowerPackages[moduleName]) {
bundleItem.filename = this.bowerPackages[moduleName];
this.log.debug("Resolved [%s] to bower package: %s", moduleName, bundleItem.filename);
return onFilenameResolved();
}
if (this.config.bundlerOptions.resolve.alias[moduleName]) {
var alias = this.config.bundlerOptions.resolve.alias[moduleName];
var relativePath = path.relative(this.config.karma.basePath, alias);
bundleItem.filename = path.join(this.config.karma.basePath, relativePath);
this.log.debug("Resolved [%s] to alias: %s", moduleName, bundleItem.filename);
return onFilenameResolved();
}
var bopts = {
extensions: this.config.bundlerOptions.resolve.extensions,
filename: requiringModule,
moduleDirectory: this.config.bundlerOptions.resolve.directories,
modules: this.shims
};
browserResolve(moduleName, bopts, function (error, filename) {
if (!error) {
bundleItem.filename = fs.realpathSync(filename);
return onFilenameResolved();
}
bopts = {
basedir: bundleItem.filename ? path.dirname(bundleItem.filename) : _this.config.karma.basePath,
extensions: _this.config.bundlerOptions.resolve.extensions,
moduleDirectory: _this.config.bundlerOptions.resolve.directories,
modules: _this.shims
};
browserResolve(moduleName, bopts, function (error2, filename2) {
if (error2) {
if (bundleItem.filename && !bundleItem.isTypingsFile()) {
// This is probably a compiler path module (.js)
return onFilenameResolved();
}
throw new Error("Unable to resolve module [" +
moduleName + "] from [" + requiringModule + "]" + os.EOL +
JSON.stringify(bopts, undefined, 2) + os.EOL +
error);
}
bundleItem.filename = fs.realpathSync(filename2);
onFilenameResolved();
});
});
};
Resolver.prototype.resolveDependencies = function (bundleItem, buffer, onDependenciesResolved) {
var _this = this;
if (bundleItem.isScript() && this.dependencyWalker.hasRequire(bundleItem.source)) {
this.dependencyWalker.collectJavascriptDependencies(bundleItem, function (moduleNames) {
async.each(moduleNames, function (moduleName, onModuleResolved) {
var dependency = new bundle_item_1.BundleItem(moduleName);
_this.resolveModule(bundleItem.filename, dependency, buffer, function (resolved) {
if (resolved) {
bundleItem.dependencies.push(resolved);
}
onModuleResolved();
});
}, onDependenciesResolved);
});
}
else {
process.nextTick(function () {
onDependenciesResolved();
});
}
};
return Resolver;
}());
exports.Resolver = Resolver;
//# sourceMappingURL=resolver.js.map