{"version":3,"file":"utils.cjs","names":["#options","camelCase","#transformParam","#eachParam","SchemaGenerator","schemaKeywords","camelCase","camelCase"],"sources":["../../../internals/utils/src/reserved.ts","../../../internals/utils/src/urlPath.ts","../src/utils/getComments.ts","../src/utils/getImports.ts","../src/utils/getParams.ts","../src/utils/getSchemas.ts","../src/utils/paramsCasing.ts"],"sourcesContent":["/**\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 } from './casing.ts'\nimport { isValidVarName } from './reserved.ts'\n\nexport type URLObject = {\n  /** The resolved URL string (Express-style or template literal, depending on context). */\n  url: string\n  /** Extracted path parameters as a key-value map, or `undefined` when the path has none. */\n  params?: Record<string, string>\n}\n\ntype ObjectOptions = {\n  /** Controls whether the `url` is rendered as an Express path or a template literal. Defaults to `'path'`. */\n  type?: 'path' | 'template'\n  /** Optional transform applied to each extracted parameter name. */\n  replacer?: (pathParam: string) => string\n  /** When `true`, the result is serialized to a string expression instead of a plain object. */\n  stringify?: boolean\n}\n\n/** Supported identifier casing strategies for path parameters. */\ntype PathCasing = 'camelcase'\n\ntype Options = {\n  /** Casing strategy applied to path parameter names. Defaults to the original identifier. */\n  casing?: PathCasing\n}\n\n/**\n * Parses and transforms an OpenAPI/Swagger path string into various URL formats.\n *\n * @example\n * const p = new URLPath('/pet/{petId}')\n * p.URL      // '/pet/:petId'\n * p.template // '`/pet/${petId}`'\n */\nexport class URLPath {\n  /** The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`. */\n  path: string\n\n  #options: Options\n\n  constructor(path: string, options: Options = {}) {\n    this.path = path\n    this.#options = options\n  }\n\n  /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */\n  get URL(): string {\n    return this.toURLPath()\n  }\n\n  /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`). */\n  get isURL(): boolean {\n    try {\n      return !!new URL(this.path).href\n    } catch {\n      return false\n    }\n  }\n\n  /**\n   * Converts the OpenAPI path to a TypeScript template literal string.\n   *\n   * @example\n   * new URLPath('/pet/{petId}').template              // '`/pet/${petId}`'\n   * new URLPath('/account/monetary-accountID').template // '`/account/${monetaryAccountId}`'\n   */\n  get template(): string {\n    return this.toTemplateString()\n  }\n\n  /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set. */\n  get object(): URLObject | string {\n    return this.toObject()\n  }\n\n  /** Returns a map of path parameter names, or `undefined` when the path has no parameters. */\n  get params(): Record<string, string> | undefined {\n    return this.getParams()\n  }\n\n  #transformParam(raw: string): string {\n    const param = isValidVarName(raw) ? raw : camelCase(raw)\n    return this.#options.casing === 'camelcase' ? camelCase(param) : param\n  }\n\n  /** Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name. */\n  #eachParam(fn: (raw: string, param: string) => void): void {\n    for (const match of this.path.matchAll(/\\{([^}]+)\\}/g)) {\n      const raw = match[1]!\n      fn(raw, this.#transformParam(raw))\n    }\n  }\n\n  toObject({ type = 'path', replacer, stringify }: ObjectOptions = {}): URLObject | string {\n    const object = {\n      url: type === 'path' ? this.toURLPath() : this.toTemplateString({ replacer }),\n      params: this.getParams(),\n    }\n\n    if (stringify) {\n      if (type === 'template') {\n        return JSON.stringify(object).replaceAll(\"'\", '').replaceAll(`\"`, '')\n      }\n\n      if (object.params) {\n        return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll(\"'\", '').replaceAll(`\"`, '')} }`\n      }\n\n      return `{ url: '${object.url}' }`\n    }\n\n    return object\n  }\n\n  /**\n   * Converts the OpenAPI path to a TypeScript template literal string.\n   * An optional `replacer` can transform each extracted parameter name before interpolation.\n   *\n   * @example\n   * new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'\n   */\n  toTemplateString({ prefix = '', replacer }: { prefix?: string; replacer?: (pathParam: string) => string } = {}): string {\n    const parts = this.path.split(/\\{([^}]+)\\}/)\n    const result = parts\n      .map((part, i) => {\n        if (i % 2 === 0) return part\n        const param = this.#transformParam(part)\n        return `\\${${replacer ? replacer(param) : param}}`\n      })\n      .join('')\n\n    return `\\`${prefix}${result}\\``\n  }\n\n  /**\n   * Extracts all `{param}` segments from the path and returns them as a key-value map.\n   * An optional `replacer` transforms each parameter name in both key and value positions.\n   * Returns `undefined` when no path parameters are found.\n   */\n  getParams(replacer?: (pathParam: string) => string): Record<string, string> | undefined {\n    const params: Record<string, string> = {}\n\n    this.#eachParam((_raw, param) => {\n      const key = replacer ? replacer(param) : param\n      params[key] = key\n    })\n\n    return Object.keys(params).length > 0 ? params : undefined\n  }\n\n  /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */\n  toURLPath(): string {\n    return this.path.replace(/\\{([^}]+)\\}/g, ':$1')\n  }\n}\n","import { URLPath } from '@internals/utils'\nimport type { Operation } from '@kubb/oas'\n\nexport function getComments(operation: Operation): string[] {\n  return [\n    operation.getDescription() && `@description ${operation.getDescription()}`,\n    operation.getSummary() && `@summary ${operation.getSummary()}`,\n    operation.path && `{@link ${new URLPath(operation.path).URL}}`,\n    operation.isDeprecated() && '@deprecated',\n  ]\n    .filter((x): x is string => Boolean(x))\n    .flatMap((text) => {\n      return text.split(/\\r?\\n/).map((line) => line.trim())\n    })\n    .filter((x): x is string => Boolean(x))\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport { SchemaGenerator } from '../SchemaGenerator.ts'\nimport type { Schema } from '../SchemaMapper'\nimport { schemaKeywords } from '../SchemaMapper'\n\n/**\n * Get imports from a schema tree by extracting all ref schemas that are importable\n */\nexport function getImports(tree: Array<Schema>): Array<KubbFile.Import> {\n  const refs = SchemaGenerator.deepSearch(tree, schemaKeywords.ref)\n\n  if (!refs) return []\n\n  return refs\n    .map((item) => {\n      if (!item.args.path || !item.args.isImportable) {\n        return undefined\n      }\n\n      return {\n        name: [item.args.name],\n        path: item.args.path,\n      } satisfies KubbFile.Import\n    })\n    .filter((x): x is NonNullable<typeof x> => x !== undefined)\n}\n","import { camelCase, isValidVarName } from '@internals/utils'\nimport type { FunctionParamsAST } from '@kubb/core'\nimport type { OasTypes } from '@kubb/oas'\nimport type { Params } from '@kubb/react-fabric/types'\nimport type { OperationSchema } from '../types.ts'\n/**\n *\n * @deprecated\n * TODO move to operationManager hook\n */\nexport function getASTParams(\n  operationSchema: OperationSchema | undefined,\n  {\n    typed = false,\n    casing,\n    override,\n  }: {\n    typed?: boolean\n    casing?: 'camelcase'\n    override?: (data: FunctionParamsAST) => FunctionParamsAST\n  } = {},\n): FunctionParamsAST[] {\n  if (!operationSchema || !operationSchema.schema.properties || !operationSchema.name) {\n    return []\n  }\n\n  const requiredFields = Array.isArray(operationSchema.schema.required) ? operationSchema.schema.required : []\n\n  return Object.entries(operationSchema.schema.properties).map(([name]: [string, OasTypes.SchemaObject]) => {\n    // Use camelCase name for indexed access if casing is enabled\n    const accessName = casing === 'camelcase' ? camelCase(name) : name\n\n    const data: FunctionParamsAST = {\n      name,\n      enabled: !!name,\n      required: requiredFields.includes(name),\n      type: typed ? `${operationSchema.name}[\"${accessName}\"]` : undefined,\n    }\n\n    return override ? override(data) : data\n  })\n}\n\nexport function getPathParams(\n  operationSchema: OperationSchema | undefined,\n  options: {\n    typed?: boolean\n    casing?: 'camelcase'\n    override?: (data: FunctionParamsAST) => FunctionParamsAST\n  } = {},\n) {\n  return getASTParams(operationSchema, options).reduce((acc, curr) => {\n    if (curr.name && curr.enabled) {\n      let name = curr.name\n\n      // Only transform to camelCase if explicitly requested\n      if (options.casing === 'camelcase') {\n        name = camelCase(name)\n      } else if (!isValidVarName(name)) {\n        // If not valid variable name and casing not set, still need to make it valid\n        name = camelCase(name)\n      }\n\n      acc[name] = {\n        default: curr.default,\n        type: curr.type,\n        optional: !curr.required,\n      }\n    }\n\n    return acc\n  }, {} as Params)\n}\n\n/**\n * Get a mapping of camelCase parameter names to their original names\n * Used for mapping function parameters to backend parameter names\n */\nexport function getParamsMapping(\n  operationSchema: OperationSchema | undefined,\n  options: {\n    casing?: 'camelcase'\n  } = {},\n): Record<string, string> | undefined {\n  if (!operationSchema || !operationSchema.schema.properties) {\n    return undefined\n  }\n\n  const allEntries: Array<[string, string]> = []\n  let hasTransformation = false\n\n  Object.entries(operationSchema.schema.properties).forEach(([originalName]) => {\n    let transformedName = originalName\n\n    // Only transform to camelCase if explicitly requested\n    if (options.casing === 'camelcase') {\n      transformedName = camelCase(originalName)\n    } else if (!isValidVarName(originalName)) {\n      // If not valid variable name and casing not set, still need to make it valid\n      transformedName = camelCase(originalName)\n    }\n\n    allEntries.push([originalName, transformedName])\n\n    if (transformedName !== originalName) {\n      hasTransformation = true\n    }\n  })\n\n  // When using explicit casing and there are transformations, include ALL params so that\n  // mappedParams contains every parameter (not just the ones whose names changed).\n  // This prevents params with already-camelCase names (e.g. 'page', 'search') from being\n  // silently dropped when other params in the same schema do need transformation.\n  if (options.casing === 'camelcase' && hasTransformation) {\n    return Object.fromEntries(allEntries)\n  }\n\n  // When casing is not specified or no transformations are needed, only return changed entries\n  const mapping: Record<string, string> = {}\n  allEntries.forEach(([originalName, transformedName]) => {\n    if (transformedName !== originalName) {\n      mapping[originalName] = transformedName\n    }\n  })\n\n  return Object.keys(mapping).length > 0 ? mapping : undefined\n}\n","import type { contentType, Oas, OasTypes } from '@kubb/oas'\n\nexport type GetSchemasResult = {\n  schemas: Record<string, OasTypes.SchemaObject>\n  /**\n   * Mapping from original component name to resolved name after collision handling\n   * e.g., { 'Order': 'OrderSchema', 'variant': 'variant2' }\n   */\n  nameMapping: Map<string, string>\n}\n\ntype Mode = 'schemas' | 'responses' | 'requestBodies'\n\ntype GetSchemasProps = {\n  oas: Oas\n  contentType?: contentType\n  includes?: Mode[]\n  /**\n   * Whether to resolve name collisions with suffixes.\n   * If not provided, uses oas.options.collisionDetection\n   * @default false (from oas.options or fallback)\n   */\n  collisionDetection?: boolean\n}\n\n/**\n * Collect schemas from OpenAPI components (schemas, responses, requestBodies)\n * and return them in dependency order along with name mapping for collision resolution.\n *\n * This function is a wrapper around the oas.getSchemas() method for backward compatibility.\n * New code should use oas.getSchemas() directly.\n *\n * @deprecated Use oas.getSchemas() instead\n */\nexport function getSchemas({ oas, contentType, includes = ['schemas', 'requestBodies', 'responses'], collisionDetection }: GetSchemasProps): GetSchemasResult {\n  return oas.getSchemas({\n    contentType,\n    includes,\n    collisionDetection,\n  })\n}\n","import { camelCase, isValidVarName } from '@internals/utils'\nimport type { SchemaObject } from '@kubb/oas'\n\n/**\n * Apply casing transformation to schema properties\n * Only transforms property names, not nested schemas\n */\nexport function applyParamsCasing(schema: SchemaObject, casing: 'camelcase' | undefined): SchemaObject {\n  if (!casing || !schema.properties) {\n    return schema\n  }\n\n  const transformedProperties: Record<string, any> = {}\n  const transformedRequired: string[] = []\n\n  // Transform property names\n  Object.entries(schema.properties).forEach(([originalName, propertySchema]) => {\n    let transformedName = originalName\n\n    if (casing === 'camelcase') {\n      transformedName = camelCase(originalName)\n    } else if (!isValidVarName(originalName)) {\n      // If not valid variable name, make it valid\n      transformedName = camelCase(originalName)\n    }\n\n    transformedProperties[transformedName] = propertySchema\n  })\n\n  // Transform required field names\n  if (Array.isArray(schema.required)) {\n    schema.required.forEach((originalName) => {\n      let transformedName = originalName\n\n      if (casing === 'camelcase') {\n        transformedName = camelCase(originalName)\n      } else if (!isValidVarName(originalName)) {\n        transformedName = camelCase(originalName)\n      }\n\n      transformedRequired.push(transformedName)\n    })\n  }\n\n  // Return a new schema with transformed properties and required fields\n  return {\n    ...schema,\n    properties: transformedProperties,\n    ...(transformedRequired.length > 0 && { required: transformedRequired }),\n  } as SchemaObject\n}\n\n/**\n * Check if this schema is a parameter schema (pathParams, queryParams, or headerParams)\n * Only these should be transformed, not response/data/body\n */\nexport function isParameterSchema(schemaName: string): boolean {\n  const lowerName = schemaName.toLowerCase()\n  return lowerName.includes('pathparams') || lowerName.includes('queryparams') || lowerName.includes('headerparams')\n}\n"],"mappings":"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"}