{"version":3,"file":"Server-CZSA_FNa.cjs","names":["FunctionParams","File"],"sources":["../../../internals/utils/src/casing.ts","../../../internals/utils/src/reserved.ts","../src/components/Server.tsx"],"sourcesContent":["type Options = {\n  /** When `true`, dot-separated segments are split on `.` and joined with `/` after casing. */\n  isFile?: boolean\n  /** Text prepended before casing is applied. */\n  prefix?: string\n  /** Text appended before casing is applied. */\n  suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n  const normalized = text\n    .trim()\n    .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n    .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n    .replace(/(\\d)([a-z])/g, '$1 $2')\n\n  const words = normalized.split(/[\\s\\-_./\\\\:]+/).filter(Boolean)\n\n  return words\n    .map((word, i) => {\n      const allUpper = word.length > 1 && word === word.toUpperCase()\n      if (allUpper) return word\n      if (i === 0 && !pascal) return word.charAt(0).toLowerCase() + word.slice(1)\n      return word.charAt(0).toUpperCase() + word.slice(1)\n    })\n    .join('')\n    .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n/**\n * Splits `text` on `.` and applies `transformPart` to each segment.\n * The last segment receives `isLast = true`, all earlier segments receive `false`.\n * Segments are joined with `/` to form a file path.\n */\nfunction applyToFileParts(text: string, transformPart: (part: string, isLast: boolean) => string): string {\n  const parts = text.split('.')\n  return parts.map((part, i) => transformPart(part, i === parts.length - 1)).join('/')\n}\n\n/**\n * Converts `text` to camelCase.\n * When `isFile` is `true`, dot-separated segments are each cased independently and joined with `/`.\n *\n * @example\n * camelCase('hello-world')                   // 'helloWorld'\n * camelCase('pet.petId', { isFile: true })   // 'pet/petId'\n */\nexport function camelCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n  if (isFile) {\n    return applyToFileParts(text, (part, isLast) => camelCase(part, isLast ? { prefix, suffix } : {}))\n  }\n\n  return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n * When `isFile` is `true`, the last dot-separated segment is PascalCased and earlier segments are camelCased.\n *\n * @example\n * pascalCase('hello-world')                  // 'HelloWorld'\n * pascalCase('pet.petId', { isFile: true })  // 'pet/PetId'\n */\nexport function pascalCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n  if (isFile) {\n    return applyToFileParts(text, (part, isLast) => (isLast ? pascalCase(part, { prefix, suffix }) : camelCase(part)))\n  }\n\n  return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n\n/**\n * Converts `text` to snake_case.\n *\n * @example\n * snakeCase('helloWorld')  // 'hello_world'\n * snakeCase('Hello-World') // 'hello_world'\n */\nexport function snakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n  const processed = `${prefix} ${text} ${suffix}`.trim()\n  return processed\n    .replace(/([a-z])([A-Z])/g, '$1_$2')\n    .replace(/[\\s\\-.]+/g, '_')\n    .replace(/[^a-zA-Z0-9_]/g, '')\n    .toLowerCase()\n    .split('_')\n    .filter(Boolean)\n    .join('_')\n}\n\n/**\n * Converts `text` to SCREAMING_SNAKE_CASE.\n *\n * @example\n * screamingSnakeCase('helloWorld') // 'HELLO_WORLD'\n */\nexport function screamingSnakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n  return snakeCase(text, { prefix, suffix }).toUpperCase()\n}\n","/**\n * JavaScript and Java reserved words.\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n  'abstract',\n  'arguments',\n  'boolean',\n  'break',\n  'byte',\n  'case',\n  'catch',\n  'char',\n  'class',\n  'const',\n  'continue',\n  'debugger',\n  'default',\n  'delete',\n  'do',\n  'double',\n  'else',\n  'enum',\n  'eval',\n  'export',\n  'extends',\n  'false',\n  'final',\n  'finally',\n  'float',\n  'for',\n  'function',\n  'goto',\n  'if',\n  'implements',\n  'import',\n  'in',\n  'instanceof',\n  'int',\n  'interface',\n  'let',\n  'long',\n  'native',\n  'new',\n  'null',\n  'package',\n  'private',\n  'protected',\n  'public',\n  'return',\n  'short',\n  'static',\n  'super',\n  'switch',\n  'synchronized',\n  'this',\n  'throw',\n  'throws',\n  'transient',\n  'true',\n  'try',\n  'typeof',\n  'var',\n  'void',\n  'volatile',\n  'while',\n  'with',\n  'yield',\n  'Array',\n  'Date',\n  'hasOwnProperty',\n  'Infinity',\n  'isFinite',\n  'isNaN',\n  'isPrototypeOf',\n  'length',\n  'Math',\n  'name',\n  'NaN',\n  'Number',\n  'Object',\n  'prototype',\n  'String',\n  'toString',\n  'undefined',\n  'valueOf',\n]\n\n/**\n * Prefixes a word with `_` when it is a reserved JavaScript/Java identifier\n * or starts with a digit.\n */\nexport function transformReservedWord(word: string): string {\n  const firstChar = word.charCodeAt(0)\n  if (word && (reservedWords.includes(word) || (firstChar >= 48 && firstChar <= 57))) {\n    return `_${word}`\n  }\n  return word\n}\n\n/**\n * Returns `true` when `name` is a syntactically valid JavaScript variable name.\n */\nexport function isValidVarName(name: string): boolean {\n  try {\n    new Function(`var ${name}`)\n  } catch {\n    return false\n  }\n  return true\n}\n","import { camelCase, isValidVarName } from '@internals/utils'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport type { SchemaObject } from '@kubb/oas'\nimport type { OperationSchemas } from '@kubb/plugin-oas'\nimport { isOptional } from '@kubb/plugin-oas/utils'\nimport { File, FunctionParams } from '@kubb/react-fabric'\nimport type { FabricReactNode } from '@kubb/react-fabric/types'\n\ntype Props = {\n  serverName: string\n  serverVersion: string\n  paramsCasing?: 'camelcase'\n  operations: Array<{\n    tool: {\n      name: string\n      title?: string\n      description: string\n    }\n    mcp: {\n      name: string\n      file: KubbFile.File\n    }\n    zod: {\n      name: string\n      file: KubbFile.File\n      schemas: OperationSchemas\n    }\n    type: {\n      schemas: OperationSchemas\n    }\n  }>\n}\n\ntype GetParamsProps = {\n  schemas: OperationSchemas\n  paramsCasing?: 'camelcase'\n}\n\nfunction zodExprFromOasSchema(schema: SchemaObject): string {\n  const types = Array.isArray(schema.type) ? schema.type : [schema.type]\n  const baseType = types.find((t) => t && t !== 'null')\n  const isNullableType = types.includes('null')\n\n  let expr: string\n\n  if (Array.isArray(schema.enum) && schema.enum.length > 0) {\n    const values = schema.enum.map((v: unknown) => JSON.stringify(v)).join(', ')\n    expr = `z.enum([${values}])`\n    if (isNullableType) {\n      expr = `${expr}.nullable()`\n    }\n    return expr\n  }\n\n  switch (baseType) {\n    case 'integer':\n      expr = 'z.coerce.number()'\n      break\n    case 'number':\n      expr = 'z.number()'\n      break\n    case 'boolean':\n      expr = 'z.boolean()'\n      break\n    case 'array':\n      expr = 'z.array(z.unknown())'\n      break\n    default:\n      expr = 'z.string()'\n  }\n\n  if (isNullableType) {\n    expr = `${expr}.nullable()`\n  }\n\n  return expr\n}\n\nfunction getParams({ schemas, paramsCasing }: GetParamsProps) {\n  const pathParamProperties = schemas.pathParams?.schema?.properties ?? {}\n  const requiredFields = Array.isArray(schemas.pathParams?.schema?.required) ? schemas.pathParams.schema.required : []\n\n  const pathParamEntries = Object.entries(pathParamProperties).reduce<Record<string, { value: string; optional: boolean }>>(\n    (acc, [originalKey, propSchema]) => {\n      const key = paramsCasing === 'camelcase' || !isValidVarName(originalKey) ? camelCase(originalKey) : originalKey\n      acc[key] = {\n        value: zodExprFromOasSchema(propSchema as SchemaObject),\n        optional: !requiredFields.includes(originalKey),\n      }\n      return acc\n    },\n    {},\n  )\n\n  return FunctionParams.factory({\n    data: {\n      mode: 'object',\n      children: {\n        ...pathParamEntries,\n        data: schemas.request?.name\n          ? {\n              value: schemas.request?.name,\n              optional: isOptional(schemas.request?.schema),\n            }\n          : undefined,\n        params: schemas.queryParams?.name\n          ? {\n              value: schemas.queryParams?.name,\n              optional: isOptional(schemas.queryParams?.schema),\n            }\n          : undefined,\n        headers: schemas.headerParams?.name\n          ? {\n              value: schemas.headerParams?.name,\n              optional: isOptional(schemas.headerParams?.schema),\n            }\n          : undefined,\n      },\n    },\n  })\n}\n\nexport function Server({ serverName, serverVersion, paramsCasing, operations }: Props): FabricReactNode {\n  const registrations = operations\n    .map(({ tool, mcp, zod }) => {\n      const paramsClient = getParams({ schemas: zod.schemas, paramsCasing })\n      const outputSchema = zod.schemas.response?.name\n\n      const config = [\n        tool.title ? `title: ${JSON.stringify(tool.title)}` : null,\n        `description: ${JSON.stringify(tool.description)}`,\n        outputSchema ? `outputSchema: { data: ${outputSchema} }` : null,\n      ]\n        .filter(Boolean)\n        .join(',\\n  ')\n\n      if (zod.schemas.request?.name || zod.schemas.headerParams?.name || zod.schemas.queryParams?.name || zod.schemas.pathParams?.name) {\n        return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n  ${config},\n  inputSchema: ${paramsClient.toObjectValue()},\n}, async (${paramsClient.toObject()}) => {\n  return ${mcp.name}(${paramsClient.toObject()})\n})\n          `\n      }\n\n      return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n  ${config},\n}, async () => {\n  return ${mcp.name}(${paramsClient.toObject()})\n})\n          `\n    })\n    .filter(Boolean)\n    .join('\\n')\n\n  return (\n    <>\n      <File.Source name=\"getServer\" isExportable isIndexable>\n        {`\nexport function getServer() {\n  const server = new McpServer({\n    name: '${serverName}',\n    version: '${serverVersion}',\n  })\n${registrations}\n  return server\n}\n`}\n      </File.Source>\n\n      <File.Source name=\"server\" isExportable isIndexable>\n        {`\nexport const server = getServer()\n`}\n      </File.Source>\n\n      <File.Source name=\"startServer\" isExportable isIndexable>\n        {`\nexport async function startServer() {\n  try {\n    const transport = new StdioServerTransport()\n    await server.connect(transport)\n\n  } catch (error) {\n    console.error('Failed to start server:', error)\n    process.exit(1)\n  }\n}\n`}\n      </File.Source>\n    </>\n  )\n}\n"],"mappings":"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"}