Skip to content

Commit 166ad34

Browse files
committed
add object resolver to schema-definition
1 parent 222cb05 commit 166ad34

File tree

5 files changed

+27
-6
lines changed

5 files changed

+27
-6
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
node_modules
1+
/node_modules
2+
/bin

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@omer-x/next-openapi-interface-generator",
3-
"version": "0.1.2",
3+
"version": "0.1.3",
44
"description": "OpenAPI interface generator for Next.js",
55
"keywords": [
66
"next",

src/core/openapi.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export type SchemaDefinition = {
77
items?: SchemaDefinition | SchemaDefinition[],
88
oneOf?: SchemaDefinition[],
99
enum?: (string | null)[],
10+
properties?: Record<string, SchemaDefinition>,
11+
required?: string[],
1012
};
1113

1214
type SchemaComponent = {

src/core/resolvers/schema-definition.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ function resolveArray(items: SchemaDefinition[], isArray: boolean) {
66
return isArray ? `(${names})[]` : names;
77
}
88

9+
function resolveObject(props: Record<string, SchemaDefinition>, required: string[]) {
10+
return Object.entries(props).map(([propName, propDefinition]) => {
11+
const isRequired = required.includes(propName);
12+
return `${propName}${isRequired ? "" : "?"}: ${resolveSchema(propDefinition)}`;
13+
});
14+
}
15+
916
function resolveEnumItem(item: string | null) {
1017
if (item === null) return "null";
1118
return `"${item}"`;
@@ -32,7 +39,13 @@ export function resolveSchema(definition: SchemaDefinition): string {
3239
}
3340
return "unknown[]";
3441
}
35-
case "object": return "unknown";
42+
case "object": {
43+
if (definition.properties) {
44+
const props = resolveObject(definition.properties, definition.required ?? []);
45+
return `{ ${props.join(", ")} }`;
46+
}
47+
return "unknown";
48+
}
3649
}
3750
}
3851
if (definition.$ref) {
@@ -48,11 +61,16 @@ export function simplifySchema(resolvedSchema: string) {
4861
return resolvedSchema.replace(/\[|\]/g, "");
4962
}
5063

64+
function isRawObject(schema: string) {
65+
return (/\{.*\}/).test(schema);
66+
}
67+
5168
export function filterGenericSchemas(resolvedSchemas: string[]) {
5269
const genericSchemas = [
5370
"string",
5471
"number",
72+
"boolean",
5573
"unknown",
5674
];
57-
return resolvedSchemas.filter(s => !genericSchemas.includes(s));
75+
return resolvedSchemas.filter(s => !genericSchemas.includes(s) && !isRawObject(s));
5876
}

0 commit comments

Comments
 (0)