mlld
Version:
mlld: a modular prompt scripting language
1 lines • 15.3 kB
Source Map (JSON)
{"version":3,"sources":["../interpreter/utils/ast-evaluation.ts","../interpreter/core/json-formatter.ts"],"names":["createASTAwareJSONReplacer","replacer","key","val","obj","tokest","_extension","undefined","content","valWithContent","Array","isArray","length","firstItem","textNode","type","varRef","identifier","dataObj","properties","dataArr","items","execVal","params","paramNames","join","typeVal","def","value","definition","constructor","Object","hasWrappedContent","values","some","v","processed","k","entries","JSONFormatter","stringify","options","pretty","indent","handleExecutables","handleNamespaces","JSON","stringifyNamespace","namespaceObject","cleaned","frontmatter","exports","variables","executables","fm","__meta__","keys","internalFields","hasExports","includes","__executable"],"mappings":"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","file":"chunk-VFHGNRP2.mjs","sourcesContent":["/**\n * Shared utilities for AST node evaluation and JSON serialization\n */\n\nimport type { MlldNode } from '@core/types';\nimport type { Environment } from '../env/Environment';\n\n/**\n * Creates a JSON replacer function that properly handles AST nodes\n * This is used to ensure consistent serialization across the codebase\n */\nexport function createASTAwareJSONReplacer() {\n const replacer = (key: string, val: unknown): unknown => {\n // Handle LoadContentResult - return content for string representation\n if (val && typeof val === 'object' && 'content' in val && 'filename' in val && 'tokest' in val) {\n // This looks like a LoadContentResult - check if it has the getters\n const obj = val as any;\n if (typeof obj.tokest === 'number' || obj._extension !== undefined) {\n // This is a LoadContentResult - return its content for JSON serialization\n return obj.content;\n }\n }\n // Handle wrapped strings (quotes, backticks, brackets)\n if (val && typeof val === 'object' && 'wrapperType' in val && 'content' in val) {\n const valWithContent = val as { wrapperType: string; content: unknown[] };\n if (Array.isArray(valWithContent.content)) {\n // Extract the string content from wrapped strings\n if (valWithContent.content.length > 0) {\n const firstItem = valWithContent.content[0];\n if (firstItem && typeof firstItem === 'object' && 'type' in firstItem && 'content' in firstItem) {\n const textNode = firstItem as { type: string; content: string };\n if (textNode.type === 'Text') {\n return textNode.content;\n }\n }\n }\n // Handle empty content - return empty string instead of the wrapper object\n if (valWithContent.content.length === 0) {\n return '';\n }\n }\n // TODO: Handle interpolated content in wrapped strings\n return ''; // Fallback for unhandled content\n }\n \n // Handle raw Text nodes\n if (val && typeof val === 'object' && 'type' in val && 'content' in val) {\n const textNode = val as { type: string; content: string };\n if (textNode.type === 'Text') {\n return textNode.content;\n }\n }\n \n // Convert VariableReference nodes to their string representation\n if (val && typeof val === 'object' && 'type' in val && 'identifier' in val) {\n const varRef = val as { type: string; identifier: string };\n if (varRef.type === 'VariableReference') {\n return `@${varRef.identifier}`;\n }\n }\n \n // Convert nested DataObject types to plain objects\n if (val && typeof val === 'object' && 'type' in val && 'properties' in val) {\n const dataObj = val as { type: string; properties: Record<string, unknown> };\n if (dataObj.type === 'object') {\n return dataObj.properties;\n }\n }\n \n // Convert nested DataArray types to plain arrays\n if (val && typeof val === 'object' && 'type' in val && 'items' in val) {\n const dataArr = val as { type: string; items: unknown[] };\n if (dataArr.type === 'array') {\n return dataArr.items;\n }\n }\n \n // Hide raw executable details in JSON output\n if (val && typeof val === 'object' && '__executable' in val) {\n const execVal = val as { __executable: boolean; paramNames?: string[] };\n const params = execVal.paramNames || [];\n return `<function(${params.join(', ')})>`;\n }\n \n // Handle executable variables\n if (val && typeof val === 'object' && 'type' in val) {\n const typeVal = val as { type: string; value?: unknown; definition?: unknown };\n if (typeVal.type === 'executable') {\n const def = typeVal.value || typeVal.definition || {};\n const params = (def as { paramNames?: string[] }).paramNames || [];\n return `<function(${params.join(', ')})>`;\n }\n }\n \n // Handle plain objects that might contain wrapped values\n // This is important for objects in arrays that don't have a 'type' property\n if (val && typeof val === 'object' && val.constructor === Object && !('type' in val)) {\n // Check if any property has wrapped content\n const hasWrappedContent = Object.values(val).some(v => \n v && typeof v === 'object' && 'wrapperType' in v && 'content' in v\n );\n \n if (hasWrappedContent) {\n // Process the object's properties\n const processed: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(val)) {\n processed[k] = replacer(k, v); // Recursively call the replacer\n }\n return processed;\n }\n }\n \n return val;\n };\n \n return replacer;\n}\n\n/**\n * Evaluates a node to extract its runtime value\n * Handles wrapped strings and Text nodes that may not be fully evaluated\n */\nexport async function evaluateNodeToValue(node: unknown, env?: Environment): Promise<unknown> {\n if (!node || typeof node !== 'object') {\n return node;\n }\n \n // Handle wrapped strings\n if ('wrapperType' in node && 'content' in node) {\n const wrappedNode = node as { wrapperType: string; content: unknown[] };\n if (Array.isArray(wrappedNode.content)) {\n if (wrappedNode.content.length > 0) {\n const firstItem = wrappedNode.content[0];\n if (firstItem && typeof firstItem === 'object' && 'type' in firstItem && 'content' in firstItem) {\n const textNode = firstItem as { type: string; content: string };\n if (textNode.type === 'Text') {\n return textNode.content;\n }\n }\n }\n // If we have an env and interpolate function, use it for complex content\n if (env && wrappedNode.content.length > 0) {\n const { interpolate } = await import('../core/interpreter');\n return await interpolate(wrappedNode.content as MlldNode[], env);\n }\n }\n }\n \n // Handle raw Text nodes\n if ('type' in node && 'content' in node) {\n const textNode = node as { type: string; content: string };\n if (textNode.type === 'Text') {\n return textNode.content;\n }\n }\n \n return node;\n}","import { createASTAwareJSONReplacer } from '../utils/ast-evaluation';\n\nexport interface JSONFormatOptions {\n pretty?: boolean;\n indent?: number;\n handleExecutables?: boolean;\n handleNamespaces?: boolean;\n}\n\nexport class JSONFormatter {\n /**\n * Single source of truth for JSON serialization in mlld\n */\n static stringify(value: any, options: JSONFormatOptions = {}): string {\n const {\n pretty = false,\n indent = 2,\n handleExecutables = true,\n handleNamespaces = true\n } = options;\n \n // Use our existing shared replacer\n const replacer = createASTAwareJSONReplacer();\n \n return JSON.stringify(value, replacer, pretty ? indent : undefined);\n }\n \n /**\n * Special formatting for namespace objects\n * Shows only frontmatter and exported variables, not internal structure\n */\n static stringifyNamespace(namespaceObject: any): string {\n const cleaned: any = {\n frontmatter: {},\n exports: {\n variables: {},\n executables: {}\n }\n };\n \n // Add frontmatter if present\n const fm = namespaceObject.fm || namespaceObject.frontmatter || namespaceObject.__meta__;\n if (fm && Object.keys(fm).length > 0) {\n cleaned.frontmatter = fm;\n }\n \n // Separate variables and executables\n const internalFields = ['fm', 'frontmatter', '__meta__'];\n let hasExports = false;\n \n for (const [key, value] of Object.entries(namespaceObject)) {\n if (!internalFields.includes(key)) {\n hasExports = true;\n // Check if it's an executable\n if (value && typeof value === 'object' && (value as any).__executable) {\n const params = (value as any).paramNames || [];\n cleaned.exports.executables[key] = `<function(${params.join(', ')})>`;\n } else if (value && typeof value === 'object' && value.type === 'executable') {\n // Handle variable-stored executables\n const def = value.value || value.definition || {};\n const params = def.paramNames || [];\n cleaned.exports.executables[key] = `<function(${params.join(', ')})>`;\n } else {\n cleaned.exports.variables[key] = value;\n }\n }\n }\n \n // If no exports, remove the exports section\n if (!hasExports) {\n delete cleaned.exports;\n }\n \n // If no frontmatter, remove that section\n if (Object.keys(cleaned.frontmatter).length === 0) {\n delete cleaned.frontmatter;\n }\n \n // If nothing left, just return an empty object representation\n if (Object.keys(cleaned).length === 0) {\n return '{}';\n }\n \n return this.stringify(cleaned, { pretty: true, handleExecutables: false });\n }\n}"]}