@genkit-ai/dotprompt
Version:
Genkit AI framework `.prompt` file format and management library.
1 lines • 6.33 kB
Source Map (JSON)
{"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":[]}