{"version":3,"sources":["../interpreter/eval/expressions.ts"],"names":["rightResult"],"mappings":"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","file":"expressions-FPH3NB7C.mjs","sourcesContent":["import type { Environment } from '../env/Environment';\nimport { evaluate } from '../core/interpreter';\nimport { MlldDirectiveError } from '../../core/errors/MlldDirectiveError';\nimport { isEqual, toNumber, isTruthy } from './expression';\n\n/**\n * Unified expression evaluator for all expression types from the unified grammar\n * Handles: BinaryExpression, UnaryExpression, TernaryExpression, ArrayFilterExpression, ArraySliceExpression, Literal nodes\n */\nexport async function evaluateUnifiedExpression(node: any, env: Environment): Promise<any> {\n  try {\n    switch (node.type) {\n      case 'BinaryExpression':\n        return await evaluateBinaryExpression(node, env);\n      case 'UnaryExpression':\n        return await evaluateUnaryExpression(node, env);\n      case 'TernaryExpression':\n        return await evaluateTernaryExpression(node, env);\n      case 'ArrayFilterExpression':\n        return await evaluateArrayFilterExpression(node, env);\n      case 'ArraySliceExpression':\n        return await evaluateArraySliceExpression(node, env);\n      case 'Literal':\n        // Handle none literal (only valid in when context)\n        if (node.valueType === 'none') {\n          throw new Error('The \"none\" keyword can only be used as a condition in /when directives');\n        }\n        return node.value;\n      case 'VariableReference':\n        // Delegate variable references to the standard evaluator\n        try {\n          const varResult = await evaluate(node, env);\n          return varResult.value;\n        } catch (error) {\n          // Handle undefined variables gracefully for backward compatibility\n          if (error.message && error.message.includes('Variable not found')) {\n            return undefined;\n          }\n          throw error;\n        }\n      case 'ExecReference':\n        // Delegate exec references to the standard evaluator\n        const execResult = await evaluate(node, env);\n        return execResult.value;\n      case 'Text':\n        // Handle text nodes that might appear in expressions\n        return node.content;\n      default:\n        // For all other node types, delegate to the standard evaluator\n        const result = await evaluate(node, env);\n        return result.value;\n    }\n  } catch (error) {\n    throw new MlldDirectiveError(\n      `Expression evaluation failed: ${error instanceof Error ? error.message : String(error)}`,\n      'expression',\n      {\n        location: (node as any)?.location,\n        cause: error as Error,\n        context: { nodeType: (node as any)?.type, operator: (node as any)?.operator },\n        env\n      }\n    );\n  }\n}\n\n/**\n * Evaluate binary expressions (&&, ||, ==, !=, <, >, <=, >=, ~=)\n */\nasync function evaluateBinaryExpression(node: any, env: Environment): Promise<any> {\n  let { operator } = node;\n  \n  // Handle operator being an array (from PEG.js negative lookahead)\n  if (Array.isArray(operator)) {\n    operator = operator[0];\n  }\n  \n  \n  \n  const leftResult = await evaluateUnifiedExpression(node.left, env);\n  \n  // Short-circuit evaluation for logical operators  \n  if (operator === '&&') {\n    const leftTruthy = isTruthy(leftResult);\n    if (!leftTruthy) {\n      // Short-circuit: if left is falsy, return left value\n      return leftResult;\n    }\n    // Otherwise evaluate and return right\n    const rightResult = await evaluateUnifiedExpression(node.right, env);\n    return rightResult;\n  }\n  \n  if (operator === '||') {\n    const leftTruthy = isTruthy(leftResult);\n    if (leftTruthy) {\n      // Short-circuit: if left is truthy, return left value\n      return leftResult;\n    }\n    // Otherwise evaluate and return right\n    const rightResult = await evaluateUnifiedExpression(node.right, env);\n    return rightResult;\n  }\n  \n  const rightResult = await evaluateUnifiedExpression(node.right, env);\n  \n  \n  switch (operator) {\n    case '==':\n      const equal = isEqual(leftResult, rightResult);\n      return equal;\n    case '!=':\n      return !isEqual(leftResult, rightResult);\n    case '~=':\n      // Regex match operator\n      const regex = new RegExp(String(rightResult));\n      return regex.test(String(leftResult));\n    case '<':\n      const leftNum = toNumber(leftResult);\n      const rightNum = toNumber(rightResult);\n      const ltResult = leftNum < rightNum;\n      return ltResult;\n    case '>':\n      return toNumber(leftResult) > toNumber(rightResult);\n    case '<=':\n      return toNumber(leftResult) <= toNumber(rightResult);\n    case '>=':\n      return toNumber(leftResult) >= toNumber(rightResult);\n    case '+':\n      return toNumber(leftResult) + toNumber(rightResult);\n    case '-':\n      return toNumber(leftResult) - toNumber(rightResult);\n    case '*':\n      return toNumber(leftResult) * toNumber(rightResult);\n    case '/':\n      return toNumber(leftResult) / toNumber(rightResult);\n    case '%':\n      return toNumber(leftResult) % toNumber(rightResult);\n    default:\n      throw new Error(`Unknown binary operator: ${operator}`);\n  }\n}\n\n/**\n * Evaluate unary expressions (!, -, +)\n */\nasync function evaluateUnaryExpression(node: any, env: Environment): Promise<any> {\n  const operandResult = await evaluateUnifiedExpression(node.operand, env);\n  \n  switch (node.operator) {\n    case '!':\n      return !isTruthy(operandResult);\n    case '-':\n      return -toNumber(operandResult);\n    case '+':\n      return +toNumber(operandResult);\n    default:\n      throw new Error(`Unknown unary operator: ${node.operator}`);\n  }\n}\n\n/**\n * Evaluate ternary expressions (condition ? trueBranch : falseBranch)\n */\nasync function evaluateTernaryExpression(node: any, env: Environment): Promise<any> {\n  const conditionResult = await evaluateUnifiedExpression(node.condition, env);\n  \n  return isTruthy(conditionResult)\n    ? await evaluateUnifiedExpression(node.trueBranch, env)\n    : await evaluateUnifiedExpression(node.falseBranch, env);\n}\n\n/**\n * Evaluate array filter expressions: @array[?condition]\n */\nasync function evaluateArrayFilterExpression(node: any, env: Environment): Promise<any[]> {\n  const array = await evaluateUnifiedExpression(node.array, env);\n  \n  if (!Array.isArray(array)) {\n    throw new Error(`Cannot filter non-array value: ${typeof array}`);\n  }\n  \n  const results = [];\n  for (const item of array) {\n    // Create new environment with current item accessible as '$'\n    const itemEnv = env.withVariable('$', item);\n    const passes = await evaluateUnifiedExpression(node.filter, itemEnv);\n    if (passes) {\n      results.push(item);\n    }\n  }\n  \n  return results;\n}\n\n/**\n * Evaluate array slice expressions: @array[start:end]\n */\nasync function evaluateArraySliceExpression(node: any, env: Environment): Promise<any[]> {\n  const array = await evaluateUnifiedExpression(node.array, env);\n  \n  if (!Array.isArray(array)) {\n    throw new Error(`Cannot slice non-array value: ${typeof array}`);\n  }\n  \n  const start = node.start || 0;\n  const end = node.end !== undefined ? node.end : array.length;\n  \n  return array.slice(start, end);\n}\n\n/**\n * Check if a node is a unified expression type\n */\nexport function isUnifiedExpressionNode(node: any): boolean {\n  return node && [\n    'BinaryExpression',\n    'UnaryExpression', \n    'TernaryExpression',\n    'ArrayFilterExpression',\n    'ArraySliceExpression',\n    'Literal'\n  ].includes(node.type);\n}\n\n/**\n * Helper function to evaluate array filter expressions\n * This will be expanded when we implement array operations\n */\nexport async function evaluateArrayFilter(array: any[], filter: any, env: Environment): Promise<any[]> {\n  const results = [];\n  for (const item of array) {\n    // Create a new environment with the current item as '$'\n    const itemEnv = env.withVariable('$', item);\n    const passes = await evaluateUnifiedExpression(filter, itemEnv);\n    if (passes) results.push(item);\n  }\n  return results;\n}\n"]}