@redocly/openapi-core
Version:
See https://github.com/Redocly/openapi-cli
79 lines (70 loc) • 2.61 kB
text/typescript
import * as fs from 'fs';
import * as path from 'path';
import { RedoclyClient } from '../redocly';
import { loadYaml } from '../utils';
import { Config, DOMAINS, RawConfig, Region, transformConfig } from './config';
import { defaultPlugin } from './builtIn';
export async function loadConfig(configPath: string | undefined = findConfig(), customExtends?: string[]): Promise<Config> {
const rawConfig = await getConfig(configPath);
if (customExtends !== undefined) {
rawConfig.lint = rawConfig.lint || {};
rawConfig.lint.extends = customExtends;
}
const redoclyClient = new RedoclyClient();
const tokens = await redoclyClient.getTokens();
if (tokens.length) {
if (!rawConfig.resolve) rawConfig.resolve = {};
if (!rawConfig.resolve.http) rawConfig.resolve.http = {};
rawConfig.resolve.http.headers = [...(rawConfig.resolve.http.headers ?? [])];
for (const item of tokens) {
const domain = DOMAINS[item.region as Region];
rawConfig.resolve.http.headers.push({
matches: `https://api.${domain}/registry/**`,
name: 'Authorization',
envVariable: undefined,
value: item.token,
},
//support redocly.com domain for future compatibility
...(item.region === 'us' ? [{
matches: `https://api.redoc.ly/registry/**`,
name: 'Authorization',
envVariable: undefined,
value: item.token,
}] : []));
}
}
return new Config(
{
...rawConfig,
lint: {
...rawConfig?.lint,
plugins: [...(rawConfig?.lint?.plugins || []), defaultPlugin], // inject default plugin
},
},
configPath,
);
}
export const CONFIG_FILE_NAMES = ['redocly.yaml', 'redocly.yml', '.redocly.yaml', '.redocly.yml'];
export function findConfig(dir?: string): string | undefined {
if (!fs.hasOwnProperty('existsSync')) return;
const existingConfigFiles = CONFIG_FILE_NAMES
.map(name => dir ? path.resolve(dir, name) : name)
.filter(fs.existsSync);
if (existingConfigFiles.length > 1) {
throw new Error(`
Multiple configuration files are not allowed.
Found the following files: ${existingConfigFiles.join(', ')}.
Please use 'redocly.yaml' instead.
`);
}
return existingConfigFiles[0];
}
export async function getConfig(configPath: string | undefined = findConfig()) {
if (!configPath) return {};
try {
const rawConfig = ((await loadYaml(configPath)) || {}) as RawConfig;
return transformConfig(rawConfig);
} catch (e) {
throw new Error(`Error parsing config file at '${configPath}': ${e.message}`);
}
}