mirror of
https://github.com/Unleash/unleash.git
synced 2025-02-04 00:18:01 +01:00
fix: add support for experimental flags (#1025)
This commit is contained in:
parent
1ce913ddf1
commit
ae03390331
81
src/lib/__snapshots__/create-config.test.ts.snap
Normal file
81
src/lib/__snapshots__/create-config.test.ts.snap
Normal file
@ -0,0 +1,81 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`should create default config 1`] = `
|
||||
Object {
|
||||
"authentication": Object {
|
||||
"createAdminUser": true,
|
||||
"customAuthHandler": [Function],
|
||||
"enableApiToken": true,
|
||||
"type": "open-source",
|
||||
},
|
||||
"db": Object {
|
||||
"acquireConnectionTimeout": 30000,
|
||||
"database": "unleash_db",
|
||||
"disableMigration": false,
|
||||
"driver": "postgres",
|
||||
"host": "localhost",
|
||||
"password": "password",
|
||||
"pool": Object {
|
||||
"idleTimeoutMillis": 30000,
|
||||
"max": 4,
|
||||
"min": 0,
|
||||
"propagateCreateError": false,
|
||||
},
|
||||
"port": 4242,
|
||||
"schema": "public",
|
||||
"ssl": Object {
|
||||
"rejectUnauthorized": false,
|
||||
},
|
||||
"user": "unleash",
|
||||
"version": undefined,
|
||||
},
|
||||
"email": Object {
|
||||
"host": undefined,
|
||||
"port": 587,
|
||||
"secure": false,
|
||||
"sender": "noreply@unleash-hosted.com",
|
||||
"smtppass": undefined,
|
||||
"smtpuser": undefined,
|
||||
},
|
||||
"enableOAS": false,
|
||||
"enterpriseVersion": undefined,
|
||||
"eventHook": undefined,
|
||||
"experimental": Object {},
|
||||
"getLogger": [Function],
|
||||
"import": Object {
|
||||
"dropBeforeImport": false,
|
||||
"file": undefined,
|
||||
"keepExisting": false,
|
||||
},
|
||||
"listen": Object {
|
||||
"host": undefined,
|
||||
"port": 4242,
|
||||
},
|
||||
"preHook": undefined,
|
||||
"preRouterHook": undefined,
|
||||
"secureHeaders": false,
|
||||
"server": Object {
|
||||
"baseUriPath": "",
|
||||
"enableRequestLogger": false,
|
||||
"gracefulShutdownEnable": true,
|
||||
"gracefulShutdownTimeout": 1000,
|
||||
"headersTimeout": 61000,
|
||||
"host": undefined,
|
||||
"keepAliveTimeout": 60000,
|
||||
"pipe": undefined,
|
||||
"port": 4242,
|
||||
"secret": "super-secret",
|
||||
"serverMetrics": true,
|
||||
"unleashUrl": "http://localhost:4242",
|
||||
},
|
||||
"session": Object {
|
||||
"db": true,
|
||||
"ttlHours": 48,
|
||||
},
|
||||
"ui": Object {},
|
||||
"versionCheck": Object {
|
||||
"enable": true,
|
||||
"url": "https://version.unleash.run",
|
||||
},
|
||||
}
|
||||
`;
|
66
src/lib/create-config.test.ts
Normal file
66
src/lib/create-config.test.ts
Normal file
@ -0,0 +1,66 @@
|
||||
// @ts-nocheck
|
||||
import { createConfig } from './create-config';
|
||||
|
||||
test('should create default config', async () => {
|
||||
const config = createConfig({
|
||||
db: {
|
||||
host: 'localhost',
|
||||
port: 4242,
|
||||
user: 'unleash',
|
||||
password: 'password',
|
||||
database: 'unleash_db',
|
||||
},
|
||||
server: {
|
||||
port: 4242,
|
||||
},
|
||||
});
|
||||
|
||||
expect(config).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('should enabled metricsV2 via options', async () => {
|
||||
const config = createConfig({
|
||||
experimental: {
|
||||
metricsV2: { enabled: true },
|
||||
},
|
||||
});
|
||||
|
||||
expect(config.experimental.metricsV2.enabled).toBe(true);
|
||||
});
|
||||
|
||||
test('should enabled metricsV2 via env variable', async () => {
|
||||
process.env.EXP_METRICS_V2 = 'true';
|
||||
const config = createConfig({});
|
||||
|
||||
expect(config.experimental.metricsV2.enabled).toBe(true);
|
||||
delete process.env.EXP_METRICS_V2;
|
||||
});
|
||||
|
||||
test('should enabled metricsV2 when environments is enabled via env variable', async () => {
|
||||
process.env.EXP_ENVIRONMENTS = 'true';
|
||||
const config = createConfig({});
|
||||
|
||||
expect(config.experimental.environments.enabled).toBe(true);
|
||||
expect(config.experimental.metricsV2.enabled).toBe(true);
|
||||
delete process.env.EXP_ENVIRONMENTS;
|
||||
});
|
||||
|
||||
test('should enabled metricsV2 when environments is enabled via options', async () => {
|
||||
const config = createConfig({
|
||||
experimental: {
|
||||
environments: { enabled: true },
|
||||
},
|
||||
});
|
||||
|
||||
expect(config.experimental.environments.enabled).toBe(true);
|
||||
expect(config.experimental.metricsV2.enabled).toBe(true);
|
||||
});
|
||||
|
||||
test('should set UI flag when environments is enabled', async () => {
|
||||
process.env.EXP_ENVIRONMENTS = 'true';
|
||||
const config = createConfig({});
|
||||
|
||||
expect(config.experimental.environments.enabled).toBe(true);
|
||||
expect(config.ui.flags?.E).toBe(true);
|
||||
delete process.env.EXP_ENVIRONMENTS;
|
||||
});
|
@ -14,6 +14,7 @@ import {
|
||||
IEmailOption,
|
||||
IListeningPipe,
|
||||
IListeningHost,
|
||||
IUIConfig,
|
||||
} from './types/option';
|
||||
import { getDefaultLogProvider, LogLevel, validateLogProvider } from './logger';
|
||||
import { defaultCustomAuthDenyAll } from './default-custom-auth-deny-all';
|
||||
@ -51,6 +52,36 @@ function mergeAll<T>(objects: Partial<T>[]): T {
|
||||
return merge.all<T>(objects.filter((i) => i));
|
||||
}
|
||||
|
||||
function loadExperimental(options: IUnleashOptions): any {
|
||||
const experimental = options.experimental || {};
|
||||
|
||||
if (safeBoolean(process.env.EXP_ENVIRONMENTS, false)) {
|
||||
experimental.environments = { enabled: true };
|
||||
}
|
||||
|
||||
if (
|
||||
safeBoolean(process.env.EXP_METRICS_V2, false) ||
|
||||
//@ts-ignore
|
||||
experimental.environments?.enabled
|
||||
) {
|
||||
experimental.metricsV2 = { enabled: true };
|
||||
}
|
||||
|
||||
return experimental;
|
||||
}
|
||||
|
||||
function loadUI(options: IUnleashOptions, experimental: any = {}): IUIConfig {
|
||||
const uiO = options.ui || {};
|
||||
const ui: IUIConfig = {};
|
||||
|
||||
if (experimental.environments?.enabled) {
|
||||
ui.flags = {
|
||||
E: true,
|
||||
};
|
||||
}
|
||||
return mergeAll([uiO, ui]);
|
||||
}
|
||||
|
||||
const defaultDbOptions: IDBOption = {
|
||||
user: process.env.DATABASE_USERNAME,
|
||||
password: process.env.DATABASE_PASSWORD,
|
||||
@ -215,18 +246,14 @@ export function createConfig(options: IUnleashOptions): IUnleashConfig {
|
||||
: options.authentication,
|
||||
]);
|
||||
|
||||
const ui = options.ui || {};
|
||||
|
||||
const importSetting: IImportOption = mergeAll([
|
||||
defaultImport,
|
||||
options.import,
|
||||
]);
|
||||
|
||||
const experimental = options.experimental || {};
|
||||
const experimental = loadExperimental(options);
|
||||
|
||||
if (safeBoolean(process.env.EXP_METRICS_V2, false)) {
|
||||
experimental.metricsV2 = { enabled: true };
|
||||
}
|
||||
const ui = loadUI(options, experimental);
|
||||
|
||||
const email: IEmailOption = mergeAll([defaultEmail, options.email]);
|
||||
|
||||
@ -253,7 +280,7 @@ export function createConfig(options: IUnleashOptions): IUnleashConfig {
|
||||
authentication,
|
||||
ui,
|
||||
import: importSetting,
|
||||
experimental: experimental || {},
|
||||
experimental,
|
||||
email,
|
||||
secureHeaders,
|
||||
enableOAS,
|
||||
|
@ -111,11 +111,26 @@ export interface IEmailOption {
|
||||
export interface IListeningPipe {
|
||||
path: string;
|
||||
}
|
||||
|
||||
export interface IListeningHost {
|
||||
host?: string;
|
||||
port: number;
|
||||
}
|
||||
|
||||
export interface IUIConfig {
|
||||
slogan?: string;
|
||||
name?: string;
|
||||
flags?: { [key: string]: boolean };
|
||||
links?: [
|
||||
{
|
||||
value: string;
|
||||
icon?: string;
|
||||
href: string;
|
||||
title: string;
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
export interface IUnleashConfig {
|
||||
db: IDBOption;
|
||||
session: ISessionOption;
|
||||
@ -124,7 +139,7 @@ export interface IUnleashConfig {
|
||||
listen: IListeningHost | IListeningPipe;
|
||||
versionCheck: IVersionOption;
|
||||
authentication: IAuthOption;
|
||||
ui: object;
|
||||
ui: IUIConfig;
|
||||
import: IImportOption;
|
||||
experimental: {
|
||||
[key: string]: object;
|
||||
|
Loading…
Reference in New Issue
Block a user