Skip to content
Open
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* eslint-disable no-console */
import { createSafeLogger } from '@launchdarkly/js-sdk-common';

import ConfigurationImpl from '../../src/configuration/Configuration';
import { createConfiguration } from '../../src/configuration/Configuration';

describe('Configuration', () => {
beforeEach(() => {
Expand All @@ -10,46 +10,48 @@ describe('Configuration', () => {
});

it('has valid default values', () => {
const config = new ConfigurationImpl();
const config = createConfiguration();

expect(config).toMatchObject({
allAttributesPrivate: false,
baseUri: 'https://clientsdk.launchdarkly.com',
capacity: 100,
debug: false,
diagnosticOptOut: false,
diagnosticRecordingInterval: 900,
withReasons: false,
eventsUri: 'https://events.launchdarkly.com',
flushInterval: 30,
logger: expect.anything(),
maxCachedContexts: 5,
privateAttributes: [],
sendEvents: true,
sendLDHeaders: true,
streamInitialReconnectDelay: 1,
streamUri: 'https://clientstream.launchdarkly.com',
useReport: false,
});
// Verify service endpoints have correct default values
expect(config.serviceEndpoints.polling).toBe('https://clientsdk.launchdarkly.com');
expect(config.serviceEndpoints.streaming).toBe('https://clientstream.launchdarkly.com');
expect(config.serviceEndpoints.events).toBe('https://events.launchdarkly.com');
expect(console.error).not.toHaveBeenCalled();
});

it('allows specifying valid wrapperName', () => {
const config = new ConfigurationImpl({ wrapperName: 'test' });
const config = createConfiguration({ wrapperName: 'test' });
expect(config).toMatchObject({ wrapperName: 'test' });
});

it('warns and ignored invalid keys', () => {
// @ts-ignore
const config = new ConfigurationImpl({ baseballUri: 1 });
const config = createConfiguration({ baseballUri: 1 });

// @ts-ignore
expect(config.baseballUri).toBeUndefined();
expect(console.error).toHaveBeenCalledWith(expect.stringContaining('unknown config option'));
});

it('converts boolean types', () => {
// @ts-ignore
const config = new ConfigurationImpl({ sendEvents: 0 });
const config = createConfiguration({ sendEvents: 0 });

expect(config.sendEvents).toBeFalsy();
expect(console.error).toHaveBeenCalledWith(
Expand All @@ -59,7 +61,7 @@ describe('Configuration', () => {

it('ignores wrong type for number and logs appropriately', () => {
// @ts-ignore
const config = new ConfigurationImpl({ capacity: true });
const config = createConfiguration({ capacity: true });

expect(config.capacity).toEqual(100);
expect(console.error).toHaveBeenCalledWith(
Expand All @@ -68,7 +70,7 @@ describe('Configuration', () => {
});

it('enforces minimum flushInterval', () => {
const config = new ConfigurationImpl({ flushInterval: 1 });
const config = createConfiguration({ flushInterval: 1 });

expect(config.flushInterval).toEqual(2);
expect(console.error).toHaveBeenNthCalledWith(
Expand All @@ -78,14 +80,14 @@ describe('Configuration', () => {
});

it('allows setting a valid maxCachedContexts', () => {
const config = new ConfigurationImpl({ maxCachedContexts: 3 });
const config = createConfiguration({ maxCachedContexts: 3 });

expect(config.maxCachedContexts).toBeDefined();
expect(console.error).not.toHaveBeenCalled();
});

it('enforces minimum maxCachedContext', () => {
const config = new ConfigurationImpl({ maxCachedContexts: -1 });
const config = createConfiguration({ maxCachedContexts: -1 });

expect(config.maxCachedContexts).toBeDefined();
expect(console.error).toHaveBeenNthCalledWith(
Expand All @@ -101,16 +103,16 @@ describe('Configuration', () => {
['kebab-case-works'],
['snake_case_works'],
])('allow setting valid payload filter keys', (filter) => {
const config = new ConfigurationImpl({ payloadFilterKey: filter });
expect(config.payloadFilterKey).toEqual(filter);
const config = createConfiguration({ payloadFilterKey: filter });
expect(config.serviceEndpoints.payloadFilterKey).toEqual(filter);
expect(console.error).toHaveBeenCalledTimes(0);
});

it.each([['invalid-@-filter'], ['_invalid-filter'], ['-invalid-filter']])(
'ignores invalid filters and logs a warning',
(filter) => {
const config = new ConfigurationImpl({ payloadFilterKey: filter });
expect(config.payloadFilterKey).toBeUndefined();
const config = createConfiguration({ payloadFilterKey: filter });
expect(config.serviceEndpoints.payloadFilterKey).toBeUndefined();
expect(console.error).toHaveBeenNthCalledWith(
1,
expect.stringMatching(/should be of type string matching/i),
Expand All @@ -134,7 +136,7 @@ it('makes a safe logger', () => {
throw new Error('bad');
},
};
const config = new ConfigurationImpl({
const config = createConfiguration({
logger: badLogger,
});

Expand All @@ -160,6 +162,6 @@ it('does not wrap already safe loggers', () => {
throw new Error('bad');
},
});
const config = new ConfigurationImpl({ logger });
const config = createConfiguration({ logger });
expect(config.logger).toBe(logger);
});
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
LDUser,
} from '@launchdarkly/js-sdk-common';

import { Configuration, ConfigurationImpl } from '../../src/configuration';
import { Configuration, createConfiguration } from '../../src/configuration';
import {
addApplicationInfo,
addAutoEnv,
Expand Down Expand Up @@ -37,7 +37,7 @@ describe('automatic environment attributes', () => {
beforeEach(() => {
({ crypto, info } = mockPlatform);
(crypto.randomUUID as jest.Mock).mockResolvedValue('test-device-key-1');
config = new ConfigurationImpl({ logger });
config = createConfiguration({ logger });
});

afterEach(() => {
Expand Down Expand Up @@ -342,7 +342,7 @@ describe('automatic environment attributes', () => {

describe('addApplicationInfo', () => {
test('add id, version, name, versionName', async () => {
config = new ConfigurationImpl({
config = createConfiguration({
applicationInfo: {
id: 'com.from-config.ld',
version: '2.2.2',
Expand Down Expand Up @@ -435,7 +435,7 @@ describe('automatic environment attributes', () => {
info.platformData = jest
.fn()
.mockReturnValueOnce({ ld_application: { version: null, locale: '' } });
config = new ConfigurationImpl({ applicationInfo: { version: '1.2.3' } });
config = createConfiguration({ applicationInfo: { version: '1.2.3' } });
const ldApplication = await addApplicationInfo(mockPlatform, config);

expect(ldApplication).toBeUndefined();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { secondsToMillis } from '@launchdarkly/js-sdk-common';

import { ConfigurationImpl } from '../../src/configuration';
import { createConfiguration } from '../../src/configuration';
import createDiagnosticsInitConfig, {
type DiagnosticsInitConfig,
} from '../../src/diagnostics/createDiagnosticsInitConfig';
Expand All @@ -9,7 +9,7 @@ describe('createDiagnosticsInitConfig', () => {
let initConfig: DiagnosticsInitConfig;

beforeEach(() => {
initConfig = createDiagnosticsInitConfig(new ConfigurationImpl());
initConfig = createDiagnosticsInitConfig(createConfiguration());
});

test('defaults', () => {
Expand All @@ -29,7 +29,7 @@ describe('createDiagnosticsInitConfig', () => {

test('non-default config', () => {
const custom = createDiagnosticsInitConfig(
new ConfigurationImpl({
createConfiguration({
baseUri: 'https://dev.ld.com',
streamUri: 'https://stream.ld.com',
eventsUri: 'https://events.ld.com',
Expand Down
4 changes: 2 additions & 2 deletions packages/shared/sdk-client/src/LDClientImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import {
import { LDEvaluationDetail, LDEvaluationDetailTyped } from './api/LDEvaluationDetail';
import { LDIdentifyOptions } from './api/LDIdentifyOptions';
import { createAsyncTaskQueue } from './async/AsyncTaskQueue';
import { Configuration, ConfigurationImpl, LDClientInternalOptions } from './configuration';
import { Configuration, createConfiguration, LDClientInternalOptions } from './configuration';
import { addAutoEnv } from './context/addAutoEnv';
import {
ActiveContextTracker,
Expand Down Expand Up @@ -114,7 +114,7 @@ export default class LDClientImpl implements LDClient, LDClientIdentifyResult {
throw new Error('Platform must implement Encoding because btoa is required.');
}

this._config = new ConfigurationImpl(options, internalOptions);
this._config = createConfiguration(options, internalOptions);
this.logger = this._config.logger;

this._baseHeaders = defaultHeaders(
Expand Down
Loading