n8n/packages/cli/src/config/index.ts
Michael Auerswald 83aef17120
feat(core): Read ephemeral license from environment and clean up ee flags (#5808)
Co-authored-by: Cornelius Suermann <cornelius@n8n.io>
2023-03-31 13:51:38 +02:00

74 lines
2.2 KiB
TypeScript

import convict from 'convict';
import dotenv from 'dotenv';
import { tmpdir } from 'os';
import { mkdtempSync, readFileSync } from 'fs';
import { join } from 'path';
import { schema } from './schema';
import { inTest, inE2ETests } from '@/constants';
if (inE2ETests) {
// Skip loading config from env variables in end-to-end tests
process.env = {
E2E_TESTS: 'true',
N8N_USER_FOLDER: mkdtempSync(join(tmpdir(), 'n8n-e2e-')),
EXECUTIONS_PROCESS: 'main',
N8N_DIAGNOSTICS_ENABLED: 'false',
N8N_PUBLIC_API_DISABLED: 'true',
EXTERNAL_FRONTEND_HOOKS_URLS: '',
N8N_PERSONALIZATION_ENABLED: 'false',
};
} else if (inTest) {
process.env.N8N_PUBLIC_API_DISABLED = 'true';
process.env.N8N_PUBLIC_API_SWAGGERUI_DISABLED = 'true';
} else {
dotenv.config();
}
const config = convict(schema, { args: [] });
// eslint-disable-next-line @typescript-eslint/unbound-method
config.getEnv = config.get;
// Load overwrites when not in tests
if (!inE2ETests && !inTest) {
// Overwrite default configuration with settings which got defined in
// optional configuration files
const { N8N_CONFIG_FILES } = process.env;
if (N8N_CONFIG_FILES !== undefined) {
const configFiles = N8N_CONFIG_FILES.split(',');
console.debug('Loading config overwrites', configFiles);
config.loadFile(configFiles);
}
// Overwrite config from files defined in "_FILE" environment variables
Object.entries(process.env).forEach(([envName, fileName]) => {
if (envName.endsWith('_FILE') && fileName) {
const configEnvName = envName.replace(/_FILE$/, '');
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const key = config._env[configEnvName]?.[0] as string;
if (key) {
let value: string;
try {
value = readFileSync(fileName, 'utf8');
} catch (error) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (error.code === 'ENOENT') {
throw new Error(`The file "${fileName}" could not be found.`);
}
throw error;
}
config.set(key, value);
}
}
});
}
config.validate({
allowed: 'strict',
});
// eslint-disable-next-line import/no-default-export
export default config;
export type Config = typeof config;