@azure/core-client 1.10.2-alpha.20260306.4 → 1.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/browser/authorizeRequestOnTenantChallenge.js +1 -2
  2. package/dist/browser/authorizeRequestOnTenantChallenge.js.map +1 -1
  3. package/dist/browser/base64.d.ts +1 -5
  4. package/dist/browser/base64.js +6 -14
  5. package/dist/browser/base64.js.map +1 -1
  6. package/dist/browser/interfaceHelpers.js +1 -2
  7. package/dist/browser/interfaceHelpers.js.map +1 -1
  8. package/dist/browser/operationHelpers.js +8 -4
  9. package/dist/browser/operationHelpers.js.map +1 -1
  10. package/dist/browser/serializationPolicy.js +1 -1
  11. package/dist/browser/serializationPolicy.js.map +1 -1
  12. package/dist/browser/serializer.js +32 -11
  13. package/dist/browser/serializer.js.map +1 -1
  14. package/dist/browser/serviceClient.js +2 -2
  15. package/dist/browser/serviceClient.js.map +1 -1
  16. package/dist/browser/{state.d.ts → state-web.d.mts} +1 -1
  17. package/dist/browser/{state.js → state-web.mjs} +1 -1
  18. package/dist/browser/state-web.mjs.map +1 -0
  19. package/dist/browser/urlHelpers.js +2 -1
  20. package/dist/browser/urlHelpers.js.map +1 -1
  21. package/dist/commonjs/authorizeRequestOnTenantChallenge.js +1 -2
  22. package/dist/commonjs/authorizeRequestOnTenantChallenge.js.map +1 -1
  23. package/dist/commonjs/base64.d.ts +1 -1
  24. package/dist/commonjs/base64.js +6 -6
  25. package/dist/commonjs/base64.js.map +1 -1
  26. package/dist/commonjs/interfaceHelpers.js +1 -2
  27. package/dist/commonjs/interfaceHelpers.js.map +1 -1
  28. package/dist/commonjs/operationHelpers.js +10 -6
  29. package/dist/commonjs/operationHelpers.js.map +1 -1
  30. package/dist/commonjs/serializationPolicy.js +1 -1
  31. package/dist/commonjs/serializationPolicy.js.map +1 -1
  32. package/dist/commonjs/serializer.js +32 -11
  33. package/dist/commonjs/serializer.js.map +1 -1
  34. package/dist/commonjs/serviceClient.js +2 -2
  35. package/dist/commonjs/serviceClient.js.map +1 -1
  36. package/dist/commonjs/{state.d.ts → state-cjs.d.ts} +1 -1
  37. package/dist/commonjs/{state.js → state-cjs.js} +1 -1
  38. package/dist/commonjs/state-cjs.js.map +1 -0
  39. package/dist/commonjs/tsdoc-metadata.json +1 -1
  40. package/dist/commonjs/urlHelpers.js +2 -1
  41. package/dist/commonjs/urlHelpers.js.map +1 -1
  42. package/dist/esm/authorizeRequestOnClaimChallenge.js +67 -44
  43. package/dist/esm/authorizeRequestOnClaimChallenge.js.map +1 -7
  44. package/dist/esm/authorizeRequestOnTenantChallenge.js +97 -72
  45. package/dist/esm/authorizeRequestOnTenantChallenge.js.map +1 -7
  46. package/dist/esm/base64.d.ts +1 -1
  47. package/dist/esm/base64.js +32 -15
  48. package/dist/esm/base64.js.map +1 -7
  49. package/dist/esm/deserializationPolicy.js +202 -205
  50. package/dist/esm/deserializationPolicy.js.map +1 -7
  51. package/dist/esm/httpClientCache.js +8 -8
  52. package/dist/esm/httpClientCache.js.map +1 -7
  53. package/dist/esm/index.js +11 -31
  54. package/dist/esm/index.js.map +1 -7
  55. package/dist/esm/interfaceHelpers.js +34 -23
  56. package/dist/esm/interfaceHelpers.js.map +1 -7
  57. package/dist/esm/interfaces.js +11 -6
  58. package/dist/esm/interfaces.js.map +1 -7
  59. package/dist/esm/log.js +4 -4
  60. package/dist/esm/log.js.map +1 -7
  61. package/dist/esm/operationHelpers.js +86 -73
  62. package/dist/esm/operationHelpers.js.map +1 -7
  63. package/dist/esm/pipeline.js +23 -22
  64. package/dist/esm/pipeline.js.map +1 -7
  65. package/dist/esm/serializationPolicy.js +134 -163
  66. package/dist/esm/serializationPolicy.js.map +1 -7
  67. package/dist/esm/serializer.js +877 -812
  68. package/dist/esm/serializer.js.map +1 -7
  69. package/dist/esm/serviceClient.js +150 -151
  70. package/dist/esm/serviceClient.js.map +1 -7
  71. package/dist/esm/state-cjs.d.ts +8 -0
  72. package/dist/esm/state-cjs.js +9 -0
  73. package/dist/esm/state-cjs.js.map +1 -0
  74. package/dist/esm/state.js +10 -5
  75. package/dist/esm/state.js.map +1 -7
  76. package/dist/esm/urlHelpers.js +207 -199
  77. package/dist/esm/urlHelpers.js.map +1 -7
  78. package/dist/esm/utils.js +118 -64
  79. package/dist/esm/utils.js.map +1 -7
  80. package/dist/react-native/authorizeRequestOnTenantChallenge.js +1 -2
  81. package/dist/react-native/authorizeRequestOnTenantChallenge.js.map +1 -1
  82. package/dist/react-native/base64.d.ts +1 -1
  83. package/dist/react-native/base64.js +6 -6
  84. package/dist/react-native/base64.js.map +1 -1
  85. package/dist/react-native/interfaceHelpers.js +1 -2
  86. package/dist/react-native/interfaceHelpers.js.map +1 -1
  87. package/dist/react-native/operationHelpers.js +8 -4
  88. package/dist/react-native/operationHelpers.js.map +1 -1
  89. package/dist/react-native/serializationPolicy.js +1 -1
  90. package/dist/react-native/serializationPolicy.js.map +1 -1
  91. package/dist/react-native/serializer.js +32 -11
  92. package/dist/react-native/serializer.js.map +1 -1
  93. package/dist/react-native/serviceClient.js +2 -2
  94. package/dist/react-native/serviceClient.js.map +1 -1
  95. package/dist/react-native/state-web.d.mts +8 -0
  96. package/dist/react-native/state-web.mjs +9 -0
  97. package/dist/react-native/state-web.mjs.map +1 -0
  98. package/dist/react-native/urlHelpers.js +2 -1
  99. package/dist/react-native/urlHelpers.js.map +1 -1
  100. package/package.json +33 -19
  101. package/dist/browser/state.js.map +0 -1
  102. package/dist/commonjs/state.js.map +0 -1
  103. package/dist/react-native/state.d.ts +0 -8
  104. package/dist/react-native/state.js +0 -10
  105. package/dist/react-native/state.js.map +0 -1
