@azure/msal-common 15.11.0 → 15.12.0

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 (93) hide show
  1. package/dist/account/AccountInfo.mjs +1 -1
  2. package/dist/account/AuthToken.mjs +1 -1
  3. package/dist/account/CcsCredential.mjs +1 -1
  4. package/dist/account/ClientInfo.mjs +1 -1
  5. package/dist/account/TokenClaims.mjs +1 -1
  6. package/dist/authority/Authority.mjs +1 -1
  7. package/dist/authority/AuthorityFactory.mjs +1 -1
  8. package/dist/authority/AuthorityMetadata.mjs +1 -1
  9. package/dist/authority/AuthorityOptions.mjs +1 -1
  10. package/dist/authority/AuthorityType.mjs +1 -1
  11. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +1 -1
  12. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +1 -1
  13. package/dist/authority/OpenIdConfigResponse.mjs +1 -1
  14. package/dist/authority/ProtocolMode.mjs +1 -1
  15. package/dist/authority/RegionDiscovery.mjs +1 -1
  16. package/dist/cache/CacheManager.mjs +1 -1
  17. package/dist/cache/entities/AccountEntity.mjs +1 -1
  18. package/dist/cache/persistence/TokenCacheContext.mjs +1 -1
  19. package/dist/cache/utils/CacheHelpers.mjs +1 -1
  20. package/dist/client/AuthorizationCodeClient.mjs +1 -1
  21. package/dist/client/BaseClient.mjs +1 -1
  22. package/dist/client/RefreshTokenClient.mjs +1 -1
  23. package/dist/client/SilentFlowClient.mjs +1 -1
  24. package/dist/config/ClientConfiguration.mjs +1 -1
  25. package/dist/constants/AADServerParamKeys.mjs +1 -1
  26. package/dist/crypto/ICrypto.mjs +1 -1
  27. package/dist/crypto/JoseHeader.mjs +1 -1
  28. package/dist/crypto/PopTokenGenerator.mjs +1 -1
  29. package/dist/error/AuthError.mjs +1 -1
  30. package/dist/error/AuthErrorCodes.mjs +1 -1
  31. package/dist/error/CacheError.mjs +1 -1
  32. package/dist/error/CacheErrorCodes.mjs +1 -1
  33. package/dist/error/ClientAuthError.mjs +1 -1
  34. package/dist/error/ClientAuthErrorCodes.mjs +1 -1
  35. package/dist/error/ClientConfigurationError.mjs +1 -1
  36. package/dist/error/ClientConfigurationErrorCodes.mjs +1 -1
  37. package/dist/error/InteractionRequiredAuthError.mjs +1 -1
  38. package/dist/error/InteractionRequiredAuthErrorCodes.mjs +1 -1
  39. package/dist/error/JoseHeaderError.mjs +1 -1
  40. package/dist/error/JoseHeaderErrorCodes.mjs +1 -1
  41. package/dist/error/NetworkError.mjs +1 -1
  42. package/dist/error/ServerError.mjs +1 -1
  43. package/dist/index-browser.mjs +1 -1
  44. package/dist/index-node.mjs +1 -1
  45. package/dist/index.mjs +1 -1
  46. package/dist/logger/Logger.mjs +1 -1
  47. package/dist/network/INetworkModule.mjs +1 -1
  48. package/dist/network/RequestThumbprint.mjs +1 -1
  49. package/dist/network/ThrottlingUtils.mjs +1 -1
  50. package/dist/packageMetadata.d.ts +1 -1
  51. package/dist/packageMetadata.mjs +2 -2
  52. package/dist/protocol/Authorize.mjs +1 -1
  53. package/dist/request/AuthenticationHeaderParser.mjs +1 -1
  54. package/dist/request/RequestParameterBuilder.mjs +1 -1
  55. package/dist/request/ScopeSet.d.ts.map +1 -1
  56. package/dist/request/ScopeSet.mjs +7 -3
  57. package/dist/request/ScopeSet.mjs.map +1 -1
  58. package/dist/response/ResponseHandler.mjs +1 -1
  59. package/dist/telemetry/performance/PerformanceClient.mjs +1 -1
  60. package/dist/telemetry/performance/PerformanceEvent.d.ts +7 -0
  61. package/dist/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
  62. package/dist/telemetry/performance/PerformanceEvent.mjs +1 -1
  63. package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  64. package/dist/telemetry/performance/StubPerformanceClient.mjs +1 -1
  65. package/dist/telemetry/server/ServerTelemetryManager.mjs +1 -1
  66. package/dist/url/UrlString.mjs +1 -1
  67. package/dist/utils/ClientAssertionUtils.mjs +1 -1
  68. package/dist/utils/Constants.mjs +1 -1
  69. package/dist/utils/FunctionWrappers.mjs +1 -1
  70. package/dist/utils/ProtocolUtils.mjs +1 -1
  71. package/dist/utils/StringUtils.mjs +1 -1
  72. package/dist/utils/TimeUtils.mjs +1 -1
  73. package/dist/utils/UrlUtils.d.ts +8 -0
  74. package/dist/utils/UrlUtils.d.ts.map +1 -1
  75. package/dist/utils/UrlUtils.mjs +54 -2
  76. package/dist/utils/UrlUtils.mjs.map +1 -1
  77. package/lib/index-browser.cjs +2 -2
  78. package/lib/{index-node-CtW_2rqJ.js → index-node-C8h2xZEM.js} +60 -4
  79. package/lib/index-node-C8h2xZEM.js.map +1 -0
  80. package/lib/index-node.cjs +2 -2
  81. package/lib/index.cjs +2 -2
  82. package/lib/types/packageMetadata.d.ts +1 -1
  83. package/lib/types/request/ScopeSet.d.ts.map +1 -1
  84. package/lib/types/telemetry/performance/PerformanceEvent.d.ts +7 -0
  85. package/lib/types/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
  86. package/lib/types/utils/UrlUtils.d.ts +8 -0
  87. package/lib/types/utils/UrlUtils.d.ts.map +1 -1
  88. package/package.json +1 -1
  89. package/src/packageMetadata.ts +1 -1
  90. package/src/request/ScopeSet.ts +12 -2
  91. package/src/telemetry/performance/PerformanceEvent.ts +8 -0
  92. package/src/utils/UrlUtils.ts +60 -0
  93. package/lib/index-node-CtW_2rqJ.js.map +0 -1
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v15.11.0 2025-08-12 */
1
+ /*! @azure/msal-common v15.12.0 2025-08-19 */
2
2
  'use strict';
