openapi-typescript
Advanced tools
Comparing version 6.3.1 to 6.3.2
@@ -149,2 +149,15 @@ import { URL } from "node:url"; | ||
} | ||
case "SchemaMap": { | ||
subschemaOutput += "{\n"; | ||
indentLv++; | ||
for (const [name, schemaObject] of getEntries(subschema.schema)) { | ||
const c = getSchemaObjectComment(schemaObject, indentLv); | ||
if (c) | ||
subschemaOutput += indent(c, indentLv); | ||
subschemaOutput += indent(`${escObjKey(name)}: ${transformSchemaObject(schemaObject, { path: `${path}${name}`, ctx: { ...ctx, indentLv } })};\n`, indentLv); | ||
} | ||
indentLv--; | ||
subschemaOutput += indent("};", indentLv); | ||
break; | ||
} | ||
case "SchemaObject": { | ||
@@ -151,0 +164,0 @@ subschemaOutput = transformSchemaObject(subschema.schema, { path, ctx: { ...ctx, indentLv } }); |
@@ -149,2 +149,15 @@ import { URL } from "node:url"; | ||
} | ||
case "SchemaMap": { | ||
subschemaOutput += "{\n"; | ||
indentLv++; | ||
for (const [name, schemaObject] of getEntries(subschema.schema)) { | ||
const c = getSchemaObjectComment(schemaObject, indentLv); | ||
if (c) | ||
subschemaOutput += indent(c, indentLv); | ||
subschemaOutput += indent(`${escObjKey(name)}: ${transformSchemaObject(schemaObject, { path: `${path}${name}`, ctx: { ...ctx, indentLv } })};\n`, indentLv); | ||
} | ||
indentLv--; | ||
subschemaOutput += indent("};", indentLv); | ||
break; | ||
} | ||
case "SchemaObject": { | ||
@@ -151,0 +164,0 @@ subschemaOutput = transformSchemaObject(subschema.schema, { path, ctx: { ...ctx, indentLv } }); |
@@ -25,3 +25,8 @@ /// <reference types="node" resolution-mode="require"/> | ||
}>; | ||
export declare function getHint(path: (string | number)[], startFrom?: Subschema["hint"]): Subschema["hint"] | undefined; | ||
export interface GetHintOptions { | ||
path: string[]; | ||
external: boolean; | ||
startFrom?: Subschema["hint"]; | ||
} | ||
export declare function getHint({ path, external, startFrom }: GetHintOptions): Subschema["hint"] | undefined; | ||
export {}; |
@@ -170,3 +170,7 @@ import fs from "node:fs"; | ||
const isRemoteFullSchema = ref.path[0] === "paths" || ref.path[0] === "components"; | ||
const hint = isRemoteFullSchema ? "OpenAPI3" : getHint([...nodePath, ...ref.path], options.hint); | ||
const hintPath = [...nodePath]; | ||
if (ref.filename) | ||
hintPath.push(ref.filename); | ||
hintPath.push(...ref.path); | ||
const hint = isRemoteFullSchema ? "OpenAPI3" : getHint({ path: hintPath, external: !!ref.filename, startFrom: options.hint }); | ||
if (schema instanceof URL) { | ||
@@ -242,11 +246,11 @@ const nextURL = new URL(ref.filename, schema); | ||
} | ||
export function getHint(path, startFrom) { | ||
export function getHint({ path, external, startFrom }) { | ||
if (startFrom && startFrom !== "OpenAPI3") { | ||
switch (startFrom) { | ||
case "OperationObject": | ||
return getHintFromOperationObject(path); | ||
return getHintFromOperationObject(path, external); | ||
case "RequestBodyObject": | ||
return getHintFromRequestBodyObject(path); | ||
return getHintFromRequestBodyObject(path, external); | ||
case "ResponseObject": | ||
return getHintFromResponseObject(path); | ||
return getHintFromResponseObject(path, external); | ||
default: | ||
@@ -258,32 +262,32 @@ return startFrom; | ||
case "paths": | ||
return getHintFromPathItemObject(path.slice(2)); | ||
return getHintFromPathItemObject(path.slice(2), external); | ||
case "components": | ||
return getHintFromComponentsObject(path.slice(1)); | ||
return getHintFromComponentsObject(path.slice(1), external); | ||
} | ||
return undefined; | ||
} | ||
function getHintFromComponentsObject(path) { | ||
function getHintFromComponentsObject(path, external) { | ||
switch (path[0]) { | ||
case "schemas": | ||
case "headers": | ||
return getHintFromSchemaObject(path.slice(2)); | ||
return getHintFromSchemaObject(path.slice(2), external); | ||
case "parameters": | ||
return getHintFromParameterObject(path.slice(2)); | ||
return getHintFromParameterObject(path.slice(2), external); | ||
case "responses": | ||
return getHintFromResponseObject(path.slice(2)); | ||
return getHintFromResponseObject(path.slice(2), external); | ||
case "requestBodies": | ||
return getHintFromRequestBodyObject(path.slice(2)); | ||
return getHintFromRequestBodyObject(path.slice(2), external); | ||
case "pathItems": | ||
return getHintFromPathItemObject(path.slice(2)); | ||
return getHintFromPathItemObject(path.slice(2), external); | ||
} | ||
return "SchemaObject"; | ||
} | ||
function getHintFromMediaTypeObject(path) { | ||
function getHintFromMediaTypeObject(path, external) { | ||
switch (path[0]) { | ||
case "schema": | ||
return getHintFromSchemaObject(path.slice(1)); | ||
return getHintFromSchemaObject(path.slice(1), external); | ||
} | ||
return "MediaTypeObject"; | ||
} | ||
function getHintFromOperationObject(path) { | ||
function getHintFromOperationObject(path, external) { | ||
switch (path[0]) { | ||
@@ -293,18 +297,18 @@ case "parameters": | ||
case "requestBody": | ||
return getHintFromRequestBodyObject(path.slice(1)); | ||
return getHintFromRequestBodyObject(path.slice(1), external); | ||
case "responses": | ||
return getHintFromResponseObject(path.slice(2)); | ||
return getHintFromResponseObject(path.slice(2), external); | ||
} | ||
return "OperationObject"; | ||
} | ||
function getHintFromParameterObject(path) { | ||
function getHintFromParameterObject(path, external) { | ||
switch (path[0]) { | ||
case "content": | ||
return getHintFromMediaTypeObject(path.slice(2)); | ||
return getHintFromMediaTypeObject(path.slice(2), external); | ||
case "schema": | ||
return getHintFromSchemaObject(path.slice(1)); | ||
return getHintFromSchemaObject(path.slice(1), external); | ||
} | ||
return "ParameterObject"; | ||
} | ||
function getHintFromPathItemObject(path) { | ||
function getHintFromPathItemObject(path, external) { | ||
switch (path[0]) { | ||
@@ -315,25 +319,25 @@ case "parameters": { | ||
} | ||
return getHintFromParameterObject(path.slice(1)); | ||
return getHintFromParameterObject(path.slice(1), external); | ||
} | ||
default: | ||
return getHintFromOperationObject(path.slice(1)); | ||
return getHintFromOperationObject(path.slice(1), external); | ||
} | ||
} | ||
function getHintFromRequestBodyObject(path) { | ||
function getHintFromRequestBodyObject(path, external) { | ||
switch (path[0]) { | ||
case "content": | ||
return getHintFromMediaTypeObject(path.slice(2)); | ||
return getHintFromMediaTypeObject(path.slice(2), external); | ||
} | ||
return "RequestBodyObject"; | ||
} | ||
function getHintFromResponseObject(path) { | ||
function getHintFromResponseObject(path, external) { | ||
switch (path[0]) { | ||
case "headers": | ||
return getHintFromSchemaObject(path.slice(2)); | ||
return getHintFromSchemaObject(path.slice(2), external); | ||
case "content": | ||
return getHintFromMediaTypeObject(path.slice(2)); | ||
return getHintFromMediaTypeObject(path.slice(2), external); | ||
} | ||
return "ResponseObject"; | ||
} | ||
function getHintFromSchemaObject(path) { | ||
function getHintFromSchemaObject(path, external) { | ||
switch (path[0]) { | ||
@@ -343,6 +347,9 @@ case "allOf": | ||
case "oneOf": | ||
return getHintFromSchemaObject(path.slice(2)); | ||
return getHintFromSchemaObject(path.slice(2), external); | ||
} | ||
if (path.length === 2 && external) { | ||
return "SchemaMap"; | ||
} | ||
return "SchemaObject"; | ||
} | ||
//# sourceMappingURL=load.js.map |
@@ -346,2 +346,5 @@ /// <reference types="node" resolution-mode="require"/> | ||
} | { | ||
hint: "SchemaMap"; | ||
schema: NonNullable<ComponentsObject["schemas"]>; | ||
} | { | ||
hint: "SchemaObject"; | ||
@@ -348,0 +351,0 @@ schema: SchemaObject; |
{ | ||
"name": "openapi-typescript", | ||
"description": "Generate TypeScript types from Swagger OpenAPI specs", | ||
"version": "6.3.1", | ||
"version": "6.3.2", | ||
"author": { | ||
@@ -6,0 +6,0 @@ "name": "Drew Powers", |
@@ -177,2 +177,14 @@ import type { GlobalContext, OpenAPI3, OpenAPITSOptions, Subschema } from "./types.js"; | ||
} | ||
case "SchemaMap": { | ||
subschemaOutput += "{\n"; | ||
indentLv++; | ||
for (const [name, schemaObject] of getEntries(subschema.schema!)) { | ||
const c = getSchemaObjectComment(schemaObject, indentLv); | ||
if (c) subschemaOutput += indent(c, indentLv); | ||
subschemaOutput += indent(`${escObjKey(name)}: ${transformSchemaObject(schemaObject, { path: `${path}${name}`, ctx: { ...ctx, indentLv } })};\n`, indentLv); | ||
} | ||
indentLv--; | ||
subschemaOutput += indent("};", indentLv); | ||
break; | ||
} | ||
case "SchemaObject": { | ||
@@ -179,0 +191,0 @@ subschemaOutput = transformSchemaObject(subschema.schema, { path, ctx: { ...ctx, indentLv } }); |
@@ -220,3 +220,6 @@ import type { ComponentsObject, Fetch, GlobalContext, OpenAPI3, OperationObject, ParameterObject, PathItemObject, ReferenceObject, RequestBodyObject, ResponseObject, SchemaObject, Subschema } from "./types.js"; | ||
const isRemoteFullSchema = ref.path[0] === "paths" || ref.path[0] === "components"; // if the initial ref is "paths" or "components" this must be a full schema | ||
const hint = isRemoteFullSchema ? "OpenAPI3" : getHint([...nodePath, ...ref.path], options.hint); | ||
const hintPath: string[] = [...(nodePath as string[])]; | ||
if (ref.filename) hintPath.push(ref.filename); | ||
hintPath.push(...ref.path); | ||
const hint = isRemoteFullSchema ? "OpenAPI3" : getHint({ path: hintPath, external: !!ref.filename, startFrom: options.hint }); | ||
@@ -310,12 +313,18 @@ // if root schema is remote and this is a relative reference, treat as remote | ||
export interface GetHintOptions { | ||
path: string[]; | ||
external: boolean; | ||
startFrom?: Subschema["hint"]; | ||
} | ||
/** given a path array (an array of indices), what type of object is this? */ | ||
export function getHint(path: (string | number)[], startFrom?: Subschema["hint"]): Subschema["hint"] | undefined { | ||
export function getHint({ path, external, startFrom }: GetHintOptions): Subschema["hint"] | undefined { | ||
if (startFrom && startFrom !== "OpenAPI3") { | ||
switch (startFrom) { | ||
case "OperationObject": | ||
return getHintFromOperationObject(path); | ||
return getHintFromOperationObject(path, external); | ||
case "RequestBodyObject": | ||
return getHintFromRequestBodyObject(path); | ||
return getHintFromRequestBodyObject(path, external); | ||
case "ResponseObject": | ||
return getHintFromResponseObject(path); | ||
return getHintFromResponseObject(path, external); | ||
default: | ||
@@ -327,32 +336,32 @@ return startFrom; | ||
case "paths": | ||
return getHintFromPathItemObject(path.slice(2)); // skip URL at [1] | ||
return getHintFromPathItemObject(path.slice(2), external); // skip URL at [1] | ||
case "components": | ||
return getHintFromComponentsObject(path.slice(1)); | ||
return getHintFromComponentsObject(path.slice(1), external); | ||
} | ||
return undefined; | ||
} | ||
function getHintFromComponentsObject(path: (string | number)[]): Subschema["hint"] | undefined { | ||
function getHintFromComponentsObject(path: (string | number)[], external: boolean): Subschema["hint"] | undefined { | ||
switch (path[0] as keyof ComponentsObject) { | ||
case "schemas": | ||
case "headers": | ||
return getHintFromSchemaObject(path.slice(2)); | ||
return getHintFromSchemaObject(path.slice(2), external); | ||
case "parameters": | ||
return getHintFromParameterObject(path.slice(2)); | ||
return getHintFromParameterObject(path.slice(2), external); | ||
case "responses": | ||
return getHintFromResponseObject(path.slice(2)); | ||
return getHintFromResponseObject(path.slice(2), external); | ||
case "requestBodies": | ||
return getHintFromRequestBodyObject(path.slice(2)); | ||
return getHintFromRequestBodyObject(path.slice(2), external); | ||
case "pathItems": | ||
return getHintFromPathItemObject(path.slice(2)); | ||
return getHintFromPathItemObject(path.slice(2), external); | ||
} | ||
return "SchemaObject"; | ||
} | ||
function getHintFromMediaTypeObject(path: (string | number)[]): Subschema["hint"] { | ||
function getHintFromMediaTypeObject(path: (string | number)[], external: boolean): Subschema["hint"] { | ||
switch (path[0]) { | ||
case "schema": | ||
return getHintFromSchemaObject(path.slice(1)); | ||
return getHintFromSchemaObject(path.slice(1), external); | ||
} | ||
return "MediaTypeObject"; | ||
} | ||
function getHintFromOperationObject(path: (string | number)[]): Subschema["hint"] { | ||
function getHintFromOperationObject(path: (string | number)[], external: boolean): Subschema["hint"] { | ||
switch (path[0] as keyof OperationObject) { | ||
@@ -362,18 +371,18 @@ case "parameters": | ||
case "requestBody": | ||
return getHintFromRequestBodyObject(path.slice(1)); | ||
return getHintFromRequestBodyObject(path.slice(1), external); | ||
case "responses": | ||
return getHintFromResponseObject(path.slice(2)); // skip the response code at [1] | ||
return getHintFromResponseObject(path.slice(2), external); // skip the response code at [1] | ||
} | ||
return "OperationObject"; | ||
} | ||
function getHintFromParameterObject(path: (string | number)[]): Subschema["hint"] { | ||
function getHintFromParameterObject(path: (string | number)[], external: boolean): Subschema["hint"] { | ||
switch (path[0]) { | ||
case "content": | ||
return getHintFromMediaTypeObject(path.slice(2)); // skip content type at [1] | ||
return getHintFromMediaTypeObject(path.slice(2), external); // skip content type at [1] | ||
case "schema": | ||
return getHintFromSchemaObject(path.slice(1)); | ||
return getHintFromSchemaObject(path.slice(1), external); | ||
} | ||
return "ParameterObject"; | ||
} | ||
function getHintFromPathItemObject(path: (string | number)[]): Subschema["hint"] | undefined { | ||
function getHintFromPathItemObject(path: (string | number)[], external: boolean): Subschema["hint"] | undefined { | ||
switch (path[0] as keyof PathItemObject) { | ||
@@ -384,25 +393,25 @@ case "parameters": { | ||
} | ||
return getHintFromParameterObject(path.slice(1)); | ||
return getHintFromParameterObject(path.slice(1), external); | ||
} | ||
default: | ||
return getHintFromOperationObject(path.slice(1)); | ||
return getHintFromOperationObject(path.slice(1), external); | ||
} | ||
} | ||
function getHintFromRequestBodyObject(path: (string | number)[]): Subschema["hint"] { | ||
function getHintFromRequestBodyObject(path: (string | number)[], external: boolean): Subschema["hint"] { | ||
switch (path[0] as keyof RequestBodyObject) { | ||
case "content": | ||
return getHintFromMediaTypeObject(path.slice(2)); // skip content type at [1] | ||
return getHintFromMediaTypeObject(path.slice(2), external); // skip content type at [1] | ||
} | ||
return "RequestBodyObject"; | ||
} | ||
function getHintFromResponseObject(path: (string | number)[]): Subschema["hint"] { | ||
function getHintFromResponseObject(path: (string | number)[], external: boolean): Subschema["hint"] { | ||
switch (path[0] as keyof ResponseObject) { | ||
case "headers": | ||
return getHintFromSchemaObject(path.slice(2)); // skip name at [1] | ||
return getHintFromSchemaObject(path.slice(2), external); // skip name at [1] | ||
case "content": | ||
return getHintFromMediaTypeObject(path.slice(2)); // skip content type at [1] | ||
return getHintFromMediaTypeObject(path.slice(2), external); // skip content type at [1] | ||
} | ||
return "ResponseObject"; | ||
} | ||
function getHintFromSchemaObject(path: (string | number)[]): Subschema["hint"] { | ||
function getHintFromSchemaObject(path: (string | number)[], external: boolean): Subschema["hint"] { | ||
switch (path[0]) { | ||
@@ -412,5 +421,10 @@ case "allOf": | ||
case "oneOf": | ||
return getHintFromSchemaObject(path.slice(2)); // skip array index at [1] | ||
return getHintFromSchemaObject(path.slice(2), external); // skip array index at [1] | ||
} | ||
// if this is external, and the path is [filename, key], then the external schema is probably a SchemaMap | ||
if (path.length === 2 && external) { | ||
return "SchemaMap"; | ||
} | ||
// otherwise, path length of 1 means partial schema is likely a SchemaObject (or it’s unknown, in which case assume SchemaObject) | ||
return "SchemaObject"; | ||
} |
@@ -642,2 +642,3 @@ import type { URL } from "node:url"; | ||
| { hint: "ResponseObject"; schema: ResponseObject } | ||
| { hint: "SchemaMap"; schema: NonNullable<ComponentsObject["schemas"]> } | ||
| { hint: "SchemaObject"; schema: SchemaObject }; | ||
@@ -644,0 +645,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
301341
4811