{"version":3,"sources":["../src/picoschema.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst JSON_SCHEMA_SCALAR_TYPES = [\n  'string',\n  'boolean',\n  'null',\n  'number',\n  'integer',\n  'any',\n];\n\nconst WILDCARD_PROPERTY_NAME = '(*)';\n\nimport { JSONSchema } from '@genkit-ai/core/schema';\n\nexport function picoschema(schema: unknown): JSONSchema | null {\n  if (!schema) return null;\n  // if there's a JSON schema-ish type at the top level, treat as JSON schema\n  if (\n    [...JSON_SCHEMA_SCALAR_TYPES, 'object', 'array'].includes(\n      (schema as any)?.type\n    )\n  ) {\n    return schema;\n  }\n\n  if (typeof (schema as any)?.properties === 'object') {\n    return { ...schema, type: 'object' };\n  }\n\n  return parsePico(schema);\n}\n\nfunction extractDescription(input: string): [string, string | null] {\n  if (!input.includes(',')) return [input, null];\n\n  const match = input.match(/(.*?), *(.*)$/);\n  return [match![1], match![2]];\n}\n\nfunction parsePico(obj: any, path: string[] = []): JSONSchema {\n  if (typeof obj === 'string') {\n    const [type, description] = extractDescription(obj);\n    if (!JSON_SCHEMA_SCALAR_TYPES.includes(type)) {\n      throw new Error(`Picoschema: Unsupported scalar type '${type}'.`);\n    }\n\n    if (type === 'any') {\n      return description ? { description } : {};\n    }\n\n    return description ? { type, description } : { type };\n  } else if (typeof obj !== 'object') {\n    throw new Error(\n      'Picoschema: only consists of objects and strings. Got: ' +\n        JSON.stringify(obj)\n    );\n  }\n\n  const schema: JSONSchema = {\n    type: 'object',\n    properties: {},\n    required: [],\n    additionalProperties: false,\n  };\n\n  for (const key in obj) {\n    // wildcard property\n    if (key === WILDCARD_PROPERTY_NAME) {\n      schema.additionalProperties = parsePico(obj[key], [...path, key]);\n      continue;\n    }\n\n    const [name, typeInfo] = key.split('(');\n    const isOptional = name.endsWith('?');\n    const propertyName = isOptional ? name.slice(0, -1) : name;\n\n    if (!isOptional) {\n      schema.required.push(propertyName);\n    }\n\n    if (!typeInfo) {\n      const prop = parsePico(obj[key], [...path, key]);\n      // make all optional fields also nullable\n      if (isOptional && typeof prop.type === 'string') {\n        prop.type = [prop.type, 'null'];\n      }\n      schema.properties[propertyName] = prop;\n      continue;\n    }\n\n    const [type, description] = extractDescription(\n      typeInfo.substring(0, typeInfo.length - 1)\n    );\n    if (type === 'array') {\n      schema.properties[propertyName] = {\n        type: isOptional ? ['array', 'null'] : 'array',\n        items: parsePico(obj[key], [...path, key]),\n      };\n    } else if (type === 'object') {\n      const prop = parsePico(obj[key], [...path, key]);\n      if (isOptional) prop.type = [prop.type, 'null'];\n      schema.properties[propertyName] = prop;\n    } else if (type === 'enum') {\n      const prop = { enum: obj[key] };\n      if (isOptional) prop.enum.push(null);\n      schema.properties[propertyName] = prop;\n    } else {\n      throw new Error(\n        \"Picoschema: parenthetical types must be 'object' or 'array', got: \" +\n          type\n      );\n    }\n    if (description) {\n      schema.properties[propertyName].description = description;\n    }\n  }\n\n  if (!schema.required.length) delete schema.required;\n  return schema;\n}\n"],"mappings":"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","names":[]}