From 87da7f50487cbcf13add3d2095d5abfac407728d Mon Sep 17 00:00:00 2001 From: Andrew Tatomyr Date: Thu, 23 Apr 2026 11:38:35 +0300 Subject: [PATCH 1/2] chore: refactor types --- packages/core/src/types/index.ts | 21 ++++++++++--------- packages/core/src/types/redocly-yaml.ts | 2 +- packages/core/src/typings/openapi.ts | 4 ++-- packages/core/src/typings/swagger.ts | 2 +- packages/core/src/utils/is-not-empty-array.ts | 2 +- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index d9b8d4c0a1..7014ac1518 100755 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -14,7 +14,7 @@ export type ScalarSchema = { export type NormalizedScalarSchema = { name?: never; type?: 'string' | 'boolean' | 'number' | 'integer' | 'object' | 'array'; - items?: ScalarSchema; + items?: NormalizedScalarSchema; enum?: string[]; directResolveAs?: NormalizedNodeType; resolvable: boolean; @@ -46,7 +46,7 @@ export type NormalizedNodeType = { requiredOneOf?: string[]; allowed?: (value: any) => string[] | undefined; extensionsPrefix?: string; - directResolveAs?: NormalizedPropType; + directResolveAs?: NormalizedNodeType; description?: string; documentationLink?: string; }; @@ -122,7 +122,7 @@ export function normalizeTypes( if (options.doNotResolveExamples && prop && (prop as ScalarSchema).isExample) { mappedProps[propName] = { - ...(prop as object), + ...prop, resolvable: false, }; } @@ -132,24 +132,25 @@ export function normalizeTypes( } // typings are painful here... - function resolveType(type?: any): any { + function resolveType( + type: NormalizedPropType | NormalizedResolveTypeFn | string + ): NormalizedPropType | NormalizedResolveTypeFn { if (typeof type === 'string') { if (!normalizedTypes[type]) { throw new Error(`Unknown type name found: ${type}`); } return normalizedTypes[type]; } else if (typeof type === 'function') { - return (value: any, key: string) => { - return resolveType(type(value, key)); - }; - } else if (type && type.name) { + return (value: unknown, key: string) => + resolveType((type as NormalizedResolveTypeFn)(value, key)) as NormalizedPropType; + } else if (isNamedType(type)) { type = { ...type }; normalizeType(type); return type; - } else if (type && type.directResolveAs) { + } else if (type?.directResolveAs !== undefined) { return { ...type, - directResolveAs: resolveType(type.directResolveAs), + directResolveAs: (resolveType(type.directResolveAs) ?? undefined) as NormalizedNodeType, }; } else { return type; diff --git a/packages/core/src/types/redocly-yaml.ts b/packages/core/src/types/redocly-yaml.ts index fd14651ad7..1ff84c7bfa 100644 --- a/packages/core/src/types/redocly-yaml.ts +++ b/packages/core/src/types/redocly-yaml.ts @@ -231,7 +231,7 @@ const configGovernanceProperties: Record< return { ...ConfigGovernance, directResolveAs: { name: 'ConfigGovernance', ...ConfigGovernance }, - } as PropType; + }; }, description: 'Use extends to inherit rules and their configurations from other rulesets.', documentationLink: 'https://redocly.com/docs/cli/configuration/reference/extends#extends', diff --git a/packages/core/src/typings/openapi.ts b/packages/core/src/typings/openapi.ts index 1f12e997f0..ce42603b02 100644 --- a/packages/core/src/typings/openapi.ts +++ b/packages/core/src/typings/openapi.ts @@ -223,8 +223,8 @@ export interface Oas3Discriminator { export interface Oas3MediaType { schema?: Referenced; example?: unknown; - examples?: { [name: string]: Referenced }; - encoding?: { [field: string]: Oas3Encoding }; + examples?: Record>; + encoding?: Record>; itemSchema?: Referenced; // added in OAS 3.2 prefixEncoding?: Oas3Encoding[]; // added in OAS 3.2 itemEncoding?: Referenced>; // added in OAS 3.2 diff --git a/packages/core/src/typings/swagger.ts b/packages/core/src/typings/swagger.ts index 4231e396f3..16270595b6 100644 --- a/packages/core/src/typings/swagger.ts +++ b/packages/core/src/typings/swagger.ts @@ -194,7 +194,7 @@ export type Oas2Header = Oas2Items & { description?: 'string' }; export interface Oas2Response { description?: string; schema: Referenced; - examples?: Record; + examples?: Record; headers?: Record; } diff --git a/packages/core/src/utils/is-not-empty-array.ts b/packages/core/src/utils/is-not-empty-array.ts index 5042dbc41f..895896b45c 100644 --- a/packages/core/src/utils/is-not-empty-array.ts +++ b/packages/core/src/utils/is-not-empty-array.ts @@ -1,3 +1,3 @@ export function isNotEmptyArray(args?: T[]): args is [T, ...T[]] { - return Array.isArray(args) && !!args.length; + return Array.isArray(args) && args.length > 0; } From 2c0d4e7e707ac490fc8bf83d3bdd36195978e4d9 Mon Sep 17 00:00:00 2001 From: Andrew Tatomyr Date: Thu, 23 Apr 2026 11:55:09 +0300 Subject: [PATCH 2/2] update test threshold --- vitest.config.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vitest.config.ts b/vitest.config.ts index 778958cbc2..9a227ef098 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -20,10 +20,10 @@ const configExtension: { [key: string]: ViteUserConfig } = { 'packages/cli/src/utils/assert-node-version.ts', ], thresholds: { - lines: 79, - functions: 82, - statements: 78, - branches: 70, + lines: 80, + functions: 83, + statements: 79, + branches: 71, }, }, },