angular2
Version:
Angular 2 - a web framework for modern web apps
75 lines • 11.3 kB
JavaScript
import { RouteSegment, Tree } from './segments';
import { RoutesMetadata } from './metadata/metadata';
import { isPresent, stringify } from 'angular2/src/facade/lang';
import { PromiseWrapper } from 'angular2/src/facade/promise';
import { BaseException } from 'angular2/src/facade/exceptions';
import { reflector } from 'angular2/src/core/reflection/reflection';
export function recognize(componentResolver, type, url) {
return _recognize(componentResolver, type, url, url.root)
.then(nodes => new Tree(nodes));
}
function _recognize(componentResolver, type, url, current) {
let metadata = _readMetadata(type); // should read from the factory instead
let matched;
try {
matched = _match(metadata, url, current);
}
catch (e) {
return PromiseWrapper.reject(e, null);
}
return componentResolver.resolveComponent(matched.route.component)
.then(factory => {
let segment = new RouteSegment(matched.consumedUrlSegments, matched.parameters, "", matched.route.component, factory);
if (isPresent(matched.leftOver)) {
return _recognize(componentResolver, matched.route.component, url, matched.leftOver)
.then(children => [segment].concat(children));
}
else {
return [segment];
}
});
}
function _match(metadata, url, current) {
for (let r of metadata.routes) {
let matchingResult = _matchWithParts(r, url, current);
if (isPresent(matchingResult)) {
return matchingResult;
}
}
throw new BaseException("Cannot match any routes");
}
function _matchWithParts(route, url, current) {
let parts = route.path.split("/");
let parameters = {};
let consumedUrlSegments = [];
let u = current;
for (let i = 0; i < parts.length; ++i) {
consumedUrlSegments.push(u);
let p = parts[i];
if (p.startsWith(":")) {
let 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);
}
class _MatchingResult {
constructor(route, consumedUrlSegments, parameters, leftOver) {
this.route = route;
this.consumedUrlSegments = consumedUrlSegments;
this.parameters = parameters;
this.leftOver = leftOver;
}
}
function _readMetadata(componentType) {
let metadata = reflector.annotations(componentType).filter(f => f instanceof RoutesMetadata);
if (metadata.length === 0) {
throw new BaseException(`Component '${stringify(componentType)}' does not have route configuration`);
}
return metadata[0];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb2duaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlmZmluZ19wbHVnaW5fd3JhcHBlci1vdXRwdXRfcGF0aC14QkxJQnJWUi50bXAvYW5ndWxhcjIvc3JjL2FsdF9yb3V0ZXIvcmVjb2duaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJPQUFPLEVBQUMsWUFBWSxFQUFjLElBQUksRUFBQyxNQUFNLFlBQVk7T0FDbEQsRUFBQyxjQUFjLEVBQWdCLE1BQU0scUJBQXFCO09BQzFELEVBQU8sU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLDBCQUEwQjtPQUM1RCxFQUFDLGNBQWMsRUFBQyxNQUFNLDZCQUE2QjtPQUNuRCxFQUFDLGFBQWEsRUFBQyxNQUFNLGdDQUFnQztPQUVyRCxFQUFDLFNBQVMsRUFBQyxNQUFNLHlDQUF5QztBQUVqRSwwQkFBMEIsaUJBQW9DLEVBQUUsSUFBVSxFQUNoRCxHQUFxQjtJQUM3QyxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQztTQUNwRCxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFlLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELG9CQUFvQixpQkFBb0MsRUFBRSxJQUFVLEVBQUUsR0FBcUIsRUFDdkUsT0FBbUI7SUFDckMsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUUsdUNBQXVDO0lBRTVFLElBQUksT0FBTyxDQUFDO0lBQ1osSUFBSSxDQUFDO1FBQ0gsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUU7SUFBQSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lB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QUssR0FBTCxLQUFLLENBQWU7UUFBUyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQWM7UUFDOUQsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFZO0lBQUcsQ0FBQztBQUN6RixDQUFDO0FBRUQsdUJBQXVCLGFBQW1CO0lBQ3hDLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksY0FBYyxDQUFDLENBQUM7SUFDN0YsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sSUFBSSxhQUFhLENBQ25CLGNBQWMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1JvdXRlU2VnbWVudCwgVXJsU2VnbWVudCwgVHJlZX0gZnJvbSAnLi9zZWdtZW50cyc7XG5pbXBvcnQge1JvdXRlc01ldGFkYXRhLCBSb3V0ZU1ldGFkYXRhfSBmcm9tICcuL21ldGFkYXRhL21ldGFkYXRhJztcbmltcG9ydCB7VHlwZSwgaXNQcmVzZW50LCBzdHJpbmdpZnl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1Byb21pc2VXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL3Byb21pc2UnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtDb21wb25lbnRSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge3JlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29nbml6ZShjb21wb25lbnRSZXNvbHZlcjogQ29tcG9uZW50UmVzb2x2ZXIsIHR5cGU6IFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogVHJlZTxVcmxTZWdtZW50Pik6IFByb21pc2U8VHJlZTxSb3V0ZVNlZ21lbnQ+PiB7XG4gIHJldHVybiBfcmVjb2duaXplKGNvbXBvbmVudFJlc29sdmVyLCB0eXBlLCB1cmwsIHVybC5yb290KVxuICAgICAgLnRoZW4obm9kZXMgPT4gbmV3IFRyZWU8Um91dGVTZWdtZW50Pihub2RlcykpO1xufVxuXG5mdW5jdGlvbiBfcmVjb2duaXplKGNvbXBvbmVudFJlc29sdmVyOiBDb21wb25lbnRSZXNvbHZlciwgdHlwZTogVHlwZSwgdXJsOiBUcmVlPFVybFNlZ21lbnQ+LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBVcmxTZWdtZW50KTogUHJvbWlzZTxSb3V0ZVNlZ21lbnRbXT4ge1xuICBsZXQgbWV0YWRhdGEgPSBfcmVhZE1ldGFkYXRhKHR5cGUpOyAgLy8gc2hvdWxkIHJlYWQgZnJvbSB0aGUgZmFjdG9yeSBpbnN0ZWFkXG5cbiAgbGV0IG1hdGNoZWQ7XG4gIHRyeSB7XG4gICAgbWF0Y2hlZCA9IF9tYXRjaChtZXRhZGF0YSwgdXJsLCBjdXJyZW50KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBQcm9taXNlV3JhcHBlci5yZWplY3QoZSwgbnVsbCk7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudChtYXRjaGVkLnJvdXRlLmNvbXBvbmVudClcbiAgICAgIC50aGVuKGZhY3RvcnkgPT4ge1xuICAgICAgICBsZXQgc2VnbWVudCA9IG5ldyBSb3V0ZVNlZ21lbnQobWF0Y2hlZC5jb25zdW1lZFVybFNlZ21lbnRzLCBtYXRjaGVkLnBhcmFtZXRlcnMsIFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkLnJvdXRlLmNvbXBvbmVudCwgZmFjdG9yeSk7XG5cbiAgICAgICAgaWYgKGlzUHJlc2VudChtYXRjaGVkLmxlZnRPdmVyKSkge1xuICAgICAgICAgIHJldHVybiBfcmVjb2duaXplKGNvbXBvbmVudFJlc29sdmVyLCBtYXRjaGVkLnJvdXRlLmNvbXBvbmVudCwgdXJsLCBtYXRjaGVkLmxlZnRPdmVyKVxuICAgICAgICAgICAgICAudGhlbihjaGlsZHJlbiA9PiBbc2VnbWVudF0uY29uY2F0KGNoaWxkcmVuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtzZWdtZW50XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG59XG5cbmZ1bmN0aW9uIF9tYXRjaChtZXRhZGF0YTogUm91dGVzTWV0YWRhdGEsIHVybDogVHJlZTxVcmxTZWdtZW50PixcbiAgICAgICAgICAgICAgICBjdXJyZW50OiBVcmxTZWdtZW50KTogX01hdGNoaW5nUmVzdWx0IHtcbiAgZm9yIChsZXQgciBvZiBtZXRhZGF0YS5yb3V0ZXMpIHtcbiAgICBsZXQgbWF0Y2hpbmdSZXN1bHQgPSBfbWF0Y2hXaXRoUGFydHMociwgdXJsLCBjdXJyZW50KTtcbiAgICBpZiAoaXNQcmVzZW50KG1hdGNoaW5nUmVzdWx0KSkge1xuICAgICAgcmV0dXJuIG1hdGNoaW5nUmVzdWx0O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkNhbm5vdCBtYXRjaCBhbnkgcm91dGVzXCIpO1xufVxuXG5mdW5jdGlvbiBfbWF0Y2hXaXRoUGFydHMocm91dGU6IFJvdXRlTWV0YWRhdGEsIHVybDogVHJlZTxVcmxTZWdtZW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBVcmxTZWdtZW50KTogX01hdGNoaW5nUmVzdWx0IHtcbiAgbGV0IHBhcnRzID0gcm91dGUucGF0aC5zcGxpdChcIi9cIik7XG4gIGxldCBwYXJhbWV0ZXJzID0ge307XG4gIGxldCBjb25zdW1lZFVybFNlZ21lbnRzID0gW107XG5cbiAgbGV0IHUgPSBjdXJyZW50O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3VtZWRVcmxTZWdtZW50cy5wdXNoKHUpO1xuICAgIGxldCBwID0gcGFydHNbaV07XG4gICAgaWYgKHAuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgIGxldCBzZWdtZW50ID0gdS5zZWdtZW50O1xuICAgICAgcGFyYW1ldGVyc1twLnN1YnN0cmluZygxKV0gPSBzZWdtZW50O1xuICAgIH0gZWxzZSBpZiAocCAhPSB1LnNlZ21lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB1ID0gdXJsLmZpcnN0Q2hpbGQodSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBfTWF0Y2hpbmdSZXN1bHQocm91dGUsIGNvbnN1bWVkVXJsU2VnbWVudHMsIHBhcmFtZXRlcnMsIHUpO1xufVxuXG5jbGFzcyBfTWF0Y2hpbmdSZXN1bHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcm91dGU6IFJvdXRlTWV0YWRhdGEsIHB1YmxpYyBjb25zdW1lZFVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10sXG4gICAgICAgICAgICAgIHB1YmxpYyBwYXJhbWV0ZXJzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwgcHVibGljIGxlZnRPdmVyOiBVcmxTZWdtZW50KSB7fVxufVxuXG5mdW5jdGlvbiBfcmVhZE1ldGFkYXRhKGNvbXBvbmVudFR5cGU6IFR5cGUpIHtcbiAgbGV0IG1ldGFkYXRhID0gcmVmbGVjdG9yLmFubm90YXRpb25zKGNvbXBvbmVudFR5cGUpLmZpbHRlcihmID0+IGYgaW5zdGFuY2VvZiBSb3V0ZXNNZXRhZGF0YSk7XG4gIGlmIChtZXRhZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgYENvbXBvbmVudCAnJHtzdHJpbmdpZnkoY29tcG9uZW50VHlwZSl9JyBkb2VzIG5vdCBoYXZlIHJvdXRlIGNvbmZpZ3VyYXRpb25gKTtcbiAgfVxuICByZXR1cm4gbWV0YWRhdGFbMF07XG59Il19