{"version":3,"sources":["../../src/core/config.ts","../../src/utils/code-utils.ts","../../src/utils/file-utils.ts","../../src/parsers/faker-parser.ts"],"sourcesContent":["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","/**\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 { 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","/**\n * Faker 관련 파싱 및 특별한 데이터 생성 로직\n */\n\nimport { Options, SchemaOutputType, faker } from \"../core\"\nimport { toTypeScriptCode, readJsonFile } from \"../utils\"\nimport { join } from \"path\"\n\n/**\n * 특별한 Faker 규칙을 파싱하여 적용\n * titles.json과 descriptions.json에서 사용자 정의 faker 규칙을 로드\n */\nexport const specialFakerParser = (options: Options) => {\n  if (options.specialPath === undefined)\n    return {\n      titleSpecial: {},\n      descriptionSpecial: {},\n    }\n\n  const titlePath = join(options.baseDir ?? \"\", options.specialPath, \"titles.json\")\n  const descPath = join(options.baseDir ?? \"\", options.specialPath, \"descriptions.json\")\n  const titleSpecialKey: Record<string, object> = readJsonFile(titlePath, {})\n  const descriptionSpecialKey: Record<string, object> = readJsonFile(descPath, {})\n\n  const titleSpecial = Object.entries(titleSpecialKey).reduce((acc, [key, value]) => {\n    const fakerValue = getFakerValue(value, options)\n    acc[key] = fakerValue\n    return acc\n  }, {} as Record<string, SchemaOutputType>)\n\n  const descriptionSpecial = Object.entries(descriptionSpecialKey).reduce((acc, [key, value]) => {\n    const fakerValue = getFakerValue(value, options)\n    acc[key] = fakerValue\n    return acc\n  }, {} as Record<string, SchemaOutputType>)\n\n  return { titleSpecial, descriptionSpecial }\n}\n\n/**\n * 특별한 Faker 값 정의에서 실제 값을 생성\n */\nconst getFakerValue = (value: object, options: Options): SchemaOutputType => {\n  if (\"value\" in value) {\n    // value type, use directly\n    return value.value as SchemaOutputType\n  }\n\n  if (\"module\" in value && \"type\" in value) {\n    // dynamic faker\n    if (options.isStatic === false) {\n      const fakerOption =\n        \"options\" in value\n          ? toTypeScriptCode(value.options, {\n              depth: 0,\n              ...options,\n            })\n          : \"\"\n      return `faker.${value.module}.${value.type}(${fakerOption})`\n    }\n\n    // faker type, make faker\n    const fakerModule = faker[value.module as keyof typeof faker]\n    if (fakerModule === undefined) {\n      console.warn(\"can't find faker module\", fakerModule)\n      return undefined\n    }\n\n    const fakerFunc = fakerModule[value.type as keyof typeof fakerModule] as Function\n    if (fakerFunc === undefined || typeof fakerFunc !== \"function\") {\n      console.warn(\"can't find faker function\", fakerFunc)\n      return undefined\n    }\n\n    return \"options\" in value ? fakerFunc(value.options) : fakerFunc()\n  }\n\n  return undefined\n}\n\n/**\n * Faker 모듈의 유효성을 검증\n */\nexport const validateFakerModule = (moduleName: string): boolean => {\n  return moduleName in faker\n}\n\n/**\n * Faker 함수의 유효성을 검증\n */\nexport const validateFakerFunction = (moduleName: string, functionName: string): boolean => {\n  try {\n    const fakerModule = faker[moduleName as keyof typeof faker]\n    return typeof fakerModule?.[functionName as keyof typeof fakerModule] === \"function\"\n  } catch {\n    return false\n  }\n}\n\n/**\n * 사용 가능한 Faker 모듈 목록 반환\n */\nexport const getAvailableFakerModules = (): string[] => {\n  return Object.keys(faker).filter((key) => typeof faker[key as keyof typeof faker] === \"object\")\n}\n\n/**\n * 특정 Faker 모듈의 사용 가능한 함수 목록 반환\n */\nexport const getAvailableFakerFunctions = (moduleName: string): string[] => {\n  try {\n    const fakerModule = faker[moduleName as keyof typeof faker]\n    if (!fakerModule) return []\n\n    return Object.keys(fakerModule).filter(\n      (key) => typeof fakerModule[key as keyof typeof fakerModule] === \"function\"\n    )\n  } catch {\n    return []\n  }\n}\n"],"mappings":"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","names":[]}