Skip to content

Commit a8143f1

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 a8143f1

File tree

2 files changed

+212
-120
lines changed

2 files changed

+212
-120
lines changed

src/openapi3/dereferencedOpenApiv3.ts

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

0 commit comments

Comments
 (0)