UNPKG

@redocly/openapi-core

Version:

See https://github.com/Redocly/openapi-cli

79 lines (70 loc) 2.61 kB
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}`); } }