Home Reference Source

src/DependencyParser.js

void function (define) {

    define(
        function (require) {
            var u = require('./util');
            var DependencyTree = require('./DependencyTree');
            var SETTER_REGEX = /^set([A-Z].*)$/;

            function DependencyParser(context) {
                this.context = context;
            }

            DependencyParser.prototype.getPropertyFromSetter = function (name) {
                var prop = null;
                var matches = name.match(SETTER_REGEX);
                if (matches) {
                    prop = matches[1];
                    prop = prop.charAt(0).toLowerCase() + prop.slice(1);
                }

                return prop;
            };

            DependencyParser.prototype.getDepsFromArgs = function (args) {
                var deps = [];
                for (var i = args.length - 1; i > -1; --i) {
                    u.hasReference(args[i]) && u.addToSet(deps, args[i].$ref);
                }
                return deps;
            };

            DependencyParser.prototype.getDepsFromProperties = function (properties) {
                var deps = [];
                for (var k in properties) {
                    if (u.hasOwn(properties, k)) {
                        var prop = properties[k];
                        u.hasReference(prop) && u.addToSet(deps, prop.$ref);
                    }
                }
                return deps;
            };

            DependencyParser.prototype.getDepsFromSetters = function (instance, exclude) {
                exclude = exclude || {};
                var deps = [];
                var prop = null;
                for (var k in instance) {
                    if (typeof instance[k] === 'function') {
                        prop = this.getPropertyFromSetter(k);
                        prop && !exclude.hasOwnProperty(prop) && deps.push(prop);
                    }
                }
                return deps;
            };

            DependencyParser.prototype.getDepsFromInterfaces = function () {

            };

            DependencyParser.prototype.getDependentModules = function (component, result, deps) {
                return getDependentModules(component, this.context, result || {}, new DependencyTree(), deps);
            };

            function getDependentModules(component, context, result, depTree, deps) {
                if (component) {
                    var module = component.module;
                    if (typeof component.creator !== 'function' && module) {
                        result[module] = result[module] || [];
                        result[module].push(component);
                    }

                    var circular = depTree.checkForCircular(component.id);
                    if (circular) {
                        var msg = component.id + ' has circular dependencies ';
                        throw new u.CircularError(msg, component);
                    }

                    depTree.addData(component);
                    var child = depTree.appendChild(new DependencyTree());

                    deps = deps || component.argDeps.concat(component.propDeps).concat(component.setterDeps || []);
                    for (var i = deps.length - 1; i > -1; --i) {
                        getDependentModules(context.getComponentConfig(deps[i]), context, result, child);
                    }
                }

                return result;
            }

            return DependencyParser;
        }
    );

}(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory; });