{"version":3,"sources":["../src/template.ts"],"names":["PromptTemplateError","FrameworkError","template","message","context","ValidationPromptTemplateError","PromptTemplate","Serializable","config","functions","trim","text","render","replace","defaults","schema","toJsonSchema","escape","Boolean","customTags","register","validateInput","input","validator","createSchemaValidator","coerceTypes","success","errors","fork","customizer","clone","newConfig","isPlainObject","ValueError","update","undefined","Object","assign","updatedInput","pickBy","_","k","getProp","view","output","Mustache","tags","identity","match","loadSnapshot","data","createSnapshot"],"mappings":"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","file":"template.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { FrameworkError, ValueError } from \"@/errors.js\";\nimport { ObjectLike, PlainObject } from \"@/internals/types.js\";\nimport { clone, identity, isPlainObject, pickBy } from \"remeda\";\nimport Mustache from \"mustache\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { z, ZodType } from \"zod\";\nimport { createSchemaValidator, toJsonSchema } from \"@/internals/helpers/schema.js\";\nimport type { SchemaObject, ValidateFunction } from \"ajv\";\nimport { getProp } from \"@/internals/helpers/object.js\";\n\ntype PostInfer<T> = T extends PlainObject\n  ? {\n      [K in keyof T]: T[K] extends Date ? string : T[K];\n    }\n  : T;\ntype InferValue<T> = T extends ZodType<infer A> ? PostInfer<A> : never;\nexport type PromptTemplateRenderFn<K extends ZodType> = (this: InferValue<K>) => any;\n\nexport type PromptTemplateRenderInput<T extends ZodType, T2 extends z.input<T> = z.input<T>> = {\n  [K in Extract<keyof T2, string>]: T2[K] | PromptTemplateRenderFn<T> | undefined;\n};\n\nexport interface PromptTemplateInput<T extends ZodType> {\n  template: string;\n  customTags?: [string, string];\n  escape?: boolean;\n  schema: SchemaObject;\n  defaults?: Partial<InferValue<T>>;\n  functions?: Record<string, PromptTemplateRenderFn<T>>;\n}\n\ntype PromptTemplateConstructor<T extends ZodType, N> = N extends ZodType\n  ? Omit<PromptTemplateInput<N>, \"schema\" | \"functions\" | \"defaults\"> & {\n      schema: N;\n      functions?: Record<string, PromptTemplateRenderFn<N | T>>;\n      defaults?: Partial<InferValue<N | T>>;\n    }\n  : Omit<PromptTemplateInput<T>, \"schema\"> & { schema: T | SchemaObject };\n\ntype Customizer<T extends ZodType, N> =\n  | ((config: Required<PromptTemplateInput<T>>) => PromptTemplateConstructor<T, N>)\n  | ((config: Required<PromptTemplateInput<T>>) => void);\n\nexport class PromptTemplateError<T extends ZodType> extends FrameworkError {\n  template: PromptTemplate<T>;\n\n  constructor(message: string, template: PromptTemplate<T>, context?: ObjectLike) {\n    super(message, [], {\n      context,\n    });\n    this.template = template;\n  }\n}\n\nexport class ValidationPromptTemplateError<T extends ZodType> extends PromptTemplateError<T> {}\n\nexport class PromptTemplate<T extends ZodType> extends Serializable {\n  protected config: Required<PromptTemplateInput<T>>;\n\n  public static functions = {\n    trim: () => (text: string, render: (value: string) => string) => {\n      return render(text).replace(/(,\\s*$)/g, \"\");\n    },\n  };\n\n  constructor(config: Omit<PromptTemplateInput<T>, \"schema\"> & { schema: T | SchemaObject }) {\n    super();\n    this.config = {\n      ...config,\n      defaults: (config.defaults ?? {}) as Partial<InferValue<T>>,\n      schema: toJsonSchema(config.schema),\n      escape: Boolean(config.escape),\n      customTags: config.customTags ?? [\"{{\", \"}}\"],\n      functions: {\n        ...PromptTemplate.functions,\n        ...config.functions,\n      },\n    };\n  }\n\n  static {\n    this.register();\n  }\n\n  validateInput(input: unknown): asserts input is T {\n    const validator = createSchemaValidator(this.config.schema, {\n      coerceTypes: false,\n    }) as ValidateFunction<T>;\n\n    const success = validator(input);\n    if (!success) {\n      throw new ValidationPromptTemplateError(\n        `Template cannot be rendered because input does not adhere to the template schema.`,\n        this,\n        {\n          errors: validator.errors,\n        },\n      );\n    }\n  }\n\n  fork(customizer: Customizer<T, SchemaObject>): PromptTemplate<T>;\n  fork<R extends ZodType>(customizer: Customizer<T, R>): PromptTemplate<R>;\n  fork<R extends ZodType>(\n    customizer: Customizer<T, SchemaObject> | Customizer<T, R>,\n  ): PromptTemplate<T | R> {\n    const config = clone(this.config);\n    const newConfig = customizer?.(config) ?? config;\n    if (!isPlainObject(newConfig)) {\n      throw new ValueError(\"Return type from customizer must be a config or nothing.\");\n    }\n    return new PromptTemplate(newConfig);\n  }\n\n  update(input: Partial<PromptTemplateInput<T>>) {\n    if (input.schema) {\n      this.config.schema = input.schema;\n    }\n    if (input.template !== undefined) {\n      this.config.template = input.template;\n    }\n    if (input.functions) {\n      Object.assign(this.config.functions, input.functions);\n    }\n    if (input.defaults) {\n      Object.assign(this.config.defaults, input.defaults);\n    }\n    if (input.escape !== undefined) {\n      this.config.escape = input.escape;\n    }\n    if (input.customTags) {\n      this.config.customTags = input.customTags;\n    }\n  }\n\n  render(input: PromptTemplateRenderInput<T>): string {\n    const updatedInput: typeof input = { ...input };\n    Object.assign(\n      updatedInput,\n      pickBy(this.config.defaults, (_, k) => getProp(updatedInput, [k]) === undefined),\n    );\n\n    this.validateInput(updatedInput);\n    const view: Record<string, any> = {\n      ...this.config.functions,\n      ...updatedInput,\n    };\n\n    const output = Mustache.render(\n      this.config.template,\n      view,\n      {},\n      {\n        tags: this.config.customTags,\n        ...(!this.config.escape && {\n          escape: identity(),\n        }),\n      },\n    );\n\n    if (output.match(/\\[object (.+)]/)) {\n      throw new ValidationPromptTemplateError(\n        \"Rendered template contains incorrectly serialized value!\",\n        this,\n        {\n          output,\n        },\n      );\n    }\n\n    return output;\n  }\n\n  loadSnapshot(data: ReturnType<typeof this.createSnapshot>) {\n    this.config = data.config;\n  }\n\n  createSnapshot() {\n    return {\n      config: this.config,\n    };\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace PromptTemplate {\n  export type infer<T> = PromptTemplate<ZodType<T>>;\n}\n"]}