UNPKG

@angular/router-deprecated

Version:
212 lines 6.99 kB
import { StringMapWrapper } from '../src/facade/collection'; import { BaseException } from '../src/facade/exceptions'; import { RegExpWrapper, isBlank, isPresent } from '../src/facade/lang'; export function convertUrlParamsToArray(urlParams) { var paramsArray = []; if (isBlank(urlParams)) { return []; } StringMapWrapper.forEach(urlParams, (value /** TODO #9100 */, key /** TODO #9100 */) => { paramsArray.push((value === true) ? key : key + '=' + value); }); return paramsArray; } // Convert an object of url parameters into a string that can be used in an URL export function serializeParams(urlParams, joiner = '&') { return convertUrlParamsToArray(urlParams).join(joiner); } /** * This class represents a parsed URL */ export class Url { constructor(path, child = null, auxiliary = [], params = {}) { this.path = path; this.child = child; this.auxiliary = auxiliary; this.params = params; } toString() { return this.path + this._matrixParamsToString() + this._auxToString() + this._childString(); } segmentToString() { return this.path + this._matrixParamsToString(); } /** @internal */ _auxToString() { return this.auxiliary.length > 0 ? ('(' + this.auxiliary.map(sibling => sibling.toString()).join('//') + ')') : ''; } _matrixParamsToString() { var paramString = serializeParams(this.params, ';'); if (paramString.length > 0) { return ';' + paramString; } return ''; } /** @internal */ _childString() { return isPresent(this.child) ? ('/' + this.child.toString()) : ''; } } export class RootUrl extends Url { constructor(path, child = null, auxiliary = [], params = null) { super(path, child, auxiliary, params); } toString() { return this.path + this._auxToString() + this._childString() + this._queryParamsToString(); } segmentToString() { return this.path + this._queryParamsToString(); } _queryParamsToString() { if (isBlank(this.params)) { return ''; } return '?' + serializeParams(this.params); } } export function pathSegmentsToUrl(pathSegments) { var url = new Url(pathSegments[pathSegments.length - 1]); for (var i = pathSegments.length - 2; i >= 0; i -= 1) { url = new Url(pathSegments[i], url); } return url; } var SEGMENT_RE = RegExpWrapper.create('^[^\\/\\(\\)\\?;=&#]+'); function matchUrlSegment(str) { var match = RegExpWrapper.firstMatch(SEGMENT_RE, str); return isPresent(match) ? match[0] : ''; } var QUERY_PARAM_VALUE_RE = RegExpWrapper.create('^[^\\(\\)\\?;&#]+'); function matchUrlQueryParamValue(str) { var match = RegExpWrapper.firstMatch(QUERY_PARAM_VALUE_RE, str); return isPresent(match) ? match[0] : ''; } export class UrlParser { peekStartsWith(str) { return this._remaining.startsWith(str); } capture(str) { if (!this._remaining.startsWith(str)) { throw new BaseException(`Expected "${str}".`); } this._remaining = this._remaining.substring(str.length); } parse(url) { this._remaining = url; if (url == '' || url == '/') { return new Url(''); } return this.parseRoot(); } // segment + (aux segments) + (query params) parseRoot() { if (this.peekStartsWith('/')) { this.capture('/'); } var path = matchUrlSegment(this._remaining); this.capture(path); var aux = []; if (this.peekStartsWith('(')) { aux = this.parseAuxiliaryRoutes(); } if (this.peekStartsWith(';')) { // TODO: should these params just be dropped? this.parseMatrixParams(); } var child = null; if (this.peekStartsWith('/') && !this.peekStartsWith('//')) { this.capture('/'); child = this.parseSegment(); } var queryParams = null; if (this.peekStartsWith('?')) { queryParams = this.parseQueryParams(); } return new RootUrl(path, child, aux, queryParams); } // segment + (matrix params) + (aux segments) parseSegment() { if (this._remaining.length == 0) { return null; } if (this.peekStartsWith('/')) { this.capture('/'); } var path = matchUrlSegment(this._remaining); this.capture(path); var matrixParams = null; if (this.peekStartsWith(';')) { matrixParams = this.parseMatrixParams(); } var aux = []; if (this.peekStartsWith('(')) { aux = this.parseAuxiliaryRoutes(); } var child = null; if (this.peekStartsWith('/') && !this.peekStartsWith('//')) { this.capture('/'); child = this.parseSegment(); } return new Url(path, child, aux, matrixParams); } parseQueryParams() { var params = {}; this.capture('?'); this.parseQueryParam(params); while (this._remaining.length > 0 && this.peekStartsWith('&')) { this.capture('&'); this.parseQueryParam(params); } return params; } parseMatrixParams() { var params = {}; while (this._remaining.length > 0 && this.peekStartsWith(';')) { this.capture(';'); this.parseParam(params); } return params; } parseParam(params) { var key = matchUrlSegment(this._remaining); if (isBlank(key)) { return; } this.capture(key); var value = true; if (this.peekStartsWith('=')) { this.capture('='); var valueMatch = matchUrlSegment(this._remaining); if (isPresent(valueMatch)) { value = valueMatch; this.capture(value); } } params[key] = value; } parseQueryParam(params) { var key = matchUrlSegment(this._remaining); if (isBlank(key)) { return; } this.capture(key); var value = true; if (this.peekStartsWith('=')) { this.capture('='); var valueMatch = matchUrlQueryParamValue(this._remaining); if (isPresent(valueMatch)) { value = valueMatch; this.capture(value); } } params[key] = value; } parseAuxiliaryRoutes() { var routes = []; this.capture('('); while (!this.peekStartsWith(')') && this._remaining.length > 0) { routes.push(this.parseSegment()); if (this.peekStartsWith('//')) { this.capture('//'); } } this.capture(')'); return routes; } } export var parser = new UrlParser(); //# sourceMappingURL=url_parser.js.map