@scalar/oas-utils
Version:
Open API spec and Yaml handling utilities
71 lines (68 loc) • 2.78 kB
JavaScript
import { nanoidSchema } from '@scalar/types/utils';
import { z } from 'zod';
/**
* Server Variable Object
*
* An object representing a Server Variable for server URL template substitution.
*
* @see https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.1.md#server-variable-object
*/
const oasServerVariableSchema = z.object({
/**
* An enumeration of string values to be used if the substitution options are from a limited set. The array MUST NOT be empty.
*/
enum: z.array(z.string()).optional(),
/**
* REQUIRED. The default value to use for substitution, which SHALL be sent if an alternate value is not supplied.
* Note this behavior is different than the Schema Object's treatment of default values, because in those cases
* parameter values are optional. If the enum is defined, the value MUST exist in the enum's values.
*/
default: z.string().optional(),
/**
* An optional description for the server variable. CommonMark syntax MAY be used for rich text representation.
*/
description: z.string().optional(),
});
/** Extended schema for server variables */
const extendedServerVariableSchema = oasServerVariableSchema
.extend({
/** The value of the variable */
value: z.string().optional(),
})
.refine((data) => {
// Set default to the first enum value if invalid
if (Array.isArray(data.enum) && !data.enum.includes(data.default ?? '') && data.enum.length > 0) {
data.default = data.enum[0];
}
if (Array.isArray(data.enum) && data.enum.length === 0) {
delete data.enum;
}
// Always return true since we’ve modified the data to be valid
return true;
});
/**
* Server Object
*
* An object representing a Server.
*
* @see https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.1.md#server-object
*/
const oasServerSchema = z.object({
/**
* REQUIRED. A URL to the target host. This URL supports Server Variables and MAY be relative, to indicate that
* the host location is relative to the location where the OpenAPI document is being served. Variable substitutions
* will be made when a variable is named in {brackets}.
*/
url: z.string(),
/**
* An optional string describing the host designated by the URL. CommonMark syntax MAY be used for rich text
* representation.
*/
description: z.string().optional(),
/** A map between a variable name and its value. The value is used for substitution in the server's URL template. */
variables: z.record(z.string(), extendedServerVariableSchema).optional(),
});
const serverSchema = oasServerSchema.extend({
uid: nanoidSchema.brand(),
});
export { oasServerSchema, oasServerVariableSchema, serverSchema };