openapi-ts-mock-generator
Version:
typescript mock data generator based openapi
1 lines • 42.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/defaults.ts","../src/writer.ts","../src/parser.ts","../src/types.ts","../src/generate.ts"],"sourcesContent":["import { Options } from \"./types\"\nimport { Faker, ko } from \"@faker-js/faker\"\n\nexport const defaultOptions: Options = {\n path: \"\",\n baseDir: \"./\",\n arrayMinLength: 1,\n arrayMaxLength: 3,\n isStatic: true,\n handlerUrl: \"*\",\n fakerLocale: \"ko\",\n generateTarget: \"api,schema\",\n}\n\nexport const ARRAY_MIN_LENGTH = 1\nexport const ARRAY_MAX_LENGTH = 3\n\nexport const MIN_STRING_LENGTH = 3\nexport const MAX_STRING_LENGTH = 20\n\nexport const MIN_INTEGER = 1\nexport const MAX_INTEGER = 100000\n\nexport const MIN_NUMBER = 0\nexport const MAX_NUMBER = 100\n\nexport const MIN_WORD_LENGTH = 0\nexport const MAX_WORD_LENGTH = 3\n\nconst FAKER_SEED = 1\n\nexport const faker = new Faker({\n locale: [ko],\n})\nfaker.seed(FAKER_SEED)\n\n// script generated comment\nexport const GEN_COMMENT =\n \"/* Do not edit this file. */\\n/* This file generated by openapi-ts-mock-generator. */\\n\\n\"\n","import { getRandomLengthArray, parseSchema, refSchemaParser, specialFakerParser } from \"./parser\"\nimport { Options, ParseSchemaType, PathNormalizedType, SchemaOutputType } from \"./types\"\nimport SwaggerParser from \"@apidevtools/swagger-parser\"\nimport { camelCase, pascalCase } from \"change-case-all\"\nimport { existsSync, mkdirSync, writeFileSync, rmSync, readdirSync } from \"fs\"\nimport { isReference } from \"oazapfts/generate\"\nimport * as path from \"path\"\nimport { GEN_COMMENT } from \"./defaults\"\n\nexport const writeHandlers = (paths: PathNormalizedType[], options: Options) => {\n const firstTags = Array.from(new Set(paths.map((path) => path.tags[0])))\n // create records with tag as key\n const handlersPerTag = firstTags.reduce(\n (acc, tag) => {\n acc[tag] = []\n return acc\n },\n {} as Record<string, string[]>\n )\n\n paths.forEach((path) => {\n const codeBaseArray = [` http.${path.method}(\\`\\${handlerUrl}${path.pathname}\\`, () => {`]\n if (path.responses.length === 1) {\n // single response\n const res = path.responses[0]\n if (res.schema?.type === \"ref\") {\n const schemaName = pascalCase(res.schema.value.$ref.replace(\"#/components/schemas/\", \"\"))\n codeBaseArray.push(` // Schema is ${schemaName}`)\n }\n const outputResName = `get${pascalCase(path.operationId)}${res.statusCode}`\n codeBaseArray.push(` return HttpResponse.json(${outputResName}(), {`)\n codeBaseArray.push(` status: ${res.statusCode},`)\n codeBaseArray.push(` })`)\n } else if (path.responses.length > 1) {\n // multiple responses\n // random select response\n codeBaseArray.push(` const responses = [`)\n path.responses.forEach((res) => {\n const schemaName =\n res.schema?.type === \"ref\"\n ? pascalCase(res.schema.value.$ref.replace(\"#/components/schemas/\", \"\"))\n : \"\"\n const schemaComment = schemaName ? ` // Schema is ${schemaName}` : \"\"\n const outputResName = `get${pascalCase(path.operationId)}${res.statusCode}`\n codeBaseArray.push(\n ` [${outputResName}(), { status: ${res.statusCode} }],${schemaComment}`\n )\n return outputResName\n })\n codeBaseArray.push(` ]`)\n codeBaseArray.push(` const randomIndex = Math.floor(Math.random() * responses.length)`)\n codeBaseArray.push(` return HttpResponse.json(...responses[randomIndex])`)\n } else {\n // empty responses\n codeBaseArray.push(` return HttpResponse.json()`)\n }\n codeBaseArray.push(` }),`)\n const handler = codeBaseArray.join(\"\\n\")\n handlersPerTag[path.tags[0]].push(handler)\n })\n\n Object.entries(handlersPerTag).forEach(([tag, handlers]) => {\n const importMSW = `import { http, HttpResponse } from 'msw'`\n const responseNames = handlers\n .reduce((acc, handler) => {\n const matched = handler.match(/get[A-Z]\\w+/g)\n if (matched === null) return acc\n return [...acc, ...matched]\n }, [] as string[])\n .join(\", \")\n const importResponses =\n responseNames.length > 0 ? `import { ${responseNames} } from \"../response\"\\n` : \"\"\n\n const handlerUrl = `const handlerUrl = \"${options.handlerUrl}\"`\n\n const handlerName = camelCase(tag)\n const mockHandlers = [\n `${importMSW}`,\n `${importResponses}`,\n `${handlerUrl}`,\n ``,\n `export const ${handlerName}Handlers = [`,\n `${handlers.join(\"\\n\\n\")}`,\n `]`,\n ].join(\"\\n\")\n const directory = path.join(options.baseDir ?? \"\", \"handlers\")\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true })\n } else if (options.clear) {\n // clear directory\n readdirSync(directory).forEach((file) => {\n rmSync(path.join(directory, file))\n })\n }\n const fileName = path.join(directory, `${tag}.ts`)\n writeFileSync(fileName, GEN_COMMENT + mockHandlers)\n console.log(`Generated Handler ${fileName}`)\n })\n\n // make mockHandlers.ts for merge all handlers\n const handlersImport = Object.keys(handlersPerTag)\n .map((tag) => {\n const handlerName = `${camelCase(tag)}Handlers`\n return `import { ${handlerName} } from \"./handlers/${tag}\"`\n })\n .join(\"\\n\")\n const handlersArrayItem = Object.keys(handlersPerTag)\n .map((tag) => {\n const handlerName = `${camelCase(tag)}Handlers`\n return ` ...${handlerName},`\n })\n .join(\"\\n\")\n\n const mockHandlers = [\n `${handlersImport}`,\n ``,\n `export const handlers = [`,\n `${handlersArrayItem}`,\n `]`,\n ].join(\"\\n\")\n const fileName = path.join(options.baseDir ?? \"\", \"mockHandlers.ts\")\n writeFileSync(fileName, GEN_COMMENT + mockHandlers)\n console.log(`Generated mock handlers ${fileName}`)\n}\n\nexport const writeResponses = async (paths: PathNormalizedType[], options: Options) => {\n const parser = new SwaggerParser()\n const openapiPath = options.path.startsWith(\"http\")\n ? options.path\n : path.join(options.baseDir ?? \"\", options.path)\n await parser.dereference(openapiPath)\n const refs = parser.$refs\n\n const firstTags = Array.from(new Set(paths.map((path) => path.tags[0])))\n // create records with tag as key\n const codeBasePerTag = firstTags.reduce(\n (acc, tag) => {\n acc[tag] = []\n return acc\n },\n {} as Record<string, string[]>\n )\n const specialFakers = specialFakerParser(options)\n paths.forEach((path) => {\n const pathResponses = path.responses.map((res) => {\n const codeBaseArray = [\n `export const get${pascalCase(path.operationId)}${res.statusCode} = () => {`,\n ]\n if (res.schema?.type === \"ref\") {\n const { name, value } = refSchemaParser(res.schema.value.$ref, refs)\n const outputSchema = parseSchema(value, specialFakers, options)\n codeBaseArray.push(` // Schema is ${name}`)\n codeBaseArray.push(\n ` return ${toUnquotedJSON(outputSchema, {\n depth: 1,\n isStatic: options.isStatic,\n })}`\n )\n } else if (res.schema?.type === \"array\") {\n if (isReference(res.schema.value)) {\n const { name, value } = refSchemaParser(res.schema.value.$ref, refs)\n const outputSchema = getRandomLengthArray(\n options.arrayMinLength,\n options.arrayMaxLength\n ).map(() => parseSchema(value, specialFakers, options))\n codeBaseArray.push(` // Schema is ${name} array`)\n codeBaseArray.push(\n ` return ${toUnquotedJSON(outputSchema, {\n depth: 1,\n isStatic: options.isStatic,\n })}`\n )\n } else {\n const outputSchema = getRandomLengthArray(\n options.arrayMinLength,\n options.arrayMaxLength\n ).map(() => res.schema && parseSchema(res.schema.value, specialFakers, options))\n codeBaseArray.push(\n ` return ${toUnquotedJSON(outputSchema, {\n depth: 1,\n isStatic: options.isStatic,\n })}`\n )\n }\n } else if (res.schema?.type === \"anyOf\") {\n const firstSchema = res.schema.value.anyOf?.[0]\n if (isReference(firstSchema)) {\n const { name, value } = refSchemaParser(firstSchema.$ref, refs)\n const outputSchema = parseSchema(value, specialFakers, options)\n codeBaseArray.push(` // Schema is ${name}`)\n codeBaseArray.push(\n ` return ${toUnquotedJSON(outputSchema, {\n depth: 1,\n isStatic: options.isStatic,\n })}`\n )\n } else {\n codeBaseArray.push(` return ${res.schema.value}`)\n }\n } else {\n codeBaseArray.push(` return ${res.schema?.value}`)\n }\n\n return [...codeBaseArray, `}`].join(\"\\n\")\n })\n const pathResponsesWithComment = `// ${path.operationId}\\n` + pathResponses.join(\"\\n\\n\")\n codeBasePerTag[path.tags[0]].push(pathResponsesWithComment)\n })\n\n const directory = path.join(options.baseDir ?? \"\", \"response\")\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true })\n } else if (options.clear) {\n // clear directory\n readdirSync(directory).forEach((file) => {\n rmSync(path.join(directory, file))\n })\n }\n\n Object.entries(codeBasePerTag).forEach(([tag, responses]) => {\n const needImportFaker = responses.some((res) => res.includes(\"faker.\"))\n const importFaker =\n options.isStatic || !needImportFaker ? \"\" : 'import { faker } from \"../fakers\"\\n\\n'\n\n const fileName = `${directory}/${tag}.ts`\n writeFileSync(fileName, GEN_COMMENT + importFaker + responses.join(\"\\n\\n\"))\n console.log(`Generated ${fileName}`)\n })\n\n // make index.ts for merge all responses\n const importResponses = Object.entries(codeBasePerTag).map(([tag, responses]) => {\n const responseNames = responses\n .reduce((acc, handler) => {\n const matched = handler.match(/get[A-Z]\\w+/g)\n if (matched === null) return acc\n return [...acc, ...matched]\n }, [] as string[])\n .join(\",\\n \")\n return [\"export {\", \" \" + responseNames, '} from \"./' + tag + '\"'].join(\"\\n\")\n })\n const fileName = `${directory}/index.ts`\n writeFileSync(fileName, GEN_COMMENT + importResponses.join(\"\\n\"))\n console.log(`Generated ${fileName}`)\n}\n\nexport const writeSchema = (schemas: Record<string, SchemaOutputType>, options: Options) => {\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 = ${toUnquotedJSON(varValue, {\n isStatic: options.isStatic,\n })}`\n })\n .join(\"\\n\\n\")\n\n const importFaker = options.isStatic ? \"\" : 'import { faker } from \"./fakers\"\\n\\n'\n\n const outputFileName = path.join(`${options.baseDir}`, \"schemas.ts\")\n writeFileSync(outputFileName, GEN_COMMENT + importFaker + generatedVars)\n console.log(`Generated schema ${outputFileName}`)\n}\n\nexport const writeFaker = (options: Options) => {\n const directory = path.join(options.baseDir ?? \"\")\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true })\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 const outputFileName = path.join(`${options.baseDir}`, \"fakers.ts\")\n writeFileSync(outputFileName, GEN_COMMENT + importFaker + fakerDeclare)\n console.log(`Generated fakers ${outputFileName}`)\n}\n\nexport const toUnquotedJSON = (\n param: ParseSchemaType,\n options: {\n depth?: number\n isStatic?: boolean\n singleLine?: boolean\n }\n): string => {\n const { depth, isStatic, singleLine } = {\n depth: 0,\n isStatic: false,\n singleLine: false,\n ...options,\n }\n\n const prefixSpace = \" \".repeat(depth * 2) // for indent\n const lineBreak = singleLine ? \"\" : \"\\n\"\n\n if (param === null) {\n return \"null\"\n } else if (Array.isArray(param)) {\n const results = param.map((elem) => toUnquotedJSON(elem, { ...options, depth: depth + 1 }))\n const firstElementSpace = singleLine ? \"\" : \" \"\n return [\"[\", firstElementSpace + results.join(\", \"), \"]\"].join(lineBreak + prefixSpace)\n } else if (typeof param === \"object\") {\n const firstElementSpace = singleLine ? \" \" : \" \"\n const lastComma = singleLine ? \", \" : \",\"\n const results = Object.entries(param)\n .map(\n ([key, value]) =>\n `${firstElementSpace}${key}: ${toUnquotedJSON(value, {\n ...options,\n depth: depth + 1,\n })}${lastComma}`\n )\n .join(lineBreak + prefixSpace)\n return [\"{\", `${results}`, \"}\"].join(lineBreak + prefixSpace)\n } else if (\n typeof param === \"string\" &&\n isStatic === false &&\n (param.startsWith(\"faker\") || param.startsWith(\"Buffer.from(faker\"))\n ) {\n return param // dynamic mode, start with faker or Buffer.from(faker)\n } else if (typeof param === \"string\" && param.endsWith(\" as const\")) {\n // split \" as const\" from string\n return `\"${param.slice(0, -\" as const\".length)}\" as const`\n }\n return JSON.stringify(param)\n}\n\nexport const multiLineStr = (str: string) => {\n // line break to space\n // multiple space to single space\n // space + dot to dot\n return str.replace(/\\n/g, \" \").replace(/\\s+/g, \" \").replace(/\\s\\./g, \".\").trim()\n}\n","import {\n ARRAY_MAX_LENGTH,\n ARRAY_MIN_LENGTH,\n MAX_INTEGER,\n MAX_NUMBER,\n MAX_STRING_LENGTH,\n MAX_WORD_LENGTH,\n MIN_INTEGER,\n MIN_NUMBER,\n MIN_STRING_LENGTH,\n MIN_WORD_LENGTH,\n faker,\n} from \"./defaults\"\nimport { Options, ParseSchemaType, SchemaOutputType } from \"./types\"\nimport { multiLineStr, toUnquotedJSON } from \"./writer\"\nimport SwaggerParser from \"@apidevtools/swagger-parser\"\nimport { pascalCase } from \"change-case-all\"\nimport { existsSync, readFileSync } from \"fs\"\nimport { SchemaObject, isReference } from \"oazapfts/generate\"\nimport { OpenAPIV3_1 } from \"openapi-types\"\nimport { join } from \"path\"\n\nexport const parseSchema = (\n schemaValue: OpenAPIV3_1.ReferenceObject | OpenAPIV3_1.SchemaObject,\n specialSchema: ReturnType<typeof specialFakerParser>,\n options: Options,\n outputSchema: ParseSchemaType = {}\n): ParseSchemaType => {\n if (isReference(schemaValue)) {\n console.warn(\"can't parse reference schema\", schemaValue, schemaValue.$ref)\n return\n }\n\n if (schemaValue.type === \"object\") {\n if (schemaValue.properties === undefined) return {}\n return Object.entries(schemaValue.properties).reduce((acc, [key, field]) => {\n acc[key] = parseSchema(field, specialSchema, options, outputSchema) as SchemaOutputType\n return acc\n }, {} as Record<string, SchemaOutputType>)\n } else if (schemaValue.enum !== undefined) {\n // enum value\n const enumValue = options.isStatic\n ? faker.helpers.arrayElement(schemaValue.enum)\n : `faker.helpers.arrayElement<${schemaValue.enum\n .map((item) => `\"${item}\"`)\n .join(\" | \")}>(${toUnquotedJSON(schemaValue.enum, {\n depth: 0,\n isStatic: options.isStatic,\n singleLine: true,\n })})`\n if (options.isStatic && typeof enumValue === \"string\") return enumValue + \" as const\"\n return enumValue\n } else if (schemaValue.allOf !== undefined) {\n // allOf value, sub model\n const allOfValue = schemaValue.allOf\n return faker.helpers.arrayElement(\n allOfValue.map((field) => {\n return parseSchema(field, specialSchema, options, outputSchema)\n })\n )\n } else if (schemaValue.anyOf !== undefined) {\n // anyOf value, select one or more. ex) string or null\n const anyOfValue = schemaValue.anyOf\n return options.isStatic\n ? faker.helpers.arrayElement(\n anyOfValue.map((field) => {\n return parseSchema(field, specialSchema, options, outputSchema)\n })\n )\n : multiLineStr(`\n faker.helpers.arrayElement([\n ${anyOfValue.map((field) =>\n toUnquotedJSON(parseSchema(field, specialSchema, options, {}), {\n depth: 0,\n isStatic: options.isStatic,\n singleLine: true,\n })\n )}\n ])\n `)\n } else if (schemaValue.oneOf !== undefined) {\n // oneOf value, exactly one. Can't find example\n const oneOfValue = schemaValue.oneOf\n return options.isStatic\n ? faker.helpers.arrayElement(\n oneOfValue.map((field) => {\n return parseSchema(field, specialSchema, options, outputSchema)\n })\n )\n : multiLineStr(`\n faker.helpers.arrayElement([\n ${oneOfValue.map((field) =>\n toUnquotedJSON(parseSchema(field, specialSchema, options, {}), {\n depth: 0,\n isStatic: options.isStatic,\n singleLine: true,\n })\n )}\n ])\n `)\n } else if (schemaValue.type === \"array\") {\n if (\"prefixItems\" in schemaValue) {\n const length = faker.number.int({\n min: schemaValue.minItems,\n max: schemaValue.maxItems,\n })\n\n return (schemaValue.prefixItems as Array<SchemaObject>)\n .slice(0, length)\n .map((field) => parseSchema(field, specialSchema, options, outputSchema)) as (\n | SchemaOutputType\n | Record<string, SchemaOutputType>\n )[]\n }\n // array\n const arrayValue = schemaValue.items\n return getRandomLengthArray(options.arrayMinLength, options.arrayMaxLength).map(() =>\n parseSchema(arrayValue, specialSchema, options, outputSchema)\n ) as (SchemaOutputType | Record<string, SchemaOutputType>)[]\n }\n return valueGenerator(schemaValue, specialSchema, options.isStatic)\n}\n\nconst uuidToB64 = (uuid: string) => {\n const uuidBuffer = Buffer.from(uuid.replace(/-/g, \"\"), \"hex\")\n const base64Uuid = uuidBuffer\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\")\n return base64Uuid\n}\n\nconst valueGenerator = (\n schemaValue: OpenAPIV3_1.SchemaObject,\n specialSchema: ReturnType<typeof specialFakerParser>,\n isStatic: boolean\n): ParseSchemaType => {\n // if title or description in special keys\n // return special faker data\n const { titleSpecial, descriptionSpecial } = specialSchema\n if (schemaValue.title && titleSpecial[schemaValue.title]) {\n return titleSpecial[schemaValue.title]\n } else if (schemaValue.description && descriptionSpecial[schemaValue.description]) {\n return descriptionSpecial[schemaValue.description]\n }\n\n if (schemaValue.type === \"string\" && schemaValue.format === \"date-time\") {\n // date-time, 2017-07-21T17:32:28Z\n return isStatic\n ? faker.date\n .between({\n from: \"2020-01-01T00:00:00.000Z\",\n to: \"2030-12-31T23:59:59.999Z\",\n })\n .toISOString()\n : multiLineStr(`\n faker.date.between({\n from: \"2020-01-01T00:00:00.000Z\",\n to: \"2030-12-31T23:59:59.999Z\",\n })\n .toISOString()\n `)\n } else if (schemaValue.type === \"string\" && schemaValue.format === \"date\") {\n // date, 2017-07-21\n return isStatic\n ? faker.date\n .between({\n from: \"2020-01-01T00:00:00.000Z\",\n to: \"2030-12-31T23:59:59.999Z\",\n })\n .toISOString()\n .split(\"T\")[0]\n : multiLineStr(`\n faker.date.between({\n from: \"2020-01-01T00:00:00.000Z\",\n to: \"2030-12-31T23:59:59.999Z\",\n })\n .toISOString()\n .split(\"T\")[0]\n `)\n } else if (schemaValue.type === \"string\" && schemaValue.pattern) {\n return isStatic\n ? faker.helpers.fromRegExp(schemaValue.pattern)\n : `faker.helpers.fromRegExp(/${schemaValue.pattern}/)`\n } else if (schemaValue.type === \"string\" && schemaValue.title?.toLowerCase() === \"b64uuid\") {\n // generate base 64 uuid\n const baseUuid = faker.string.uuid()\n return isStatic\n ? uuidToB64(baseUuid)\n : multiLineStr(`\n Buffer.from(faker.string.uuid().replace(/-/g, \"\"), \"hex\")\n .toString(\"base64\")\n .replace(/\\\\+/g, \"-\")\n .replace(/\\\\//g, \"_\")\n .replace(/=/g, \"\")\n `)\n } else if (schemaValue.type === \"string\") {\n const minLength =\n schemaValue.minLength ??\n Math.min(MIN_STRING_LENGTH, schemaValue.maxLength ?? MAX_STRING_LENGTH)\n const maxLength =\n schemaValue.maxLength ??\n Math.max(MAX_STRING_LENGTH, schemaValue.minLength ?? MIN_STRING_LENGTH)\n\n return isStatic\n ? faker.string.alphanumeric({\n length: { min: minLength, max: maxLength },\n })\n : multiLineStr(`\n faker.string.alphanumeric({\n length: { min: ${minLength}, max: ${maxLength} },\n })\n `)\n } else if (schemaValue.type === \"integer\") {\n return isStatic\n ? faker.number.int({ min: MIN_INTEGER, max: MAX_INTEGER })\n : multiLineStr(`\n faker.number.int({ min: ${MIN_INTEGER}, max: ${MAX_INTEGER} })\n `)\n } else if (schemaValue.type === \"number\") {\n const minNumber = schemaValue.minimum ?? Math.min(MIN_NUMBER, schemaValue.maximum ?? MAX_NUMBER)\n const maxNumber = schemaValue.maximum ?? Math.max(MAX_NUMBER, schemaValue.minimum ?? MIN_NUMBER)\n return isStatic\n ? faker.number.float({\n min: minNumber,\n max: maxNumber,\n fractionDigits: 2,\n })\n : multiLineStr(`\n faker.number.float({\n min: ${minNumber},\n max: ${maxNumber},\n fractionDigits: 2,\n })\n `)\n } else if (schemaValue.type === \"boolean\") {\n return isStatic ? faker.datatype.boolean() : \"faker.datatype.boolean()\"\n } else if (schemaValue.type === \"null\") {\n return null\n } else if (Object.keys(schemaValue).length === 0) {\n // array any. ex) blank=True list\n return isStatic\n ? faker.word.words({\n count: {\n min: MIN_WORD_LENGTH,\n max: MAX_WORD_LENGTH,\n },\n })\n : multiLineStr(`\n faker.word.words({\n count: {\n min: ${MIN_WORD_LENGTH},\n max: ${MAX_WORD_LENGTH},\n },\n })\n `)\n }\n\n return isStatic ? faker.word.adjective() : \"faker.word.adjective()\"\n}\n\nexport const getRandomLengthArray = (\n min: number = ARRAY_MIN_LENGTH,\n max: number = ARRAY_MAX_LENGTH\n) => {\n const length = faker.number.int({\n min,\n max,\n })\n return Array.from({ length }, (_, i) => i)\n}\n\nexport const refSchemaParser = (ref: string, refs: SwaggerParser.$Refs) => {\n const schemaName = pascalCase(ref.replace(\"#/components/schemas/\", \"\"))\n const schemaValue: OpenAPIV3_1.SchemaObject = refs.get(ref)\n return { name: schemaName, value: schemaValue }\n}\n\nconst getFakerValue = (value: object, options: { isStatic: boolean }): SchemaOutputType => {\n if (\"value\" in value) {\n // value type, use directly\n return value.value as SchemaOutputType\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 ? toUnquotedJSON(value.options, {\n depth: 0,\n isStatic: options.isStatic,\n singleLine: true,\n })\n : \"\"\n return `faker.${value.module}.${value.type}(${fakerOption})`\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 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 return \"options\" in value ? fakerFunc(value.options) : fakerFunc()\n }\n return undefined\n}\n\nexport const specialFakerParser = (options: Options) => {\n if (options.specialPath === undefined)\n return {\n titleSpecial: {},\n descriptionSpecial: {},\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> = existsSync(titlePath)\n ? JSON.parse(readFileSync(titlePath, \"utf-8\"))\n : {}\n const descriptionSpecialKey: Record<string, object> = existsSync(descPath)\n ? JSON.parse(readFileSync(descPath, \"utf-8\"))\n : {}\n\n const titleSpecial = Object.entries(titleSpecialKey).reduce((acc, [key, value]) => {\n const fakerValue = getFakerValue(value, {\n isStatic: options.isStatic,\n })\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, {\n isStatic: options.isStatic,\n })\n acc[key] = fakerValue\n return acc\n }, {} as Record<string, SchemaOutputType>)\n\n return { titleSpecial, descriptionSpecial }\n}\n","import { OpenAPIV3_1 } from \"openapi-types\"\n\nexport type Options = {\n path: string\n arrayMinLength?: number\n arrayMaxLength?: number\n isStatic: boolean\n includeCodes?: number[]\n baseDir?: string\n specialPath?: string\n handlerUrl: string\n fakerLocale: string\n generateTarget: string\n clear?: boolean\n}\n\nexport type SchemaOutputType = string | number | boolean | null | undefined | Date\n\ntype NestedSchemaOutputType<T> =\n | {\n [K in keyof T]: T[K] extends object ? NestedSchemaOutputType<T[K]> : T[K]\n }\n | SchemaOutputType\n | {}\n\nexport type ParseSchemaType = NestedSchemaOutputType<string>\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\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\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\nexport const isNotNullish = <TValue>(value: TValue | null | undefined): value is TValue => {\n return value !== null && value !== undefined\n}\n","import { parseSchema, specialFakerParser } from \"./parser\"\nimport {\n HttpMethods,\n Options,\n PathNormalizedType,\n ResponseSchemaType,\n SchemaOutputType,\n isNotNullish,\n} from \"./types\"\nimport SwaggerParser from \"@apidevtools/swagger-parser\"\nimport { isReference } from \"oazapfts/generate\"\nimport { OpenAPIV3_1 } from \"openapi-types\"\nimport * as path from \"path\"\n\nconst getOpenAPIDocsDeref = async (path: string) => {\n const doc = await SwaggerParser.dereference(path)\n const isOpenApiV3 = \"openapi\" in doc && doc.openapi.startsWith(\"3\")\n if (isOpenApiV3) return doc as OpenAPIV3_1.Document\n return\n}\n\nconst getOpenAPIDocsBundle = async (path: string) => {\n const doc = await SwaggerParser.bundle(path)\n const isOpenApiV3 = \"openapi\" in doc && doc.openapi.startsWith(\"3\")\n if (isOpenApiV3) return doc as OpenAPIV3_1.Document\n return\n}\n\nexport const generateSchema = async (options: Options) => {\n const openapiPath = options.path.startsWith(\"http\")\n ? options.path\n : path.join(options.baseDir ?? \"\", options.path)\n const doc = await getOpenAPIDocsDeref(openapiPath)\n const sampleSchemas = doc?.components?.schemas\n if (sampleSchemas === undefined) {\n console.warn(\"No schemas found\")\n return\n }\n\n const specialFakers = specialFakerParser(options)\n return Object.entries(sampleSchemas).reduce(\n (acc, [schemaName, schema]) => {\n acc[schemaName] = parseSchema(schema, specialFakers, options, {}) as SchemaOutputType\n return acc\n },\n {} as Record<string, SchemaOutputType>\n )\n}\n\nexport const generateAPI = async (options: Options) => {\n const openapiPath = options.path.startsWith(\"http\")\n ? options.path\n : path.join(options.baseDir ?? \"\", options.path)\n const doc = await getOpenAPIDocsBundle(openapiPath)\n\n const samplePaths = doc?.paths\n if (samplePaths === undefined) {\n console.warn(\"No paths found\")\n return\n }\n\n const specialFakers = specialFakerParser(options)\n const normalizedPaths = Object.entries(samplePaths).reduce((acc, [apiName, api]) => {\n if (api === undefined) return acc\n const paths = Object.values(HttpMethods)\n .map((method) => {\n if (api[method] === undefined) return\n const responses = Object.entries(api[method]?.responses ?? [])\n .map(([statusCode, response]) => {\n if (isReference(response)) return undefined\n if (options.includeCodes && !options.includeCodes.includes(parseInt(statusCode)))\n return undefined\n const schema = response.content?.[\"application/json\"]?.schema ?? {}\n const compositeSchema = (() => {\n if (\"oneOf\" in schema) {\n return {\n type: \"oneOf\",\n value: schema,\n } as ResponseSchemaType\n }\n if (\"anyOf\" in schema) {\n return {\n type: \"anyOf\",\n value: schema,\n } as ResponseSchemaType\n }\n if (\"type\" in schema && \"items\" in schema && schema.type === \"array\") {\n return {\n type: \"array\",\n value: schema.items,\n } as ResponseSchemaType\n }\n // Todo: can't find sample data\n // if (\"allOf\" in schema) {\n // return parseSchema(schema, {})\n // }\n if (isReference(schema)) return { type: \"ref\", value: schema } as ResponseSchemaType\n if (Object.keys(schema).length === 0) {\n // empty object return undefined\n return undefined\n }\n return parseSchema(schema ?? {}, specialFakers, options, {})\n })()\n\n return {\n statusCode: parseInt(statusCode),\n description: response.description,\n schema: compositeSchema,\n }\n })\n .filter(isNotNullish)\n\n return {\n pathname: apiName.replace(/{/g, \":\").replace(/}/g, \"\"),\n operationId: api[method]?.operationId ?? \"\",\n summary: api[method]?.summary ?? \"\",\n tags: api[method]?.tags ?? [\"default\"],\n method,\n responses,\n } as PathNormalizedType\n })\n .filter(isNotNullish)\n\n return [...acc, ...paths]\n }, [] as PathNormalizedType[])\n\n return normalizedPaths\n}\n"],"mappings":"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","names":["pascalCase","isReference","HttpMethods","SwaggerParser","isReference","path","SwaggerParser","_a","_b","_c","isReference"]}