@@ -1,226 +1,234 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
1
3
  import { getOperationArgumentValueFromParameter } from "./operationHelpers.js";
2
4
  import { getPathStringFromParameter } from "./interfaceHelpers.js";
3
5
  const CollectionFormatToDelimiterMap = {
4
- CSV: ",",
5
- SSV: " ",
6
- Multi: "Multi",
7
- TSV: " ",
8
- Pipes: "|"
6
+ CSV: ",",
7
+ SSV: " ",
8
+ Multi: "Multi",
9
+ TSV: "\t",
10
+ Pipes: "|",
9
11
  };
10
- function getRequestUrl(baseUri, operationSpec, operationArguments, fallbackObject) {
11
- const urlReplacements = calculateUrlReplacements(
12
- operationSpec,
13
- operationArguments,
14
- fallbackObject
15
- );
16
- let isAbsolutePath = false;
17
- let requestUrl = replaceAll(baseUri, urlReplacements);
18
- if (operationSpec.path) {
19
- let path = replaceAll(operationSpec.path, urlReplacements);
20
- if (operationSpec.path === "/{nextLink}" && path.startsWith("/")) {
21
- path = path.substring(1);
22
- }
23
- if (isAbsoluteUrl(path)) {
24
- requestUrl = path;
25
- isAbsolutePath = true;
26
- } else {
27
- requestUrl = appendPath(requestUrl, path);
12
+ export function getRequestUrl(baseUri, operationSpec, operationArguments, fallbackObject) {
13
+ const urlReplacements = calculateUrlReplacements(operationSpec, operationArguments, fallbackObject);
14
+ let isAbsolutePath = false;
15
+ let requestUrl = replaceAll(baseUri, urlReplacements);
16
+ if (operationSpec.path) {
17
+ let path = replaceAll(operationSpec.path, urlReplacements);
18
+ // QUIRK: sometimes we get a path component like /{nextLink}
19
+ // which may be a fully formed URL with a leading /. In that case, we should
20
+ // remove the leading /
21
+ if (operationSpec.path === "/{nextLink}" && path.startsWith("/")) {
22
+ path = path.substring(1);
23
+ }
24
+ // QUIRK: sometimes we get a path component like {nextLink}
25
+ // which may be a fully formed URL. In that case, we should
26
+ // ignore the baseUri.
27
+ if (isAbsoluteUrl(path)) {
28
+ requestUrl = path;
29
+ isAbsolutePath = true;
30
+ }
31
+ else {
32
+ requestUrl = appendPath(requestUrl, path);
33
+ }
28
34
  }
29
- }
30
- const { queryParams, sequenceParams } = calculateQueryParameters(
31
- operationSpec,
32
- operationArguments,
33
- fallbackObject
34
- );
35
- requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath);
36
- return requestUrl;
35
+ const { queryParams, sequenceParams } = calculateQueryParameters(operationSpec, operationArguments, fallbackObject);
36
+ /**
37
+ * Notice that this call sets the `noOverwrite` parameter to true if the `requestUrl`
38
+ * is an absolute path. This ensures that existing query parameter values in `requestUrl`
39
+ * do not get overwritten. On the other hand when `requestUrl` is not absolute path, it
40
+ * is still being built so there is nothing to overwrite.
41
+ */
42
+ requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath);
43
+ return requestUrl;
37
44
  }
38
45
  function replaceAll(input, replacements) {
39
- let result = input;
40
- for (const [searchValue, replaceValue] of replacements) {
41
- result = result.split(searchValue).join(replaceValue);
42
- }
43
- return result;
46
+ let result = input;
47
+ for (const [searchValue, replaceValue] of replacements) {
48
+ result = result.split(searchValue).join(replaceValue);
49
+ }
50
+ return result;
44
51
  }
45
52
  function calculateUrlReplacements(operationSpec, operationArguments, fallbackObject) {
46
- const result = /* @__PURE__ */ new Map();
47
- if (operationSpec.urlParameters?.length) {
48
- for (const urlParameter of operationSpec.urlParameters) {
49
- let urlParameterValue = getOperationArgumentValueFromParameter(
50
- operationArguments,
51
- urlParameter,
52
- fallbackObject
53
- );
54
- const parameterPathString = getPathStringFromParameter(urlParameter);
55
- urlParameterValue = operationSpec.serializer.serialize(
56
- urlParameter.mapper,
57
- urlParameterValue,
58
- parameterPathString
59
- );
60
- if (!urlParameter.skipEncoding) {
61
- urlParameterValue = encodeURIComponent(urlParameterValue);
62
- }
63
- result.set(
64
- `{${urlParameter.mapper.serializedName || parameterPathString}}`,
65
- urlParameterValue
66
- );
53
+ const result = new Map();
54
+ if (operationSpec.urlParameters?.length) {
55
+ for (const urlParameter of operationSpec.urlParameters) {
56
+ let urlParameterValue = getOperationArgumentValueFromParameter(operationArguments, urlParameter, fallbackObject);
57
+ const parameterPathString = getPathStringFromParameter(urlParameter);
58
+ urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, parameterPathString);
59
+ if (!urlParameter.skipEncoding) {
60
+ urlParameterValue = encodeURIComponent(urlParameterValue);
61
+ }
62
+ result.set(`{${urlParameter.mapper.serializedName || parameterPathString}}`, urlParameterValue);
63
+ }
67
64
  }
68
- }
69
- return result;
65
+ return result;
70
66
  }
71
67
  function isAbsoluteUrl(url) {
72
- return url.includes("://");
68
+ return url.includes("://");
73
69
  }
