@uirouter/core
Version:
UI-Router Core: Framework agnostic, State-based routing for JavaScript Single Page Apps
91 lines • 3.92 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.StateQueueManager = void 0;
var common_1 = require("../common");
var stateObject_1 = require("./stateObject");
var StateQueueManager = /** @class */ (function () {
function StateQueueManager(router, states, builder, listeners) {
this.router = router;
this.states = states;
this.builder = builder;
this.listeners = listeners;
this.queue = [];
}
StateQueueManager.prototype.dispose = function () {
this.queue = [];
};
StateQueueManager.prototype.register = function (stateDecl) {
var queue = this.queue;
var state = stateObject_1.StateObject.create(stateDecl);
var name = state.name;
if (!common_1.isString(name))
throw new Error('State must have a valid name');
if (this.states.hasOwnProperty(name) || common_1.inArray(queue.map(common_1.prop('name')), name))
throw new Error("State '" + name + "' is already defined");
queue.push(state);
this.flush();
return state;
};
StateQueueManager.prototype.flush = function () {
var _this = this;
var _a = this, queue = _a.queue, states = _a.states, builder = _a.builder;
var registered = [], // states that got registered
orphans = [], // states that don't yet have a parent registered
previousQueueLength = {}; // keep track of how long the queue when an orphan was first encountered
var getState = function (name) { return _this.states.hasOwnProperty(name) && _this.states[name]; };
var notifyListeners = function () {
if (registered.length) {
_this.listeners.forEach(function (listener) {
return listener('registered', registered.map(function (s) { return s.self; }));
});
}
};
while (queue.length > 0) {
var state = queue.shift();
var name_1 = state.name;
var result = builder.build(state);
var orphanIdx = orphans.indexOf(state);
if (result) {
var existingState = getState(name_1);
if (existingState && existingState.name === name_1) {
throw new Error("State '" + name_1 + "' is already defined");
}
var existingFutureState = getState(name_1 + '.**');
if (existingFutureState) {
// Remove future state of the same name
this.router.stateRegistry.deregister(existingFutureState);
}
states[name_1] = state;
this.attachRoute(state);
if (orphanIdx >= 0)
orphans.splice(orphanIdx, 1);
registered.push(state);
continue;
}
var prev = previousQueueLength[name_1];
previousQueueLength[name_1] = queue.length;
if (orphanIdx >= 0 && prev === queue.length) {
// Wait until two consecutive iterations where no additional states were dequeued successfully.
// throw new Error(`Cannot register orphaned state '${name}'`);
queue.push(state);
notifyListeners();
return states;
}
else if (orphanIdx < 0) {
orphans.push(state);
}
queue.push(state);
}
notifyListeners();
return states;
};
StateQueueManager.prototype.attachRoute = function (state) {
if (state.abstract || !state.url)
return;
var rulesApi = this.router.urlService.rules;
rulesApi.rule(rulesApi.urlRuleFactory.create(state));
};
return StateQueueManager;
}());
exports.StateQueueManager = StateQueueManager;
//# sourceMappingURL=stateQueueManager.js.map
;