angular2
Version:
Angular 2 - a web framework for modern web apps
79 lines • 11.8 kB
JavaScript
"use strict";
var segments_1 = require('./segments');
var metadata_1 = require('./metadata/metadata');
var lang_1 = require('angular2/src/facade/lang');
var promise_1 = require('angular2/src/facade/promise');
var exceptions_1 = require('angular2/src/facade/exceptions');
var reflection_1 = require('angular2/src/core/reflection/reflection');
function recognize(componentResolver, type, url) {
return _recognize(componentResolver, type, url, url.root)
.then(function (nodes) { return new segments_1.Tree(nodes); });
}
exports.recognize = recognize;
function _recognize(componentResolver, type, url, current) {
var metadata = _readMetadata(type); // should read from the factory instead
var matched;
try {
matched = _match(metadata, url, current);
}
catch (e) {
return promise_1.PromiseWrapper.reject(e, null);
}
return componentResolver.resolveComponent(matched.route.component)
.then(function (factory) {
var segment = new segments_1.RouteSegment(matched.consumedUrlSegments, matched.parameters, "", matched.route.component, factory);
if (lang_1.isPresent(matched.leftOver)) {
return _recognize(componentResolver, matched.route.component, url, matched.leftOver)
.then(function (children) { return [segment].concat(children); });
}
else {
return [segment];
}
});
}
function _match(metadata, url, current) {
for (var _i = 0, _a = metadata.routes; _i < _a.length; _i++) {
var r = _a[_i];
var matchingResult = _matchWithParts(r, url, current);
if (lang_1.isPresent(matchingResult)) {
return matchingResult;
}
}
throw new exceptions_1.BaseException("Cannot match any routes");
}
function _matchWithParts(route, url, current) {
var parts = route.path.split("/");
var parameters = {};
var consumedUrlSegments = [];
var u = current;
for (var i = 0; i < parts.length; ++i) {
consumedUrlSegments.push(u);
var p = parts[i];
if (p.startsWith(":")) {
var segment = u.segment;
parameters[p.substring(1)] = segment;
}
else if (p != u.segment) {
return null;
}
u = url.firstChild(u);
}
return new _MatchingResult(route, consumedUrlSegments, parameters, u);
}
var _MatchingResult = (function () {
function _MatchingResult(route, consumedUrlSegments, parameters, leftOver) {
this.route = route;
this.consumedUrlSegments = consumedUrlSegments;
this.parameters = parameters;
this.leftOver = leftOver;
}
return _MatchingResult;
}());
function _readMetadata(componentType) {
var metadata = reflection_1.reflector.annotations(componentType).filter(function (f) { return f instanceof metadata_1.RoutesMetadata; });
if (metadata.length === 0) {
throw new exceptions_1.BaseException("Component '" + lang_1.stringify(componentType) + "' does not have route configuration");
}
return metadata[0];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb2duaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlmZmluZ19wbHVnaW5fd3JhcHBlci1vdXRwdXRfcGF0aC1CUkplcjFKOS50bXAvYW5ndWxhcjIvc3JjL2FsdF9yb3V0ZXIvcmVjb2duaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5QkFBNkMsWUFBWSxDQUFDLENBQUE7QUFDMUQseUJBQTRDLHFCQUFxQixDQUFDLENBQUE7QUFDbEUscUJBQXlDLDBCQUEwQixDQUFDLENBQUE7QUFDcEUsd0JBQTZCLDZCQUE2QixDQUFDLENBQUE7QUFDM0QsMkJBQTRCLGdDQUFnQyxDQUFDLENBQUE7QUFFN0QsMkJBQXdCLHlDQUF5QyxDQUFDLENBQUE7QUFFbEUsbUJBQTBCLGlCQUFvQyxFQUFFLElBQVUsRUFDaEQsR0FBcUI7SUFDN0MsTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUM7U0FDcEQsSUFBSSxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsSUFBSSxlQUFJLENBQWUsS0FBSyxDQUFDLEVBQTdCLENBQTZCLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBSmUsaUJBQVMsWUFJeEIsQ0FBQTtBQUVELG9CQUFvQixpQkFBb0MsRUFBRSxJQUFVLEVBQUUsR0FBcUIsRUFDdkUsT0FBbUI7SUFDckMsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUUsdUNBQXVDO0lBRTVFLElBQUksT0FBTyxDQUFDO0lBQ1osSUFBSSxDQUFDO1FBQ0gsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUU7SUFBQSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsTUFBTSxDQUFDLHdCQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMs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RUQ7SUFDRSx5QkFBbUIsS0FBb0IsRUFBUyxtQkFBaUMsRUFDOUQsVUFBbUMsRUFBUyxRQUFvQjtRQURoRSxVQUFLLEdBQUwsS0FBSyxDQUFlO1FBQVMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFjO1FBQzlELGVBQVUsR0FBVixVQUFVLENBQXlCO1FBQVMsYUFBUSxHQUFSLFFBQVEsQ0FBWTtJQUFHLENBQUM7SUFDekYsc0JBQUM7QUFBRCxDQUFDLEFBSEQsSUFHQztBQUVELHVCQUF1QixhQUFtQjtJQUN4QyxJQUFJLFFBQVEsR0FBRyxzQkFBUyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLFlBQVkseUJBQWMsRUFBM0IsQ0FBMkIsQ0FBQyxDQUFDO0lBQzdGLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLElBQUksMEJBQWEsQ0FDbkIsZ0JBQWMsZ0JBQVMsQ0FBQyxhQUFhLENBQUMsd0NBQXFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSb3V0ZVNlZ21lbnQsIFVybFNlZ21lbnQsIFRyZWV9IGZyb20gJy4vc2VnbWVudHMnO1xuaW1wb3J0IHtSb3V0ZXNNZXRhZGF0YSwgUm91dGVNZXRhZGF0YX0gZnJvbSAnLi9tZXRhZGF0YS9tZXRhZGF0YSc7XG5pbXBvcnQge1R5cGUsIGlzUHJlc2VudCwgc3RyaW5naWZ5fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9wcm9taXNlJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7Q29tcG9uZW50UmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtyZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvZ25pemUoY29tcG9uZW50UmVzb2x2ZXI6IENvbXBvbmVudFJlc29sdmVyLCB0eXBlOiBUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFRyZWU8VXJsU2VnbWVudD4pOiBQcm9taXNlPFRyZWU8Um91dGVTZWdtZW50Pj4ge1xuICByZXR1cm4gX3JlY29nbml6ZShjb21wb25lbnRSZXNvbHZlciwgdHlwZSwgdXJsLCB1cmwucm9vdClcbiAgICAgIC50aGVuKG5vZGVzID0+IG5ldyBUcmVlPFJvdXRlU2VnbWVudD4obm9kZXMpKTtcbn1cblxuZnVuY3Rpb24gX3JlY29nbml6ZShjb21wb25lbnRSZXNvbHZlcjogQ29tcG9uZW50UmVzb2x2ZXIsIHR5cGU6IFR5cGUsIHVybDogVHJlZTxVcmxTZWdtZW50PixcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudDogVXJsU2VnbWVudCk6IFByb21pc2U8Um91dGVTZWdtZW50W10+IHtcbiAgbGV0IG1ldGFkYXRhID0gX3JlYWRNZXRhZGF0YSh0eXBlKTsgIC8vIHNob3VsZCByZWFkIGZyb20gdGhlIGZhY3RvcnkgaW5zdGVhZFxuXG4gIGxldCBtYXRjaGVkO1xuICB0cnkge1xuICAgIG1hdGNoZWQgPSBfbWF0Y2gobWV0YWRhdGEsIHVybCwgY3VycmVudCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXIucmVqZWN0KGUsIG51bGwpO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBvbmVudFJlc29sdmVyLnJlc29sdmVDb21wb25lbnQobWF0Y2hlZC5yb3V0ZS5jb21wb25lbnQpXG4gICAgICAudGhlbihmYWN0b3J5ID0+IHtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSBuZXcgUm91dGVTZWdtZW50KG1hdGNoZWQuY29uc3VtZWRVcmxTZWdtZW50cywgbWF0Y2hlZC5wYXJhbWV0ZXJzLCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZC5yb3V0ZS5jb21wb25lbnQsIGZhY3RvcnkpO1xuXG4gICAgICAgIGlmIChpc1ByZXNlbnQobWF0Y2hlZC5sZWZ0T3ZlcikpIHtcbiAgICAgICAgICByZXR1cm4gX3JlY29nbml6ZShjb21wb25lbnRSZXNvbHZlciwgbWF0Y2hlZC5yb3V0ZS5jb21wb25lbnQsIHVybCwgbWF0Y2hlZC5sZWZ0T3ZlcilcbiAgICAgICAgICAgICAgLnRoZW4oY2hpbGRyZW4gPT4gW3NlZ21lbnRdLmNvbmNhdChjaGlsZHJlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbc2VnbWVudF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfbWF0Y2gobWV0YWRhdGE6IFJvdXRlc01ldGFkYXRhLCB1cmw6IFRyZWU8VXJsU2VnbWVudD4sXG4gICAgICAgICAgICAgICAgY3VycmVudDogVXJsU2VnbWVudCk6IF9NYXRjaGluZ1Jlc3VsdCB7XG4gIGZvciAobGV0IHIgb2YgbWV0YWRhdGEucm91dGVzKSB7XG4gICAgbGV0IG1hdGNoaW5nUmVzdWx0ID0gX21hdGNoV2l0aFBhcnRzKHIsIHVybCwgY3VycmVudCk7XG4gICAgaWYgKGlzUHJlc2VudChtYXRjaGluZ1Jlc3VsdCkpIHtcbiAgICAgIHJldHVybiBtYXRjaGluZ1Jlc3VsdDtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXCJDYW5ub3QgbWF0Y2ggYW55IHJvdXRlc1wiKTtcbn1cblxuZnVuY3Rpb24gX21hdGNoV2l0aFBhcnRzKHJvdXRlOiBSb3V0ZU1ldGFkYXRhLCB1cmw6IFRyZWU8VXJsU2VnbWVudD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudDogVXJsU2VnbWVudCk6IF9NYXRjaGluZ1Jlc3VsdCB7XG4gIGxldCBwYXJ0cyA9IHJvdXRlLnBhdGguc3BsaXQoXCIvXCIpO1xuICBsZXQgcGFyYW1ldGVycyA9IHt9O1xuICBsZXQgY29uc3VtZWRVcmxTZWdtZW50cyA9IFtdO1xuXG4gIGxldCB1ID0gY3VycmVudDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN1bWVkVXJsU2VnbWVudHMucHVzaCh1KTtcbiAgICBsZXQgcCA9IHBhcnRzW2ldO1xuICAgIGlmIChwLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICBsZXQgc2VnbWVudCA9IHUuc2VnbWVudDtcbiAgICAgIHBhcmFtZXRlcnNbcC5zdWJzdHJpbmcoMSldID0gc2VnbWVudDtcbiAgICB9IGVsc2UgaWYgKHAgIT0gdS5zZWdtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdSA9IHVybC5maXJzdENoaWxkKHUpO1xuICB9XG4gIHJldHVybiBuZXcgX01hdGNoaW5nUmVzdWx0KHJvdXRlLCBjb25zdW1lZFVybFNlZ21lbnRzLCBwYXJhbWV0ZXJzLCB1KTtcbn1cblxuY2xhc3MgX01hdGNoaW5nUmVzdWx0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHJvdXRlOiBSb3V0ZU1ldGFkYXRhLCBwdWJsaWMgY29uc3VtZWRVcmxTZWdtZW50czogVXJsU2VnbWVudFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgcGFyYW1ldGVyczoge1trZXk6IHN0cmluZ106IHN0cmluZ30sIHB1YmxpYyBsZWZ0T3ZlcjogVXJsU2VnbWVudCkge31cbn1cblxuZnVuY3Rpb24gX3JlYWRNZXRhZGF0YShjb21wb25lbnRUeXBlOiBUeXBlKSB7XG4gIGxldCBtZXRhZGF0YSA9IHJlZmxlY3Rvci5hbm5vdGF0aW9ucyhjb21wb25lbnRUeXBlKS5maWx0ZXIoZiA9PiBmIGluc3RhbmNlb2YgUm91dGVzTWV0YWRhdGEpO1xuICBpZiAobWV0YWRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgIGBDb21wb25lbnQgJyR7c3RyaW5naWZ5KGNvbXBvbmVudFR5cGUpfScgZG9lcyBub3QgaGF2ZSByb3V0ZSBjb25maWd1cmF0aW9uYCk7XG4gIH1cbiAgcmV0dXJuIG1ldGFkYXRhWzBdO1xufSJdfQ==
;