mlld
Version:
mlld: llm scripting language
1 lines • 11.9 kB
Source Map (JSON)
{"version":3,"sources":["../interpreter/core/ast-evaluator.ts"],"names":["interpolateAndRecord","nodes","env","interpolate","descriptors","text","undefined","collectSecurityDescriptor","descriptor","push","length","merged","mergeSecurityDescriptors","recordSecurityDescriptor","ASTEvaluator","normalizeArray","value","type","Array","isArray","items","map","item","normalizeValue","location","synthetic","Error","normalizeObject","Object","properties","key","val","entries","content","evaluateToRuntime","normalized","evaluatedItems","evaluatedObject","entry","varName","spreadVar","getVariable","spreadValue","assign"],"mappings":"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","file":"ast-evaluator-TR7L7WV6.mjs","sourcesContent":["import { Environment } from '@interpreter/env/Environment';\nimport { SourceLocation } from '@core/types/astTypes';\nimport type { SecurityDescriptor } from '@core/types/security';\n\nasync function interpolateAndRecord(nodes: any, env: Environment): Promise<string> {\n const { interpolate } = await import('@interpreter/core/interpreter');\n const descriptors: SecurityDescriptor[] = [];\n const text = await interpolate(nodes, env, undefined, {\n collectSecurityDescriptor: descriptor => {\n if (descriptor) {\n descriptors.push(descriptor);\n }\n }\n });\n if (descriptors.length > 0) {\n const merged =\n descriptors.length === 1 ? descriptors[0] : env.mergeSecurityDescriptors(...descriptors);\n env.recordSecurityDescriptor(merged);\n }\n return text;\n}\n\nexport interface ArrayNode {\n type: 'array';\n items: any[];\n location: SourceLocation | { synthetic: boolean };\n}\n\nexport interface ObjectNode {\n type: 'object';\n properties: Record<string, any>;\n location: SourceLocation | { synthetic: boolean };\n}\n\nexport class ASTEvaluator {\n /**\n * Normalize an array value to have consistent type information\n */\n static normalizeArray(value: any): ArrayNode {\n // Already normalized\n if (value && typeof value === 'object' && value.type === 'array') {\n return value;\n }\n \n // Plain JavaScript array - synthesize type information\n if (Array.isArray(value)) {\n return {\n type: 'array',\n items: value.map(item => this.normalizeValue(item)),\n location: { synthetic: true }\n };\n }\n \n throw new Error(`Expected array, got ${typeof value}`);\n }\n \n /**\n * Normalize an object value to have consistent type information\n */\n static normalizeObject(value: any): ObjectNode {\n // Already normalized\n if (value && typeof value === 'object' && value.type === 'object') {\n return value;\n }\n \n // Plain JavaScript object - synthesize type information\n if (typeof value === 'object' && value !== null && value.constructor === Object) {\n const properties: Record<string, any> = {};\n \n for (const [key, val] of Object.entries(value)) {\n // Skip internal properties\n if (key === 'wrapperType' || key === 'nodeId' || key === 'location') {\n continue;\n }\n properties[key] = this.normalizeValue(val);\n }\n \n return {\n type: 'object',\n properties,\n location: { synthetic: true }\n };\n }\n \n throw new Error(`Expected object, got ${typeof value}`);\n }\n \n /**\n * Normalize any value - Phase 2: Extended for objects\n */\n static normalizeValue(value: any): any {\n if (value === null || value === undefined) {\n return value;\n }\n \n // Handle wrapped content first (e.g., quoted strings)\n if (value && typeof value === 'object' && 'wrapperType' in value && 'content' in value && Array.isArray(value.content)) {\n // Extract the string content from wrapped strings\n if (value.content.length > 0 && value.content[0].type === 'Text') {\n return value.content[0].content;\n }\n // Handle empty content\n if (value.content.length === 0) {\n return '';\n }\n // For complex content, might need interpolation - return as is for now\n return value;\n }\n \n // Handle raw Text nodes\n if (value && typeof value === 'object' && value.type === 'Text' && 'content' in value) {\n return value.content;\n }\n \n // Handle arrays\n if (Array.isArray(value)) {\n return this.normalizeArray(value);\n }\n \n // Handle objects (but not already-typed nodes)\n if (typeof value === 'object' && value !== null && value.constructor === Object && !value.type) {\n return this.normalizeObject(value);\n }\n \n // Already-typed nodes and primitives pass through\n return value;\n }\n \n /**\n * Evaluate a value to runtime representation\n * Phase 2: Extended for objects and arrays\n */\n static async evaluateToRuntime(value: any, env: Environment): Promise<any> {\n if (value === null || value === undefined) {\n return value;\n }\n \n // Normalize the value first\n const normalized = this.normalizeValue(value);\n \n // Handle normalized arrays\n if (normalized && normalized.type === 'array') {\n const evaluatedItems = [];\n \n for (const item of normalized.items) {\n // Recursively evaluate each item\n evaluatedItems.push(await this.evaluateToRuntime(item, env));\n }\n \n return evaluatedItems;\n }\n \n // Handle normalized objects\n if (normalized && normalized.type === 'object') {\n const evaluatedObject: Record<string, any> = {};\n\n // New format: entries\n if (normalized.entries) {\n for (const entry of normalized.entries) {\n if (entry.type === 'pair') {\n // Recursively evaluate each property value\n evaluatedObject[entry.key] = await this.evaluateToRuntime(entry.value, env);\n } else if (entry.type === 'spread') {\n // Spread entry - interpolate variable name and merge\n const varName = await interpolateAndRecord(entry.value, env);\n const spreadVar = env.getVariable(varName);\n if (spreadVar) {\n const spreadValue = spreadVar.value !== undefined ? spreadVar.value : spreadVar;\n if (typeof spreadValue === 'object' && spreadValue !== null && !Array.isArray(spreadValue)) {\n Object.assign(evaluatedObject, spreadValue);\n }\n }\n }\n }\n }\n // Old format: properties (legacy)\n else if (normalized.properties) {\n for (const [key, val] of Object.entries(normalized.properties)) {\n // Recursively evaluate each property\n evaluatedObject[key] = await this.evaluateToRuntime(val, env);\n }\n }\n\n return evaluatedObject;\n }\n \n // Handle wrapped content that wasn't normalized (complex interpolation needed)\n if (normalized && typeof normalized === 'object' && 'wrapperType' in normalized && 'content' in normalized) {\n return await interpolateAndRecord(normalized.content, env);\n }\n \n // Primitives and other values\n return normalized;\n }\n}\n"]}