{"version":3,"sources":["../src/index.ts","../src/parser.ts","../src/server.ts","../src/generator.ts"],"sourcesContent":["import type { OpenAPIV3 } from \"openapi-types\";\nimport { parseSpec } from \"./parser\";\nimport { createMockServer } from \"./server\";\nimport type { MockAPIServer, MockServerOptions, SpecInput } from \"./types\";\n\nexport type { MockAPIServer, MockServerOptions };\nexport type { OpenAPIV3 } from \"openapi-types\";\n\n/**\n * Create a mock API server from an OpenAPI spec path or inline document.\n */\nexport async function mockAPI(\n  spec: SpecInput,\n  options: MockServerOptions = {}\n): Promise<MockAPIServer> {\n  const parsed = await parseSpec(spec);\n  return createMockServer(parsed, options);\n}\n\n\n","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport type { OpenAPIV3 } from \"openapi-types\";\nimport { ParsedRoute, ParsedSpec, HttpMethod, SpecInput } from \"./types\";\n\nconst SUPPORTED_METHODS: HttpMethod[] = [\"get\", \"post\", \"put\", \"delete\", \"patch\"];\n\nexport async function parseSpec(spec: SpecInput): Promise<ParsedSpec> {\n  let document: OpenAPIV3.Document;\n\n  try {\n    if (typeof spec === \"string\") {\n      // Treat as path or URL\n      const api = (await SwaggerParser.dereference(spec)) as OpenAPIV3.Document;\n      document = api;\n    } else {\n      // Inline document\n      const api = (await SwaggerParser.dereference(spec as any)) as OpenAPIV3.Document;\n      document = api;\n    }\n  } catch (error) {\n    const message =\n      error instanceof Error ? error.message : \"Unknown error while parsing OpenAPI spec.\";\n    throw new Error(`Failed to parse OpenAPI specification: ${message}`);\n  }\n\n  if (!document.paths || typeof document.paths !== \"object\") {\n    throw new Error(\"Invalid OpenAPI specification: missing or invalid 'paths' field.\");\n  }\n\n  const routes: ParsedRoute[] = [];\n\n  for (const [path, item] of Object.entries(document.paths)) {\n    if (!item) continue;\n\n    for (const method of SUPPORTED_METHODS) {\n      const operation = (item as any)[method] as OpenAPIV3.OperationObject | undefined;\n      if (!operation) continue;\n\n      const { schema: responseSchema, statusCode } = extractResponse(operation);\n\n      routes.push({\n        method,\n        path,\n        operationId: operation.operationId,\n        summary: operation.summary,\n        description: operation.description,\n        responseSchema,\n        statusCode\n      });\n    }\n  }\n\n  if (routes.length === 0) {\n    throw new Error(\"No supported routes (GET, POST, PUT, DELETE, PATCH) found in spec.\");\n  }\n\n  return { routes };\n}\n\nfunction extractResponse(\n  operation: OpenAPIV3.OperationObject\n): { schema?: OpenAPIV3.SchemaObject; statusCode?: number } {\n  if (!operation.responses || typeof operation.responses !== \"object\") {\n    return {};\n  }\n\n  // Prefer 200, then other 2xx, then default, then any\n  const responsesEntries = Object.entries(operation.responses);\n\n  const sorted = responsesEntries.sort(([a], [b]) => {\n    if (a === \"200\") return -1;\n    if (b === \"200\") return 1;\n    const aNum = parseInt(a, 10);\n    const bNum = parseInt(b, 10);\n    const aIs2xx = aNum >= 200 && aNum < 300;\n    const bIs2xx = bNum >= 200 && bNum < 300;\n    if (aIs2xx && !bIs2xx) return -1;\n    if (!aIs2xx && bIs2xx) return 1;\n    if (a === \"default\") return -1;\n    if (b === \"default\") return 1;\n    return 0;\n  });\n\n  for (const [code, resp] of sorted) {\n    const response = resp as OpenAPIV3.ResponseObject;\n    const content = response.content;\n    if (!content) continue;\n\n    const jsonLike =\n      content[\"application/json\"] ||\n      content[\"application/*+json\"] ||\n      Object.values(content)[0];\n\n    if (!jsonLike || !jsonLike.schema) continue;\n\n    const schema = jsonLike.schema as OpenAPIV3.SchemaObject;\n    const statusCode = code === \"default\" ? undefined : parseInt(code, 10) || undefined;\n    return { schema, statusCode };\n  }\n\n  return {};\n}\n","import express, { Request, Response, NextFunction } from \"express\";\nimport cors from \"cors\";\nimport type { Server } from \"http\";\nimport { ParsedSpec, MockServerOptions, MockAPIServer } from \"./types\";\nimport { generateMockData } from \"./generator\";\n\ntype CollectionStore = Map<string, any[]>;\n\nexport function createMockServer(\n  parsed: ParsedSpec,\n  options: MockServerOptions = {}\n): MockAPIServer {\n  const app = express();\n  const port = options.port ?? 3000;\n  const errorRate = options.errorRate ?? 0;\n  const store: CollectionStore = new Map();\n  const verbose = (options as any).verbose ?? false;\n\n  app.use(cors());\n  app.use(express.json());\n\n  // Verbose logging middleware\n  if (verbose) {\n    app.use((req: Request, _res: Response, next: NextFunction) => {\n      const timestamp = new Date().toISOString();\n      console.log(`[${timestamp}] ${req.method} ${req.path}`);\n      if (Object.keys(req.query).length > 0) {\n        console.log(`  Query:`, req.query);\n      }\n      if (req.body && Object.keys(req.body).length > 0) {\n        console.log(`  Body:`, JSON.stringify(req.body, null, 2));\n      }\n      next();\n    });\n  }\n\n  // Delay / slow-network middleware\n  app.use(async (_req: Request, _res: Response, next: NextFunction) => {\n    const delay = computeDelay(options);\n    if (delay > 0) {\n      setTimeout(next, delay);\n    } else {\n      next();\n    }\n  });\n\n  // Register routes\n  for (const route of parsed.routes) {\n    const expressPath = toExpressPath(route.path);\n\n    const handler = (req: Request, res: Response) => {\n      // Random error responses\n      if (errorRate > 0 && Math.random() < errorRate) {\n        const codes = [401, 404, 500];\n        const code = codes[Math.floor(Math.random() * codes.length)]!;\n        return res.status(code).json({ error: `Mock error ${code}` });\n      }\n\n      try {\n        const basePath = getBasePath(route.path);\n        const isItemRoute = hasPathParam(route.path);\n\n        if (isCollectionMethod(route.method) && !isItemRoute) {\n          return handleCollectionRoute(req, res, route, basePath, store, options);\n        }\n\n        if (!isCollectionMethod(route.method) && isItemRoute) {\n          return handleItemRoute(req, res, route, basePath, store);\n        }\n\n        // Fallback: stateless generation\n        const payload = generateMockData(route.responseSchema, {\n          generators: options.generators\n        });\n        const status = route.statusCode ?? 200;\n        res.status(status).json(payload);\n      } catch (error) {\n        const message =\n          error instanceof Error ? error.message : \"Unknown error while generating mock data.\";\n        res.status(500).json({ error: \"Failed to generate mock response\", details: message });\n      }\n    };\n\n    switch (route.method) {\n      case \"get\":\n        app.get(expressPath, handler);\n        break;\n      case \"post\":\n        app.post(expressPath, handler);\n        break;\n      case \"put\":\n        app.put(expressPath, handler);\n        break;\n      case \"delete\":\n        app.delete(expressPath, handler);\n        break;\n      case \"patch\":\n        app.patch(expressPath, handler);\n        break;\n      default:\n        break;\n    }\n  }\n\n  let server: Server | null = null;\n\n  return {\n    async start() {\n      if (server) return;\n      await new Promise<void>((resolve, reject) => {\n        server = app\n          .listen(port, () => resolve())\n          .on(\"error\", (err) => {\n            server = null;\n            reject(err);\n          });\n      });\n    },\n    async stop() {\n      if (!server) return;\n      await new Promise<void>((resolve, reject) => {\n        server!.close((err) => {\n          if (err) reject(err);\n          else resolve();\n        });\n      });\n      server = null;\n    },\n    getApp() {\n      return app;\n    }\n  };\n}\n\nfunction computeDelay(options: MockServerOptions): number {\n  if (options.delayRange) {\n    const { min, max } = options.delayRange;\n    if (max <= min) return min;\n    return Math.floor(Math.random() * (max - min + 1)) + min;\n  }\n  return options.delay ?? 0;\n}\n\nfunction toExpressPath(path: string): string {\n  // Convert OpenAPI-style {id} params to Express :id\n  return path.replace(/\\{([^}]+)\\}/g, \":$1\");\n}\n\nfunction getBasePath(path: string): string {\n  // Remove path params like /users/{id} -> /users\n  return path.replace(/\\/\\{[^}]+\\}/g, \"\");\n}\n\nfunction hasPathParam(path: string): boolean {\n  return /\\{[^}]+\\}/.test(path);\n}\n\nfunction isCollectionMethod(method: string): boolean {\n  // Collection-level routes are typically GET/POST on the base path.\n  return method === \"get\" || method === \"post\";\n}\n\nfunction handleCollectionRoute(\n  req: Request,\n  res: Response,\n  route: ParsedSpec[\"routes\"][number],\n  basePath: string,\n  store: CollectionStore,\n  options: MockServerOptions\n) {\n  const status = route.statusCode ?? 200;\n\n  let collection = store.get(basePath);\n  if (!collection) {\n    // Start with an empty collection; data will be added via POST/PUT/PATCH.\n    collection = [];\n    store.set(basePath, collection);\n  }\n\n  switch (route.method) {\n    case \"get\": {\n      let results = collection;\n\n      // Filtering: equality on query params (excluding pagination params)\n      const { page, limit, ...filters } = req.query as Record<string, string>;\n      results = results.filter((item) => {\n        return Object.entries(filters).every(([key, value]) => {\n          return String((item as any)[key]) === String(value);\n        });\n      });\n\n      // Pagination\n      const pageNum = page ? parseInt(String(page), 10) || 1 : 1;\n      const limitNum = limit ? parseInt(String(limit), 10) || 20 : results.length;\n      const start = (pageNum - 1) * limitNum;\n      const end = start + limitNum;\n      const paged = results.slice(start, end);\n\n      return res.status(status).json(paged);\n    }\n    case \"post\": {\n      const body = req.body ?? {};\n      const newItem = { ...body };\n      // Ensure an id exists\n      if (newItem.id == null) {\n        newItem.id = collection.length + 1;\n      }\n      collection.push(newItem);\n      return res.status(201).json(newItem);\n    }\n    default:\n      // For unsupported combinations fall back to generated response\n      const payload = generateMockData(route.responseSchema, {\n        generators: options.generators\n      });\n      return res.status(status).json(payload);\n  }\n}\n\nfunction handleItemRoute(\n  req: Request,\n  res: Response,\n  route: ParsedSpec[\"routes\"][number],\n  basePath: string,\n  store: CollectionStore\n) {\n  const status = route.statusCode ?? 200;\n  const idParamMatch = route.path.match(/\\{([^}]+)\\}/);\n  const idParam = idParamMatch ? idParamMatch[1] : \"id\";\n\n  const collection = store.get(basePath) ?? [];\n  const idValue = req.params[idParam];\n\n  const index = collection.findIndex((item) => {\n    const candidate = (item as any)[idParam] ?? (item as any).id;\n    return String(candidate) === String(idValue);\n  });\n\n  switch (route.method) {\n    case \"get\": {\n      if (index === -1) {\n        return res.status(404).json({ error: \"Not found\" });\n      }\n      const item = collection[index];\n      // Ensure the returned item has an ID field so that consumers relying on it\n      // (and tests) can consistently access it, even if the original payload\n      // did not include an id and it was inferred from the URL.\n      if ((item as any)[idParam] == null && (item as any).id == null) {\n        (item as any)[idParam] = idValue;\n      }\n      return res.status(status).json(item);\n    }\n    case \"put\": {\n      if (index === -1) {\n        return res.status(404).json({ error: \"Not found\" });\n      }\n      const body = req.body ?? {};\n      collection[index] = { ...body, [idParam]: (collection[index] as any)[idParam] };\n      return res.status(status).json(collection[index]);\n    }\n    case \"patch\": {\n      if (index === -1) {\n        return res.status(404).json({ error: \"Not found\" });\n      }\n      const body = req.body ?? {};\n      collection[index] = { ...collection[index], ...body };\n      return res.status(status).json(collection[index]);\n    }\n    case \"delete\": {\n      if (index === -1) {\n        return res.status(404).json({ error: \"Not found\" });\n      }\n      collection.splice(index, 1);\n      return res.status(204).send();\n    }\n    default:\n      return res.status(405).json({ error: \"Method not allowed\" });\n  }\n}\n","import { faker } from \"@faker-js/faker\";\nimport type { OpenAPIV3 } from \"openapi-types\";\n\ntype IdRegistry = Map<string, Array<string | number>>;\n\nexport interface GenerationOptions {\n  /**\n   * Custom generators by field name.\n   */\n  generators?: Record<string, () => unknown>;\n  /**\n   * Shared ID registry for relationship consistency.\n   */\n  registry?: IdRegistry;\n}\n\ninterface GenerationContext {\n  fieldName?: string;\n  parentName?: string;\n  generators?: Record<string, () => unknown>;\n  registry?: IdRegistry;\n}\n\nconst defaultRegistry: IdRegistry = new Map();\n\nexport function generateMockData(\n  schema?: OpenAPIV3.SchemaObject,\n  options: GenerationOptions = {}\n): unknown {\n  const registry = options.registry ?? defaultRegistry;\n  return innerGenerate(schema, {\n    generators: options.generators,\n    registry,\n  });\n}\n\nfunction innerGenerate(\n  schema?: OpenAPIV3.SchemaObject,\n  ctx?: GenerationContext\n): unknown {\n  if (!schema) {\n    return null;\n  }\n\n  // Handle enums\n  if (Array.isArray(schema.enum) && schema.enum.length > 0) {\n    return faker.helpers.arrayElement(schema.enum as any[]);\n  }\n\n  const type = schema.type;\n\n  if (Array.isArray(type)) {\n    // Prefer string, number, object, boolean in that order\n    const preferred = [\n      \"string\",\n      \"number\",\n      \"integer\",\n      \"object\",\n      \"array\",\n      \"boolean\",\n    ] as const;\n    const chosen = preferred.find((t) => type.includes(t as any)) ?? type[0];\n    return innerGenerate({ ...schema, type: chosen } as any, ctx);\n  }\n\n  switch (type) {\n    case \"string\":\n      return generateString(schema, ctx);\n    case \"number\":\n      return generateNumber(schema, ctx);\n    case \"integer\":\n      return generateInteger(schema, ctx);\n    case \"boolean\":\n      return faker.datatype.boolean();\n    case \"array\":\n      return generateArray(schema, ctx);\n    case \"object\":\n    default:\n      return generateObject(schema, ctx);\n  }\n}\n\nfunction generateString(\n  schema: OpenAPIV3.SchemaObject,\n  ctx?: GenerationContext\n): string {\n  const format = schema.format || \"\";\n  const nameSource = (\n    ctx?.fieldName ??\n    schema.title ??\n    schema.description ??\n    \"\"\n  )\n    .toString()\n    .toLowerCase();\n\n  if (schema.example && typeof schema.example === \"string\") {\n    return schema.example;\n  }\n\n  // Custom generators from config\n  if (ctx?.fieldName && ctx.generators && ctx.generators[ctx.fieldName]) {\n    const gen = ctx.generators[ctx.fieldName];\n    return String(gen());\n  }\n\n  // Common smart mappings via explicit faker path (non-standard extension)\n  const xFaker = (schema as any)[\"x-faker\"];\n  if (xFaker) {\n    const path = String(xFaker);\n    const [ns, method] = path.split(\".\");\n    const fakerNs: any = (faker as any)[ns];\n    if (fakerNs && typeof fakerNs[method] === \"function\") {\n      return fakerNs[method]();\n    }\n  }\n\n  // Format-based\n  if (format === \"email\" || /email/.test(nameSource)) {\n    return faker.internet.email();\n  }\n  if (format === \"uuid\" || /uuid/.test(nameSource)) {\n    return faker.string.uuid();\n  }\n  if (format === \"date-time\") {\n    return faker.date.recent().toISOString();\n  }\n  if (format === \"date\") {\n    return faker.date.recent().toISOString().split(\"T\")[0]!;\n  }\n  if (format === \"uri\" || format === \"url\" || /url/.test(nameSource)) {\n    return faker.internet.url();\n  }\n\n  // Name-like\n  if (/^(first[-_]?name|fname)$/.test(nameSource)) {\n    return faker.person.firstName();\n  }\n  if (/^(last[-_]?name|lname)$/.test(nameSource)) {\n    return faker.person.lastName();\n  }\n  if (/name/.test(nameSource)) {\n    return faker.person.fullName();\n  }\n\n  // Phone-like\n  if (/phone|mobile/.test(nameSource)) {\n    return faker.phone.number();\n  }\n\n  // Address-like\n  if (/address/.test(nameSource)) {\n    return faker.location.streetAddress();\n  }\n  if (/street/.test(nameSource)) {\n    return faker.location.street();\n  }\n  if (/city/.test(nameSource)) {\n    return faker.location.city();\n  }\n  if (/country/.test(nameSource)) {\n    return faker.location.country();\n  }\n\n  // Date-like\n  if (\n    /createdat|updatedat|timestamp|date/.test(\n      nameSource.replace(/[_\\s]/g, \"\").toLowerCase()\n    )\n  ) {\n    return faker.date.recent().toISOString();\n  }\n\n  // Status-like\n  if (nameSource === \"status\") {\n    return faker.helpers.arrayElement([\"active\", \"pending\", \"completed\"]);\n  }\n\n  const minLength = schema.minLength ?? 5;\n  const maxLength = schema.maxLength ?? 20;\n  const targetLength = faker.number.int({ min: minLength, max: maxLength });\n\n  let text = faker.lorem.words(Math.max(1, Math.floor(targetLength / 5)));\n  // Ensure string respects minLength/maxLength constraints\n  if (text.length < minLength) {\n    while (text.length < minLength) {\n      text += \" \" + faker.lorem.word();\n    }\n  }\n  if (text.length > maxLength) {\n    text = text.slice(0, maxLength);\n  }\n\n  return text;\n}\n\nfunction generateNumber(\n  schema: OpenAPIV3.SchemaObject,\n  ctx?: GenerationContext\n): number {\n  const nameSource = (ctx?.fieldName ?? \"\").toString().toLowerCase();\n  const min = (schema.minimum as number | undefined) ?? 0;\n  const max = (schema.maximum as number | undefined) ?? 1000;\n\n  // Price-like\n  if (/price|amount|cost|salary/.test(nameSource)) {\n    const value = faker.number.float({\n      min: min || 0,\n      max: max || 10000,\n    });\n    return Math.round(value * 100) / 100;\n  }\n\n  const value = faker.number.float({ min, max });\n  return value;\n}\n\nfunction generateInteger(\n  schema: OpenAPIV3.SchemaObject,\n  ctx?: GenerationContext\n): number {\n  const nameSource = (ctx?.fieldName ?? \"\").toString().toLowerCase();\n  const min = (schema.minimum as number | undefined) ?? 0;\n  const max = (schema.maximum as number | undefined) ?? 1000;\n\n  // Integer IDs with registry linkage\n  if (/id$|_id$/.test(nameSource)) {\n    const base = nameSource.replace(/(_id|id)$/i, \"\") || \"id\";\n    const reg = ctx?.registry;\n    if (!reg) {\n      return faker.number.int({ min, max });\n    }\n\n    // Foreign key: if base has known IDs, reuse one\n    const existing = reg.get(base);\n    if (existing && existing.length > 0 && nameSource !== \"id\") {\n      return Number(faker.helpers.arrayElement(existing));\n    }\n\n    const value = faker.number.int({ min, max });\n    const list = reg.get(base) ?? [];\n    list.push(value);\n    reg.set(base, list);\n    return value;\n  }\n\n  return faker.number.int({ min, max });\n}\n\nfunction generateArray(\n  schema: OpenAPIV3.SchemaObject,\n  ctx?: GenerationContext\n): unknown[] {\n  if (!(\"items\" in schema)) {\n    return [];\n  }\n  const items = (schema as OpenAPIV3.ArraySchemaObject).items as\n    | OpenAPIV3.SchemaObject\n    | undefined;\n  const minItems = schema.minItems ?? 1;\n  const maxItems = schema.maxItems ?? Math.max(minItems, 5);\n  const length = faker.number.int({ min: minItems, max: maxItems });\n\n  const result: unknown[] = [];\n  for (let i = 0; i < length; i++) {\n    result.push(\n      innerGenerate(\n        items,\n        ctx && { ...ctx, registry: ctx.registry ?? defaultRegistry }\n      )\n    );\n  }\n  return result;\n}\n\nfunction generateObject(\n  schema: OpenAPIV3.SchemaObject,\n  ctx?: GenerationContext\n): Record<string, unknown> {\n  const obj: Record<string, unknown> = {};\n\n  const properties = schema.properties || {};\n  const required = schema.required || [];\n\n  for (const [key, propSchema] of Object.entries(properties)) {\n    const childCtx: GenerationContext = {\n      ...ctx,\n      registry: ctx?.registry ?? defaultRegistry,\n      fieldName: key,\n    };\n\n    obj[key] = innerGenerate(propSchema as OpenAPIV3.SchemaObject, childCtx);\n  }\n\n  return obj;\n}\n"],"mappings":"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","names":["SwaggerParser","value","express","cors"]}