angular/modules/@angular/router/build/src/router.js

342 lines
52 KiB
JavaScript
Raw Normal View History

"use strict";
var core_1 = require('@angular/core');
var router_outlet_map_1 = require('./router_outlet_map');
var recognize_1 = require('./recognize');
2016-06-02 22:30:49 +00:00
var resolve_1 = require('./resolve');
var create_router_state_1 = require('./create_router_state');
var url_tree_1 = require('./url_tree');
var shared_1 = require('./shared');
var router_state_1 = require('./router_state');
var create_url_tree_1 = require('./create_url_tree');
var collection_1 = require('./utils/collection');
2016-06-03 21:29:15 +00:00
var Subject_1 = require('rxjs/Subject');
require('rxjs/add/operator/map');
2016-06-02 22:30:49 +00:00
require('rxjs/add/operator/scan');
require('rxjs/add/operator/mergeMap');
2016-06-03 21:29:15 +00:00
require('rxjs/add/operator/concat');
require('rxjs/add/operator/concatMap');
2016-06-02 22:30:49 +00:00
var of_1 = require('rxjs/observable/of');
var forkJoin_1 = require('rxjs/observable/forkJoin');
2016-06-03 21:29:15 +00:00
var NavigationStart = (function () {
function NavigationStart(id, url) {
this.id = id;
this.url = url;
}
return NavigationStart;
}());
exports.NavigationStart = NavigationStart;
var NavigationEnd = (function () {
function NavigationEnd(id, url) {
this.id = id;
this.url = url;
}
return NavigationEnd;
}());
exports.NavigationEnd = NavigationEnd;
var NavigationCancel = (function () {
function NavigationCancel(id, url) {
this.id = id;
this.url = url;
}
return NavigationCancel;
}());
exports.NavigationCancel = NavigationCancel;
var NavigationError = (function () {
function NavigationError(id, url, error) {
this.id = id;
this.url = url;
this.error = error;
}
return NavigationError;
}());
exports.NavigationError = NavigationError;
var Router = (function () {
2016-06-02 22:30:49 +00:00
function Router(rootComponentType, resolver, urlSerializer, outletMap, location, injector) {
this.rootComponentType = rootComponentType;
this.resolver = resolver;
this.urlSerializer = urlSerializer;
this.outletMap = outletMap;
this.location = location;
2016-06-02 22:30:49 +00:00
this.injector = injector;
2016-06-03 21:29:15 +00:00
this.navigationId = 0;
this.routerEvents = new Subject_1.Subject();
this.currentUrlTree = url_tree_1.createEmptyUrlTree();
2016-06-02 22:30:49 +00:00
this.currentRouterState = router_state_1.createEmptyState(rootComponentType);
this.setUpLocationChangeListener();
this.navigateByUrl(this.location.path());
}
Object.defineProperty(Router.prototype, "routerState", {
get: function () {
return this.currentRouterState;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Router.prototype, "urlTree", {
get: function () {
return this.currentUrlTree;
},
enumerable: true,
configurable: true
});
2016-06-03 21:29:15 +00:00
Object.defineProperty(Router.prototype, "events", {
get: function () {
return this.routerEvents;
},
enumerable: true,
configurable: true
});
Router.prototype.navigateByUrl = function (url) {
var urlTree = this.urlSerializer.parse(url);
2016-06-03 21:29:15 +00:00
return this.scheduleNavigation(urlTree, false);
};
Router.prototype.resetConfig = function (config) {
this.config = config;
};
Router.prototype.dispose = function () { this.locationSubscription.unsubscribe(); };
Router.prototype.createUrlTree = function (commands, _a) {
var _b = _a === void 0 ? {} : _a, relativeTo = _b.relativeTo, queryParameters = _b.queryParameters, fragment = _b.fragment;
var a = relativeTo ? relativeTo : this.routerState.root;
return create_url_tree_1.createUrlTree(a, this.currentUrlTree, commands, queryParameters, fragment);
};
Router.prototype.navigate = function (commands, extras) {
if (extras === void 0) { extras = {}; }
2016-06-03 21:29:15 +00:00
return this.scheduleNavigation(this.createUrlTree(commands, extras), false);
};
Router.prototype.serializeUrl = function (url) { return this.urlSerializer.serialize(url); };
Router.prototype.parseUrl = function (url) { return this.urlSerializer.parse(url); };
2016-06-03 21:29:15 +00:00
Router.prototype.scheduleNavigation = function (url, pop) {
var _this = this;
var id = ++this.navigationId;
this.routerEvents.next(new NavigationStart(id, url));
return Promise.resolve().then(function (_) { return _this.runNavigate(url, false, id); });
};
Router.prototype.setUpLocationChangeListener = function () {
var _this = this;
this.locationSubscription = this.location.subscribe(function (change) {
2016-06-03 21:29:15 +00:00
return _this.scheduleNavigation(_this.urlSerializer.parse(change['url']), change['pop']);
});
};
2016-06-03 21:29:15 +00:00
Router.prototype.runNavigate = function (url, pop, id) {
var _this = this;
2016-06-03 21:29:15 +00:00
if (id !== this.navigationId) {
this.routerEvents.next(new NavigationCancel(id, url));
return Promise.resolve(false);
}
return new Promise(function (resolvePromise, rejectPromise) {
var state;
recognize_1.recognize(_this.rootComponentType, _this.config, url).mergeMap(function (newRouterStateSnapshot) {
return resolve_1.resolve(_this.resolver, newRouterStateSnapshot);
}).map(function (routerStateSnapshot) {
return create_router_state_1.createRouterState(routerStateSnapshot, _this.currentRouterState);
}).map(function (newState) {
state = newState;
}).mergeMap(function (_) {
return new GuardChecks(state.snapshot, _this.currentRouterState.snapshot, _this.injector).check(_this.outletMap);
}).forEach(function (shouldActivate) {
if (!shouldActivate || id !== _this.navigationId) {
_this.routerEvents.next(new NavigationCancel(id, url));
return Promise.resolve(false);
}
new ActivateRoutes(state, _this.currentRouterState).activate(_this.outletMap);
_this.currentUrlTree = url;
_this.currentRouterState = state;
if (!pop) {
_this.location.go(_this.urlSerializer.serialize(url));
}
}).then(function () {
_this.routerEvents.next(new NavigationEnd(id, url));
resolvePromise(true);
}, function (e) {
_this.routerEvents.next(new NavigationError(id, url, e));
rejectPromise(e);
});
});
};
return Router;
}());
exports.Router = Router;
2016-06-02 22:30:49 +00:00
var CanActivate = (function () {
function CanActivate(route) {
this.route = route;
}
return CanActivate;
}());
var CanDeactivate = (function () {
function CanDeactivate(component, route) {
this.component = component;
this.route = route;
}
return CanDeactivate;
}());
var GuardChecks = (function () {
function GuardChecks(future, curr, injector) {
this.future = future;
this.curr = curr;
this.injector = injector;
this.checks = [];
}
GuardChecks.prototype.check = function (parentOutletMap) {
var _this = this;
var futureRoot = this.future._root;
var currRoot = this.curr ? this.curr._root : null;
this.traverseChildRoutes(futureRoot, currRoot, parentOutletMap);
if (this.checks.length === 0)
return of_1.of(true);
return forkJoin_1.forkJoin(this.checks.map(function (s) {
if (s instanceof CanActivate) {
return _this.runCanActivate(s.route);
}
else if (s instanceof CanDeactivate) {
return _this.runCanDeactivate(s.component, s.route);
}
else {
throw new Error("Cannot be reached");
}
})).map(collection_1.and);
};
GuardChecks.prototype.traverseChildRoutes = function (futureNode, currNode, outletMap) {
var _this = this;
var prevChildren = nodeChildrenAsMap(currNode);
futureNode.children.forEach(function (c) {
_this.traverseRoutes(c, prevChildren[c.value.outlet], outletMap);
delete prevChildren[c.value.outlet];
});
collection_1.forEach(prevChildren, function (v, k) { return _this.deactivateOutletAndItChildren(v, outletMap._outlets[k]); });
};
GuardChecks.prototype.traverseRoutes = function (futureNode, currNode, parentOutletMap) {
var future = futureNode.value;
var curr = currNode ? currNode.value : null;
var outlet = parentOutletMap ? parentOutletMap._outlets[futureNode.value.outlet] : null;
if (curr && future._routeConfig === curr._routeConfig) {
if (!collection_1.shallowEqual(future.params, curr.params)) {
this.checks.push(new CanDeactivate(outlet.component, curr), new CanActivate(future));
}
this.traverseChildRoutes(futureNode, currNode, outlet ? outlet.outletMap : null);
}
else {
this.deactivateOutletAndItChildren(curr, outlet);
this.checks.push(new CanActivate(future));
this.traverseChildRoutes(futureNode, null, outlet ? outlet.outletMap : null);
}
};
GuardChecks.prototype.deactivateOutletAndItChildren = function (route, outlet) {
var _this = this;
if (outlet && outlet.isActivated) {
collection_1.forEach(outlet.outletMap._outlets, function (v, k) { return _this.deactivateOutletAndItChildren(v, outlet.outletMap._outlets[k]); });
this.checks.push(new CanDeactivate(outlet.component, route));
}
};
GuardChecks.prototype.runCanActivate = function (future) {
var _this = this;
var canActivate = future._routeConfig ? future._routeConfig.canActivate : null;
if (!canActivate || canActivate.length === 0)
return of_1.of(true);
return forkJoin_1.forkJoin(canActivate.map(function (c) {
var guard = _this.injector.get(c);
if (guard.canActivate) {
return of_1.of(guard.canActivate(future, _this.future));
}
else {
return of_1.of(guard(future, _this.future));
}
})).map(collection_1.and);
};
GuardChecks.prototype.runCanDeactivate = function (component, curr) {
var _this = this;
var canDeactivate = curr._routeConfig ? curr._routeConfig.canDeactivate : null;
if (!canDeactivate || canDeactivate.length === 0)
return of_1.of(true);
return forkJoin_1.forkJoin(canDeactivate.map(function (c) {
var guard = _this.injector.get(c);
if (guard.canDeactivate) {
return of_1.of(guard.canDeactivate(component, curr, _this.curr));
}
else {
return of_1.of(guard(component, curr, _this.curr));
}
})).map(collection_1.and);
};
return GuardChecks;
}());
var ActivateRoutes = (function () {
2016-06-02 22:30:49 +00:00
function ActivateRoutes(futureState, currState) {
this.futureState = futureState;
this.currState = currState;
}
ActivateRoutes.prototype.activate = function (parentOutletMap) {
2016-06-02 22:30:49 +00:00
var futureRoot = this.futureState._root;
var currRoot = this.currState ? this.currState._root : null;
pushQueryParamsAndFragment(this.futureState);
this.activateChildRoutes(futureRoot, currRoot, parentOutletMap);
};
ActivateRoutes.prototype.activateChildRoutes = function (futureNode, currNode, outletMap) {
var _this = this;
var prevChildren = nodeChildrenAsMap(currNode);
futureNode.children.forEach(function (c) {
2016-06-02 22:30:49 +00:00
_this.activateRoutes(c, prevChildren[c.value.outlet], outletMap);
delete prevChildren[c.value.outlet];
});
collection_1.forEach(prevChildren, function (v, k) { return _this.deactivateOutletAndItChildren(outletMap._outlets[k]); });
};
ActivateRoutes.prototype.activateRoutes = function (futureNode, currNode, parentOutletMap) {
var future = futureNode.value;
var curr = currNode ? currNode.value : null;
var outlet = getOutlet(parentOutletMap, futureNode.value);
if (future === curr) {
2016-06-02 22:30:49 +00:00
router_state_1.advanceActivatedRoute(future);
this.activateChildRoutes(futureNode, currNode, outlet.outletMap);
}
else {
this.deactivateOutletAndItChildren(outlet);
2016-06-02 22:30:49 +00:00
var outletMap = new router_outlet_map_1.RouterOutletMap();
this.activateNewRoutes(outletMap, future, outlet);
this.activateChildRoutes(futureNode, null, outletMap);
}
};
ActivateRoutes.prototype.activateNewRoutes = function (outletMap, future, outlet) {
var resolved = core_1.ReflectiveInjector.resolve([
{ provide: router_state_1.ActivatedRoute, useValue: future },
{ provide: router_outlet_map_1.RouterOutletMap, useValue: outletMap }
]);
2016-06-02 22:30:49 +00:00
outlet.activate(future._futureSnapshot._resolvedComponentFactory, resolved, outletMap);
router_state_1.advanceActivatedRoute(future);
};
ActivateRoutes.prototype.deactivateOutletAndItChildren = function (outlet) {
var _this = this;
if (outlet && outlet.isActivated) {
collection_1.forEach(outlet.outletMap._outlets, function (v, k) { return _this.deactivateOutletAndItChildren(v); });
outlet.deactivate();
}
};
return ActivateRoutes;
}());
2016-06-02 22:30:49 +00:00
function pushQueryParamsAndFragment(state) {
if (!collection_1.shallowEqual(state.snapshot.queryParams, state.queryParams.value)) {
state.queryParams.next(state.snapshot.queryParams);
}
if (state.snapshot.fragment !== state.fragment.value) {
state.fragment.next(state.snapshot.fragment);
}
}
function nodeChildrenAsMap(node) {
return node ?
node.children.reduce(function (m, c) {
m[c.value.outlet] = c;
return m;
}, {}) :
{};
}
function getOutlet(outletMap, route) {
var outlet = outletMap._outlets[route.outlet];
if (!outlet) {
if (route.outlet === shared_1.PRIMARY_OUTLET) {
throw new Error("Cannot find primary outlet");
}
else {
throw new Error("Cannot find the outlet " + route.outlet);
}
}
return outlet;
}
2016-06-03 21:29:15 +00:00
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEscUJBQXNFLGVBQWUsQ0FBQyxDQUFBO0FBR3RGLGtDQUFnQyxxQkFBcUIsQ0FBQyxDQUFBO0FBQ3RELDBCQUEwQixhQUFhLENBQUMsQ0FBQTtBQUN4Qyx3QkFBd0IsV0FBVyxDQUFDLENBQUE7QUFDcEMsb0NBQWtDLHVCQUF1QixDQUFDLENBQUE7QUFFMUQseUJBQTRDLFlBQVksQ0FBQyxDQUFBO0FBQ3pELHVCQUF1QyxVQUFVLENBQUMsQ0FBQTtBQUNsRCw2QkFBaUksZ0JBQWdCLENBQUMsQ0FBQTtBQUdsSixnQ0FBOEIsbUJBQW1CLENBQUMsQ0FBQTtBQUNsRCwyQkFBMkMsb0JBQW9CLENBQUMsQ0FBQTtBQUdoRSx3QkFBd0IsY0FBYyxDQUFDLENBQUE7QUFDdkMsUUFBTyx1QkFBdUIsQ0FBQyxDQUFBO0FBQy9CLFFBQU8sd0JBQXdCLENBQUMsQ0FBQTtBQUNoQyxRQUFPLDRCQUE0QixDQUFDLENBQUE7QUFDcEMsUUFBTywwQkFBMEIsQ0FBQyxDQUFBO0FBQ2xDLFFBQU8sNkJBQTZCLENBQUMsQ0FBQTtBQUNyQyxtQkFBaUIsb0JBQW9CLENBQUMsQ0FBQTtBQUN0Qyx5QkFBdUIsMEJBQTBCLENBQUMsQ0FBQTtBQU9sRDtJQUErQix5QkFBbUIsRUFBUyxFQUFTLEdBQVc7UUFBN0IsT0FBRSxHQUFGLEVBQUUsQ0FBTztRQUFTLFFBQUcsR0FBSCxHQUFHLENBQVE7SUFBRyxDQUFDO0lBQUMsc0JBQUM7QUFBRCxDQUFDLEFBQXJGLElBQXFGO0FBQXhFLHVCQUFlLGtCQUF5RCxDQUFBO0FBS3JGO0lBQTZCLHVCQUFtQixFQUFTLEVBQVMsR0FBVztRQUE3QixPQUFFLEdBQUYsRUFBRSxDQUFPO1FBQVMsUUFBRyxHQUFILEdBQUcsQ0FBUTtJQUFHLENBQUM7SUFBQyxvQkFBQztBQUFELENBQUMsQUFBbkYsSUFB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