Skip to content

Commit 6dae81a

Browse files
zhiyuanliang-msrossgrambolinglingye001
authored
New API to load from CDN endpoint (#106)
* Adds additional undefined check (#104) * add loadCdn * revert change * fix lint * update to loadFromCdn & reuse load method * update * update * add js file extension to imports (#109) * update typescript version (#112) * add requestTracingOptions (#114) * Version bump 1.1.1 (#115) * bump up version 1.1.1 * update --------- Co-authored-by: Ross Grambo <rossgrambo@microsoft.com> Co-authored-by: linglingye001 <143174321+linglingye001@users.noreply.github.com>
1 parent f7ea66c commit 6dae81a

22 files changed

+137
-2676
lines changed

package-lock.json

Lines changed: 25 additions & 2614 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@azure/app-configuration-provider",
3-
"version": "1.1.0",
3+
"version": "1.1.1",
44
"description": "The JavaScript configuration provider for Azure App Configuration",
55
"main": "dist/index.js",
66
"module": "./dist-esm/index.js",
@@ -35,7 +35,7 @@
3535
"devDependencies": {
3636
"@rollup/plugin-typescript": "^11.1.2",
3737
"@types/mocha": "^10.0.4",
38-
"@types/node": "^20.5.7",
38+
"@types/node": "^22.7.7",
3939
"@types/sinon": "^17.0.1",
4040
"@types/uuid": "^9.0.7",
4141
"@typescript-eslint/eslint-plugin": "^6.6.0",
@@ -47,11 +47,11 @@
4747
"mocha": "^10.2.0",
4848
"nock": "^13.3.3",
4949
"rimraf": "^5.0.1",
50-
"rollup": "^3.26.3",
50+
"rollup": "^3.29.5",
5151
"rollup-plugin-dts": "^5.3.0",
5252
"sinon": "^15.2.0",
5353
"tslib": "^2.6.0",
54-
"typescript": "^5.1.6",
54+
"typescript": "^5.6.3",
5555
"uuid": "^9.0.1"
5656
},
5757
"dependencies": {

src/AzureAppConfiguration.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
import { Disposable } from "./common/disposable";
4+
import { Disposable } from "./common/disposable.js";
55

66
export type AzureAppConfiguration = {
77
/**

src/AzureAppConfigurationImpl.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33

44
import { AppConfigurationClient, ConfigurationSetting, ConfigurationSettingId, GetConfigurationSettingOptions, GetConfigurationSettingResponse, ListConfigurationSettingsOptions, featureFlagPrefix, isFeatureFlag } from "@azure/app-configuration";
55
import { isRestError } from "@azure/core-rest-pipeline";
6-
import { AzureAppConfiguration, ConfigurationObjectConstructionOptions } from "./AzureAppConfiguration";
7-
import { AzureAppConfigurationOptions } from "./AzureAppConfigurationOptions";
8-
import { IKeyValueAdapter } from "./IKeyValueAdapter";
9-
import { JsonKeyValueAdapter } from "./JsonKeyValueAdapter";
10-
import { DEFAULT_REFRESH_INTERVAL_IN_MS, MIN_REFRESH_INTERVAL_IN_MS } from "./RefreshOptions";
11-
import { Disposable } from "./common/disposable";
12-
import { FEATURE_FLAGS_KEY_NAME, FEATURE_MANAGEMENT_KEY_NAME, TELEMETRY_KEY_NAME, ENABLED_KEY_NAME, METADATA_KEY_NAME, ETAG_KEY_NAME, FEATURE_FLAG_ID_KEY_NAME, FEATURE_FLAG_REFERENCE_KEY_NAME } from "./featureManagement/constants";
13-
import { AzureKeyVaultKeyValueAdapter } from "./keyvault/AzureKeyVaultKeyValueAdapter";
14-
import { RefreshTimer } from "./refresh/RefreshTimer";
15-
import { getConfigurationSettingWithTrace, listConfigurationSettingsWithTrace, requestTracingEnabled } from "./requestTracing/utils";
16-
import { KeyFilter, LabelFilter, SettingSelector } from "./types";
6+
import { AzureAppConfiguration, ConfigurationObjectConstructionOptions } from "./AzureAppConfiguration.js";
7+
import { AzureAppConfigurationOptions } from "./AzureAppConfigurationOptions.js";
8+
import { IKeyValueAdapter } from "./IKeyValueAdapter.js";
9+
import { JsonKeyValueAdapter } from "./JsonKeyValueAdapter.js";
10+
import { DEFAULT_REFRESH_INTERVAL_IN_MS, MIN_REFRESH_INTERVAL_IN_MS } from "./RefreshOptions.js";
11+
import { Disposable } from "./common/disposable.js";
12+
import { FEATURE_FLAGS_KEY_NAME, FEATURE_MANAGEMENT_KEY_NAME, TELEMETRY_KEY_NAME, ENABLED_KEY_NAME, METADATA_KEY_NAME, ETAG_KEY_NAME, FEATURE_FLAG_ID_KEY_NAME, FEATURE_FLAG_REFERENCE_KEY_NAME } from "./featureManagement/constants.js";
13+
import { AzureKeyVaultKeyValueAdapter } from "./keyvault/AzureKeyVaultKeyValueAdapter.js";
14+
import { RefreshTimer } from "./refresh/RefreshTimer.js";
15+
import { getConfigurationSettingWithTrace, listConfigurationSettingsWithTrace, requestTracingEnabled } from "./requestTracing/utils.js";
16+
import { KeyFilter, LabelFilter, SettingSelector } from "./types.js";
1717

1818
type PagedSettingSelector = SettingSelector & {
1919
/**
@@ -66,7 +66,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
6666
this.#options = options;
6767

6868
// Enable request tracing if not opt-out
69-
this.#requestTracingEnabled = requestTracingEnabled();
69+
this.#requestTracingEnabled = options?.requestTracingOptions?.enabled ?? requestTracingEnabled();
7070

7171
if (options?.trimKeyPrefixes) {
7272
this.#sortedTrimKeyPrefixes = [...options.trimKeyPrefixes].sort((a, b) => b.localeCompare(a));
@@ -143,19 +143,19 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
143143
return this.#configMap.size;
144144
}
145145

146-
entries(): IterableIterator<[string, any]> {
146+
entries(): MapIterator<[string, any]> {
147147
return this.#configMap.entries();
148148
}
149149

150-
keys(): IterableIterator<string> {
150+
keys(): MapIterator<string> {
151151
return this.#configMap.keys();
152152
}
153153

154-
values(): IterableIterator<any> {
154+
values(): MapIterator<any> {
155155
return this.#configMap.values();
156156
}
157157

158-
[Symbol.iterator](): IterableIterator<[string, any]> {
158+
[Symbol.iterator](): MapIterator<[string, any]> {
159159
return this.#configMap[Symbol.iterator]();
160160
}
161161
// #endregion

src/AzureAppConfigurationOptions.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
// Licensed under the MIT license.
33

44
import { AppConfigurationClientOptions } from "@azure/app-configuration";
5-
import { KeyVaultOptions } from "./keyvault/KeyVaultOptions";
6-
import { RefreshOptions } from "./RefreshOptions";
7-
import { SettingSelector } from "./types";
8-
import { FeatureFlagOptions } from "./featureManagement/FeatureFlagOptions";
5+
import { KeyVaultOptions } from "./keyvault/KeyVaultOptions.js";
6+
import { RefreshOptions } from "./RefreshOptions.js";
7+
import { SettingSelector } from "./types.js";
8+
import { FeatureFlagOptions } from "./featureManagement/FeatureFlagOptions.js";
9+
import { RequestTracingOptions } from "./requestTracing/RequestTracingOptions.js";
910

1011
export const MaxRetries = 2;
1112
export const MaxRetryDelayInMs = 60000;
@@ -47,4 +48,9 @@ export interface AzureAppConfigurationOptions {
4748
* Specifies options used to configure feature flags.
4849
*/
4950
featureFlagOptions?: FeatureFlagOptions;
50-
}
51+
52+
/**
53+
* Specifies options used to configure request tracing.
54+
*/
55+
requestTracingOptions?: RequestTracingOptions;
56+
}

src/JsonKeyValueAdapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Licensed under the MIT license.
33

44
import { ConfigurationSetting, featureFlagContentType, secretReferenceContentType } from "@azure/app-configuration";
5-
import { IKeyValueAdapter } from "./IKeyValueAdapter";
5+
import { IKeyValueAdapter } from "./IKeyValueAdapter.js";
66

77
export class JsonKeyValueAdapter implements IKeyValueAdapter {
88
static readonly #ExcludedJsonContentTypes: string[] = [

src/RefreshOptions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
import { WatchedSetting } from "./WatchedSetting";
4+
import { WatchedSetting } from "./WatchedSetting.js";
55

66
export const DEFAULT_REFRESH_INTERVAL_IN_MS = 30 * 1000;
77
export const MIN_REFRESH_INTERVAL_IN_MS = 1 * 1000;

src/featureManagement/FeatureFlagOptions.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
import { FeatureFlagRefreshOptions } from "../RefreshOptions";
5-
import { SettingSelector } from "../types";
4+
import { FeatureFlagRefreshOptions } from "../RefreshOptions.js";
5+
import { SettingSelector } from "../types.js";
66

77
/**
88
* Options used to configure feature flags.
@@ -27,4 +27,4 @@ export interface FeatureFlagOptions {
2727
* Specifies how feature flag refresh is configured. All selected feature flags will be watched for changes.
2828
*/
2929
refresh?: FeatureFlagRefreshOptions;
30-
}
30+
}

src/index.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
export { AzureAppConfiguration } from "./AzureAppConfiguration";
5-
export { Disposable } from "./common/disposable";
6-
export { load } from "./load";
7-
export { KeyFilter, LabelFilter } from "./types";
4+
export { AzureAppConfiguration } from "./AzureAppConfiguration.js";
5+
export { Disposable } from "./common/disposable.js";
6+
export { load } from "./load.js";
7+
export { KeyFilter, LabelFilter } from "./types.js";
8+
export { VERSION } from "./version.js";

src/keyvault/AzureKeyVaultKeyValueAdapter.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// Licensed under the MIT license.
33

44
import { ConfigurationSetting, isSecretReference, parseSecretReference } from "@azure/app-configuration";
5-
import { IKeyValueAdapter } from "../IKeyValueAdapter";
6-
import { KeyVaultOptions } from "./KeyVaultOptions";
5+
import { IKeyValueAdapter } from "../IKeyValueAdapter.js";
6+
import { KeyVaultOptions } from "./KeyVaultOptions.js";
77
import { SecretClient, parseKeyVaultSecretIdentifier } from "@azure/keyvault-secrets";
88

99
export class AzureKeyVaultKeyValueAdapter implements IKeyValueAdapter {
@@ -72,4 +72,4 @@ export class AzureKeyVaultKeyValueAdapter implements IKeyValueAdapter {
7272

7373
function getHost(url: string) {
7474
return new URL(url).host;
75-
}
75+
}

src/load.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
import { AppConfigurationClient, AppConfigurationClientOptions } from "@azure/app-configuration";
55
import { TokenCredential } from "@azure/identity";
6-
import { AzureAppConfiguration } from "./AzureAppConfiguration";
7-
import { AzureAppConfigurationImpl } from "./AzureAppConfigurationImpl";
8-
import { AzureAppConfigurationOptions, MaxRetries, MaxRetryDelayInMs } from "./AzureAppConfigurationOptions";
9-
import * as RequestTracing from "./requestTracing/constants";
6+
import { AzureAppConfiguration } from "./AzureAppConfiguration.js";
7+
import { AzureAppConfigurationImpl } from "./AzureAppConfigurationImpl.js";
8+
import { AzureAppConfigurationOptions, MaxRetries, MaxRetryDelayInMs } from "./AzureAppConfigurationOptions.js";
9+
import * as RequestTracing from "./requestTracing/constants.js";
1010

1111
const MIN_DELAY_FOR_UNHANDLED_ERROR: number = 5000; // 5 seconds
1212

@@ -82,6 +82,23 @@ export async function load(
8282
}
8383
}
8484

85+
/**
86+
* Loads the data from a CDN and returns an instance of AzureAppConfiguration.
87+
* @param cdnEndpoint The URL to the CDN.
88+
* @param appConfigOptions Optional parameters.
89+
*/
90+
export async function loadFromCdn(cdnEndpoint: URL | string, options?: AzureAppConfigurationOptions): Promise<AzureAppConfiguration>;
91+
92+
export async function loadFromCdn(
93+
cdnEndpoint: string | URL,
94+
appConfigOptions?: AzureAppConfigurationOptions
95+
): Promise<AzureAppConfiguration> {
96+
const emptyTokenCredential: TokenCredential = {
97+
getToken: async () => ({ token: "", expiresOnTimestamp: 0 })
98+
};
99+
return await load(cdnEndpoint, emptyTokenCredential, appConfigOptions);
100+
}
101+
85102
function instanceOfTokenCredential(obj: unknown) {
86103
return obj && typeof obj === "object" && "getToken" in obj && typeof obj.getToken === "function";
87104
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
4+
/**
5+
* Options used to configure request tracing.
6+
*/
7+
export interface RequestTracingOptions {
8+
/**
9+
* Specifies whether request tracing is enabled.
10+
*/
11+
enabled: boolean;
12+
}

src/requestTracing/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
import { VERSION } from "../version";
4+
import { VERSION } from "../version.js";
55

66
export const ENV_AZURE_APP_CONFIGURATION_TRACING_DISABLED = "AZURE_APP_CONFIGURATION_TRACING_DISABLED";
77

src/requestTracing/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Licensed under the MIT license.
33

44
import { AppConfigurationClient, ConfigurationSettingId, GetConfigurationSettingOptions, ListConfigurationSettingsOptions } from "@azure/app-configuration";
5-
import { AzureAppConfigurationOptions } from "../AzureAppConfigurationOptions";
5+
import { AzureAppConfigurationOptions } from "../AzureAppConfigurationOptions.js";
66
import {
77
AZURE_FUNCTION_ENV_VAR,
88
AZURE_WEB_APP_ENV_VAR,
@@ -111,7 +111,7 @@ export function requestTracingEnabled(): boolean {
111111

112112
function getEnvironmentVariable(name: string) {
113113
// Make it compatible with non-Node.js runtime
114-
if (typeof process?.env === "object") {
114+
if (typeof process !== "undefined" && typeof process?.env === "object") {
115115
return process.env[name];
116116
} else {
117117
return undefined;

src/version.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
export const VERSION = "1.1.0";
4+
export const VERSION = "1.1.1";

test/clientOptions.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import * as chai from "chai";
55
import * as chaiAsPromised from "chai-as-promised";
66
chai.use(chaiAsPromised);
77
const expect = chai.expect;
8-
import { load } from "./exportedApi";
9-
import { createMockedConnectionString } from "./utils/testHelper";
8+
import { load } from "./exportedApi.js";
9+
import { createMockedConnectionString } from "./utils/testHelper.js";
1010
import * as nock from "nock";
1111

1212
class HttpRequestCountPolicy {

test/featureFlag.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
import * as chai from "chai";
55
import * as chaiAsPromised from "chai-as-promised";
6-
import { load } from "./exportedApi";
7-
import { createMockedConnectionString, createMockedEndpoint, createMockedFeatureFlag, createMockedKeyValue, mockAppConfigurationClientListConfigurationSettings, restoreMocks } from "./utils/testHelper";
6+
import { load } from "./exportedApi.js";
7+
import { createMockedConnectionString, createMockedEndpoint, createMockedFeatureFlag, createMockedKeyValue, mockAppConfigurationClientListConfigurationSettings, restoreMocks } from "./utils/testHelper.js";
88
chai.use(chaiAsPromised);
99
const expect = chai.expect;
1010

test/json.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import * as chai from "chai";
55
import * as chaiAsPromised from "chai-as-promised";
66
chai.use(chaiAsPromised);
77
const expect = chai.expect;
8-
import { load } from "./exportedApi";
9-
import { mockAppConfigurationClientListConfigurationSettings, restoreMocks, createMockedConnectionString, createMockedKeyVaultReference, createMockedJsonKeyValue } from "./utils/testHelper";
8+
import { load } from "./exportedApi.js";
9+
import { mockAppConfigurationClientListConfigurationSettings, restoreMocks, createMockedConnectionString, createMockedKeyVaultReference, createMockedJsonKeyValue } from "./utils/testHelper.js";
1010

1111
const jsonKeyValue = createMockedJsonKeyValue("json.settings.logging", '{"Test":{"Level":"Debug"},"Prod":{"Level":"Warning"}}');
1212
const keyVaultKeyValue = createMockedKeyVaultReference("TestKey", "https://fake-vault-name.vault.azure.net/secrets/fakeSecretName");

test/keyvault.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import * as chai from "chai";
55
import * as chaiAsPromised from "chai-as-promised";
66
chai.use(chaiAsPromised);
77
const expect = chai.expect;
8-
import { load } from "./exportedApi";
9-
import { sinon, createMockedConnectionString, createMockedTokenCredential, mockAppConfigurationClientListConfigurationSettings, mockSecretClientGetSecret, restoreMocks, createMockedKeyVaultReference } from "./utils/testHelper";
8+
import { load } from "./exportedApi.js";
9+
import { sinon, createMockedConnectionString, createMockedTokenCredential, mockAppConfigurationClientListConfigurationSettings, mockSecretClientGetSecret, restoreMocks, createMockedKeyVaultReference } from "./utils/testHelper.js";
1010
import { KeyVaultSecret, SecretClient } from "@azure/keyvault-secrets";
1111

1212
const mockedData = [
@@ -111,4 +111,4 @@ describe("key vault reference", function () {
111111
expect(settings.get("TestKey")).eq("SecretValue");
112112
expect(settings.get("TestKey2")).eq("SecretValue2");
113113
});
114-
});
114+
});

test/load.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import * as chai from "chai";
55
import * as chaiAsPromised from "chai-as-promised";
66
chai.use(chaiAsPromised);
77
const expect = chai.expect;
8-
import { load } from "./exportedApi";
9-
import { mockAppConfigurationClientListConfigurationSettings, restoreMocks, createMockedConnectionString, createMockedEndpoint, createMockedTokenCredential, createMockedKeyValue } from "./utils/testHelper";
8+
import { load } from "./exportedApi.js";
9+
import { mockAppConfigurationClientListConfigurationSettings, restoreMocks, createMockedConnectionString, createMockedEndpoint, createMockedTokenCredential, createMockedKeyValue } from "./utils/testHelper.js";
1010

1111
const mockedKVs = [{
1212
key: "app.settings.fontColor",

test/refresh.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import * as chai from "chai";
55
import * as chaiAsPromised from "chai-as-promised";
66
chai.use(chaiAsPromised);
77
const expect = chai.expect;
8-
import { load } from "./exportedApi";
9-
import { mockAppConfigurationClientListConfigurationSettings, mockAppConfigurationClientGetConfigurationSetting, restoreMocks, createMockedConnectionString, createMockedKeyValue, sleepInMs, createMockedFeatureFlag } from "./utils/testHelper";
8+
import { load } from "./exportedApi.js";
9+
import { mockAppConfigurationClientListConfigurationSettings, mockAppConfigurationClientGetConfigurationSetting, restoreMocks, createMockedConnectionString, createMockedKeyValue, sleepInMs, createMockedFeatureFlag } from "./utils/testHelper.js";
1010
import * as uuid from "uuid";
1111

1212
let mockedKVs: any[] = [];
@@ -423,4 +423,4 @@ describe("dynamic refresh feature flags", function () {
423423
await settings.refresh();
424424
expect(refreshSuccessfulCount).eq(1); // change in feature flags, because page etags are different.
425425
});
426-
});
426+
});

test/requestTracing.test.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import * as chai from "chai";
55
import * as chaiAsPromised from "chai-as-promised";
66
chai.use(chaiAsPromised);
77
const expect = chai.expect;
8-
import { createMockedConnectionString, createMockedKeyValue, createMockedTokenCredential, mockAppConfigurationClientListConfigurationSettings, restoreMocks, sleepInMs } from "./utils/testHelper";
9-
import { load } from "./exportedApi";
8+
import { createMockedConnectionString, createMockedKeyValue, createMockedTokenCredential, mockAppConfigurationClientListConfigurationSettings, restoreMocks, sleepInMs } from "./utils/testHelper.js";
9+
import { load } from "./exportedApi.js";
1010

1111
class HttpRequestHeadersPolicy {
1212
headers: any;
@@ -122,6 +122,20 @@ describe("request tracing", function () {
122122
delete process.env.AZURE_APP_CONFIGURATION_TRACING_DISABLED;
123123
});
124124

125+
it("should disable request tracing by RequestTracingOptions", async () => {
126+
try {
127+
await load(createMockedConnectionString(fakeEndpoint), {
128+
clientOptions,
129+
requestTracingOptions: {
130+
enabled: false
131+
}
132+
});
133+
} catch (e) { /* empty */ }
134+
expect(headerPolicy.headers).not.undefined;
135+
const correlationContext = headerPolicy.headers.get("Correlation-Context");
136+
expect(correlationContext).undefined;
137+
});
138+
125139
it("should have request type in correlation-context header when refresh is enabled", async () => {
126140
mockAppConfigurationClientListConfigurationSettings([{
127141
key: "app.settings.fontColor",

0 commit comments

Comments
 (0)