swagger-fsd-gen
Version:
Swagger API client generator that creates type-safe API clients using ky and TanStack Query with Feature Sliced Design pattern. Automatically generates API client code from Swagger/OpenAPI specifications.
112 lines (102 loc) • 3.55 kB
JavaScript
/**
* Swagger 스키마 파서 유틸리티
* - Swagger anyOf 스키마를 TypeScript Union 타입으로 변환
* - 필수/선택적 필드 처리
* - null 타입 자동 추가/제거
*/
/**
* 기본 스키마 파서 클래스
* - swagger-typescript-api의 스키마 파서 기반 클래스
* - 다양한 스키마 타입 처리를 위한 공통 기능 제공
*/
class MonoSchemaParser {
schema;
typeName;
schemaPath;
schemaParser;
/** @type {SchemaParserFabric} */
schemaParserFabric;
/** @type {TypeNameFormatter} */
typeNameFormatter;
/** @type {SchemaComponentsMap} */
schemaComponentsMap;
/** @type {SchemaUtils} */
schemaUtils;
/** @type {CodeGenConfig} */
config;
/** @type {SchemaFormatters} */
schemaFormatters;
/**
* MonoSchemaParser 생성자
* @param {Object} schemaParser - 상위 스키마 파서 인스턴스
* @param {Object} schema - 파싱할 스키마 객체
* @param {string} typeName - 생성할 타입명
* @param {Array} schemaPath - 스키마 경로 배열 (기본값: [])
*/
constructor(schemaParser, schema, typeName, schemaPath = []) {
this.schemaParser = schemaParser;
this.schemaParserFabric = schemaParser.schemaParserFabric;
this.schema = schema;
this.typeName = typeName;
this.typeNameFormatter = schemaParser.typeNameFormatter;
this.schemaPath = schemaPath;
this.schemaComponentsMap = this.schemaParser.schemaComponentsMap;
this.schemaUtils = this.schemaParser.schemaUtils;
this.config = this.schemaParser.config;
this.schemaFormatters = this.schemaParser.schemaFormatters;
}
}
/**
* anyOf 스키마 파서 클래스
* - Swagger anyOf 스키마를 TypeScript Union 타입 (T1 | T2)으로 변환
* - 필수/선택적 필드에 따른 null 타입 자동 처리
* - 중복 타입 제거 및 최적화
*
* @example
* // Swagger anyOf 스키마:
* {
* "anyOf": [
* { "type": "string" },
* { "type": "number" }
* ]
* }
*
* // 생성되는 TypeScript 타입:
* string | number
*/
class AnyOfSchemaParser extends MonoSchemaParser {
/**
* anyOf 스키마를 TypeScript Union 타입으로 파싱
* @returns {string} TypeScript Union 타입 문자열
*/
parse() {
// 제외할 타입들 (any 타입은 항상 제외)
const ignoreTypes = [this.config.Ts.Keyword.Any];
// 필수 필드 여부에 따른 null 타입 처리
if (this.schema.required === "boolean") {
// 스키마에 required가 boolean으로 명시된 경우
!this.schema.required && ignoreTypes.push("null");
} else {
// 상위 스키마에서 required 필드 확인
const isRequired = this.schemaComponentsMap._data
.find((v) => v.typeName === this.schemaPath.at(0))
?.rawTypeData?.required?.includes(this.schemaPath.at(1));
!isRequired && ignoreTypes.push("null");
}
// anyOf 배열의 각 스키마를 TypeScript 타입으로 변환
const combined = this.schema.anyOf.map((childSchema) =>
this.schemaParserFabric.getInlineParseContent(
this.schemaUtils.makeAddRequiredToChildSchema(this.schema, childSchema),
this.schemaPath
)
);
// 제외할 타입들을 필터링하여 최종 타입 배열 생성
const filtered = this.schemaUtils.filterSchemaContents(
combined,
(content) => !ignoreTypes.includes(content)
);
// TypeScript Union 타입 문자열 생성 (예: "string | number")
return this.config.Ts.UnionType(filtered);
}
}
export { AnyOfSchemaParser };