3
3
  /*
4
4
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v15.11.0 2025-08-12 */
1
+ /*! @azure/msal-common v15.12.0 2025-08-19 */
2
2
  'use strict';
3
3
  /*
4
4
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v15.11.0 2025-08-12 */
1
+ /*! @azure/msal-common v15.12.0 2025-08-19 */
2
2
  'use strict';
3
3
  /*
4
4
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v15.11.0 2025-08-12 */
1
+ /*! @azure/msal-common v15.12.0 2025-08-19 */
2
2
  'use strict';
3
3
  import { Constants } from './Constants.mjs';
4
4
  import { createClientAuthError } from '../error/ClientAuthError.mjs';
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v15.11.0 2025-08-12 */
1
+ /*! @azure/msal-common v15.12.0 2025-08-19 */
2
2
  'use strict';
3
3
  /*
4
4
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v15.11.0 2025-08-12 */
1
+ /*! @azure/msal-common v15.12.0 2025-08-19 */
2
2
  'use strict';
3
3
  /*
4
4
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -13,4 +13,12 @@ export declare function getDeserializedResponse(responseString: string): Authori
13
13
  * Utility to create a URL from the params map
14
14
  */
15
15
  export declare function mapToQueryString(parameters: Map<string, string>, encodeExtraParams?: boolean, extraQueryParameters?: StringDict): string;
16
+ /**
17
+ * Normalizes URLs for comparison by removing hash, canonicalizing,
18
+ * and ensuring consistent URL encoding in query parameters.
19
+ * This fixes redirect loops when URLs contain encoded characters like apostrophes (%27).
20
+ * @param url - URL to normalize
21
+ * @returns Normalized URL string for comparison
22
+ */
23
+ export declare function normalizeUrlForComparison(url: string): string;
16
24
  //# sourceMappingURL=UrlUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UrlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/UrlUtils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAKrE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAWtE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,cAAc,EAAE,MAAM,GACvB,iBAAiB,GAAG,IAAI,CA4B1B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,iBAAiB,GAAE,OAAc,EACjC,oBAAoB,CAAC,EAAE,UAAU,GAClC,MAAM,CAgBR"}
