mlld
Version:
mlld: a modular prompt scripting language
1 lines • 17.4 kB
Source Map (JSON)
{"version":3,"sources":["../interpreter/utils/field-access.ts"],"names":["accessField","value","field","options","VARIABLE_METADATA_PROPS","parentVariable","isVariable","__variable","type","fieldName","String","includes","metadataValue","preserveContext","accessPath","parentPath","rawValue","fieldValue","accessedValue","name","Error","isLoadContentResult","result","undefined","isLoadContentResultArray","map","item","content","join","properties","returnUndefinedForMissing","numKey","index","Number","items","length","Array","isArray","resultIsVariable","accessFields","fields","current","path","parentVar","createFieldAccessVariable","source","metadata","fieldAccess"],"mappings":"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","file":"chunk-27PI3WNS.mjs","sourcesContent":["/**\n * Utility for accessing fields on objects/arrays\n */\n\nimport { FieldAccessNode } from '@core/types/primitives';\nimport { isLoadContentResult, isLoadContentResultURL, isLoadContentResultArray } from '@core/types/load-content';\nimport type { Variable } from '@core/types/variable/VariableTypes';\nimport { isVariable } from './variable-resolution';\n\n/**\n * Result of field access that preserves context\n */\nexport interface FieldAccessResult {\n /** The accessed value */\n value: any;\n /** The parent Variable if available */\n parentVariable?: Variable;\n /** The access path taken */\n accessPath: string[];\n /** Whether the value itself is a Variable */\n isVariable: boolean;\n}\n\n/**\n * Options for field access\n */\nexport interface FieldAccessOptions {\n /** Whether to preserve context and return FieldAccessResult */\n preserveContext?: boolean;\n /** Parent path for building access path */\n parentPath?: string[];\n /** Whether to return undefined for missing fields instead of throwing */\n returnUndefinedForMissing?: boolean;\n}\n\n/**\n * Access a field on an object or array.\n * Handles dot notation (object.field), numeric fields (obj.123), \n * array indexing (array[0]), and string indexing (obj[\"key\"])\n * \n * Phase 2: Handle normalized AST objects\n * Phase 5: Consolidated with enhanced field access for Variable preservation\n */\nexport function accessField(value: any, field: FieldAccessNode, options?: FieldAccessOptions): any | FieldAccessResult {\n // CRITICAL: Variable metadata properties whitelist\n // Only these properties access the Variable itself, not its value\n const VARIABLE_METADATA_PROPS = ['type', 'isComplex', 'source', 'metadata'];\n \n // Check if the input is a Variable\n const parentVariable = isVariable(value) ? value : (value as any)?.__variable;\n \n // Special handling for Variable metadata properties\n if (isVariable(value) && field.type === 'field') {\n const fieldName = String(field.value);\n \n if (VARIABLE_METADATA_PROPS.includes(fieldName)) {\n // Return metadata property\n const metadataValue = value[fieldName as keyof typeof value];\n \n if (options?.preserveContext) {\n return {\n value: metadataValue,\n parentVariable: value,\n accessPath: [...(options.parentPath || []), fieldName],\n isVariable: false\n };\n }\n return metadataValue;\n }\n }\n \n // Extract the raw value if we have a Variable\n const rawValue = isVariable(value) ? value.value : value;\n const fieldValue = field.value;\n \n // Perform the actual field access\n let accessedValue: any;\n const fieldName = String(fieldValue);\n \n switch (field.type) {\n case 'field':\n case 'stringIndex':\n case 'bracketAccess': {\n // All handle string-based property access\n const name = String(fieldValue);\n \n if (typeof rawValue !== 'object' || rawValue === null) {\n throw new Error(`Cannot access field \"${name}\" on non-object value`);\n }\n \n // Handle LoadContentResult objects - access metadata properties\n if (isLoadContentResult(rawValue)) {\n // Try to access the property - getters will be invoked\n const result = (rawValue as any)[name];\n if (result !== undefined) {\n accessedValue = result;\n break;\n }\n throw new Error(`Field \"${name}\" not found in LoadContentResult`);\n }\n \n // Handle LoadContentResultArray - special case for .content\n if (isLoadContentResultArray(rawValue)) {\n if (name === 'content') {\n // Return concatenated content\n accessedValue = rawValue.map(item => item.content).join('\\n\\n');\n break;\n }\n // Try to access as array property\n const result = (rawValue as any)[name];\n if (result !== undefined) {\n accessedValue = result;\n break;\n }\n throw new Error(`Field \"${name}\" not found in LoadContentResultArray`);\n }\n \n // Handle normalized AST objects\n if (rawValue.type === 'object' && rawValue.properties) {\n // Access the properties object for normalized AST objects\n if (!(name in rawValue.properties)) {\n if (options?.returnUndefinedForMissing) {\n accessedValue = undefined;\n break;\n }\n throw new Error(`Field \"${name}\" not found in object`);\n }\n accessedValue = rawValue.properties[name];\n break;\n }\n \n // Handle regular objects\n if (!(name in rawValue)) {\n if (options?.returnUndefinedForMissing) {\n accessedValue = undefined;\n break;\n }\n throw new Error(`Field \"${name}\" not found in object`);\n }\n \n accessedValue = rawValue[name];\n break;\n }\n \n case 'numericField': {\n // Handle numeric property access (obj.123)\n const numKey = String(fieldValue);\n \n if (typeof rawValue !== 'object' || rawValue === null) {\n throw new Error(`Cannot access numeric field \"${numKey}\" on non-object value`);\n }\n \n // Handle normalized AST objects\n if (rawValue.type === 'object' && rawValue.properties) {\n if (!(numKey in rawValue.properties)) {\n if (options?.returnUndefinedForMissing) {\n accessedValue = undefined;\n break;\n }\n throw new Error(`Numeric field \"${numKey}\" not found in object`);\n }\n accessedValue = rawValue.properties[numKey];\n break;\n }\n \n // Handle regular objects\n if (!(numKey in rawValue)) {\n if (options?.returnUndefinedForMissing) {\n accessedValue = undefined;\n break;\n }\n throw new Error(`Numeric field \"${numKey}\" not found in object`);\n }\n \n accessedValue = rawValue[numKey];\n break;\n }\n \n case 'arrayIndex': {\n // Handle array index access (arr[0])\n const index = Number(fieldValue);\n \n // Handle normalized AST arrays\n if (rawValue && typeof rawValue === 'object' && rawValue.type === 'array' && rawValue.items) {\n const items = rawValue.items;\n if (index < 0 || index >= items.length) {\n throw new Error(`Array index ${index} out of bounds (array length: ${items.length})`);\n }\n accessedValue = items[index];\n break;\n }\n \n // Handle regular arrays\n if (!Array.isArray(rawValue)) {\n // Try object access with numeric key as fallback\n const numKey = String(fieldValue);\n if (typeof rawValue === 'object' && rawValue !== null) {\n // Handle normalized AST objects\n if (rawValue.type === 'object' && rawValue.properties) {\n if (numKey in rawValue.properties) {\n accessedValue = rawValue.properties[numKey];\n break;\n }\n } else if (numKey in rawValue) {\n accessedValue = rawValue[numKey];\n break;\n }\n }\n throw new Error(`Cannot access index ${index} on non-array value`);\n }\n \n if (index < 0 || index >= rawValue.length) {\n throw new Error(`Array index ${index} out of bounds (array length: ${rawValue.length})`);\n }\n \n accessedValue = rawValue[index];\n break;\n }\n \n default:\n throw new Error(`Unknown field access type: ${(field as any).type}`);\n }\n \n // Check if we need to return context-preserving result\n if (options?.preserveContext) {\n const accessPath = [...(options.parentPath || []), fieldName];\n const resultIsVariable = isVariable(accessedValue);\n \n return {\n value: accessedValue,\n parentVariable,\n accessPath,\n isVariable: resultIsVariable\n };\n }\n \n // Return raw value for backward compatibility\n return accessedValue;\n}\n\n/**\n * Access multiple fields in sequence, preserving context\n */\nexport function accessFields(\n value: any,\n fields: FieldAccessNode[],\n options?: FieldAccessOptions\n): any | FieldAccessResult {\n let current = value;\n let path = options?.parentPath || [];\n let parentVar = isVariable(value) ? value : undefined;\n \n for (const field of fields) {\n const result = accessField(current, field, {\n preserveContext: true,\n parentPath: path,\n returnUndefinedForMissing: options?.returnUndefinedForMissing\n });\n \n if (options?.preserveContext) {\n // Update tracking variables\n current = (result as FieldAccessResult).value;\n path = (result as FieldAccessResult).accessPath;\n \n // Update parent variable if we accessed through a Variable\n if ((result as FieldAccessResult).isVariable && isVariable((result as FieldAccessResult).value)) {\n parentVar = (result as FieldAccessResult).value;\n }\n } else {\n // Simple mode - just get the value\n current = result;\n }\n }\n \n if (options?.preserveContext) {\n return {\n value: current,\n parentVariable: parentVar,\n accessPath: path,\n isVariable: isVariable(current)\n };\n }\n \n return current;\n}\n\n/**\n * Create a Variable wrapper for field access results when needed\n */\nexport function createFieldAccessVariable(\n result: FieldAccessResult,\n source: any\n): Variable {\n // If the result is already a Variable, return it\n if (result.isVariable && isVariable(result.value)) {\n return result.value;\n }\n \n // Create a computed Variable to preserve context\n return {\n type: 'computed',\n name: result.accessPath.join('.'),\n value: result.value,\n metadata: {\n source,\n parentVariable: result.parentVariable,\n accessPath: result.accessPath,\n fieldAccess: true\n }\n } as Variable;\n}\n\n"]}