74
70
  function appendPath(url, pathToAppend) {
75
- if (!pathToAppend) {
76
- return url;
77
- }
78
- const parsedUrl = new URL(url);
79
- let newPath = parsedUrl.pathname;
80
- if (!newPath.endsWith("/")) {
81
- newPath = `${newPath}/`;
82
- }
83
- if (pathToAppend.startsWith("/")) {
84
- pathToAppend = pathToAppend.substring(1);
85
- }
86
- const searchStart = pathToAppend.indexOf("?");
87
- if (searchStart !== -1) {
88
- const path = pathToAppend.substring(0, searchStart);
89
- const search = pathToAppend.substring(searchStart + 1);
90
- newPath = newPath + path;
91
- if (search) {
92
- parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search;
71
+ if (!pathToAppend) {
72
+ return url;
73
+ }
74
+ const parsedUrl = new URL(url);
75
+ let newPath = parsedUrl.pathname;
76
+ if (!newPath.endsWith("/")) {
77
+ newPath = `${newPath}/`;
93
78
  }
94
- } else {
95
- newPath = newPath + pathToAppend;
96
- }
97
- parsedUrl.pathname = newPath;
98
- return parsedUrl.toString();
79
+ if (pathToAppend.startsWith("/")) {
80
+ pathToAppend = pathToAppend.substring(1);
81
+ }
82
+ const searchStart = pathToAppend.indexOf("?");
83
+ if (searchStart !== -1) {
84
+ const path = pathToAppend.substring(0, searchStart);
85
+ const search = pathToAppend.substring(searchStart + 1);
86
+ newPath = newPath + path;
87
+ if (search) {
88
+ parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search;
89
+ }
90
+ }
91
+ else {
92
+ newPath = newPath + pathToAppend;
93
+ }
94
+ // Use Object.assign to bypass react-native's incorrect readonly URL.pathname declaration
95
+ Object.assign(parsedUrl, { pathname: newPath });
96
+ return parsedUrl.toString();
99
97
  }
100
98
  function calculateQueryParameters(operationSpec, operationArguments, fallbackObject) {
101
- const result = /* @__PURE__ */ new Map();
102
- const sequenceParams = /* @__PURE__ */ new Set();
103
- if (operationSpec.queryParameters?.length) {
104
- for (const queryParameter of operationSpec.queryParameters) {
105
- if (queryParameter.mapper.type.name === "Sequence" && queryParameter.mapper.serializedName) {
106
- sequenceParams.add(queryParameter.mapper.serializedName);
107
- }
108
- let queryParameterValue = getOperationArgumentValueFromParameter(
109
- operationArguments,
110
- queryParameter,
111
- fallbackObject
112
- );
113
- if (queryParameterValue !== void 0 && queryParameterValue !== null || queryParameter.mapper.required) {
114
- queryParameterValue = operationSpec.serializer.serialize(
115
- queryParameter.mapper,
116
- queryParameterValue,
117
- getPathStringFromParameter(queryParameter)
118
- );
119
- const delimiter = queryParameter.collectionFormat ? CollectionFormatToDelimiterMap[queryParameter.collectionFormat] : "";
120
- if (Array.isArray(queryParameterValue)) {
121
- queryParameterValue = queryParameterValue.map((item) => {
122
- if (item === null || item === void 0) {
123
- return "";
99
+ const result = new Map();
100
+ const sequenceParams = new Set();
101
+ if (operationSpec.queryParameters?.length) {
102
+ for (const queryParameter of operationSpec.queryParameters) {
103
+ if (queryParameter.mapper.type.name === "Sequence" && queryParameter.mapper.serializedName) {
104
+ sequenceParams.add(queryParameter.mapper.serializedName);
105
+ }
106
+ let queryParameterValue = getOperationArgumentValueFromParameter(operationArguments, queryParameter, fallbackObject);
107
+ if ((queryParameterValue !== undefined && queryParameterValue !== null) ||
108
+ queryParameter.mapper.required) {
109
+ queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, getPathStringFromParameter(queryParameter));
110
+ const delimiter = queryParameter.collectionFormat
111
+ ? CollectionFormatToDelimiterMap[queryParameter.collectionFormat]
112
+ : "";
113
+ if (Array.isArray(queryParameterValue)) {
114
+ // replace null and undefined
115
+ queryParameterValue = queryParameterValue.map((item) => {
116
+ if (item === null || item === undefined) {
117
+ return "";
118
+ }
119
+ return item;
120
+ });
121
+ }
122
+ if (queryParameter.collectionFormat === "Multi" && queryParameterValue.length === 0) {
123
+ continue;
124
+ }
125
+ else if (Array.isArray(queryParameterValue) &&
126
+ (queryParameter.collectionFormat === "SSV" || queryParameter.collectionFormat === "TSV")) {
127
+ queryParameterValue = queryParameterValue.join(delimiter);
128
+ }
129
+ if (!queryParameter.skipEncoding) {
130
+ if (Array.isArray(queryParameterValue)) {
131
+ queryParameterValue = queryParameterValue.map((item) => {
132
+ return encodeURIComponent(item);
133
+ });
134
+ }
135
+ else {
136
+ queryParameterValue = encodeURIComponent(queryParameterValue);
137
+ }
138
+ }
139
+ // Join pipes and CSV *after* encoding, or the server will be upset.
140
+ if (Array.isArray(queryParameterValue) &&
141
+ (queryParameter.collectionFormat === "CSV" || queryParameter.collectionFormat === "Pipes")) {
142
+ queryParameterValue = queryParameterValue.join(delimiter);
143
+ }
144
+ result.set(queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter), queryParameterValue);
124
145
  }
125
- return item;
126
- });
127
- }
128
- if (queryParameter.collectionFormat === "Multi" && queryParameterValue.length === 0) {
129
- continue;
130
- } else if (Array.isArray(queryParameterValue) && (queryParameter.collectionFormat === "SSV" || queryParameter.collectionFormat === "TSV")) {
131
- queryParameterValue = queryParameterValue.join(delimiter);
132
- }
133
- if (!queryParameter.skipEncoding) {
134
- if (Array.isArray(queryParameterValue)) {
135
- queryParameterValue = queryParameterValue.map((item) => {
136
- return encodeURIComponent(item);
137
- });
138
- } else {
139
- queryParameterValue = encodeURIComponent(queryParameterValue);
140
- }
141
- }
142
- if (Array.isArray(queryParameterValue) && (queryParameter.collectionFormat === "CSV" || queryParameter.collectionFormat === "Pipes")) {
143
- queryParameterValue = queryParameterValue.join(delimiter);
144
146
  }
145
- result.set(
146
- queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter),
147
- queryParameterValue
148
- );
149
- }
150
147
  }
151
- }
152
- return {
153
- queryParams: result,
154
- sequenceParams
155
- };
148
+ return {
149
+ queryParams: result,
150
+ sequenceParams,
151
+ };
156
152
  }
157
153
  function simpleParseQueryParams(queryString) {
158
- const result = /* @__PURE__ */ new Map();
159
- if (!queryString || queryString[0] !== "?") {
160
- return result;
161
- }
162
- queryString = queryString.slice(1);
163
- const pairs = queryString.split("&");
164
- for (const pair of pairs) {
165
- const [name, value] = pair.split("=", 2);
166
- const existingValue = result.get(name);
167
- if (existingValue) {
168
- if (Array.isArray(existingValue)) {
169
- existingValue.push(value);
170
- } else {
171
- result.set(name, [existingValue, value]);
172
- }
173
- } else {
174
- result.set(name, value);
154
+ const result = new Map();
155
+ if (!queryString || queryString[0] !== "?") {
156
+ return result;
175
157
  }
176
- }
177
- return result;
158
+ // remove the leading ?
159
+ queryString = queryString.slice(1);
160
+ const pairs = queryString.split("&");
161
+ for (const pair of pairs) {
162
+ const [name, value] = pair.split("=", 2);
163
+ const existingValue = result.get(name);
164
+ if (existingValue) {
165
+ if (Array.isArray(existingValue)) {
166
+ existingValue.push(value);
167
+ }
168
+ else {
169
+ result.set(name, [existingValue, value]);
170
+ }
171
+ }
172
+ else {
173
+ result.set(name, value);
174
+ }
175
+ }
176
+ return result;
178
177
  }
179
- function appendQueryParams(url, queryParams, sequenceParams, noOverwrite = false) {
180
- if (queryParams.size === 0) {
181
- return url;
182
- }
183
- const parsedUrl = new URL(url);
184
- const combinedParams = simpleParseQueryParams(parsedUrl.search);
185
- for (const [name, value] of queryParams) {
186
- const existingValue = combinedParams.get(name);
187
- if (Array.isArray(existingValue)) {
188
- if (Array.isArray(value)) {
189
- existingValue.push(...value);
190
- const valueSet = new Set(existingValue);
191
- combinedParams.set(name, Array.from(valueSet));
192
- } else {
193
- existingValue.push(value);
194
- }
195
- } else if (existingValue) {
196
- if (Array.isArray(value)) {
197
- value.unshift(existingValue);
198
- } else if (sequenceParams.has(name)) {
199
- combinedParams.set(name, [existingValue, value]);
200
- }
201
- if (!noOverwrite) {
202
- combinedParams.set(name, value);
203
- }
204
- } else {
205
- combinedParams.set(name, value);
178
+ /** @internal */
179
+ export function appendQueryParams(url, queryParams, sequenceParams, noOverwrite = false) {
180
+ if (queryParams.size === 0) {
181
+ return url;
206
182
  }
207
- }
208
- const searchPieces = [];
209
- for (const [name, value] of combinedParams) {
210
- if (typeof value === "string") {
211
- searchPieces.push(`${name}=${value}`);
212
- } else if (Array.isArray(value)) {
213
- for (const subValue of value) {
214
- searchPieces.push(`${name}=${subValue}`);
215
- }
216
- } else {
217
- searchPieces.push(`${name}=${value}`);
183
+ const parsedUrl = new URL(url);
184
+ // QUIRK: parsedUrl.searchParams will have their name/value pairs decoded, which
185
+ // can change their meaning to the server, such as in the case of a SAS signature.
186
+ // To avoid accidentally un-encoding a query param, we parse the key/values ourselves
187
+ const combinedParams = simpleParseQueryParams(parsedUrl.search);
188
+ for (const [name, value] of queryParams) {
189
+ const existingValue = combinedParams.get(name);
190
+ if (Array.isArray(existingValue)) {
191
+ if (Array.isArray(value)) {
192
+ existingValue.push(...value);
193
+ const valueSet = new Set(existingValue);
194
+ combinedParams.set(name, Array.from(valueSet));
195
+ }
196
+ else {
197
+ existingValue.push(value);
198
+ }
199
+ }
200
+ else if (existingValue) {
201
+ if (Array.isArray(value)) {
202
+ value.unshift(existingValue);
203
+ }
204
+ else if (sequenceParams.has(name)) {
205
+ combinedParams.set(name, [existingValue, value]);
206
+ }
207
+ if (!noOverwrite) {
208
+ combinedParams.set(name, value);
209
+ }
210
+ }
211
+ else {
212
+ combinedParams.set(name, value);
213
+ }
218
214
  }
219
- }
220
- parsedUrl.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
221
- return parsedUrl.toString();
215
+ const searchPieces = [];
216
+ for (const [name, value] of combinedParams) {
217
+ if (typeof value === "string") {
218
+ searchPieces.push(`${name}=${value}`);
219
+ }
220
+ else if (Array.isArray(value)) {
221
+ // QUIRK: If we get an array of values, include multiple key/value pairs
222
+ for (const subValue of value) {
223
+ searchPieces.push(`${name}=${subValue}`);
224
+ }
225
+ }
226
+ else {
227
+ searchPieces.push(`${name}=${value}`);
228
+ }
229
+ }
230
+ // QUIRK: we have to set search manually as searchParams will encode comma when it shouldn't.
231
+ parsedUrl.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
232
+ return parsedUrl.toString();
222
233
  }
223
- export {
224
- appendQueryParams,
225
- getRequestUrl
226
- };
234
+ //# sourceMappingURL=urlHelpers.js.map
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["/mnt/vss/_work/1/s/sdk/core/core-client/src/urlHelpers.ts"],
4
- "sourcesContent": ["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { OperationArguments, OperationSpec, QueryCollectionFormat } from \"./interfaces.js\";\nimport { getOperationArgumentValueFromParameter } from \"./operationHelpers.js\";\nimport { getPathStringFromParameter } from \"./interfaceHelpers.js\";\n\nconst CollectionFormatToDelimiterMap: { [key in QueryCollectionFormat]: string } = {\n CSV: \",\",\n SSV: \" \",\n Multi: \"Multi\",\n TSV: \"\\t\",\n Pipes: \"|\",\n};\n\nexport function getRequestUrl(\n baseUri: string,\n operationSpec: OperationSpec,\n operationArguments: OperationArguments,\n fallbackObject: { [parameterName: string]: any },\n): string {\n const urlReplacements = calculateUrlReplacements(\n operationSpec,\n operationArguments,\n fallbackObject,\n );\n\n let isAbsolutePath = false;\n\n let requestUrl = replaceAll(baseUri, urlReplacements);\n if (operationSpec.path) {\n let path = replaceAll(operationSpec.path, urlReplacements);\n // QUIRK: sometimes we get a path component like /{nextLink}\n // which may be a fully formed URL with a leading /. In that case, we should\n // remove the leading /\n if (operationSpec.path === \"/{nextLink}\" && path.startsWith(\"/\")) {\n path = path.substring(1);\n }\n // QUIRK: sometimes we get a path component like {nextLink}\n // which may be a fully formed URL. In that case, we should\n // ignore the baseUri.\n if (isAbsoluteUrl(path)) {\n requestUrl = path;\n isAbsolutePath = true;\n } else {\n requestUrl = appendPath(requestUrl, path);\n }\n }\n\n const { queryParams, sequenceParams } = calculateQueryParameters(\n operationSpec,\n operationArguments,\n fallbackObject,\n );\n /**\n * Notice that this call sets the `noOverwrite` parameter to true if the `requestUrl`\n * is an absolute path. This ensures that existing query parameter values in `requestUrl`\n * do not get overwritten. On the other hand when `requestUrl` is not absolute path, it\n * is still being built so there is nothing to overwrite.\n */\n requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath);\n\n return requestUrl;\n}\n\nfunction replaceAll(input: string, replacements: Map<string, string>): string {\n let result = input;\n for (const [searchValue, replaceValue] of replacements) {\n result = result.split(searchValue).join(replaceValue);\n }\n return result;\n}\n\nfunction calculateUrlReplacements(\n operationSpec: OperationSpec,\n operationArguments: OperationArguments,\n fallbackObject: { [parameterName: string]: any },\n): Map<string, string> {\n const result = new Map<string, string>();\n if (operationSpec.urlParameters?.length) {\n for (const urlParameter of operationSpec.urlParameters) {\n let urlParameterValue: string = getOperationArgumentValueFromParameter(\n operationArguments,\n urlParameter,\n fallbackObject,\n );\n const parameterPathString = getPathStringFromParameter(urlParameter);\n urlParameterValue = operationSpec.serializer.serialize(\n urlParameter.mapper,\n urlParameterValue,\n parameterPathString,\n );\n if (!urlParameter.skipEncoding) {\n urlParameterValue = encodeURIComponent(urlParameterValue);\n }\n result.set(\n `{${urlParameter.mapper.serializedName || parameterPathString}}`,\n urlParameterValue,\n );\n }\n }\n return result;\n}\n\nfunction isAbsoluteUrl(url: string): boolean {\n return url.includes(\"://\");\n}\n\nfunction appendPath(url: string, pathToAppend?: string): string {\n if (!pathToAppend) {\n return url;\n }\n\n const parsedUrl = new URL(url);\n let newPath = parsedUrl.pathname;\n\n if (!newPath.endsWith(\"/\")) {\n newPath = `${newPath}/`;\n }\n\n if (pathToAppend.startsWith(\"/\")) {\n pathToAppend = pathToAppend.substring(1);\n }\n\n const searchStart = pathToAppend.indexOf(\"?\");\n if (searchStart !== -1) {\n const path = pathToAppend.substring(0, searchStart);\n const search = pathToAppend.substring(searchStart + 1);\n newPath = newPath + path;\n if (search) {\n parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search;\n }\n } else {\n newPath = newPath + pathToAppend;\n }\n\n parsedUrl.pathname = newPath;\n\n return parsedUrl.toString();\n}\n\nfunction calculateQueryParameters(\n operationSpec: OperationSpec,\n operationArguments: OperationArguments,\n fallbackObject: { [parameterName: string]: any },\n): {\n queryParams: Map<string, string | string[]>;\n sequenceParams: Set<string>;\n} {\n const result = new Map<string, string | string[]>();\n const sequenceParams: Set<string> = new Set<string>();\n\n if (operationSpec.queryParameters?.length) {\n for (const queryParameter of operationSpec.queryParameters) {\n if (queryParameter.mapper.type.name === \"Sequence\" && queryParameter.mapper.serializedName) {\n sequenceParams.add(queryParameter.mapper.serializedName);\n }\n let queryParameterValue: string | string[] = getOperationArgumentValueFromParameter(\n operationArguments,\n queryParameter,\n fallbackObject,\n );\n if (\n (queryParameterValue !== undefined && queryParameterValue !== null) ||\n queryParameter.mapper.required\n ) {\n queryParameterValue = operationSpec.serializer.serialize(\n queryParameter.mapper,\n queryParameterValue,\n getPathStringFromParameter(queryParameter),\n );\n\n const delimiter = queryParameter.collectionFormat\n ? CollectionFormatToDelimiterMap[queryParameter.collectionFormat]\n : \"\";\n if (Array.isArray(queryParameterValue)) {\n // replace null and undefined\n queryParameterValue = queryParameterValue.map((item) => {\n if (item === null || item === undefined) {\n return \"\";\n }\n\n return item;\n });\n }\n if (queryParameter.collectionFormat === \"Multi\" && queryParameterValue.length === 0) {\n continue;\n } else if (\n Array.isArray(queryParameterValue) &&\n (queryParameter.collectionFormat === \"SSV\" || queryParameter.collectionFormat === \"TSV\")\n ) {\n queryParameterValue = queryParameterValue.join(delimiter);\n }\n if (!queryParameter.skipEncoding) {\n if (Array.isArray(queryParameterValue)) {\n queryParameterValue = queryParameterValue.map((item: string) => {\n return encodeURIComponent(item);\n });\n } else {\n queryParameterValue = encodeURIComponent(queryParameterValue);\n }\n }\n\n // Join pipes and CSV *after* encoding, or the server will be upset.\n if (\n Array.isArray(queryParameterValue) &&\n (queryParameter.collectionFormat === \"CSV\" || queryParameter.collectionFormat === \"Pipes\")\n ) {\n queryParameterValue = queryParameterValue.join(delimiter);\n }\n\n result.set(\n queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter),\n queryParameterValue,\n );\n }\n }\n }\n return {\n queryParams: result,\n sequenceParams,\n };\n}\n\nfunction simpleParseQueryParams(queryString: string): Map<string, string | string[] | undefined> {\n const result: Map<string, string | string[] | undefined> = new Map<\n string,\n string | string[] | undefined\n >();\n if (!queryString || queryString[0] !== \"?\") {\n return result;\n }\n\n // remove the leading ?\n queryString = queryString.slice(1);\n const pairs = queryString.split(\"&\");\n\n for (const pair of pairs) {\n const [name, value] = pair.split(\"=\", 2);\n const existingValue = result.get(name);\n if (existingValue) {\n if (Array.isArray(existingValue)) {\n existingValue.push(value);\n } else {\n result.set(name, [existingValue, value]);\n }\n } else {\n result.set(name, value);\n }\n }\n\n return result;\n}\n\n/** @internal */\nexport function appendQueryParams(\n url: string,\n queryParams: Map<string, string | string[]>,\n sequenceParams: Set<string>,\n noOverwrite: boolean = false,\n): string {\n if (queryParams.size === 0) {\n return url;\n }\n\n const parsedUrl = new URL(url);\n\n // QUIRK: parsedUrl.searchParams will have their name/value pairs decoded, which\n // can change their meaning to the server, such as in the case of a SAS signature.\n // To avoid accidentally un-encoding a query param, we parse the key/values ourselves\n const combinedParams = simpleParseQueryParams(parsedUrl.search);\n\n for (const [name, value] of queryParams) {\n const existingValue = combinedParams.get(name);\n if (Array.isArray(existingValue)) {\n if (Array.isArray(value)) {\n existingValue.push(...value);\n const valueSet = new Set(existingValue);\n combinedParams.set(name, Array.from(valueSet));\n } else {\n existingValue.push(value);\n }\n } else if (existingValue) {\n if (Array.isArray(value)) {\n value.unshift(existingValue);\n } else if (sequenceParams.has(name)) {\n combinedParams.set(name, [existingValue, value]);\n }\n if (!noOverwrite) {\n combinedParams.set(name, value);\n }\n } else {\n combinedParams.set(name, value);\n }\n }\n\n const searchPieces: string[] = [];\n for (const [name, value] of combinedParams) {\n if (typeof value === \"string\") {\n searchPieces.push(`${name}=${value}`);\n } else if (Array.isArray(value)) {\n // QUIRK: If we get an array of values, include multiple key/value pairs\n for (const subValue of value) {\n searchPieces.push(`${name}=${subValue}`);\n }\n } else {\n searchPieces.push(`${name}=${value}`);\n }\n }\n\n // QUIRK: we have to set search manually as searchParams will encode comma when it shouldn't.\n parsedUrl.search = searchPieces.length ? `?${searchPieces.join(\"&\")}` : \"\";\n return parsedUrl.toString();\n}\n"],
5
- "mappings": "AAIA,SAAS,8CAA8C;AACvD,SAAS,kCAAkC;AAE3C,MAAM,iCAA6E;AAAA,EACjF,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AACT;AAEO,SAAS,cACd,SACA,eACA,oBACA,gBACQ;AACR,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,iBAAiB;AAErB,MAAI,aAAa,WAAW,SAAS,eAAe;AACpD,MAAI,cAAc,MAAM;AACtB,QAAI,OAAO,WAAW,cAAc,MAAM,eAAe;AAIzD,QAAI,cAAc,SAAS,iBAAiB,KAAK,WAAW,GAAG,GAAG;AAChE,aAAO,KAAK,UAAU,CAAC;AAAA,IACzB;AAIA,QAAI,cAAc,IAAI,GAAG;AACvB,mBAAa;AACb,uBAAiB;AAAA,IACnB,OAAO;AACL,mBAAa,WAAW,YAAY,IAAI;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,EAAE,aAAa,eAAe,IAAI;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAOA,eAAa,kBAAkB,YAAY,aAAa,gBAAgB,cAAc;AAEtF,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,cAA2C;AAC5E,MAAI,SAAS;AACb,aAAW,CAAC,aAAa,YAAY,KAAK,cAAc;AACtD,aAAS,OAAO,MAAM,WAAW,EAAE,KAAK,YAAY;AAAA,EACtD;AACA,SAAO;AACT;AAEA,SAAS,yBACP,eACA,oBACA,gBACqB;AACrB,QAAM,SAAS,oBAAI,IAAoB;AACvC,MAAI,cAAc,eAAe,QAAQ;AACvC,eAAW,gBAAgB,cAAc,eAAe;AACtD,UAAI,oBAA4B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,sBAAsB,2BAA2B,YAAY;AACnE,0BAAoB,cAAc,WAAW;AAAA,QAC3C,aAAa;AAAA,QACb;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,aAAa,cAAc;AAC9B,4BAAoB,mBAAmB,iBAAiB;AAAA,MAC1D;AACA,aAAO;AAAA,QACL,IAAI,aAAa,OAAO,kBAAkB,mBAAmB;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAAsB;AAC3C,SAAO,IAAI,SAAS,KAAK;AAC3B;AAEA,SAAS,WAAW,KAAa,cAA+B;AAC9D,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,IAAI,IAAI,GAAG;AAC7B,MAAI,UAAU,UAAU;AAExB,MAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,cAAU,GAAG,OAAO;AAAA,EACtB;AAEA,MAAI,aAAa,WAAW,GAAG,GAAG;AAChC,mBAAe,aAAa,UAAU,CAAC;AAAA,EACzC;AAEA,QAAM,cAAc,aAAa,QAAQ,GAAG;AAC5C,MAAI,gBAAgB,IAAI;AACtB,UAAM,OAAO,aAAa,UAAU,GAAG,WAAW;AAClD,UAAM,SAAS,aAAa,UAAU,cAAc,CAAC;AACrD,cAAU,UAAU;AACpB,QAAI,QAAQ;AACV,gBAAU,SAAS,UAAU,SAAS,GAAG,UAAU,MAAM,IAAI,MAAM,KAAK;AAAA,IAC1E;AAAA,EACF,OAAO;AACL,cAAU,UAAU;AAAA,EACtB;AAEA,YAAU,WAAW;AAErB,SAAO,UAAU,SAAS;AAC5B;AAEA,SAAS,yBACP,eACA,oBACA,gBAIA;AACA,QAAM,SAAS,oBAAI,IAA+B;AAClD,QAAM,iBAA8B,oBAAI,IAAY;AAEpD,MAAI,cAAc,iBAAiB,QAAQ;AACzC,eAAW,kBAAkB,cAAc,iBAAiB;AAC1D,UAAI,eAAe,OAAO,KAAK,SAAS,cAAc,eAAe,OAAO,gBAAgB;AAC1F,uBAAe,IAAI,eAAe,OAAO,cAAc;AAAA,MACzD;AACA,UAAI,sBAAyC;AAAA,QAC3C;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UACG,wBAAwB,UAAa,wBAAwB,QAC9D,eAAe,OAAO,UACtB;AACA,8BAAsB,cAAc,WAAW;AAAA,UAC7C,eAAe;AAAA,UACf;AAAA,UACA,2BAA2B,cAAc;AAAA,QAC3C;AAEA,cAAM,YAAY,eAAe,mBAC7B,+BAA+B,eAAe,gBAAgB,IAC9D;AACJ,YAAI,MAAM,QAAQ,mBAAmB,GAAG;AAEtC,gCAAsB,oBAAoB,IAAI,CAAC,SAAS;AACtD,gBAAI,SAAS,QAAQ,SAAS,QAAW;AACvC,qBAAO;AAAA,YACT;AAEA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA,YAAI,eAAe,qBAAqB,WAAW,oBAAoB,WAAW,GAAG;AACnF;AAAA,QACF,WACE,MAAM,QAAQ,mBAAmB,MAChC,eAAe,qBAAqB,SAAS,eAAe,qBAAqB,QAClF;AACA,gCAAsB,oBAAoB,KAAK,SAAS;AAAA,QAC1D;AACA,YAAI,CAAC,eAAe,cAAc;AAChC,cAAI,MAAM,QAAQ,mBAAmB,GAAG;AACtC,kCAAsB,oBAAoB,IAAI,CAAC,SAAiB;AAC9D,qBAAO,mBAAmB,IAAI;AAAA,YAChC,CAAC;AAAA,UACH,OAAO;AACL,kCAAsB,mBAAmB,mBAAmB;AAAA,UAC9D;AAAA,QACF;AAGA,YACE,MAAM,QAAQ,mBAAmB,MAChC,eAAe,qBAAqB,SAAS,eAAe,qBAAqB,UAClF;AACA,gCAAsB,oBAAoB,KAAK,SAAS;AAAA,QAC1D;AAEA,eAAO;AAAA,UACL,eAAe,OAAO,kBAAkB,2BAA2B,cAAc;AAAA,UACjF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,aAAiE;AAC/F,QAAM,SAAqD,oBAAI,IAG7D;AACF,MAAI,CAAC,eAAe,YAAY,CAAC,MAAM,KAAK;AAC1C,WAAO;AAAA,EACT;AAGA,gBAAc,YAAY,MAAM,CAAC;AACjC,QAAM,QAAQ,YAAY,MAAM,GAAG;AAEnC,aAAW,QAAQ,OAAO;AACxB,UAAM,CAAC,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,CAAC;AACvC,UAAM,gBAAgB,OAAO,IAAI,IAAI;AACrC,QAAI,eAAe;AACjB,UAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,sBAAc,KAAK,KAAK;AAAA,MAC1B,OAAO;AACL,eAAO,IAAI,MAAM,CAAC,eAAe,KAAK,CAAC;AAAA,MACzC;AAAA,IACF,OAAO;AACL,aAAO,IAAI,MAAM,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,kBACd,KACA,aACA,gBACA,cAAuB,OACf;AACR,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,IAAI,IAAI,GAAG;AAK7B,QAAM,iBAAiB,uBAAuB,UAAU,MAAM;AAE9D,aAAW,CAAC,MAAM,KAAK,KAAK,aAAa;AACvC,UAAM,gBAAgB,eAAe,IAAI,IAAI;AAC7C,QAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,sBAAc,KAAK,GAAG,KAAK;AAC3B,cAAM,WAAW,IAAI,IAAI,aAAa;AACtC,uBAAe,IAAI,MAAM,MAAM,KAAK,QAAQ,CAAC;AAAA,MAC/C,OAAO;AACL,sBAAc,KAAK,KAAK;AAAA,MAC1B;AAAA,IACF,WAAW,eAAe;AACxB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,QAAQ,aAAa;AAAA,MAC7B,WAAW,eAAe,IAAI,IAAI,GAAG;AACnC,uBAAe,IAAI,MAAM,CAAC,eAAe,KAAK,CAAC;AAAA,MACjD;AACA,UAAI,CAAC,aAAa;AAChB,uBAAe,IAAI,MAAM,KAAK;AAAA,MAChC;AAAA,IACF,OAAO;AACL,qBAAe,IAAI,MAAM,KAAK;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,eAAyB,CAAC;AAChC,aAAW,CAAC,MAAM,KAAK,KAAK,gBAAgB;AAC1C,QAAI,OAAO,UAAU,UAAU;AAC7B,mBAAa,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE;AAAA,IACtC,WAAW,MAAM,QAAQ,KAAK,GAAG;AAE/B,iBAAW,YAAY,OAAO;AAC5B,qBAAa,KAAK,GAAG,IAAI,IAAI,QAAQ,EAAE;AAAA,MACzC;AAAA,IACF,OAAO;AACL,mBAAa,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE;AAAA,IACtC;AAAA,EACF;AAGA,YAAU,SAAS,aAAa,SAAS,IAAI,aAAa,KAAK,GAAG,CAAC,KAAK;AACxE,SAAO,UAAU,SAAS;AAC5B;",
6
- "names": []
7
- }
1
+ {"version":3,"file":"urlHelpers.js","sourceRoot":"","sources":["../../src/urlHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { OperationArguments, OperationSpec, QueryCollectionFormat } from \"./interfaces.js\";\nimport { getOperationArgumentValueFromParameter } from \"./operationHelpers.js\";\nimport { getPathStringFromParameter } from \"./interfaceHelpers.js\";\n\nconst CollectionFormatToDelimiterMap: { [key in QueryCollectionFormat]: string } = {\n CSV: \",\",\n SSV: \" \",\n Multi: \"Multi\",\n TSV: \"\\t\",\n Pipes: \"|\",\n};\n\nexport function getRequestUrl(\n baseUri: string,\n operationSpec: OperationSpec,\n operationArguments: OperationArguments,\n fallbackObject: { [parameterName: string]: any },\n): string {\n const urlReplacements = calculateUrlReplacements(\n operationSpec,\n operationArguments,\n fallbackObject,\n );\n\n let isAbsolutePath = false;\n\n let requestUrl = replaceAll(baseUri, urlReplacements);\n if (operationSpec.path) {\n let path = replaceAll(operationSpec.path, urlReplacements);\n // QUIRK: sometimes we get a path component like /{nextLink}\n // which may be a fully formed URL with a leading /. In that case, we should\n // remove the leading /\n if (operationSpec.path === \"/{nextLink}\" && path.startsWith(\"/\")) {\n path = path.substring(1);\n }\n // QUIRK: sometimes we get a path component like {nextLink}\n // which may be a fully formed URL. In that case, we should\n // ignore the baseUri.\n if (isAbsoluteUrl(path)) {\n requestUrl = path;\n isAbsolutePath = true;\n } else {\n requestUrl = appendPath(requestUrl, path);\n }\n }\n\n const { queryParams, sequenceParams } = calculateQueryParameters(\n operationSpec,\n operationArguments,\n fallbackObject,\n );\n /**\n * Notice that this call sets the `noOverwrite` parameter to true if the `requestUrl`\n * is an absolute path. This ensures that existing query parameter values in `requestUrl`\n * do not get overwritten. On the other hand when `requestUrl` is not absolute path, it\n * is still being built so there is nothing to overwrite.\n */\n requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath);\n\n return requestUrl;\n}\n\nfunction replaceAll(input: string, replacements: Map<string, string>): string {\n let result = input;\n for (const [searchValue, replaceValue] of replacements) {\n result = result.split(searchValue).join(replaceValue);\n }\n return result;\n}\n\nfunction calculateUrlReplacements(\n operationSpec: OperationSpec,\n operationArguments: OperationArguments,\n fallbackObject: { [parameterName: string]: any },\n): Map<string, string> {\n const result = new Map<string, string>();\n if (operationSpec.urlParameters?.length) {\n for (const urlParameter of operationSpec.urlParameters) {\n let urlParameterValue: string = getOperationArgumentValueFromParameter(\n operationArguments,\n urlParameter,\n fallbackObject,\n );\n const parameterPathString = getPathStringFromParameter(urlParameter);\n urlParameterValue = operationSpec.serializer.serialize(\n urlParameter.mapper,\n urlParameterValue,\n parameterPathString,\n );\n if (!urlParameter.skipEncoding) {\n urlParameterValue = encodeURIComponent(urlParameterValue);\n }\n result.set(\n `{${urlParameter.mapper.serializedName || parameterPathString}}`,\n urlParameterValue,\n );\n }\n }\n return result;\n}\n\nfunction isAbsoluteUrl(url: string): boolean {\n return url.includes(\"://\");\n}\n\nfunction appendPath(url: string, pathToAppend?: string): string {\n if (!pathToAppend) {\n return url;\n }\n\n const parsedUrl = new URL(url);\n let newPath = parsedUrl.pathname;\n\n if (!newPath.endsWith(\"/\")) {\n newPath = `${newPath}/`;\n }\n\n if (pathToAppend.startsWith(\"/\")) {\n pathToAppend = pathToAppend.substring(1);\n }\n\n const searchStart = pathToAppend.indexOf(\"?\");\n if (searchStart !== -1) {\n const path = pathToAppend.substring(0, searchStart);\n const search = pathToAppend.substring(searchStart + 1);\n newPath = newPath + path;\n if (search) {\n parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search;\n }\n } else {\n newPath = newPath + pathToAppend;\n }\n\n // Use Object.assign to bypass react-native's incorrect readonly URL.pathname declaration\n Object.assign(parsedUrl, { pathname: newPath });\n\n return parsedUrl.toString();\n}\n\nfunction calculateQueryParameters(\n operationSpec: OperationSpec,\n operationArguments: OperationArguments,\n fallbackObject: { [parameterName: string]: any },\n): {\n queryParams: Map<string, string | string[]>;\n sequenceParams: Set<string>;\n} {\n const result = new Map<string, string | string[]>();\n const sequenceParams: Set<string> = new Set<string>();\n\n if (operationSpec.queryParameters?.length) {\n for (const queryParameter of operationSpec.queryParameters) {\n if (queryParameter.mapper.type.name === \"Sequence\" && queryParameter.mapper.serializedName) {\n sequenceParams.add(queryParameter.mapper.serializedName);\n }\n let queryParameterValue: string | string[] = getOperationArgumentValueFromParameter(\n operationArguments,\n queryParameter,\n fallbackObject,\n );\n if (\n (queryParameterValue !== undefined && queryParameterValue !== null) ||\n queryParameter.mapper.required\n ) {\n queryParameterValue = operationSpec.serializer.serialize(\n queryParameter.mapper,\n queryParameterValue,\n getPathStringFromParameter(queryParameter),\n );\n\n const delimiter = queryParameter.collectionFormat\n ? CollectionFormatToDelimiterMap[queryParameter.collectionFormat]\n : \"\";\n if (Array.isArray(queryParameterValue)) {\n // replace null and undefined\n queryParameterValue = queryParameterValue.map((item) => {\n if (item === null || item === undefined) {\n return \"\";\n }\n\n return item;\n });\n }\n if (queryParameter.collectionFormat === \"Multi\" && queryParameterValue.length === 0) {\n continue;\n } else if (\n Array.isArray(queryParameterValue) &&\n (queryParameter.collectionFormat === \"SSV\" || queryParameter.collectionFormat === \"TSV\")\n ) {\n queryParameterValue = queryParameterValue.join(delimiter);\n }\n if (!queryParameter.skipEncoding) {\n if (Array.isArray(queryParameterValue)) {\n queryParameterValue = queryParameterValue.map((item: string) => {\n return encodeURIComponent(item);\n });\n } else {\n queryParameterValue = encodeURIComponent(queryParameterValue);\n }\n }\n\n // Join pipes and CSV *after* encoding, or the server will be upset.\n if (\n Array.isArray(queryParameterValue) &&\n (queryParameter.collectionFormat === \"CSV\" || queryParameter.collectionFormat === \"Pipes\")\n ) {\n queryParameterValue = queryParameterValue.join(delimiter);\n }\n\n result.set(\n queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter),\n queryParameterValue,\n );\n }\n }\n }\n return {\n queryParams: result,\n sequenceParams,\n };\n}\n\nfunction simpleParseQueryParams(queryString: string): Map<string, string | string[] | undefined> {\n const result: Map<string, string | string[] | undefined> = new Map<\n string,\n string | string[] | undefined\n >();\n if (!queryString || queryString[0] !== \"?\") {\n return result;\n }\n\n // remove the leading ?\n queryString = queryString.slice(1);\n const pairs = queryString.split(\"&\");\n\n for (const pair of pairs) {\n const [name, value] = pair.split(\"=\", 2);\n const existingValue = result.get(name);\n if (existingValue) {\n if (Array.isArray(existingValue)) {\n existingValue.push(value);\n } else {\n result.set(name, [existingValue, value]);\n }\n } else {\n result.set(name, value);\n }\n }\n\n return result;\n}\n\n/** @internal */\nexport function appendQueryParams(\n url: string,\n queryParams: Map<string, string | string[]>,\n sequenceParams: Set<string>,\n noOverwrite: boolean = false,\n): string {\n if (queryParams.size === 0) {\n return url;\n }\n\n const parsedUrl = new URL(url);\n\n // QUIRK: parsedUrl.searchParams will have their name/value pairs decoded, which\n // can change their meaning to the server, such as in the case of a SAS signature.\n // To avoid accidentally un-encoding a query param, we parse the key/values ourselves\n const combinedParams = simpleParseQueryParams(parsedUrl.search);\n\n for (const [name, value] of queryParams) {\n const existingValue = combinedParams.get(name);\n if (Array.isArray(existingValue)) {\n if (Array.isArray(value)) {\n existingValue.push(...value);\n const valueSet = new Set(existingValue);\n combinedParams.set(name, Array.from(valueSet));\n } else {\n existingValue.push(value);\n }\n } else if (existingValue) {\n if (Array.isArray(value)) {\n value.unshift(existingValue);\n } else if (sequenceParams.has(name)) {\n combinedParams.set(name, [existingValue, value]);\n }\n if (!noOverwrite) {\n combinedParams.set(name, value);\n }\n } else {\n combinedParams.set(name, value);\n }\n }\n\n const searchPieces: string[] = [];\n for (const [name, value] of combinedParams) {\n if (typeof value === \"string\") {\n searchPieces.push(`${name}=${value}`);\n } else if (Array.isArray(value)) {\n // QUIRK: If we get an array of values, include multiple key/value pairs\n for (const subValue of value) {\n searchPieces.push(`${name}=${subValue}`);\n }\n } else {\n searchPieces.push(`${name}=${value}`);\n }\n }\n\n // QUIRK: we have to set search manually as searchParams will encode comma when it shouldn't.\n parsedUrl.search = searchPieces.length ? `?${searchPieces.join(\"&\")}` : \"\";\n return parsedUrl.toString();\n}\n"]}