UNPKG

mlld

Version:

mlld: llm scripting language

1 lines 17.4 kB
{"version":3,"sources":["../interpreter/utils/ast-evaluation.ts","../interpreter/core/json-formatter.ts"],"names":[],"mappings":"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","file":"chunk-YCWPICFD.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 // Smart pretty-printing: only pretty-print if the object is complex enough\n let shouldPrettyPrint = pretty;\n if (pretty) {\n const compactJson = JSON.stringify(value, replacer);\n // Only pretty-print if it's longer than 60 chars or has nested objects/arrays\n shouldPrettyPrint = compactJson.length > 60 || this.hasNestedStructures(value);\n }\n \n const result = JSON.stringify(value, replacer, shouldPrettyPrint ? indent : undefined);\n \n // Post-process: for single-key objects that were pretty-printed, keep them on one line but with spaces\n if (pretty && typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const keys = Object.keys(value);\n if (keys.length === 1 && shouldPrettyPrint) {\n // Check if this is a simple single-key object (not nested)\n const val = value[keys[0]];\n if (typeof val !== 'object' || val === null) {\n // Convert multiline format to single-line with spaces (no extra spaces around braces)\n const lines = result.split('\\n').map(l => l.trim());\n if (lines.length === 3 && lines[0] === '{' && lines[2] === '}') {\n return `{${lines[1]}}`;\n }\n }\n }\n }\n \n return result;\n }\n \n /**\n * Check if a value has nested objects or arrays that warrant pretty-printing\n */\n private static hasNestedStructures(value: any, depth = 0): boolean {\n if (depth > 2) return true; // Deep nesting\n \n if (Array.isArray(value)) {\n // For arrays: pretty print if more than 1 item OR if any item is an object/complex\n return value.length > 1 || value.some(item => \n typeof item === 'object' && item !== null\n );\n }\n \n if (typeof value === 'object' && value !== null) {\n const keys = Object.keys(value);\n // Always pretty-print objects (even single-key ones for consistent spacing)\n // But skip if it's an empty object\n return keys.length > 0;\n }\n \n return false;\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}"]}