Skip to content

Commit 1e37761

Browse files
committed
feat(openapi3): add fully-dereferenced OpenAPI 3 types and replace custom guards
* Introduce `src/openapi3/dereferencedOpenApiv3.ts`, providing fully-dereferenced versions of core OpenAPI 3 objects (Document, OperationObject, SchemaObject, etc.). * Refactor `handleJson.ts` to consume the new types: * Remove bespoke type-guard helpers (`isParameter`, `isSchema`, …). * Eliminate most explicit `as` casts and manual type-narrowing logic. * Simplify enum/array handling through shared helpers (`buildEnumObject`, `getArrayType`). Signed-off-by: J3m5 <5523410+J3m5@users.noreply.github.com>
1 parent 1e897ee commit 1e37761

File tree

2 files changed

+221
-120
lines changed

2 files changed

+221
-120
lines changed

src/openapi3/dereferencedOpenApiv3.ts

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
// oxlint-disable consistent-indexed-object-style
2+
import type { OpenAPIV3 } from "openapi-types";
3+
4+
interface ArraySchemaObjectDereferenced extends BaseSchemaObjectDereferenced {
5+
type: OpenAPIV3.ArraySchemaObjectType;
6+
items: SchemaObjectDereferenced;
7+
}
8+
9+
interface NonArraySchemaObjectDereferenced
10+
extends BaseSchemaObjectDereferenced {
11+
type?: OpenAPIV3.NonArraySchemaObjectType;
12+
}
13+
14+
export type SchemaObjectDereferenced =
15+
| ArraySchemaObjectDereferenced
16+
| NonArraySchemaObjectDereferenced;
17+
18+
type BaseSchemaObjectDereferenced = Omit<
19+
OpenAPIV3.BaseSchemaObject,
20+
"additionalProperties" | "properties" | "allOf" | "oneOf" | "anyOf" | "not"
21+
> & {
22+
additionalProperties?: boolean | SchemaObjectDereferenced;
23+
properties?: {
24+
[name: string]: SchemaObjectDereferenced;
25+
};
26+
allOf?: SchemaObjectDereferenced[];
27+
oneOf?: SchemaObjectDereferenced[];
28+
anyOf?: SchemaObjectDereferenced[];
29+
not?: SchemaObjectDereferenced;
30+
};
31+
32+
type EncodingObjectDereferenced = Omit<OpenAPIV3.EncodingObject, "headers"> & {
33+
headers?: {
34+
[header: string]: HeaderObjectDereferenced;
35+
};
36+
};
37+
38+
type MediaTypeObjectDereferenced = Omit<
39+
OpenAPIV3.MediaTypeObject,
40+
"schema" | "encoding"
41+
> & {
42+
schema?: SchemaObjectDereferenced;
43+
encoding?: {
44+
[media: string]: EncodingObjectDereferenced;
45+
};
46+
};
47+
48+
type ParameterBaseObjectDereferenced = Omit<
49+
OpenAPIV3.ParameterObject,
50+
"schema" | "content"
51+
> & {
52+
schema?: SchemaObjectDereferenced;
53+
content?: {
54+
[media: string]: MediaTypeObjectDereferenced;
55+
};
56+
};
57+
58+
interface HeaderObjectDereferenced extends ParameterBaseObjectDereferenced {}
59+
60+
type RequestBodyObjectDereferenced = Omit<
61+
OpenAPIV3.RequestBodyObject,
62+
"content"
63+
> & {
64+
content: {
65+
[media: string]: MediaTypeObjectDereferenced;
66+
};
67+
};
68+
69+
type ResponseObjectDereferenced = Omit<
70+
OpenAPIV3.ResponseObject,
71+
"headers" | "content"
72+
> & {
73+
headers?: {
74+
[header: string]: HeaderObjectDereferenced;
75+
};
76+
content?: {
77+
[media: string]: MediaTypeObjectDereferenced;
78+
};
79+
};
80+
81+
interface ResponsesObjectDereferenced {
82+
[code: string]: ResponseObjectDereferenced;
83+
}
84+
85+
interface ParameterObjectDereferenced extends ParameterBaseObjectDereferenced {
86+
name: string;
87+
in: string;
88+
}
89+
90+
type PathItemObjectDereferenced<T extends object = object> = Omit<
91+
OpenAPIV3.PathItemObject,
92+
"parameters" | `${OpenAPIV3.HttpMethods}`
93+
> & {
94+
parameters?: ParameterObjectDereferenced[];
95+
} & {
96+
[method in OpenAPIV3.HttpMethods]?: OperationObjectDereferenced<T>;
97+
};
98+
interface CallbackObjectDereferenced {
99+
[url: string]: PathItemObjectDereferenced;
100+
}
101+
102+
export type OperationObjectDereferenced<T extends object = object> = Omit<
103+
OpenAPIV3.OperationObject,
104+
"parameters" | "requestBody" | "responses" | "callbacks"
105+
> & {
106+
parameters?: ParameterObjectDereferenced[];
107+
requestBody?: RequestBodyObjectDereferenced;
108+
responses: ResponsesObjectDereferenced;
109+
callbacks?: {
110+
[callback: string]: CallbackObjectDereferenced;
111+
};
112+
} & T;
113+
114+
interface PathsObjectDereferenced<
115+
T extends object = object,
116+
P extends object = object,
117+
> {
118+
[pattern: string]: (PathItemObjectDereferenced<T> & P) | undefined;
119+
}
120+
121+
type ComponentsObjectDereferenced = Omit<
122+
OpenAPIV3.ComponentsObject,
123+
| "schemas"
124+
| "responses"
125+
| "parameters"
126+
| "requestBodies"
127+
| "headers"
128+
| "callbacks"
129+
> & {
130+
schemas?: {
131+
[key: string]: SchemaObjectDereferenced;
132+
};
133+
responses?: {
134+
[key: string]: ResponseObjectDereferenced;
135+
};
136+
parameters?: {
137+
[key: string]: ParameterObjectDereferenced;
138+
};
139+
requestBodies?: {
140+
[key: string]: RequestBodyObjectDereferenced;
141+
};
142+
headers?: {
143+
[key: string]: HeaderObjectDereferenced;
144+
};
145+
callbacks?: {
146+
[key: string]: CallbackObjectDereferenced;
147+
};
148+
};
149+
150+
export type OpenAPIV3DocumentDereferenced<T extends object = object> = Omit<
151+
OpenAPIV3.Document,
152+
"paths" | "components"
153+
> & {
154+
paths: PathsObjectDereferenced<T>;
155+
components?: ComponentsObjectDereferenced;
156+
};

0 commit comments

Comments
 (0)