{"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":";;;AAIA,eAAeA,oBAAAA,CAAqBC,OAAYC,GAAgB,EAAA;AAC9D,EAAA,MAAM,EAAEC,WAAAA,EAAgB,GAAA,MAAM,OAAO,4BAAA,CAAA;AACrC,EAAA,MAAMC,cAAoC,EAAA;AAC1C,EAAA,MAAMC,IAAO,GAAA,MAAMF,WAAYF,CAAAA,KAAAA,EAAOC,KAAKI,MAAW,EAAA;AACpDC,IAAAA,yBAAAA,0BAA2BC,UAAAA,KAAAA;AACzB,MAAA,IAAIA,UAAY,EAAA;AACdJ,QAAAA,WAAAA,CAAYK,KAAKD,UAAAA,CAAAA;AACnB;KAHyBA,EAAAA,2BAAAA;GAK7B,CAAA;AACA,EAAIJ,IAAAA,WAAAA,CAAYM,SAAS,CAAG,EAAA;AAC1B,IAAMC,MAAAA,MAAAA,GACJP,WAAYM,CAAAA,MAAAA,KAAW,CAAIN,GAAAA,WAAAA,CAAY,CAAA,CAAKF,GAAAA,GAAAA,CAAIU,wBAAwB,CAAA,GAAIR,WAAAA,CAAAA;AAC9EF,IAAAA,GAAAA,CAAIW,yBAAyBF,MAAAA,CAAAA;AAC/B;AACA,EAAON,OAAAA,IAAAA;AACT;AAhBeL,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AA8BR,IAAMc,aAAAA,GAAN,MAAMA,aAAAA,CAAAA;;;;AAIX,EAAA,OAAOC,eAAeC,KAAuB,EAAA;AAE3C,IAAA,IAAIA,SAAS,OAAOA,KAAAA,KAAU,QAAYA,IAAAA,KAAAA,CAAMC,SAAS,OAAS,EAAA;AAChE,MAAOD,OAAAA,KAAAA;AACT;AAGA,IAAIE,IAAAA,KAAAA,CAAMC,OAAQH,CAAAA,KAAAA,CAAQ,EAAA;AACxB,MAAO,OAAA;QACLC,IAAM,EAAA,OAAA;AACNG,QAAAA,KAAAA,EAAOJ,MAAMK,GAAIC,CAAAA,CAAAA,SAAQ,IAAKC,CAAAA,cAAAA,CAAeD,IAAAA,CAAAA,CAAAA;QAC7CE,QAAU,EAAA;UAAEC,SAAW,EAAA;AAAK;AAC9B,OAAA;AACF;AAEA,IAAA,MAAM,IAAIC,KAAAA,CAAM,CAAuB,oBAAA,EAAA,OAAOV,KAAAA,CAAO,CAAA,CAAA;AACvD;;;;AAKA,EAAA,OAAOW,gBAAgBX,KAAwB,EAAA;AAE7C,IAAA,IAAIA,SAAS,OAAOA,KAAAA,KAAU,QAAYA,IAAAA,KAAAA,CAAMC,SAAS,QAAU,EAAA;AACjE,MAAOD,OAAAA,KAAAA;AACT;AAGA,IAAA,IAAI,OAAOA,KAAU,KAAA,QAAA,IAAYA,UAAU,IAAQA,IAAAA,KAAAA,CAAM,gBAAgBY,MAAQ,EAAA;AAC/E,MAAA,MAAMC,aAAkC,EAAC;AAEzC,MAAA,KAAA,MAAW,CAACC,GAAKC,EAAAA,GAAAA,KAAQH,MAAOI,CAAAA,OAAAA,CAAQhB,KAAAA,CAAQ,EAAA;AAE9C,QAAA,IAAIc,GAAQ,KAAA,aAAA,IAAiBA,GAAQ,KAAA,QAAA,IAAYA,QAAQ,UAAY,EAAA;AACnE,UAAA;AACF;AACAD,QAAAA,UAAAA,CAAWC,GAAAA,CAAAA,GAAO,IAAKP,CAAAA,cAAAA,CAAeQ,GAAAA,CAAAA;AACxC;AAEA,MAAO,OAAA;QACLd,IAAM,EAAA,QAAA;AACNY,QAAAA,UAAAA;QACAL,QAAU,EAAA;UAAEC,SAAW,EAAA;AAAK;AAC9B,OAAA;AACF;AAEA,IAAA,MAAM,IAAIC,KAAAA,CAAM,CAAwB,qBAAA,EAAA,OAAOV,KAAAA,CAAO,CAAA,CAAA;AACxD;;;;AAKA,EAAA,OAAOO,eAAeP,KAAiB,EAAA;AACrC,IAAIA,IAAAA,KAAAA,KAAU,IAAQA,IAAAA,KAAAA,KAAUV,MAAW,EAAA;AACzC,MAAOU,OAAAA,KAAAA;AACT;AAGA,IAAA,IAAIA,KAAS,IAAA,OAAOA,KAAU,KAAA,QAAA,IAAY,aAAiBA,IAAAA,KAAAA,IAAS,SAAaA,IAAAA,KAAAA,IAASE,KAAMC,CAAAA,OAAAA,CAAQH,KAAMiB,CAAAA,OAAO,CAAG,EAAA;AAEtH,MAAIjB,IAAAA,KAAAA,CAAMiB,QAAQvB,MAAS,GAAA,CAAA,IAAKM,MAAMiB,OAAQ,CAAA,CAAA,CAAGhB,CAAAA,IAAAA,KAAS,MAAQ,EAAA;AAChE,QAAOD,OAAAA,KAAAA,CAAMiB,OAAQ,CAAA,CAAA,CAAGA,CAAAA,OAAAA;AAC1B;AAEA,MAAIjB,IAAAA,KAAAA,CAAMiB,OAAQvB,CAAAA,MAAAA,KAAW,CAAG,EAAA;AAC9B,QAAO,OAAA,EAAA;AACT;AAEA,MAAOM,OAAAA,KAAAA;AACT;AAGA,IAAIA,IAAAA,KAAAA,IAAS,OAAOA,KAAU,KAAA,QAAA,IAAYA,MAAMC,IAAS,KAAA,MAAA,IAAU,aAAaD,KAAO,EAAA;AACrF,MAAA,OAAOA,KAAMiB,CAAAA,OAAAA;AACf;AAGA,IAAIf,IAAAA,KAAAA,CAAMC,OAAQH,CAAAA,KAAAA,CAAQ,EAAA;AACxB,MAAO,OAAA,IAAA,CAAKD,eAAeC,KAAAA,CAAAA;AAC7B;AAGA,IAAI,IAAA,OAAOA,KAAU,KAAA,QAAA,IAAYA,KAAU,KAAA,IAAA,IAAQA,MAAM,WAAgBY,KAAAA,MAAAA,IAAU,CAACZ,KAAAA,CAAMC,IAAM,EAAA;AAC9F,MAAO,OAAA,IAAA,CAAKU,gBAAgBX,KAAAA,CAAAA;AAC9B;AAGA,IAAOA,OAAAA,KAAAA;AACT;;;;;EAMA,aAAakB,iBAAAA,CAAkBlB,OAAYd,GAAgC,EAAA;AACzE,IAAIc,IAAAA,KAAAA,KAAU,IAAQA,IAAAA,KAAAA,KAAUV,MAAW,EAAA;AACzC,MAAOU,OAAAA,KAAAA;AACT;AAGA,IAAMmB,MAAAA,UAAAA,GAAa,IAAKZ,CAAAA,cAAAA,CAAeP,KAAAA,CAAAA;AAGvC,IAAImB,IAAAA,UAAAA,IAAcA,UAAWlB,CAAAA,IAAAA,KAAS,OAAS,EAAA;AAC7C,MAAA,MAAMmB,iBAAiB,EAAA;AAEvB,MAAWd,KAAAA,MAAAA,IAAAA,IAAQa,WAAWf,KAAO,EAAA;AAEnCgB,QAAAA,cAAAA,CAAe3B,KAAK,MAAM,IAAA,CAAKyB,iBAAkBZ,CAAAA,IAAAA,EAAMpB,GAAAA,CAAAA,CAAAA;AACzD;AAEA,MAAOkC,OAAAA,cAAAA;AACT;AAGA,IAAID,IAAAA,UAAAA,IAAcA,UAAWlB,CAAAA,IAAAA,KAAS,QAAU,EAAA;AAC9C,MAAA,MAAMoB,kBAAuC,EAAC;AAG9C,MAAA,IAAIF,WAAWH,OAAS,EAAA;AACtB,QAAWM,KAAAA,MAAAA,KAAAA,IAASH,WAAWH,OAAS,EAAA;AACtC,UAAIM,IAAAA,KAAAA,CAAMrB,SAAS,MAAQ,EAAA;AAEzBoB,YAAgBC,eAAAA,CAAAA,KAAAA,CAAMR,GAAG,CAAI,GAAA,MAAM,KAAKI,iBAAkBI,CAAAA,KAAAA,CAAMtB,OAAOd,GAAAA,CAAAA;WAC9DoC,MAAAA,IAAAA,KAAAA,CAAMrB,SAAS,QAAU,EAAA;AAElC,YAAA,MAAMsB,OAAU,GAAA,MAAMvC,oBAAqBsC,CAAAA,KAAAA,CAAMtB,OAAOd,GAAAA,CAAAA;AACxD,YAAMsC,MAAAA,SAAAA,GAAYtC,GAAIuC,CAAAA,WAAAA,CAAYF,OAAAA,CAAAA;AAClC,YAAA,IAAIC,SAAW,EAAA;AACb,cAAA,MAAME,WAAcF,GAAAA,SAAAA,CAAUxB,KAAUV,KAAAA,MAAAA,GAAYkC,UAAUxB,KAAQwB,GAAAA,SAAAA;AACtE,cAAI,IAAA,OAAOE,gBAAgB,QAAYA,IAAAA,WAAAA,KAAgB,QAAQ,CAACxB,KAAAA,CAAMC,OAAQuB,CAAAA,WAAAA,CAAc,EAAA;AAC1Fd,gBAAOe,MAAAA,CAAAA,MAAAA,CAAON,iBAAiBK,WAAAA,CAAAA;AACjC;AACF;AACF;AACF;AACF,OAAA,MAAA,IAESP,WAAWN,UAAY,EAAA;AAC9B,QAAW,KAAA,MAAA,CAACC,KAAKC,GAAAA,CAAAA,IAAQH,OAAOI,OAAQG,CAAAA,UAAAA,CAAWN,UAAU,CAAG,EAAA;AAE9DQ,UAAAA,eAAAA,CAAgBP,GAAAA,CAAO,GAAA,MAAM,IAAKI,CAAAA,iBAAAA,CAAkBH,KAAK7B,GAAAA,CAAAA;AAC3D;AACF;AAEA,MAAOmC,OAAAA,eAAAA;AACT;AAGA,IAAA,IAAIF,cAAc,OAAOA,UAAAA,KAAe,YAAY,aAAiBA,IAAAA,UAAAA,IAAc,aAAaA,UAAY,EAAA;AAC1G,MAAA,OAAO,MAAMnC,oBAAAA,CAAqBmC,UAAWF,CAAAA,OAAAA,EAAS/B,GAAAA,CAAAA;AACxD;AAGA,IAAOiC,OAAAA,UAAAA;AACT;AACF,CAAA;AAhKarB,MAAAA,CAAAA,aAAAA,EAAAA,cAAAA,CAAAA;AAAN,IAAMA,YAAN,GAAA","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"]}