all files / fc-er/ ErContext.js

60.67% Statements 54/89
66.67% Branches 28/42
54.84% Functions 17/31
54.79% Lines 40/73
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 18715×   871×                       871×   871×   871×   871× 871× 871× 871× 871×         860× 860× 860×                                                                                                                                                                                   871× 871×         860×         871× 871×         862×         872× 872×         55×         873× 873×                 871× 871×              
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; Eif ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Iif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
Eif (typeof define !== 'function') {
    var define = require('amdefine')(module);
}
 
define(function (require) {
    'use strict';
 
    var Controller = require('./controller').Controller;
    var Router = require('./router').Router;
    var Locator = require('./locator').Locator;
    var EventBus = require('./events').EventBus;
    var Permission = require('./permission').Permission;
 
    /**
     * A request or browser-session context
     * @class ErContext
     */
 
    var ErContext = function () {
        function ErContext(options) {
            _classCallCheck(this, ErContext);
 
            this.options = options = options || {};
 
            this.plugins = [];
 
            this.setController(options.controller || new Controller());
            this.setRouter(options.router || new Router());
            this.setLocator(options.locator || new Locator());
            this.setEventBus(options.eventBus || new EventBus());
            this.setPermissionProvider(options.permission || new Permission());
        }
 
        _createClass(ErContext, [{
            key: 'start',
            value: function start() {
                this.controller.start();
                this.router.start();
                this.locator.start();
            }
        }, {
            key: 'plug',
            value: function plug(plugin) {
                if (!plugin.name) {
                    throw new Error('Application plugin must have a name');
                }
 
                this.plugins.push(plugin);
            }
 
            /**
             * Creates a serializable state of the application and plugins for
             * sending to the client
             * @method dehydrate
             * @returns {Object} Dehydrated state object
             */
 
        }, {
            key: 'dehydrate',
            value: function dehydrate() {
                var controller = this.getController();
 
                var model = controller.currentAction.model.dump();
                var currentURL = controller.currentURL.toString();
                var actionState = { currentURL: currentURL, model: model };
 
                return this.dehydratePlugins().then(function (plugins) {
                    return { actionState: actionState, plugins: plugins };
                });
            }
        }, {
            key: 'dehydratePlugins',
            value: function dehydratePlugins() {
                if (!this.dehydratePluginsPromise) {
                    var filteredPlugins = this.plugins.filter(function (plugin) {
                        return typeof plugin.dehydrate === 'function';
                    });
                    var pluginTasks = filteredPlugins.map(function (plugin) {
                        return Promise.resolve(plugin.dehydrate()).then(function (state) {
                            return {
                                name: plugin.name,
                                state: state
                            };
                        });
                    });
 
                    this.dehydratePluginsPromise = Promise.all(pluginTasks).then(function () {
                        var items = [].concat.apply([], arguments);
                        return items.reduce(function (plugins, item) {
                            plugins[item.name] = item.state;
                            return plugins;
                        }, {});
                    });
                }
 
                return this.dehydratePluginsPromise;
            }
        }, {
            key: 'rehydrate',
            value: function rehydrate(obj) {
                var _this = this;
 
                obj = obj || {};
 
                obj.plugins = obj.plugins || {};
                var pluginTasks = this.plugins.filter(function (plugin) {
                    return typeof plugin.rehydrate === 'function';
                }).map(function (plugin) {
                    var result = plugin.rehydrate(obj.plugins[plugin.name]);
                    return Promise.resolve(result);
                });
 
                var rehydratePromise = Promise.all(pluginTasks).then(function () {
                    _this.controller.rehydrate(obj.actionState);
 
                    return _this;
                });
 
                return rehydratePromise;
            }
        }, {
            key: 'getController',
            value: function getController() {
                return this.controller;
            }
        }, {
            key: 'setController',
            value: function setController(controller) {
                controller && controller.setErContext(this);
                this.controller = controller;
            }
        }, {
            key: 'getRouter',
            value: function getRouter() {
                return this.router;
            }
        }, {
            key: 'setRouter',
            value: function setRouter(router) {
                router && router.setErContext(this);
                this.router = router;
            }
        }, {
            key: 'getLocator',
            value: function getLocator() {
                return this.locator;
            }
        }, {
            key: 'setLocator',
            value: function setLocator(locator) {
                locator && locator.setErContext(this);
                this.locator = locator;
            }
        }, {
            key: 'getEventBus',
            value: function getEventBus() {
                return this.eventBus;
            }
        }, {
            key: 'setEventBus',
            value: function setEventBus(eventBus) {
                eventBus && eventBus.setErContext(this);
                this.eventBus = eventBus;
            }
        }, {
            key: 'getPermissionProvider',
            value: function getPermissionProvider() {
                return this.permissionProvider;
            }
        }, {
            key: 'setPermissionProvider',
            value: function setPermissionProvider(permissionProvider) {
                permissionProvider && permissionProvider.setErContext(this);
                this.permissionProvider = permissionProvider;
            }
        }]);
 
        return ErContext;
    }();
 
    return ErContext;
});
//# sourceMappingURL=data:application/json;base64,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Ozs0Q0FvQkM7QUFDYix1QkFBTyxLQUFLLFVBQUwsQ0FETTs7OzswQ0FJSCxZQUFZO0FBQ3RCLDhCQUFjLFdBQVcsWUFBWCxDQUF3QixJQUF4QixDQUFkLENBRHNCO0FBRXRCLHFCQUFLLFVBQUwsR0FBa0IsVUFBbEIsQ0FGc0I7Ozs7d0NBS2Q7QUFDUix1QkFBTyxLQUFLLE1BQUwsQ0FEQzs7OztzQ0FJRixRQUFRO0FBQ2QsMEJBQVUsT0FBTyxZQUFQLENBQW9CLElBQXBCLENBQVYsQ0FEYztBQUVkLHFCQUFLLE1BQUwsR0FBYyxNQUFkLENBRmM7Ozs7eUNBS0w7QUFDVCx1QkFBTyxLQUFLLE9BQUwsQ0FERTs7Ozt1Q0FJRixTQUFTO0FBQ2hCLDJCQUFXLFFBQVEsWUFBUixDQUFxQixJQUFyQixDQUFYLENBRGdCO0FBRWhCLHFCQUFLLE9BQUwsR0FBZSxPQUFmLENBRmdCOzs7OzBDQUtOO0FBQ1YsdUJBQU8sS0FBSyxRQUFMLENBREc7Ozs7d0NBSUYsVUFBVTtBQUNsQiw0QkFBWSxTQUFTLFlBQVQsQ0FBc0IsSUFBdEIsQ0FBWixDQURrQjtBQUVsQixxQkFBSyxRQUFMLEdBQWdCLFFBQWhCLENBRmtCOzs7O29EQUtFO0FBQ3BCLHVCQUFPLEtBQUssa0JBQUwsQ0FEYTs7OztrREFJRixvQkFBb0I7QUFDdEMsc0NBQXNCLG1CQUFtQixZQUFuQixDQUFnQyxJQUFoQyxDQUF0QixDQURzQztBQUV0QyxxQkFBSyxrQkFBTCxHQUEwQixrQkFBMUIsQ0FGc0M7Ozs7O1FBOUl4Qjs7QUFvSnRCLFdBQU8sU0FBUCxDQXBKc0I7Q0FBbkIsQ0FBUCIsImZpbGUiOiJFckNvbnRleHQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge3ZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSl9XG5cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGNvbnN0IENvbnRyb2xsZXIgPSByZXF1aXJlKCcuL2NvbnRyb2xsZXInKS5Db250cm9sbGVyO1xuICAgIGNvbnN0IFJvdXRlciA9IHJlcXVpcmUoJy4vcm91dGVyJykuUm91dGVyO1xuICAgIGNvbnN0IExvY2F0b3IgPSByZXF1aXJlKCcuL2xvY2F0b3InKS5Mb2NhdG9yO1xuICAgIGNvbnN0IEV2ZW50QnVzID0gcmVxdWlyZSgnLi9ldmVudHMnKS5FdmVudEJ1cztcbiAgICBjb25zdCBQZXJtaXNzaW9uID0gcmVxdWlyZSgnLi9wZXJtaXNzaW9uJykuUGVybWlzc2lvbjtcblxuICAgIC8qKlxuICAgICAqIEEgcmVxdWVzdCBvciBicm93c2VyLXNlc3Npb24gY29udGV4dFxuICAgICAqIEBjbGFzcyBFckNvbnRleHRcbiAgICAgKi9cbiAgICBjbGFzcyBFckNvbnRleHQge1xuICAgICAgICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLnNldENvbnRyb2xsZXIob3B0aW9ucy5jb250cm9sbGVyIHx8IG5ldyBDb250cm9sbGVyKCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRSb3V0ZXIob3B0aW9ucy5yb3V0ZXIgfHwgbmV3IFJvdXRlcigpKTtcbiAgICAgICAgICAgIHRoaXMuc2V0TG9jYXRvcihvcHRpb25zLmxvY2F0b3IgfHwgbmV3IExvY2F0b3IoKSk7XG4gICAgICAgICAgICB0aGlzLnNldEV2ZW50QnVzKG9wdGlvbnMuZXZlbnRCdXMgfHwgbmV3IEV2ZW50QnVzKCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRQZXJtaXNzaW9uUHJvdmlkZXIob3B0aW9ucy5wZXJtaXNzaW9uIHx8IG5ldyBQZXJtaXNzaW9uKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgKCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5sb2NhdG9yLnN0YXJ0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBwbHVnIChwbHVnaW4pIHtcbiAgICAgICAgICAgIGlmICghcGx1Z2luLm5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcGxpY2F0aW9uIHBsdWdpbiBtdXN0IGhhdmUgYSBuYW1lJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHNlcmlhbGl6YWJsZSBzdGF0ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHBsdWdpbnMgZm9yXG4gICAgICAgICAqIHNlbmRpbmcgdG8gdGhlIGNsaWVudFxuICAgICAgICAgKiBAbWV0aG9kIGRlaHlkcmF0ZVxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBEZWh5ZHJhdGVkIHN0YXRlIG9iamVjdFxuICAgICAgICAgKi9cbiAgICAgICAgZGVoeWRyYXRlICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldENvbnRyb2xsZXIoKTtcblxuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmN1cnJlbnRBY3Rpb24ubW9kZWwuZHVtcCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFVSTCA9IGNvbnRyb2xsZXIuY3VycmVudFVSTC50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uU3RhdGUgPSB7Y3VycmVudFVSTCwgbW9kZWx9O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWh5ZHJhdGVQbHVnaW5zKCkudGhlbigocGx1Z2lucykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7YWN0aW9uU3RhdGUsIHBsdWdpbnN9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWh5ZHJhdGVQbHVnaW5zICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kZWh5ZHJhdGVQbHVnaW5zUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUGx1Z2lucyA9IHRoaXMucGx1Z2lucy5maWx0ZXIoKHBsdWdpbikgPT4gKHR5cGVvZiBwbHVnaW4uZGVoeWRyYXRlID09PSAnZnVuY3Rpb24nKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luVGFza3MgPSBmaWx0ZXJlZFBsdWdpbnMubWFwKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwbHVnaW4uZGVoeWRyYXRlKCkpLnRoZW4oKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBsdWdpbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGVoeWRyYXRlUGx1Z2luc1Byb21pc2UgPSBQcm9taXNlLmFsbChwbHVnaW5UYXNrcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gW10uY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMucmVkdWNlKChwbHVnaW5zLCBpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5zW2l0ZW0ubmFtZV0gPSBpdGVtLnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsdWdpbnM7XG4gICAgICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVoeWRyYXRlUGx1Z2luc1Byb21pc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZWh5ZHJhdGUgKG9iaikge1xuICAgICAgICAgICAgb2JqID0gb2JqIHx8IHt9O1xuXG4gICAgICAgICAgICBvYmoucGx1Z2lucyA9IG9iai5wbHVnaW5zIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luVGFza3MgPSB0aGlzLnBsdWdpbnMuZmlsdGVyKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHBsdWdpbi5yZWh5ZHJhdGUgPT09ICdmdW5jdGlvbic7XG4gICAgICAgICAgICB9KS5tYXAoKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHBsdWdpbi5yZWh5ZHJhdGUob2JqLnBsdWdpbnNbcGx1Z2luLm5hbWVdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVoeWRyYXRlUHJvbWlzZSA9IFByb21pc2UuYWxsKHBsdWdpblRhc2tzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVoeWRyYXRlKG9iai5hY3Rpb25TdGF0ZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVoeWRyYXRlUHJvbWlzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldENvbnRyb2xsZXIgKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29udHJvbGxlciAmJiBjb250cm9sbGVyLnNldEVyQ29udGV4dCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRSb3V0ZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRSb3V0ZXIocm91dGVyKSB7XG4gICAgICAgICAgICByb3V0ZXIgJiYgcm91dGVyLnNldEVyQ29udGV4dCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyID0gcm91dGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0TG9jYXRvcigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2F0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRMb2NhdG9yKGxvY2F0b3IpIHtcbiAgICAgICAgICAgIGxvY2F0b3IgJiYgbG9jYXRvci5zZXRFckNvbnRleHQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0RXZlbnRCdXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ldmVudEJ1cztcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEV2ZW50QnVzKGV2ZW50QnVzKSB7XG4gICAgICAgICAgICBldmVudEJ1cyAmJiBldmVudEJ1cy5zZXRFckNvbnRleHQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzID0gZXZlbnRCdXM7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRQZXJtaXNzaW9uUHJvdmlkZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uUHJvdmlkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRQZXJtaXNzaW9uUHJvdmlkZXIocGVybWlzc2lvblByb3ZpZGVyKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9uUHJvdmlkZXIgJiYgcGVybWlzc2lvblByb3ZpZGVyLnNldEVyQ29udGV4dCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblByb3ZpZGVyID0gcGVybWlzc2lvblByb3ZpZGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEVyQ29udGV4dDtcbn0pOyJdfQ==