@azure/core-client 1.10.2-alpha.20260311.2 → 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.
- package/dist/browser/authorizeRequestOnTenantChallenge.js +1 -2
- package/dist/browser/authorizeRequestOnTenantChallenge.js.map +1 -1
- package/dist/browser/base64.d.ts +1 -5
- package/dist/browser/base64.js +6 -14
- package/dist/browser/base64.js.map +1 -1
- package/dist/browser/interfaceHelpers.js +1 -2
- package/dist/browser/interfaceHelpers.js.map +1 -1
- package/dist/browser/operationHelpers.js +8 -4
- package/dist/browser/operationHelpers.js.map +1 -1
- package/dist/browser/serializationPolicy.js +1 -1
- package/dist/browser/serializationPolicy.js.map +1 -1
- package/dist/browser/serializer.js +32 -11
- package/dist/browser/serializer.js.map +1 -1
- package/dist/browser/serviceClient.js +2 -2
- package/dist/browser/serviceClient.js.map +1 -1
- package/dist/browser/{state.d.ts → state-web.d.mts} +1 -1
- package/dist/browser/{state.js → state-web.mjs} +1 -1
- package/dist/browser/state-web.mjs.map +1 -0
- package/dist/browser/urlHelpers.js +2 -1
- package/dist/browser/urlHelpers.js.map +1 -1
- package/dist/commonjs/authorizeRequestOnTenantChallenge.js +1 -2
- package/dist/commonjs/authorizeRequestOnTenantChallenge.js.map +1 -1
- package/dist/commonjs/base64.d.ts +1 -1
- package/dist/commonjs/base64.js +6 -6
- package/dist/commonjs/base64.js.map +1 -1
- package/dist/commonjs/interfaceHelpers.js +1 -2
- package/dist/commonjs/interfaceHelpers.js.map +1 -1
- package/dist/commonjs/operationHelpers.js +10 -6
- package/dist/commonjs/operationHelpers.js.map +1 -1
- package/dist/commonjs/serializationPolicy.js +1 -1
- package/dist/commonjs/serializationPolicy.js.map +1 -1
- package/dist/commonjs/serializer.js +32 -11
- package/dist/commonjs/serializer.js.map +1 -1
- package/dist/commonjs/serviceClient.js +2 -2
- package/dist/commonjs/serviceClient.js.map +1 -1
- package/dist/commonjs/{state.d.ts → state-cjs.d.ts} +1 -1
- package/dist/commonjs/{state.js → state-cjs.js} +1 -1
- package/dist/commonjs/state-cjs.js.map +1 -0
- package/dist/commonjs/tsdoc-metadata.json +1 -1
- package/dist/commonjs/urlHelpers.js +2 -1
- package/dist/commonjs/urlHelpers.js.map +1 -1
- package/dist/esm/authorizeRequestOnClaimChallenge.js +67 -44
- package/dist/esm/authorizeRequestOnClaimChallenge.js.map +1 -7
- package/dist/esm/authorizeRequestOnTenantChallenge.js +97 -72
- package/dist/esm/authorizeRequestOnTenantChallenge.js.map +1 -7
- package/dist/esm/base64.d.ts +1 -1
- package/dist/esm/base64.js +32 -15
- package/dist/esm/base64.js.map +1 -7
- package/dist/esm/deserializationPolicy.js +202 -205
- package/dist/esm/deserializationPolicy.js.map +1 -7
- package/dist/esm/httpClientCache.js +8 -8
- package/dist/esm/httpClientCache.js.map +1 -7
- package/dist/esm/index.js +11 -31
- package/dist/esm/index.js.map +1 -7
- package/dist/esm/interfaceHelpers.js +34 -23
- package/dist/esm/interfaceHelpers.js.map +1 -7
- package/dist/esm/interfaces.js +11 -6
- package/dist/esm/interfaces.js.map +1 -7
- package/dist/esm/log.js +4 -4
- package/dist/esm/log.js.map +1 -7
- package/dist/esm/operationHelpers.js +86 -73
- package/dist/esm/operationHelpers.js.map +1 -7
- package/dist/esm/pipeline.js +23 -22
- package/dist/esm/pipeline.js.map +1 -7
- package/dist/esm/serializationPolicy.js +134 -163
- package/dist/esm/serializationPolicy.js.map +1 -7
- package/dist/esm/serializer.js +877 -812
- package/dist/esm/serializer.js.map +1 -7
- package/dist/esm/serviceClient.js +150 -151
- package/dist/esm/serviceClient.js.map +1 -7
- package/dist/esm/state-cjs.d.ts +8 -0
- package/dist/esm/state-cjs.js +9 -0
- package/dist/esm/state-cjs.js.map +1 -0
- package/dist/esm/state.js +10 -5
- package/dist/esm/state.js.map +1 -7
- package/dist/esm/urlHelpers.js +207 -199
- package/dist/esm/urlHelpers.js.map +1 -7
- package/dist/esm/utils.js +118 -64
- package/dist/esm/utils.js.map +1 -7
- package/dist/react-native/authorizeRequestOnTenantChallenge.js +1 -2
- package/dist/react-native/authorizeRequestOnTenantChallenge.js.map +1 -1
- package/dist/react-native/base64.d.ts +1 -1
- package/dist/react-native/base64.js +6 -6
- package/dist/react-native/base64.js.map +1 -1
- package/dist/react-native/interfaceHelpers.js +1 -2
- package/dist/react-native/interfaceHelpers.js.map +1 -1
- package/dist/react-native/operationHelpers.js +8 -4
- package/dist/react-native/operationHelpers.js.map +1 -1
- package/dist/react-native/serializationPolicy.js +1 -1
- package/dist/react-native/serializationPolicy.js.map +1 -1
- package/dist/react-native/serializer.js +32 -11
- package/dist/react-native/serializer.js.map +1 -1
- package/dist/react-native/serviceClient.js +2 -2
- package/dist/react-native/serviceClient.js.map +1 -1
- package/dist/react-native/state-web.d.mts +8 -0
- package/dist/react-native/state-web.mjs +9 -0
- package/dist/react-native/state-web.mjs.map +1 -0
- package/dist/react-native/urlHelpers.js +2 -1
- package/dist/react-native/urlHelpers.js.map +1 -1
- package/package.json +31 -17
- package/dist/browser/state.js.map +0 -1
- package/dist/commonjs/state.js.map +0 -1
- package/dist/react-native/state.d.ts +0 -8
- package/dist/react-native/state.js +0 -10
- package/dist/react-native/state.js.map +0 -1
package/dist/esm/urlHelpers.js
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
CSV: ",",
|
|
7
|
+
SSV: " ",
|
|
8
|
+
Multi: "Multi",
|
|
9
|
+
TSV: "\t",
|
|
10
|
+
Pipes: "|",
|
|
9
11
|
};
|
|
10
|
-
function getRequestUrl(baseUri, operationSpec, operationArguments, fallbackObject) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
68
|
+
return url.includes("://");
|
|
73
69
|
}
|
|
74
70
|
function appendPath(url, pathToAppend) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
};
|
|
148
|
+
return {
|
|
149
|
+
queryParams: result,
|
|
150
|
+
sequenceParams,
|
|
151
|
+
};
|
|
156
152
|
}
|
|
157
153
|
function simpleParseQueryParams(queryString) {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
221
|
-
|
|
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
|
-
|
|
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": "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",
|
|
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"]}
|