Skip to content

Commit 0c2456c

Browse files
authored
chore: improve types by reducing the any type and type casting (#2771)
1 parent f6303e0 commit 0c2456c

17 files changed

Lines changed: 76 additions & 56 deletions

packages/core/src/bundle/bundle-visitor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ export function makeBundleVisitor({
124124
keepUrlRefs: boolean;
125125
componentRenamingConflicts?: RuleSeverity;
126126
}) {
127-
let components: Record<string, Record<string, any>>;
127+
let components: Record<string, Record<string, unknown>>;
128128
let rootLocation: Location;
129129

130130
const visitor: Oas3Visitor | Oas2Visitor = {

packages/core/src/decorators/common/filters/filter-helper.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { isEmptyObject } from '../../../utils/is-empty-object.js';
44
import { isPlainObject } from '../../../utils/is-plain-object.js';
55
import type { UserContext } from '../../../walk.js';
66

7-
export function filter(node: any, ctx: UserContext, criteria: (item: any) => boolean) {
7+
export function filter(node: unknown, ctx: UserContext, criteria: (item: unknown) => boolean) {
88
const { parent, key } = ctx;
99
let didDelete = false;
1010
if (Array.isArray(node)) {
@@ -25,7 +25,6 @@ export function filter(node: any, ctx: UserContext, criteria: (item: any) => boo
2525
}
2626
} else if (isPlainObject(node)) {
2727
for (const key of Object.keys(node)) {
28-
node = node as any;
2928
if (isRef(node[key])) {
3029
const resolved = ctx.resolve(node[key]);
3130
if (criteria(resolved.node)) {

packages/core/src/env.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export const isBrowser =
22
typeof window !== 'undefined' ||
33
typeof process === 'undefined' ||
4-
(process?.platform as any) === 'browser'; // main and worker thread
4+
(process?.platform as string) === 'browser'; // main and worker thread
55
export const env = isBrowser ? {} : process.env || {};

packages/core/src/format/format.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,9 @@ export function formatProblems(
230230
totals,
231231
version,
232232
problems: problems.map((p) => {
233-
const problem = {
233+
const problem: Record<string, unknown> = {
234234
...p,
235-
location: p.location.map((location: any) => ({
235+
location: p.location.map((location: LocationObject) => ({
236236
...location,
237237
source: {
238238
ref: isAbsoluteUrl(location.source.absoluteRef)
@@ -255,7 +255,7 @@ export function formatProblems(
255255
if (env.FORMAT_JSON_WITH_CODEFRAMES) {
256256
const location = p.location[0]; // TODO: support multiple locations
257257
const loc = getLineColLocation(location);
258-
(problem as any).codeframe = getCodeframe(loc, color);
258+
problem.codeframe = getCodeframe(loc, color);
259259
}
260260
return problem;
261261
}),
@@ -458,14 +458,14 @@ function outputForGithubActions(problems: NormalizedProblem[], cwd: string): voi
458458
}
459459
}
460460

461-
function formatProperties(props: Record<string, any>): string {
461+
function formatProperties(props: Record<string, unknown>): string {
462462
return Object.entries(props)
463463
.filter(([, v]) => v !== null && v !== undefined)
464464
.map(([k, v]) => `${k}=${escapeProperty(v)}`)
465465
.join(',');
466466
}
467467

468-
function toString(v: any): string {
468+
function toString(v: unknown): string {
469469
if (v === null || v === undefined) {
470470
return '';
471471
} else if (typeof v === 'string' || v instanceof String) {
@@ -474,10 +474,10 @@ function outputForGithubActions(problems: NormalizedProblem[], cwd: string): voi
474474
return JSON.stringify(v);
475475
}
476476

477-
function escapeMessage(v: any): string {
477+
function escapeMessage(v: unknown): string {
478478
return toString(v).replace(/%/g, '%25').replace(/\r/g, '%0D').replace(/\n/g, '%0A');
479479
}
480-
function escapeProperty(v: any): string {
480+
function escapeProperty(v: unknown): string {
481481
return toString(v)
482482
.replace(/%/g, '%25')
483483
.replace(/\r/g, '%0D')

packages/core/src/logger.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export const colorize = new Proxy(colorette, {
1313
return identity;
1414
}
1515

16+
// oxlint-disable-next-line typescript/no-explicit-any
1617
return (target as any)[prop];
1718
},
1819
});

packages/core/src/resolve.ts

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
import { isNamedType, SpecExtension, type NormalizedNodeType } from './types/index.js';
1818
import type { OasRef } from './typings/openapi.js';
1919
import { getOwn } from './utils/get-own.js';
20+
import { isPlainObject } from './utils/is-plain-object.js';
2021
import { makeRefId } from './utils/make-ref-id.js';
2122
import { nextTick } from './utils/next-tick.js';
2223
import { readFileFromUrl } from './utils/read-file-from-url.js';
@@ -193,17 +194,17 @@ export type ResolvedRefMap = Map<string, ResolvedRef>;
193194

194195
type RefFrame = {
195196
prev: RefFrame | null;
196-
node: any;
197+
node: unknown;
197198
};
198199

199-
function pushRef(head: RefFrame, node: any): RefFrame {
200+
function pushRef(head: RefFrame, node: unknown): RefFrame {
200201
return {
201202
prev: head,
202203
node,
203204
};
204205
}
205206

206-
function hasRef(head: RefFrame | null, node: any): boolean {
207+
function hasRef(head: RefFrame | null, node: unknown): boolean {
207208
while (head) {
208209
if (head.node === node) {
209210
return true;
@@ -236,18 +237,18 @@ export async function resolveDocument(opts: {
236237
return resolvedRefMap;
237238

238239
function resolveRefsInParallel(
239-
rootNode: any,
240+
rootNode: unknown,
240241
rootNodeDocument: Document,
241242
rootNodePointer: string,
242-
type: any
243+
type: NormalizedNodeType
243244
) {
244245
const rootNodeDocAbsoluteRef = rootNodeDocument.source.absoluteRef;
245-
const anchorRefsMap: Map<string, any> = new Map();
246+
const anchorRefsMap: Map<string, unknown> = new Map();
246247

247248
walk(rootNode, type, rootNodeDocAbsoluteRef + rootNodePointer);
248249

249-
function walk(node: any, type: NormalizedNodeType, nodeAbsoluteRef: string) {
250-
if (typeof node !== 'object' || node === null) {
250+
function walk(node: unknown, type: NormalizedNodeType, nodeAbsoluteRef: string) {
251+
if (!isPlainObject(node) && !Array.isArray(node)) {
251252
return;
252253
}
253254

@@ -258,11 +259,6 @@ export async function resolveDocument(opts: {
258259

259260
seenNodes.add(nodeId);
260261

261-
const [_, anchor] = Object.entries(node).find(([key]) => key === '$anchor') || [];
262-
if (anchor) {
263-
anchorRefsMap.set(`#${anchor}`, node);
264-
}
265-
266262
if (Array.isArray(node)) {
267263
const itemsType = type.items;
268264
// we continue resolving unknown types, but stop early on known scalars
@@ -291,6 +287,11 @@ export async function resolveDocument(opts: {
291287
return;
292288
}
293289

290+
const [_, anchor] = Object.entries(node).find(([key]) => key === '$anchor') || [];
291+
if (anchor) {
292+
anchorRefsMap.set(`#${anchor}`, node);
293+
}
294+
294295
for (const propName of Object.keys(node)) {
295296
let propValue = node[propName];
296297
let propType = getOwn(type.properties, propName);
@@ -342,7 +343,7 @@ export async function resolveDocument(opts: {
342343
if (isExternalValue(node)) {
343344
const promise = followRef(
344345
rootNodeDocument,
345-
{ $ref: node.externalValue },
346+
{ $ref: node.externalValue as string },
346347
{
347348
prev: null,
348349
node,
@@ -352,7 +353,7 @@ export async function resolveDocument(opts: {
352353
resolveRefsInParallel(
353354
resolvedRef.node,
354355
resolvedRef.document,
355-
resolvedRef.nodePointer!,
356+
resolvedRef.nodePointer,
356357
type
357358
);
358359
}
@@ -420,33 +421,42 @@ export async function resolveDocument(opts: {
420421
nodePointer: '#/',
421422
};
422423

423-
let target = targetDoc.parsed as any;
424+
let target = targetDoc.parsed;
424425

425426
const segments = pointer;
426427
for (const segment of segments) {
427-
if (typeof target !== 'object') {
428-
target = undefined;
429-
break;
430-
} else if (target[segment] !== undefined) {
428+
if (isPlainObject(target) && target[segment] !== undefined) {
431429
target = target[segment];
432430
resolvedRef.nodePointer = joinPointer(
433431
resolvedRef.nodePointer!,
434432
escapePointerFragment(segment)
435433
);
434+
} else if (Array.isArray(target) && target[+segment] !== undefined) {
435+
target = target[+segment];
436+
resolvedRef.nodePointer = joinPointer(
437+
resolvedRef.nodePointer!,
438+
escapePointerFragment(segment)
439+
);
436440
} else if (isRef(target)) {
437441
resolvedRef = await followRef(targetDoc, target, pushRef(refStack, target));
438442
targetDoc = resolvedRef.document || targetDoc;
439443

440-
if (typeof resolvedRef.node !== 'object') {
444+
if (isPlainObject(resolvedRef.node)) {
445+
target = resolvedRef.node[segment];
446+
resolvedRef.nodePointer = joinPointer(
447+
resolvedRef.nodePointer!,
448+
escapePointerFragment(segment)
449+
);
450+
} else if (Array.isArray(resolvedRef.node)) {
451+
target = resolvedRef.node[+segment];
452+
resolvedRef.nodePointer = joinPointer(
453+
resolvedRef.nodePointer!,
454+
escapePointerFragment(segment)
455+
);
456+
} else {
441457
target = undefined;
442458
break;
443459
}
444-
445-
target = resolvedRef.node[segment];
446-
resolvedRef.nodePointer = joinPointer(
447-
resolvedRef.nodePointer!,
448-
escapePointerFragment(segment)
449-
);
450460
} else {
451461
target = undefined;
452462
break;

packages/core/src/rules/ajv.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ function getAjv(resolve: ResolveFn, dialect: AjvDialect): AnyAjv {
6161

6262
ajvInstances[dialect] = dialect === '2020' ? new Ajv2020(options) : new AjvDraft4(options);
6363

64+
// oxlint-disable-next-line typescript/no-explicit-any
6465
addFormats(ajvInstances[dialect] as any);
6566
}
6667
return ajvInstances[dialect];
@@ -126,9 +127,10 @@ export function validateJsonSchema(
126127

127128
function beatifyErrorMessage(error: ErrorObject) {
128129
let message = error.message;
129-
const suggest = error.keyword === 'enum' ? error.params.allowedValues : undefined;
130+
const suggest: string[] | undefined =
131+
error.keyword === 'enum' ? error.params.allowedValues : undefined;
130132
if (suggest) {
131-
message += ` ${suggest.map((e: any) => `"${e}"`).join(', ')}`;
133+
message += ` ${suggest.map((e) => `"${e}"`).join(', ')}`;
132134
}
133135

134136
if (error.keyword === 'type') {

packages/core/src/rules/async2/no-channel-trailing-slash.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { UserContext } from '../../walk.js';
33

44
export const NoChannelTrailingSlash: Async2Rule = () => {
55
return {
6-
Channel(_channel: any, { report, key, location }: UserContext) {
6+
Channel(_channel: unknown, { report, key, location }: UserContext) {
77
if ((key as string).endsWith('/') && key !== '/') {
88
report({
99
message: `\`${key}\` should not have a trailing slash.`,

packages/core/src/rules/catalog-entity/entity-key-valid.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const MAX_KEY_LENGTH = 150;
88

99
export const EntityKeyValid: CatalogEntityRule = () => {
1010
return {
11-
any(node: any, { report, location }: UserContext) {
11+
any(node: unknown, { report, location }: UserContext) {
1212
if (isPlainObject(node) && 'key' in node) {
1313
const key = node.key;
1414

packages/core/src/rules/common/no-invalid-parameter-examples.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import type { Oas3Parameter } from '../../typings/openapi.js';
22
import { isDefined } from '../../utils/is-defined.js';
33
import { isPlainObject } from '../../utils/is-plain-object.js';
4+
import type { Oas2Rule, Oas3Rule } from '../../visitors.js';
45
import type { UserContext } from '../../walk.js';
56
import { validateExample } from '../utils.js';
67

7-
export const NoInvalidParameterExamples: any = (opts: any) => {
8+
export const NoInvalidParameterExamples: Oas3Rule | Oas2Rule = (opts) => {
89
return {
910
Parameter: {
1011
leave(parameter: Oas3Parameter, ctx: UserContext) {

0 commit comments

Comments
 (0)