UNPKG

openapi-ts-mock-generator

Version:
1 lines 25.3 kB
{"version":3,"sources":["../../src/core/types.ts","../../src/core/config.ts","../../src/core/options.ts","../../src/core/index.ts","../../src/generators/faker-generator.ts","../../src/utils/code-utils.ts","../../src/utils/array-utils.ts","../../src/utils/file-utils.ts"],"sourcesContent":["import { OpenAPIV3_1 } from \"openapi-types\"\n\n/**\n * 메인 옵션 타입\n * CLI 및 프로그래매틱 API에서 사용되는 모든 설정을 포함\n */\nexport type Options = {\n path: string\n arrayMinLength: number\n arrayMaxLength: number\n includeCodes: number[] | undefined\n baseDir: string\n specialPath: string | undefined\n handlerUrl: string\n fakerLocale: string\n generateTarget: string\n clear: boolean\n} & TypeScriptCodeOptions\n\n/**\n * 스키마 출력 기본 타입\n */\nexport type SchemaOutputType = string | number | boolean | null | undefined | Date\n\n/**\n * 중첩된 스키마 출력 타입 (재귀적)\n */\ntype NestedSchemaOutputType<T> =\n | {\n [K in keyof T]: T[K] extends object ? NestedSchemaOutputType<T[K]> : T[K]\n }\n | SchemaOutputType\n | {}\n\n/**\n * 파싱된 스키마 타입\n */\nexport type ParseSchemaType = NestedSchemaOutputType<string>\n\n/**\n * HTTP 메서드 열거형\n */\nexport enum HttpMethods {\n GET = \"get\",\n PUT = \"put\",\n POST = \"post\",\n DELETE = \"delete\",\n OPTIONS = \"options\",\n HEAD = \"head\",\n PATCH = \"patch\",\n TRACE = \"trace\",\n}\n\n/**\n * 응답 스키마 타입 정의\n */\nexport type ResponseSchemaType =\n | {\n type: \"anyOf\" | \"oneOf\" | \"array\"\n value: OpenAPIV3_1.SchemaObject\n }\n | {\n type: \"ref\"\n value: OpenAPIV3_1.ReferenceObject\n }\n | undefined\n\n/**\n * 정규화된 경로 타입\n * OpenAPI 경로 정보를 내부에서 사용하기 쉬운 형태로 변환한 타입\n */\nexport type PathNormalizedType = {\n pathname: string\n operationId: string\n summary: string\n method: HttpMethods\n responses: {\n statusCode: number\n description: string\n schema: ResponseSchemaType\n }[]\n tags: string[]\n}\n\n/**\n * 코드 생성 관련 공통 옵션\n */\nexport type CodeFormatOptions = {\n depth?: number\n isStatic?: boolean\n singleLine?: boolean\n}\n\n/**\n * TypeScript 코드 생성 옵션\n */\nexport type TypeScriptCodeOptions = {\n depth?: number\n isStatic: boolean\n isOptional: boolean\n}\n\n/**\n * null 또는 undefined가 아닌 값인지 확인하는 타입 가드\n */\nexport const isNotNullish = <TValue>(value: TValue | null | undefined): value is TValue => {\n return value !== null && value !== undefined\n}\n","import { Faker, ko } from \"@faker-js/faker\"\nimport { Options } from \"./types\"\n\n/**\n * 기본 옵션 설정\n */\nexport const defaultOptions: Options = {\n path: \"\",\n arrayMinLength: 1,\n arrayMaxLength: 3,\n includeCodes: undefined,\n baseDir: \"./\",\n specialPath: undefined,\n handlerUrl: \"*\",\n fakerLocale: \"ko\",\n generateTarget: \"api,schema\",\n clear: false,\n // TypeScriptCodeOptions\n isStatic: false,\n isOptional: false,\n}\n\n/**\n * 배열 길이 관련 상수\n */\nexport const ARRAY_MIN_LENGTH = 1\nexport const ARRAY_MAX_LENGTH = 3\n\n/**\n * 문자열 길이 관련 상수\n */\nexport const MIN_STRING_LENGTH = 3\nexport const MAX_STRING_LENGTH = 20\n\n/**\n * 정수 범위 관련 상수\n */\nexport const MIN_INTEGER = 1\nexport const MAX_INTEGER = 100000\n\n/**\n * 소수 범위 관련 상수\n */\nexport const MIN_NUMBER = 0\nexport const MAX_NUMBER = 100\n\n/**\n * 단어 길이 관련 상수\n */\nexport const MIN_WORD_LENGTH = 0\nexport const MAX_WORD_LENGTH = 3\n\n/**\n * Faker 시드값 (일관된 결과를 위함)\n */\nconst FAKER_SEED = 1\n\n/**\n * 전역 Faker 인스턴스\n * 한국어 로케일을 기본으로 설정하고 시드를 고정하여 일관된 결과 제공\n */\nexport const faker = new Faker({\n locale: [ko],\n})\nfaker.seed(FAKER_SEED)\n\n/**\n * 생성된 파일의 상단에 추가되는 주석\n */\nexport const GEN_COMMENT =\n \"/* Do not edit this file. */\\n/* This file generated by openapi-ts-mock-generator. */\\n\\n\"\n","import { Options } from \"./types\"\nimport { defaultOptions } from \"./config\"\n\n/**\n * 사용자 옵션을 기본 옵션과 병합하여 완전한 옵션 객체를 생성\n */\nexport const mergeOptions = (userOptions: Partial<Options>): Options => {\n return {\n ...defaultOptions,\n ...userOptions,\n }\n}\n\n/**\n * CLI에서 받은 원시 옵션을 내부 옵션 형태로 변환\n */\nexport const transformCliOptions = (rawOptions: any): Options => {\n return {\n path: rawOptions.path || defaultOptions.path,\n baseDir: rawOptions.baseDir || defaultOptions.baseDir,\n arrayMinLength: parseInt(rawOptions.arrayMinLength) || defaultOptions.arrayMinLength,\n arrayMaxLength: parseInt(rawOptions.arrayMaxLength) || defaultOptions.arrayMaxLength,\n handlerUrl: rawOptions.handlerUrl || defaultOptions.handlerUrl,\n fakerLocale: rawOptions.locales || defaultOptions.fakerLocale,\n generateTarget: rawOptions.generateTarget || defaultOptions.generateTarget,\n specialPath: rawOptions.specialPath || defaultOptions.specialPath,\n clear: rawOptions.clear || defaultOptions.clear,\n includeCodes: rawOptions.includeCodes\n ? rawOptions.includeCodes\n .toString()\n .split(\",\")\n .map((code: string) => parseInt(code))\n : undefined,\n // TypeScriptCodeOptions\n isStatic: rawOptions.static || defaultOptions.isStatic,\n isOptional: rawOptions.optional || defaultOptions.isOptional,\n }\n}\n\n/**\n * 옵션 유효성 검증\n */\nexport const validateOptions = (options: Options): string[] => {\n const errors: string[] = []\n\n if (!options.path) {\n errors.push(\"path is required\")\n }\n\n if (\n options.arrayMinLength &&\n options.arrayMaxLength &&\n options.arrayMinLength > options.arrayMaxLength\n ) {\n errors.push(\"arrayMinLength should not be greater than arrayMaxLength\")\n }\n\n if (\n options.generateTarget &&\n !options.generateTarget.split(\",\").every((target) => [\"api\", \"schema\"].includes(target.trim()))\n ) {\n errors.push(\"generateTarget should contain only 'api' and/or 'schema'\")\n }\n\n return errors\n}\n","/**\n * Core 모듈 - 타입, 설정, 옵션 처리를 담당\n */\n\n// Types\nexport * from \"./types\"\n\n// Configuration\nexport * from \"./config\"\n\n// Options handling\nexport * from \"./options\"\n","/**\n * Faker 설정 파일 생성 로직\n * 동적 모킹에 사용할 Faker 설정 파일을 생성\n */\n\nimport { GEN_COMMENT, Options } from \"../core\"\nimport { ensureDir, safeWriteFile, toTypeScriptCode } from \"../utils\"\nimport * as path from \"path\"\n\n/**\n * Faker 설정 파일을 생성\n * 사용자가 지정한 로케일로 Faker 인스턴스를 설정하는 파일을 생성\n */\nexport const generateFaker = (options: Options): void => {\n const directory = path.join(options.baseDir ?? \"\")\n ensureDir(directory)\n\n const content = generateFakerFileContent(options)\n const outputFileName = path.join(options.baseDir ?? \"\", \"fakers.ts\")\n safeWriteFile(outputFileName, content)\n console.log(`Generated fakers ${outputFileName}`)\n}\n\n/**\n * Faker 파일의 내용 생성\n */\nconst generateFakerFileContent = (options: Options): string => {\n const { GEN_COMMENT } = require(\"../core\")\n\n const localeOption = options.fakerLocale.replace(\",\", \", \")\n const importFaker = `import { Faker, ${localeOption} } from \"@faker-js/faker\"\\n\\n`\n const fakerDeclare = [\n \"export const faker = new Faker({\",\n ` locale: [${localeOption}]`,\n \"})\",\n ].join(\"\\n\")\n\n return GEN_COMMENT + importFaker + fakerDeclare\n}\n\n/**\n * 스키마 모킹 파일을 생성\n * 스키마별 모킹 데이터를 담은 파일을 생성\n */\nexport const generateSchemaFile = (schemas: Record<string, any>, options: Options): void => {\n // key is schema name, value is generated schema value\n const generatedVars = Object.entries(schemas)\n .map(([varName, varValue]) => {\n return `export const ${varName}Mock = ${toTypeScriptCode(varValue, {\n depth: 0,\n ...options,\n })}`\n })\n .join(\"\\n\\n\")\n\n const importFaker = options.isStatic ? \"\" : 'import { faker } from \"./fakers\"\\n\\n'\n const content = GEN_COMMENT + importFaker + generatedVars\n\n const outputFileName = path.join(options.baseDir ?? \"\", \"schemas.ts\")\n safeWriteFile(outputFileName, content)\n console.log(`Generated schema ${outputFileName}`)\n}\n\n/**\n * 사용자 정의 Faker 설정 파일 생성\n * 특별한 Faker 규칙을 담은 설정 파일들을 생성\n */\nexport const generateCustomFakerConfig = (\n titleConfig: Record<string, any>,\n descriptionConfig: Record<string, any>,\n options: Options\n): void => {\n if (!options.specialPath) return\n\n const specialDir = path.join(options.baseDir ?? \"\", options.specialPath)\n ensureDir(specialDir)\n\n // titles.json 생성\n const titlesPath = path.join(specialDir, \"titles.json\")\n safeWriteFile(titlesPath, JSON.stringify(titleConfig, null, 2))\n console.log(`Generated custom faker titles config: ${titlesPath}`)\n\n // descriptions.json 생성\n const descriptionsPath = path.join(specialDir, \"descriptions.json\")\n safeWriteFile(descriptionsPath, JSON.stringify(descriptionConfig, null, 2))\n console.log(`Generated custom faker descriptions config: ${descriptionsPath}`)\n}\n\n/**\n * Faker 설정의 유효성 검증\n */\nexport const validateFakerConfig = (\n config: Record<string, any>\n): { isValid: boolean; errors: string[] } => {\n const errors: string[] = []\n\n Object.entries(config).forEach(([key, value]) => {\n if (typeof value !== \"object\") {\n errors.push(`Config for \"${key}\" must be an object`)\n return\n }\n\n if (\"module\" in value && \"type\" in value) {\n if (typeof value.module !== \"string\") {\n errors.push(`Module for \"${key}\" must be a string`)\n }\n if (typeof value.type !== \"string\") {\n errors.push(`Type for \"${key}\" must be a string`)\n }\n } else if (!(\"value\" in value)) {\n errors.push(`Config for \"${key}\" must have either \"value\" or \"module\"+\"type\"`)\n }\n })\n\n return {\n isValid: errors.length === 0,\n errors,\n }\n}\n\n/**\n * 기본 Faker 설정 템플릿 생성\n */\nexport const generateDefaultFakerTemplate = (): {\n titles: Record<string, any>\n descriptions: Record<string, any>\n} => {\n return {\n titles: {\n \"User ID\": {\n module: \"string\",\n type: \"uuid\",\n },\n Email: {\n module: \"internet\",\n type: \"email\",\n },\n Name: {\n module: \"person\",\n type: \"fullName\",\n },\n },\n descriptions: {\n \"사용자 이메일\": {\n module: \"internet\",\n type: \"email\",\n },\n \"사용자 이름\": {\n module: \"person\",\n type: \"fullName\",\n options: { locale: \"ko\" },\n },\n 전화번호: {\n module: \"phone\",\n type: \"number\",\n },\n },\n }\n}\n\n/**\n * 로케일별 사용 가능한 Faker 모듈 정보 반환\n */\nexport const getLocaleSpecificModules = (locale: string): string[] => {\n const commonModules = [\n \"datatype\",\n \"date\",\n \"finance\",\n \"git\",\n \"hacker\",\n \"helpers\",\n \"image\",\n \"internet\",\n \"lorem\",\n \"music\",\n \"person\",\n \"phone\",\n \"random\",\n \"system\",\n \"vehicle\",\n ]\n\n // 로케일별 특별한 모듈이 있다면 여기에 추가\n const localeModules: Record<string, string[]> = {\n ko: [\"person\", \"phone\", \"address\"],\n en: [\"person\", \"phone\", \"address\", \"company\"],\n ja: [\"person\", \"phone\", \"address\"],\n }\n\n return [...commonModules, ...(localeModules[locale] || [])]\n}\n","/**\n * 코드 생성 관련 유틸리티 함수들\n */\n\nimport { ParseSchemaType, TypeScriptCodeOptions, CodeFormatOptions } from \"../core\"\n\n/**\n * 객체를 TypeScript 코드로 변환 (nullable 타입 확장 지원)\n * 동적 모킹에서 optional 필드를 지원하는 코드를 생성\n */\nexport const toTypeScriptCode = (\n param: ParseSchemaType,\n options: TypeScriptCodeOptions\n): string => {\n const { depth = 0, isStatic } = options\n\n const prefixSpace = \" \".repeat(depth * 2) // 들여쓰기용\n\n if (param === null) {\n return \"null\"\n }\n\n if (Array.isArray(param)) {\n const results = param\n .map((elem) => toTypeScriptCode(elem, { ...options, depth: depth + 1 }))\n .join(\",\\n\" + prefixSpace)\n return [\"[\", results, \"]\"].join(\"\\n\" + prefixSpace)\n }\n\n if (typeof param === \"object\") {\n const results = Object.entries(param)\n .map(([key, value]) => {\n return generateObjectProperty(key, value, options, prefixSpace)\n })\n .join(\"\\n\" + prefixSpace)\n\n return [\"{\", `${results}`, \"}\"].join(\"\\n\" + prefixSpace)\n }\n\n // 문자열 처리\n if (typeof param === \"string\") {\n // 동적 faker 호출은 그대로 유지\n if (\n isStatic === false &&\n (param.startsWith(\"faker\") || param.startsWith(\"Buffer.from(faker\"))\n ) {\n return param\n }\n\n // \" as const\" 분리하여 처리\n if (param.endsWith(\" as const\")) {\n return `\"${param.slice(0, -\" as const\".length)}\" as const`\n }\n }\n\n return JSON.stringify(param)\n}\n\n/**\n * nullable 타입 확장 여부 확인\n */\nconst shouldApplyNullableExtension = (value: any, isOptional: boolean): boolean => {\n if (!isOptional) return false\n\n // 값이 null인 경우\n if (value === null) return true\n\n // 문자열 및 null을 포함한 경우\n if (typeof value === \"string\" && value.includes(\",null\")) {\n return true\n }\n\n return false\n}\n\n/**\n * 객체 프로퍼티를 생성 (nullable 타입 확장 포함)\n */\nconst generateObjectProperty = (\n key: string,\n value: any,\n options: TypeScriptCodeOptions,\n prefixSpace: string\n): string => {\n const { isOptional, depth = 0 } = options\n\n // nullable 타입 확장 로직\n const shouldApplyNullable = shouldApplyNullableExtension(value, isOptional)\n const nullableTypeExtensionStart = shouldApplyNullable\n ? `...(faker.datatype.boolean() ? {\\n${prefixSpace}`\n : \"\"\n const nullableTypeExtensionEnd = shouldApplyNullable ? `\\n${prefixSpace}} : {})` : \"\"\n\n const propertyValue = toTypeScriptCode(value, {\n ...options,\n depth: depth + 1,\n })\n\n return `${nullableTypeExtensionStart}${prefixSpace}${key}: ${propertyValue}${nullableTypeExtensionEnd},`\n}\n\n/**\n * 멀티라인 코드를 한 줄로 압축\n */\nexport const compressCode = (code: string): string => {\n return code\n .replace(/\\n/g, \" \") // 줄바꿈을 공백으로\n .replace(/\\s+/g, \" \") // 연속된 공백을 하나로\n .replace(/\\s\\./g, \".\") // 공백 + 점을 점으로\n .trim()\n}\n\n/**\n * TypeScript 인터페이스 코드 생성\n */\nexport const generateInterface = (name: string, properties: Record<string, string>): string => {\n const props = Object.entries(properties)\n .map(([key, type]) => ` ${key}: ${type}`)\n .join(\"\\n\")\n\n return `interface ${name} {\\n${props}\\n}`\n}\n\n/**\n * TypeScript 타입 별칭 코드 생성\n */\nexport const generateTypeAlias = (name: string, type: string): string => {\n return `type ${name} = ${type}`\n}\n","/**\n * 배열 처리 관련 유틸리티 함수들\n */\n\nimport { faker } from \"../core\"\n\n/**\n * 지정된 범위 내에서 랜덤한 길이의 배열을 생성\n * 배열의 각 요소는 인덱스 값으로 초기화됨\n */\nexport const getRandomLengthArray = (min: number = 1, max: number = 3): number[] => {\n const length = faker.number.int({ min, max })\n return Array.from({ length }, (_, i) => i)\n}\n\n/**\n * 배열을 지정된 크기로 청크 단위로 분할\n */\nexport const chunkArray = <T>(array: T[], size: number): T[][] => {\n const chunks: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size))\n }\n return chunks\n}\n\n/**\n * 배열에서 중복 제거 (primitive 타입용)\n */\nexport const unique = <T>(array: T[]): T[] => {\n return [...new Set(array)]\n}\n\n/**\n * 배열에서 중복 제거 (객체용, 키 기준)\n */\nexport const uniqueBy = <T>(array: T[], keyFn: (item: T) => any): T[] => {\n const seen = new Set()\n return array.filter((item) => {\n const key = keyFn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n","/**\n * 파일 시스템 관련 유틸리티 함수들\n */\n\nimport { existsSync, mkdirSync, writeFileSync, rmSync, readdirSync, readFileSync } from \"fs\"\nimport * as path from \"path\"\n\n/**\n * 디렉토리가 존재하지 않으면 생성\n */\nexport const ensureDir = (dirPath: string): void => {\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true })\n }\n}\n\n/**\n * 디렉토리를 비우고 정리\n */\nexport const clearDirectory = (dirPath: string): void => {\n if (existsSync(dirPath)) {\n readdirSync(dirPath).forEach((file) => {\n rmSync(path.join(dirPath, file))\n })\n }\n}\n\n/**\n * 안전하게 파일 쓰기 (디렉토리 자동 생성)\n */\nexport const safeWriteFile = (filePath: string, content: string): void => {\n const dir = path.dirname(filePath)\n ensureDir(dir)\n writeFileSync(filePath, content)\n}\n\n/**\n * JSON 파일 읽기 (파일이 없으면 기본값 반환)\n */\nexport const readJsonFile = <T>(filePath: string, defaultValue: T): T => {\n if (!existsSync(filePath)) {\n return defaultValue\n }\n\n try {\n const content = readFileSync(filePath, \"utf-8\")\n return JSON.parse(content)\n } catch (error) {\n console.warn(`Failed to read JSON file ${filePath}:`, error)\n return defaultValue\n }\n}\n\n/**\n * 파일 경로가 URL인지 로컬 파일인지 확인하여 절대 경로 반환\n */\nexport const resolveFilePath = (inputPath: string, baseDir?: string): string => {\n if (inputPath.startsWith(\"http\")) {\n return inputPath\n }\n\n if (baseDir) {\n return path.join(baseDir, inputPath)\n }\n\n return inputPath\n}\n\n/**\n * 여러 파일명 조합하여 고유한 파일명 생성\n */\nexport const createUniqueFileName = (baseName: string, extension: string): string => {\n const timestamp = Date.now()\n return `${baseName}-${timestamp}.${extension}`\n}\n"],"mappings":"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","names":["HttpMethods","path","GEN_COMMENT"]}