@redocly/respect-core
Version:
API testing framework core
88 lines • 3.72 kB
JavaScript
import { getValueFromContext } from '../context-parser/index.js';
import { formatCliInputs } from './inputs/index.js';
export function getServerUrl({ ctx, descriptionName, openapiOperation, xOperation, }) {
if (!descriptionName && xOperation?.url) {
return { url: xOperation?.url };
}
// Handle server overrides from command line `server` option
if (ctx.options?.server && descriptionName) {
const serverOverrides = formatCliInputs(ctx.options.server);
if (serverOverrides[descriptionName]) {
return { url: serverOverrides[descriptionName] };
}
}
const sourceDescription = ctx.sourceDescriptions?.find((sd) => sd.name === descriptionName);
if (sourceDescription &&
sourceDescription.type === 'openapi' &&
sourceDescription['x-serverUrl']) {
if (sourceDescription['x-serverUrl'].startsWith('http')) {
return {
url: sourceDescription['x-serverUrl'],
};
}
const serverIndexInDescription = sourceDescription['x-serverUrl'].startsWith('$servers.')
? sourceDescription['x-serverUrl'].split('.')[1]
: undefined;
if (!serverIndexInDescription) {
return undefined;
}
const serverObject = getValueFromContext({
value: `$sourceDescriptions.${descriptionName}.servers.${serverIndexInDescription}`,
ctx,
logger: ctx.options.logger,
});
return resolveOpenApiServerUrlWithVariables(serverObject);
}
if (openapiOperation?.servers?.[0]) {
const activeSourceDescription = ctx.sourceDescriptions?.find((sd) => sd.name === openapiOperation.sourceDescriptionName);
let serverUrlOverride;
if (ctx.sourceDescriptions?.length === 1 && ctx.sourceDescriptions[0]) {
serverUrlOverride =
'x-serverUrl' in ctx.sourceDescriptions[0]
? ctx.sourceDescriptions[0]['x-serverUrl']
: undefined;
}
else if (activeSourceDescription) {
serverUrlOverride =
'x-serverUrl' in activeSourceDescription
? activeSourceDescription['x-serverUrl']
: undefined;
}
return serverUrlOverride
? { url: serverUrlOverride }
: resolveOpenApiServerUrlWithVariables(openapiOperation.servers[0]);
}
if (!descriptionName && ctx?.sourceDescriptions && ctx.sourceDescriptions.length === 1) {
const sourceDescription = ctx.sourceDescriptions[0];
if ('x-serverUrl' in sourceDescription && sourceDescription['x-serverUrl']) {
return { url: sourceDescription['x-serverUrl'] };
}
else {
return (resolveOpenApiServerUrlWithVariables(ctx.$sourceDescriptions[sourceDescription.name]?.servers[0]) || undefined);
}
}
if (!descriptionName ||
!ctx.$sourceDescriptions ||
!ctx.$sourceDescriptions[descriptionName] ||
!ctx.$sourceDescriptions[descriptionName]?.servers?.length) {
return undefined;
}
// Get first available server url from the description
return resolveOpenApiServerUrlWithVariables(ctx.$sourceDescriptions[descriptionName].servers?.[0]);
}
function resolveOpenApiServerUrlWithVariables(server) {
if (!server) {
return undefined;
}
return {
url: server.url,
parameters: Object.entries(server.variables || {})
.map(([key, value]) => ({
in: 'path',
name: key,
value: value.default,
}))
.filter(({ value }) => !!value),
};
}
//# sourceMappingURL=get-server-url.js.map