/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license * @param {?=} rawParams * @return {?} */ function paramParser(rawParams) { if (rawParams === void 0) { rawParams = ''; } var /** @type {?} */ map = new Map(); if (rawParams.length > 0) { var /** @type {?} */ params = rawParams.split('&'); params.forEach(function (param) { var /** @type {?} */ eqIdx = param.indexOf('='); var _a = eqIdx == -1 ? [param, ''] : [param.slice(0, eqIdx), param.slice(eqIdx + 1)], key = _a[0], val = _a[1]; var /** @type {?} */ list = map.get(key) || []; list.push(val); map.set(key, list); }); } return map; } /** * \@experimental * */ export var QueryEncoder = (function () { function QueryEncoder() { } /** * @param {?} k * @return {?} */ QueryEncoder.prototype.encodeKey = function (k) { return standardEncoding(k); }; /** * @param {?} v * @return {?} */ QueryEncoder.prototype.encodeValue = function (v) { return standardEncoding(v); }; return QueryEncoder; }()); /** * @param {?} v * @return {?} */ function standardEncoding(v) { return encodeURIComponent(v) .replace(/%40/gi, '@') .replace(/%3A/gi, ':') .replace(/%24/gi, '$') .replace(/%2C/gi, ',') .replace(/%3B/gi, ';') .replace(/%2B/gi, '+') .replace(/%3D/gi, '=') .replace(/%3F/gi, '?') .replace(/%2F/gi, '/'); } /** * Map-like representation of url search parameters, based on * [URLSearchParams](https://url.spec.whatwg.org/#urlsearchparams) in the url living standard, * with several extensions for merging URLSearchParams objects: * - setAll() * - appendAll() * - replaceAll() * * This class accepts an optional second parameter of ${\@link QueryEncoder}, * which is used to serialize parameters before making a request. By default, * `QueryEncoder` encodes keys and values of parameters using `encodeURIComponent`, * and then un-encodes certain characters that are allowed to be part of the query * according to IETF RFC 3986: https://tools.ietf.org/html/rfc3986. * * These are the characters that are not encoded: `! $ \' ( ) * + , ; A 9 - . _ ~ ? /` * * If the set of allowed query characters is not acceptable for a particular backend, * `QueryEncoder` can be subclassed and provided as the 2nd argument to URLSearchParams. * * ``` * import {URLSearchParams, QueryEncoder} from '\@angular/http'; * class MyQueryEncoder extends QueryEncoder { * encodeKey(k: string): string { * return myEncodingFunction(k); * } * * encodeValue(v: string): string { * return myEncodingFunction(v); * } * } * * let params = new URLSearchParams('', new MyQueryEncoder()); * ``` * \@experimental */ export var URLSearchParams = (function () { /** * @param {?=} rawParams * @param {?=} queryEncoder */ function URLSearchParams(rawParams, queryEncoder) { if (rawParams === void 0) { rawParams = ''; } if (queryEncoder === void 0) { queryEncoder = new QueryEncoder(); } this.rawParams = rawParams; this.queryEncoder = queryEncoder; this.paramsMap = paramParser(rawParams); } /** * @return {?} */ URLSearchParams.prototype.clone = function () { var /** @type {?} */ clone = new URLSearchParams('', this.queryEncoder); clone.appendAll(this); return clone; }; /** * @param {?} param * @return {?} */ URLSearchParams.prototype.has = function (param) { return this.paramsMap.has(param); }; /** * @param {?} param * @return {?} */ URLSearchParams.prototype.get = function (param) { var /** @type {?} */ storedParam = this.paramsMap.get(param); return Array.isArray(storedParam) ? storedParam[0] : null; }; /** * @param {?} param * @return {?} */ URLSearchParams.prototype.getAll = function (param) { return this.paramsMap.get(param) || []; }; /** * @param {?} param * @param {?} val * @return {?} */ URLSearchParams.prototype.set = function (param, val) { if (val === void 0 || val === null) { this.delete(param); return; } var /** @type {?} */ list = this.paramsMap.get(param) || []; list.length = 0; list.push(val); this.paramsMap.set(param, list); }; /** * @param {?} searchParams * @return {?} */ URLSearchParams.prototype.setAll = function (searchParams) { var _this = this; searchParams.paramsMap.forEach(function (value, param) { var /** @type {?} */ list = _this.paramsMap.get(param) || []; list.length = 0; list.push(value[0]); _this.paramsMap.set(param, list); }); }; /** * @param {?} param * @param {?} val * @return {?} */ URLSearchParams.prototype.append = function (param, val) { if (val === void 0 || val === null) return; var /** @type {?} */ list = this.paramsMap.get(param) || []; list.push(val); this.paramsMap.set(param, list); }; /** * @param {?} searchParams * @return {?} */ URLSearchParams.prototype.appendAll = function (searchParams) { var _this = this; searchParams.paramsMap.forEach(function (value, param) { var /** @type {?} */ list = _this.paramsMap.get(param) || []; for (var /** @type {?} */ i = 0; i < value.length; ++i) { list.push(value[i]); } _this.paramsMap.set(param, list); }); }; /** * @param {?} searchParams * @return {?} */ URLSearchParams.prototype.replaceAll = function (searchParams) { var _this = this; searchParams.paramsMap.forEach(function (value, param) { var /** @type {?} */ list = _this.paramsMap.get(param) || []; list.length = 0; for (var /** @type {?} */ i = 0; i < value.length; ++i) { list.push(value[i]); } _this.paramsMap.set(param, list); }); }; /** * @return {?} */ URLSearchParams.prototype.toString = function () { var _this = this; var /** @type {?} */ paramsList = []; this.paramsMap.forEach(function (values, k) { values.forEach(function (v) { return paramsList.push(_this.queryEncoder.encodeKey(k) + '=' + _this.queryEncoder.encodeValue(v)); }); }); return paramsList.join('&'); }; /** * @param {?} param * @return {?} */ URLSearchParams.prototype.delete = function (param) { this.paramsMap.delete(param); }; return URLSearchParams; }()); function URLSearchParams_tsickle_Closure_declarations() { /** @type {?} */ URLSearchParams.prototype.paramsMap; /** @type {?} */ URLSearchParams.prototype.rawParams; /** @type {?} */ URLSearchParams.prototype.queryEncoder; } //# sourceMappingURL=url_search_params.js.map