openapi-ts-mock-generator
Version:
typescript mock data generator based openapi
1 lines • 5.48 kB
Source Map (JSON)
{"version":3,"sources":["../../src/utils/code-utils.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAUO,IAAM,mBAAmB,CAC9B,OACA,YACW;AACX,QAAM,EAAE,QAAQ,GAAG,SAAS,IAAI;AAEhC,QAAM,cAAc,IAAI,OAAO,QAAQ,CAAC;AAExC,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,UAAU,MACb,IAAI,CAAC,SAAS,iBAAiB,MAAM,iCAAK,UAAL,EAAc,OAAO,QAAQ,EAAE,EAAC,CAAC,EACtE,KAAK,QAAQ,WAAW;AAC3B,WAAO,CAAC,KAAK,SAAS,GAAG,EAAE,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,OAAO,QAAQ,KAAK,EACjC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,aAAO,uBAAuB,KAAK,OAAO,SAAS,WAAW;AAAA,IAChE,CAAC,EACA,KAAK,OAAO,WAAW;AAE1B,WAAO,CAAC,KAAK,GAAG,OAAO,IAAI,GAAG,EAAE,KAAK,OAAO,WAAW;AAAA,EACzD;AAGA,MAAI,OAAO,UAAU,UAAU;AAE7B,QACE,aAAa,UACZ,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW,mBAAmB,IAClE;AACA,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,aAAO,IAAI,MAAM,MAAM,GAAG,CAAC,YAAY,MAAM,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,KAAK;AAC7B;AAKA,IAAM,+BAA+B,CAAC,OAAY,eAAiC;AACjF,MAAI,CAAC;AAAY,WAAO;AAGxB,MAAI,UAAU;AAAM,WAAO;AAG3B,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,OAAO,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKA,IAAM,yBAAyB,CAC7B,KACA,OACA,SACA,gBACW;AACX,QAAM,EAAE,YAAY,QAAQ,EAAE,IAAI;AAGlC,QAAM,sBAAsB,6BAA6B,OAAO,UAAU;AAC1E,QAAM,6BAA6B,sBAC/B;AAAA,EAAqC,WAAW,KAChD;AACJ,QAAM,2BAA2B,sBAAsB;AAAA,EAAK,WAAW,YAAY;AAEnF,QAAM,gBAAgB,iBAAiB,OAAO,iCACzC,UADyC;AAAA,IAE5C,OAAO,QAAQ;AAAA,EACjB,EAAC;AAED,SAAO,GAAG,0BAA0B,GAAG,WAAW,GAAG,GAAG,KAAK,aAAa,GAAG,wBAAwB;AACvG;AAKO,IAAM,eAAe,CAAC,SAAyB;AACpD,SAAO,KACJ,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,SAAS,GAAG,EACpB,KAAK;AACV;AAKO,IAAM,oBAAoB,CAAC,MAAc,eAA+C;AAC7F,QAAM,QAAQ,OAAO,QAAQ,UAAU,EACpC,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,EACxC,KAAK,IAAI;AAEZ,SAAO,aAAa,IAAI;AAAA,EAAO,KAAK;AAAA;AACtC;AAKO,IAAM,oBAAoB,CAAC,MAAc,SAAyB;AACvE,SAAO,QAAQ,IAAI,MAAM,IAAI;AAC/B;","names":[]}