import { AutoBeOpenApi } from "@autobe/interface"; import { OpenApiTypeChecker } from "@typia/utils"; export namespace AutoBeOpenApiTypeChecker { export const getKind = (schema: AutoBeOpenApi.IJsonSchema): string => { if (isReference(schema)) return "$ref"; else if (isConstant(schema)) return JSON.stringify(schema.const); else if (isOneOf(schema)) return schema.oneOf.map((s) => getKind(s)).join(" | "); else if (isArray(schema)) return `Array<${getKind(schema.items)}>`; else if (isObject(schema)) return "object"; else if (isString(schema)) return "string"; else if (isInteger(schema)) return "integer"; else if (isNumber(schema)) return "number"; else if (isBoolean(schema)) return "boolean"; else if (isNull(schema)) return "null"; schema satisfies never; return "unknown"; }; export const isArray = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.IArray => (schema as AutoBeOpenApi.IJsonSchema.IArray).type === "array"; export const isObject = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.IObject => (schema as AutoBeOpenApi.IJsonSchema.IObject).type === "object"; export const isOneOf = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.IOneOf => (schema as AutoBeOpenApi.IJsonSchema.IOneOf).oneOf !== undefined; export const isReference = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.IReference => (schema as AutoBeOpenApi.IJsonSchema.IReference).$ref !== undefined; export const isConstant = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.IConstant => (schema as AutoBeOpenApi.IJsonSchema.IConstant).const !== undefined; export const isBoolean = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.IBoolean => (schema as AutoBeOpenApi.IJsonSchema.IBoolean).type === "boolean"; export const isInteger = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.IInteger => (schema as AutoBeOpenApi.IJsonSchema.IInteger).type === "integer"; export const isNumber = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.INumber => (schema as AutoBeOpenApi.IJsonSchema.INumber).type === "number"; export const isString = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.IString => (schema as AutoBeOpenApi.IJsonSchema.IString).type === "string"; export const isNull = ( schema: AutoBeOpenApi.IJsonSchema, ): schema is AutoBeOpenApi.IJsonSchema.INull => (schema as AutoBeOpenApi.IJsonSchema.INull).type === "null"; export const isNullable = (schema: AutoBeOpenApi.IJsonSchema): boolean => isNull(schema) || (isOneOf(schema) && schema.oneOf.some((sub) => isNull(sub))); export const visit = (props: { components: AutoBeOpenApi.IComponents; schema: AutoBeOpenApi.IJsonSchema; closure: (schema: AutoBeOpenApi.IJsonSchema, accessor: string) => void; }): void => OpenApiTypeChecker.visit({ components: props.components, schema: props.schema, closure: (schema, accessor) => { props.closure(schema as AutoBeOpenApi.IJsonSchema, accessor); }, }); export const skim = (props: { closure: (schema: AutoBeOpenApi.IJsonSchema, accessor: string) => void; schema: AutoBeOpenApi.IJsonSchema; accessor: string; }): void => { props.closure(props.schema, props.accessor); if (isOneOf(props.schema)) props.schema.oneOf.forEach((sub, index) => skim({ closure: props.closure, schema: sub, accessor: `${props.accessor}.oneOf[${index}]`, }), ); else if (isArray(props.schema)) skim({ closure: props.closure, schema: props.schema.items, accessor: `${props.accessor}.items`, }); else if (isObject(props.schema)) { if ( typeof props.schema.additionalProperties === "object" && props.schema.additionalProperties !== null ) skim({ closure: props.closure, schema: props.schema.additionalProperties, accessor: `${props.accessor}.additionalProperties`, }); for (const [key, value] of Object.entries(props.schema.properties)) if (value) skim({ closure: props.closure, schema: value, accessor: `${props.accessor}.properties[${JSON.stringify(key)}]`, }); } }; export const getTypeName = (schema: AutoBeOpenApi.IJsonSchema): string => { if (isReference(schema)) return schema.$ref.split("/").slice(-1)[0]!; else if (isConstant(schema)) return JSON.stringify(schema.const); else if (isArray(schema)) return `Array<${getTypeName(schema.items)}>`; else if (isString(schema)) return "string"; else if (isInteger(schema)) return "integer"; else if (isNumber(schema)) return "number"; else if (isBoolean(schema)) return "boolean"; else if (isNull(schema)) return "null"; else if (isObject(schema)) return "object"; else if (isOneOf(schema)) return schema.oneOf.map((s) => getTypeName(s)).join(" | "); schema satisfies never; return "unknown"; }; }