"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