1
+ {"version":3,"file":"UrlUtils.d.ts","sourceRoot":"","sources":["../../src/utils/UrlUtils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAKrE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA6B5C;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAWtE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,cAAc,EAAE,MAAM,GACvB,iBAAiB,GAAG,IAAI,CA4B1B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,iBAAiB,GAAE,OAAc,EACjC,oBAAoB,CAAC,EAAE,UAAU,GAClC,MAAM,CAgBR;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAwB7D"}
@@ -1,12 +1,35 @@
1
- /*! @azure/msal-common v15.11.0 2025-08-12 */
1
+ /*! @azure/msal-common v15.12.0 2025-08-19 */
2
2
  'use strict';
3
3
  import { createClientAuthError } from '../error/ClientAuthError.mjs';
4
+ import { StringUtils } from './StringUtils.mjs';
4
5
  import { hashNotDeserialized } from '../error/ClientAuthErrorCodes.mjs';
5
6
 
6
7
  /*
7
8
  * Copyright (c) Microsoft Corporation. All rights reserved.
8
9
  * Licensed under the MIT License.
9
10
  */
11
+ /**
12
+ * Canonicalizes a URL by making it lowercase and ensuring it ends with /
13
+ * Inlined version of UrlString.canonicalizeUri to avoid circular dependency
14
+ * @param url - URL to canonicalize
15
+ * @returns Canonicalized URL
16
+ */
17
+ function canonicalizeUrl(url) {
18
+ if (!url) {
19
+ return url;
20
+ }
21
+ let lowerCaseUrl = url.toLowerCase();
22
+ if (StringUtils.endsWith(lowerCaseUrl, "?")) {
23
+ lowerCaseUrl = lowerCaseUrl.slice(0, -1);
24
+ }
25
+ else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {
26
+ lowerCaseUrl = lowerCaseUrl.slice(0, -2);
27
+ }
28
+ if (!StringUtils.endsWith(lowerCaseUrl, "/")) {
29
+ lowerCaseUrl += "/";
30
+ }
31
+ return lowerCaseUrl;
32
+ }
10
33
  /**
11
34
  * Parses hash string from given string. Returns empty string if no hash symbol is found.
12
35
  * @param hashString
@@ -64,7 +87,36 @@ function mapToQueryString(parameters, encodeExtraParams = true, extraQueryParame
64
87
  }
65
88
  });
66
89
  return queryParameterArray.join("&");
90
+ }
91
+ /**
92
+ * Normalizes URLs for comparison by removing hash, canonicalizing,
93
+ * and ensuring consistent URL encoding in query parameters.
94
+ * This fixes redirect loops when URLs contain encoded characters like apostrophes (%27).
95
+ * @param url - URL to normalize
96
+ * @returns Normalized URL string for comparison
97
+ */
98
+ function normalizeUrlForComparison(url) {
99
+ if (!url) {
100
+ return url;
101
+ }
102
+ // Remove hash first
103
+ const urlWithoutHash = url.split("#")[0];
104
+ try {
105
+ // Parse the URL to handle encoding consistently
106
+ const urlObj = new URL(urlWithoutHash);
107
+ /*
108
+ * Reconstruct the URL with properly decoded query parameters
109
+ * This ensures that %27 and ' are treated as equivalent
110
+ */
111
+ const normalizedUrl = urlObj.origin + urlObj.pathname + urlObj.search;
112
+ // Apply canonicalization logic inline to avoid circular dependency
113
+ return canonicalizeUrl(normalizedUrl);
114
+ }
115
+ catch (e) {
116
+ // Fallback to original logic if URL parsing fails
117
+ return canonicalizeUrl(urlWithoutHash);
118
+ }
67
119
  }
68
120
 
69
- export { getDeserializedResponse, mapToQueryString, stripLeadingHashOrQuery };
121
+ export { getDeserializedResponse, mapToQueryString, normalizeUrlForComparison, stripLeadingHashOrQuery };
70
122
  //# sourceMappingURL=UrlUtils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"UrlUtils.mjs","sources":["../../src/utils/UrlUtils.ts"],"sourcesContent":[null],"names":["ClientAuthErrorCodes.hashNotDeserialized"],"mappings":";;;;;AAAA;;;AAGG;AASH;;;AAGG;AACG,SAAU,uBAAuB,CAAC,cAAsB,EAAA;AAC1D,IAAA,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AACjC,QAAA,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACtC,KAAA;AAAM,SAAA,IACH,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC;AAC9B,QAAA,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,EAChC;AACE,QAAA,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACtC,KAAA;AAED,IAAA,OAAO,cAAc,CAAC;AAC1B,CAAC;AAED;;AAEG;AACG,SAAU,uBAAuB,CACnC,cAAsB,EAAA;;IAGtB,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACpD,QAAA,OAAO,IAAI,CAAC;AACf,KAAA;IACD,IAAI;;AAEA,QAAA,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;;AAEnE,QAAA,MAAM,gBAAgB,GAAsB,MAAM,CAAC,WAAW,CAC1D,IAAI,eAAe,CAAC,kBAAkB,CAAC,CAC1C,CAAC;;QAGF,IACI,gBAAgB,CAAC,IAAI;AACrB,YAAA,gBAAgB,CAAC,OAAO;AACxB,YAAA,gBAAgB,CAAC,KAAK;AACtB,YAAA,gBAAgB,CAAC,iBAAiB;YAClC,gBAAgB,CAAC,KAAK,EACxB;AACE,YAAA,OAAO,gBAAgB,CAAC;AAC3B,SAAA;AACJ,KAAA;AAAC,IAAA,OAAO,CAAC,EAAE;AACR,QAAA,MAAM,qBAAqB,CAACA,mBAAwC,CAAC,CAAC;AACzE,KAAA;AAED,IAAA,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;AAEG;AACG,SAAU,gBAAgB,CAC5B,UAA+B,EAC/B,iBAA6B,GAAA,IAAI,EACjC,oBAAiC,EAAA;AAEjC,IAAA,MAAM,mBAAmB,GAAkB,IAAI,KAAK,EAAU,CAAC;IAE/D,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AAC9B,QAAA,IACI,CAAC,iBAAiB;YAClB,oBAAoB;YACpB,GAAG,IAAI,oBAAoB,EAC7B;YACE,mBAAmB,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAC,CAAC;AAC/C,SAAA;AAAM,aAAA;AACH,YAAA,mBAAmB,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,kBAAkB,CAAC,KAAK,CAAC,CAAE,CAAA,CAAC,CAAC;AACnE,SAAA;AACL,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC;;;;"}
1
+ {"version":3,"file":"UrlUtils.mjs","sources":["../../src/utils/UrlUtils.ts"],"sourcesContent":[null],"names":["ClientAuthErrorCodes.hashNotDeserialized"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- /*! @azure/msal-common v15.11.0 2025-08-12 */
1
+ /*! @azure/msal-common v15.12.0 2025-08-19 */
2
2
  'use strict';
3
3
  'use strict';
4
4
 
5
- var indexNode = require('./index-node-CtW_2rqJ.js');
5
+ var indexNode = require('./index-node-C8h2xZEM.js');
6
6
 
7
7
  /*
8
8
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v15.11.0 2025-08-12 */
1
+ /*! @azure/msal-common v15.12.0 2025-08-19 */
2
2
  'use strict';
3
3
  'use strict';
4
4
 
@@ -1120,6 +1120,28 @@ class StringUtils {
1120
1120
  * Copyright (c) Microsoft Corporation. All rights reserved.
1121
1121
  * Licensed under the MIT License.
1122
1122
  */
1123
+ /**
1124
+ * Canonicalizes a URL by making it lowercase and ensuring it ends with /
1125
+ * Inlined version of UrlString.canonicalizeUri to avoid circular dependency
1126
+ * @param url - URL to canonicalize
1127
+ * @returns Canonicalized URL
1128
+ */
1129
+ function canonicalizeUrl(url) {
1130
+ if (!url) {
1131
+ return url;
1132
+ }
1133
+ let lowerCaseUrl = url.toLowerCase();
1134
+ if (StringUtils.endsWith(lowerCaseUrl, "?")) {
1135
+ lowerCaseUrl = lowerCaseUrl.slice(0, -1);
1136
+ }
1137
+ else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {
1138
+ lowerCaseUrl = lowerCaseUrl.slice(0, -2);
1139
+ }
1140
+ if (!StringUtils.endsWith(lowerCaseUrl, "/")) {
1141
+ lowerCaseUrl += "/";
1142
+ }
1143
+ return lowerCaseUrl;
1144
+ }
1123
1145
  /**
1124
1146
  * Parses hash string from given string. Returns empty string if no hash symbol is found.
1125
1147
  * @param hashString
@@ -1177,12 +1199,42 @@ function mapToQueryString(parameters, encodeExtraParams = true, extraQueryParame
1177
1199
  }
1178
1200
  });
1179
1201
  return queryParameterArray.join("&");
1202
+ }
1203
+ /**
1204
+ * Normalizes URLs for comparison by removing hash, canonicalizing,
1205
+ * and ensuring consistent URL encoding in query parameters.
1206
+ * This fixes redirect loops when URLs contain encoded characters like apostrophes (%27).
1207
+ * @param url - URL to normalize
1208
+ * @returns Normalized URL string for comparison
1209
+ */
1210
+ function normalizeUrlForComparison(url) {
1211
+ if (!url) {
1212
+ return url;
1213
+ }
1214
+ // Remove hash first
1215
+ const urlWithoutHash = url.split("#")[0];
1216
+ try {
1217
+ // Parse the URL to handle encoding consistently
1218
+ const urlObj = new URL(urlWithoutHash);
1219
+ /*
1220
+ * Reconstruct the URL with properly decoded query parameters
1221
+ * This ensures that %27 and ' are treated as equivalent
1222
+ */
1223
+ const normalizedUrl = urlObj.origin + urlObj.pathname + urlObj.search;
1224
+ // Apply canonicalization logic inline to avoid circular dependency
1225
+ return canonicalizeUrl(normalizedUrl);
1226
+ }
1227
+ catch (e) {
1228
+ // Fallback to original logic if URL parsing fails
1229
+ return canonicalizeUrl(urlWithoutHash);
1230
+ }
1180
1231
  }
1181
1232
 
1182
1233
  var UrlUtils = /*#__PURE__*/Object.freeze({
1183
1234
  __proto__: null,
1184
1235
  getDeserializedResponse: getDeserializedResponse,
1185
1236
  mapToQueryString: mapToQueryString,
1237
+ normalizeUrlForComparison: normalizeUrlForComparison,
1186
1238
  stripLeadingHashOrQuery: stripLeadingHashOrQuery
1187
1239
  });
1188
1240
 
@@ -3853,7 +3905,7 @@ class Logger {
3853
3905
 
3854
3906
  /* eslint-disable header/header */
3855
3907
  const name = "@azure/msal-common";
3856
- const version = "15.11.0";
3908
+ const version = "15.12.0";
3857
3909
 
3858
3910
  /*
3859
3911
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -3897,7 +3949,11 @@ class ScopeSet {
3897
3949
  * @returns
3898
3950
  */
3899
3951
  static createSearchScopes(inputScopeString) {
3900
- const scopeSet = new ScopeSet(inputScopeString);
3952
+ // Handle empty scopes by using default OIDC scopes for cache lookup
3953
+ const scopesToUse = inputScopeString && inputScopeString.length > 0
3954
+ ? inputScopeString
3955
+ : [...OIDC_DEFAULT_SCOPES];
3956
+ const scopeSet = new ScopeSet(scopesToUse);
3901
3957
  if (!scopeSet.containsOnlyOIDCScopes()) {
3902
3958
  scopeSet.removeOIDCScopes();
3903
3959
  }
@@ -8346,4 +8402,4 @@ exports.invokeAsync = invokeAsync;
8346
8402
  exports.tenantIdMatchesHomeTenant = tenantIdMatchesHomeTenant;
8347
8403
  exports.updateAccountTenantProfileData = updateAccountTenantProfileData;
8348
8404
  exports.version = version;
8349
- //# sourceMappingURL=index-node-CtW_2rqJ.js.map
8405
+ //# sourceMappingURL=index-node-C8h2xZEM.js.map