mirror of
https://github.com/Redocly/redoc.git
synced 2025-08-06 13:20:19 +03:00
fix: exclusiveMin/Max shows incorect range
This commit is contained in:
parent
bf6b85d4ba
commit
3662a1b027
|
@ -113,7 +113,10 @@ export function detectType(schema: OpenAPISchema): string {
|
||||||
return 'any';
|
return 'any';
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isPrimitiveType(schema: OpenAPISchema, type: string | string[] | undefined = schema.type) {
|
export function isPrimitiveType(
|
||||||
|
schema: OpenAPISchema,
|
||||||
|
type: string | string[] | undefined = schema.type,
|
||||||
|
) {
|
||||||
if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
|
if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -122,9 +125,10 @@ export function isPrimitiveType(schema: OpenAPISchema, type: string | string[] |
|
||||||
const isArray = Array.isArray(type);
|
const isArray = Array.isArray(type);
|
||||||
|
|
||||||
if (type === 'object' || (isArray && type?.includes('object'))) {
|
if (type === 'object' || (isArray && type?.includes('object'))) {
|
||||||
isPrimitive = schema.properties !== undefined
|
isPrimitive =
|
||||||
? Object.keys(schema.properties).length === 0
|
schema.properties !== undefined
|
||||||
: schema.additionalProperties === undefined;
|
? Object.keys(schema.properties).length === 0
|
||||||
|
: schema.additionalProperties === undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (schema.items !== undefined && (type === 'array' || (isArray && type?.includes('array')))) {
|
if (schema.items !== undefined && (type === 'array' || (isArray && type?.includes('array')))) {
|
||||||
|
@ -144,10 +148,10 @@ export function isFormUrlEncoded(contentType: string): boolean {
|
||||||
|
|
||||||
function delimitedEncodeField(fieldVal: any, fieldName: string, delimiter: string): string {
|
function delimitedEncodeField(fieldVal: any, fieldName: string, delimiter: string): string {
|
||||||
if (Array.isArray(fieldVal)) {
|
if (Array.isArray(fieldVal)) {
|
||||||
return fieldVal.map(v => v.toString()).join(delimiter);
|
return fieldVal.map((v) => v.toString()).join(delimiter);
|
||||||
} else if (typeof fieldVal === 'object') {
|
} else if (typeof fieldVal === 'object') {
|
||||||
return Object.keys(fieldVal)
|
return Object.keys(fieldVal)
|
||||||
.map(k => `${k}${delimiter}${fieldVal[k]}`)
|
.map((k) => `${k}${delimiter}${fieldVal[k]}`)
|
||||||
.join(delimiter);
|
.join(delimiter);
|
||||||
} else {
|
} else {
|
||||||
return fieldName + '=' + fieldVal.toString();
|
return fieldName + '=' + fieldVal.toString();
|
||||||
|
@ -160,7 +164,7 @@ function deepObjectEncodeField(fieldVal: any, fieldName: string): string {
|
||||||
return '';
|
return '';
|
||||||
} else if (typeof fieldVal === 'object') {
|
} else if (typeof fieldVal === 'object') {
|
||||||
return Object.keys(fieldVal)
|
return Object.keys(fieldVal)
|
||||||
.map(k => `${fieldName}[${k}]=${fieldVal[k]}`)
|
.map((k) => `${fieldName}[${k}]=${fieldVal[k]}`)
|
||||||
.join('&');
|
.join('&');
|
||||||
} else {
|
} else {
|
||||||
console.warn('deepObject style cannot be used with non-object value:' + fieldVal.toString());
|
console.warn('deepObject style cannot be used with non-object value:' + fieldVal.toString());
|
||||||
|
@ -192,7 +196,7 @@ export function urlFormEncodePayload(
|
||||||
throw new Error('Payload must have fields: ' + payload.toString());
|
throw new Error('Payload must have fields: ' + payload.toString());
|
||||||
} else {
|
} else {
|
||||||
return Object.keys(payload)
|
return Object.keys(payload)
|
||||||
.map(fieldName => {
|
.map((fieldName) => {
|
||||||
const fieldVal = payload[fieldName];
|
const fieldVal = payload[fieldName];
|
||||||
const { style = 'form', explode = true } = encoding[fieldName] || {};
|
const { style = 'form', explode = true } = encoding[fieldName] || {};
|
||||||
switch (style) {
|
switch (style) {
|
||||||
|
@ -376,7 +380,7 @@ export function isNamedDefinition(pointer?: string): boolean {
|
||||||
export function getDefinitionName(pointer?: string): string | undefined {
|
export function getDefinitionName(pointer?: string): string | undefined {
|
||||||
if (!pointer) return undefined;
|
if (!pointer) return undefined;
|
||||||
const match = pointer.match(/^#\/components\/(schemas|pathItems)\/([^\/]+)$/);
|
const match = pointer.match(/^#\/components\/(schemas|pathItems)\/([^\/]+)$/);
|
||||||
return match === null ? undefined : match[1]
|
return match === null ? undefined : match[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
function humanizeMultipleOfConstraint(multipleOf: number | undefined): string | undefined {
|
function humanizeMultipleOfConstraint(multipleOf: number | undefined): string | undefined {
|
||||||
|
@ -448,16 +452,18 @@ export function humanizeConstraints(schema: OpenAPISchema): string[] {
|
||||||
numberRange += schema.minimum;
|
numberRange += schema.minimum;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof schema.exclusiveMinimum === 'number' || typeof schema.exclusiveMaximum === 'number') {
|
if (typeof schema.exclusiveMinimum === 'number' && typeof schema.exclusiveMaximum === 'number') {
|
||||||
let minimum = 0;
|
numberRange = '[';
|
||||||
let maximum = 0;
|
numberRange += schema.exclusiveMinimum;
|
||||||
if (schema.minimum) minimum = schema.minimum;
|
numberRange += ' .. ';
|
||||||
if (typeof schema.exclusiveMinimum === 'number') minimum = minimum <= schema.exclusiveMinimum ? minimum : schema.exclusiveMinimum;
|
numberRange += schema.exclusiveMaximum;
|
||||||
|
numberRange += ']';
|
||||||
if (schema.maximum) maximum = schema.maximum;
|
} else if (typeof schema.exclusiveMinimum === 'number') {
|
||||||
if (typeof schema.exclusiveMaximum === 'number') maximum = maximum > schema.exclusiveMaximum ? maximum : schema.exclusiveMaximum;
|
numberRange = '> ';
|
||||||
|
numberRange += schema.exclusiveMinimum;
|
||||||
numberRange = `[${minimum} .. ${maximum}]`
|
} else if (typeof schema.exclusiveMaximum === 'number') {
|
||||||
|
numberRange = '< ';
|
||||||
|
numberRange += schema.exclusiveMaximum;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numberRange !== undefined) {
|
if (numberRange !== undefined) {
|
||||||
|
@ -476,7 +482,7 @@ export function sortByRequired(fields: FieldModel[], order: string[] = []) {
|
||||||
const orderedFields: FieldModel[] = [];
|
const orderedFields: FieldModel[] = [];
|
||||||
const unorderedFields: FieldModel[] = [];
|
const unorderedFields: FieldModel[] = [];
|
||||||
|
|
||||||
fields.forEach(field => {
|
fields.forEach((field) => {
|
||||||
if (field.required) {
|
if (field.required) {
|
||||||
order.includes(field.name) ? orderedFields.push(field) : unorderedFields.push(field);
|
order.includes(field.name) ? orderedFields.push(field) : unorderedFields.push(field);
|
||||||
} else {
|
} else {
|
||||||
|
@ -504,13 +510,13 @@ export function mergeParams(
|
||||||
operationParams: Array<Referenced<OpenAPIParameter>> = [],
|
operationParams: Array<Referenced<OpenAPIParameter>> = [],
|
||||||
): Array<Referenced<OpenAPIParameter>> {
|
): Array<Referenced<OpenAPIParameter>> {
|
||||||
const operationParamNames = {};
|
const operationParamNames = {};
|
||||||
operationParams.forEach(param => {
|
operationParams.forEach((param) => {
|
||||||
param = parser.shallowDeref(param);
|
param = parser.shallowDeref(param);
|
||||||
operationParamNames[param.name + '_' + param.in] = true;
|
operationParamNames[param.name + '_' + param.in] = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
// filter out path params overridden by operation ones with the same name
|
// filter out path params overridden by operation ones with the same name
|
||||||
pathParams = pathParams.filter(param => {
|
pathParams = pathParams.filter((param) => {
|
||||||
param = parser.shallowDeref(param);
|
param = parser.shallowDeref(param);
|
||||||
return !operationParamNames[param.name + '_' + param.in];
|
return !operationParamNames[param.name + '_' + param.in];
|
||||||
});
|
});
|
||||||
|
@ -522,7 +528,7 @@ export function mergeSimilarMediaTypes(
|
||||||
types: Record<string, OpenAPIMediaType>,
|
types: Record<string, OpenAPIMediaType>,
|
||||||
): Record<string, OpenAPIMediaType> {
|
): Record<string, OpenAPIMediaType> {
|
||||||
const mergedTypes = {};
|
const mergedTypes = {};
|
||||||
Object.keys(types).forEach(name => {
|
Object.keys(types).forEach((name) => {
|
||||||
const mime = types[name];
|
const mime = types[name];
|
||||||
// ignore content type parameters (e.g. charset) and merge
|
// ignore content type parameters (e.g. charset) and merge
|
||||||
const normalizedMimeName = name.split(';')[0].trim();
|
const normalizedMimeName = name.split(';')[0].trim();
|
||||||
|
@ -570,7 +576,7 @@ export function normalizeServers(
|
||||||
return resolveUrl(baseUrl, url);
|
return resolveUrl(baseUrl, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
return servers.map(server => {
|
return servers.map((server) => {
|
||||||
return {
|
return {
|
||||||
...server,
|
...server,
|
||||||
url: normalizeUrl(server.url),
|
url: normalizeUrl(server.url),
|
||||||
|
@ -588,11 +594,11 @@ export function setSecuritySchemePrefix(prefix: string) {
|
||||||
SECURITY_SCHEMES_SECTION_PREFIX = prefix;
|
SECURITY_SCHEMES_SECTION_PREFIX = prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const shortenHTTPVerb = verb =>
|
export const shortenHTTPVerb = (verb) =>
|
||||||
({
|
({
|
||||||
delete: 'del',
|
delete: 'del',
|
||||||
options: 'opts',
|
options: 'opts',
|
||||||
}[verb] || verb);
|
}[verb] || verb);
|
||||||
|
|
||||||
export function isRedocExtension(key: string): boolean {
|
export function isRedocExtension(key: string): boolean {
|
||||||
const redocExtensions = {
|
const redocExtensions = {
|
||||||
|
@ -619,7 +625,7 @@ export function extractExtensions(
|
||||||
showExtensions: string[] | true,
|
showExtensions: string[] | true,
|
||||||
): Record<string, any> {
|
): Record<string, any> {
|
||||||
return Object.keys(obj)
|
return Object.keys(obj)
|
||||||
.filter(key => {
|
.filter((key) => {
|
||||||
if (showExtensions === true) {
|
if (showExtensions === true) {
|
||||||
return key.startsWith('x-') && !isRedocExtension(key);
|
return key.startsWith('x-') && !isRedocExtension(key);
|
||||||
}
|
}
|
||||||
|
@ -634,6 +640,6 @@ export function extractExtensions(
|
||||||
export function pluralizeType(displayType: string): string {
|
export function pluralizeType(displayType: string): string {
|
||||||
return displayType
|
return displayType
|
||||||
.split(' or ')
|
.split(' or ')
|
||||||
.map(type => type.replace(/^(string|object|number|integer|array|boolean)s?( ?.*)/, '$1s$2'))
|
.map((type) => type.replace(/^(string|object|number|integer|array|boolean)s?( ?.*)/, '$1s$2'))
|
||||||
.join(' or ');
|
.join(' or ');
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user