{"version":3,"sources":["../interpreter/utils/ast-evaluation.ts","../interpreter/core/json-formatter.ts"],"names":["createASTAwareJSONReplacer","replacer","key","val","obj","tokest","_extension","undefined","content","valWithContent","Array","isArray","length","firstItem","textNode","type","varRef","identifier","dataObj","properties","dataArr","items","execVal","params","paramNames","join","typeVal","def","value","definition","constructor","Object","hasWrappedContent","values","some","v","processed","k","entries","JSONFormatter","stringify","options","pretty","indent","handleExecutables","handleNamespaces","JSON","stringifyNamespace","namespaceObject","cleaned","frontmatter","exports","variables","executables","fm","__meta__","keys","internalFields","hasExports","includes","__executable"],"mappings":";;;AAWO,SAASA,0BAAAA,GAAAA;AACd,EAAMC,MAAAA,QAAAA,mBAAYC,MAAAA,CAAAA,CAAAA,GAAAA,EAAaC,GAAAA,KAAAA;AAE7B,IAAIA,IAAAA,GAAAA,IAAO,OAAOA,GAAQ,KAAA,QAAA,IAAY,aAAaA,GAAO,IAAA,UAAA,IAAcA,GAAO,IAAA,QAAA,IAAYA,GAAK,EAAA;AAE9F,MAAA,MAAMC,GAAMD,GAAAA,GAAAA;AACZ,MAAA,IAAI,OAAOC,GAAIC,CAAAA,MAAAA,KAAW,QAAYD,IAAAA,GAAAA,CAAIE,eAAeC,MAAW,EAAA;AAElE,QAAA,OAAOH,GAAII,CAAAA,OAAAA;AACb;AACF;AAEA,IAAA,IAAIL,OAAO,OAAOA,GAAAA,KAAQ,YAAY,aAAiBA,IAAAA,GAAAA,IAAO,aAAaA,GAAK,EAAA;AAC9E,MAAA,MAAMM,cAAiBN,GAAAA,GAAAA;AACvB,MAAA,IAAIO,KAAMC,CAAAA,OAAAA,CAAQF,cAAeD,CAAAA,OAAO,CAAG,EAAA;AAEzC,QAAIC,IAAAA,cAAAA,CAAeD,OAAQI,CAAAA,MAAAA,GAAS,CAAG,EAAA;AACrC,UAAMC,MAAAA,SAAAA,GAAYJ,cAAeD,CAAAA,OAAAA,CAAQ,CAAA,CAAA;AACzC,UAAA,IAAIK,aAAa,OAAOA,SAAAA,KAAc,YAAY,MAAUA,IAAAA,SAAAA,IAAa,aAAaA,SAAW,EAAA;AAC/F,YAAA,MAAMC,QAAWD,GAAAA,SAAAA;AACjB,YAAIC,IAAAA,QAAAA,CAASC,SAAS,MAAQ,EAAA;AAC5B,cAAA,OAAOD,QAASN,CAAAA,OAAAA;AAClB;AACF;AACF;AAEA,QAAIC,IAAAA,cAAAA,CAAeD,OAAQI,CAAAA,MAAAA,KAAW,CAAG,EAAA;AACvC,UAAO,OAAA,EAAA;AACT;AACF;AAEA,MAAO,OAAA,EAAA;AACT;AAGA,IAAA,IAAIT,OAAO,OAAOA,GAAAA,KAAQ,YAAY,MAAUA,IAAAA,GAAAA,IAAO,aAAaA,GAAK,EAAA;AACvE,MAAA,MAAMW,QAAWX,GAAAA,GAAAA;AACjB,MAAIW,IAAAA,QAAAA,CAASC,SAAS,MAAQ,EAAA;AAC5B,QAAA,OAAOD,QAASN,CAAAA,OAAAA;AAClB;AACF;AAGA,IAAA,IAAIL,OAAO,OAAOA,GAAAA,KAAQ,YAAY,MAAUA,IAAAA,GAAAA,IAAO,gBAAgBA,GAAK,EAAA;AAC1E,MAAA,MAAMa,MAASb,GAAAA,GAAAA;AACf,MAAIa,IAAAA,MAAAA,CAAOD,SAAS,mBAAqB,EAAA;AACvC,QAAO,OAAA,CAAA,CAAA,EAAIC,OAAOC,UAAU,CAAA,CAAA;AAC9B;AACF;AAGA,IAAA,IAAId,OAAO,OAAOA,GAAAA,KAAQ,YAAY,MAAUA,IAAAA,GAAAA,IAAO,gBAAgBA,GAAK,EAAA;AAC1E,MAAA,MAAMe,OAAUf,GAAAA,GAAAA;AAChB,MAAIe,IAAAA,OAAAA,CAAQH,SAAS,QAAU,EAAA;AAC7B,QAAA,OAAOG,OAAQC,CAAAA,UAAAA;AACjB;AACF;AAGA,IAAA,IAAIhB,OAAO,OAAOA,GAAAA,KAAQ,YAAY,MAAUA,IAAAA,GAAAA,IAAO,WAAWA,GAAK,EAAA;AACrE,MAAA,MAAMiB,OAAUjB,GAAAA,GAAAA;AAChB,MAAIiB,IAAAA,OAAAA,CAAQL,SAAS,OAAS,EAAA;AAC5B,QAAA,OAAOK,OAAQC,CAAAA,KAAAA;AACjB;AACF;AAGA,IAAA,IAAIlB,GAAO,IAAA,OAAOA,GAAQ,KAAA,QAAA,IAAY,kBAAkBA,GAAK,EAAA;AAC3D,MAAA,MAAMmB,OAAUnB,GAAAA,GAAAA;AAChB,MAAMoB,MAAAA,MAAAA,GAASD,OAAQE,CAAAA,UAAAA,IAAc,EAAA;AACrC,MAAA,OAAO,CAAaD,UAAAA,EAAAA,MAAAA,CAAOE,IAAK,CAAA,IAAA,CAAA,CAAA,EAAA,CAAA;AAClC;AAGA,IAAA,IAAItB,GAAO,IAAA,OAAOA,GAAQ,KAAA,QAAA,IAAY,UAAUA,GAAK,EAAA;AACnD,MAAA,MAAMuB,OAAUvB,GAAAA,GAAAA;AAChB,MAAIuB,IAAAA,OAAAA,CAAQX,SAAS,YAAc,EAAA;AACjC,QAAA,MAAMY,GAAMD,GAAAA,OAAAA,CAAQE,KAASF,IAAAA,OAAAA,CAAQG,cAAc,EAAC;AACpD,QAAMN,MAAAA,MAAAA,GAAUI,GAAkCH,CAAAA,UAAAA,IAAc,EAAA;AAChE,QAAA,OAAO,CAAaD,UAAAA,EAAAA,MAAAA,CAAOE,IAAK,CAAA,IAAA,CAAA,CAAA,EAAA,CAAA;AAClC;AACF;AAIA,IAAItB,IAAAA,GAAAA,IAAO,OAAOA,GAAQ,KAAA,QAAA,IAAYA,IAAI2B,WAAgBC,KAAAA,MAAAA,IAAU,EAAE,MAAA,IAAU5B,GAAM,CAAA,EAAA;AAEpF,MAAA,MAAM6B,iBAAoBD,GAAAA,MAAAA,CAAOE,MAAO9B,CAAAA,GAAAA,EAAK+B,IAAKC,CAAAA,CAAAA,CAChDA,KAAAA,CAAAA,IAAK,OAAOA,CAAM,KAAA,QAAA,IAAY,aAAiBA,IAAAA,CAAAA,IAAK,aAAaA,CAAAA,CAAAA;AAGnE,MAAA,IAAIH,iBAAmB,EAAA;AAErB,QAAA,MAAMI,YAAqC,EAAC;AAC5C,QAAA,KAAA,MAAW,CAACC,CAAGF,EAAAA,CAAAA,KAAMJ,MAAOO,CAAAA,OAAAA,CAAQnC,GAAAA,CAAM,EAAA;AACxCiC,UAAAA,SAAAA,CAAUC,CAAAA,CAAAA,GAAKpC,QAASoC,CAAAA,CAAAA,EAAGF,CAAAA,CAAAA;AAC7B;AACA,QAAOC,OAAAA,SAAAA;AACT;AACF;AAEA,IAAOjC,OAAAA,GAAAA;GApGQ,EAAA,UAAA,CAAA;AAuGjB,EAAOF,OAAAA,QAAAA;AACT;AAzGgBD,MAAAA,CAAAA,0BAAAA,EAAAA,4BAAAA,CAAAA;;;ACFT,IAAMuC,cAAAA,GAAN,MAAMA,cAAAA,CAAAA;;;;AAIX,EAAA,OAAOC,SAAUZ,CAAAA,KAAAA,EAAYa,OAA6B,GAAA,EAAY,EAAA;AACpE,IAAM,MAAA,EACJC,SAAS,KACTC,EAAAA,MAAAA,GAAS,GACTC,iBAAoB,GAAA,IAAA,EACpBC,gBAAmB,GAAA,IAAA,EACjBJ,GAAAA,OAAAA;AAGJ,IAAA,MAAMxC,WAAWD,0BAAAA,EAAAA;AAEjB,IAAA,OAAO8C,KAAKN,SAAUZ,CAAAA,KAAAA,EAAO3B,QAAUyC,EAAAA,MAAAA,GAASC,SAASpC,MAAAA,CAAAA;AAC3D;;;;;AAMA,EAAA,OAAOwC,mBAAmBC,eAA8B,EAAA;AACtD,IAAA,MAAMC,OAAe,GAAA;AACnBC,MAAAA,WAAAA,EAAa,EAAC;MACdC,OAAS,EAAA;AACPC,QAAAA,SAAAA,EAAW,EAAC;AACZC,QAAAA,WAAAA,EAAa;AACf;AACF,KAAA;AAGA,IAAA,MAAMC,EAAKN,GAAAA,eAAAA,CAAgBM,EAAMN,IAAAA,eAAAA,CAAgBE,eAAeF,eAAgBO,CAAAA,QAAAA;AAChF,IAAA,IAAID,MAAMvB,MAAOyB,CAAAA,IAAAA,CAAKF,EAAAA,CAAAA,CAAI1C,SAAS,CAAG,EAAA;AACpCqC,MAAAA,OAAAA,CAAQC,WAAcI,GAAAA,EAAAA;AACxB;AAGA,IAAA,MAAMG,cAAiB,GAAA;AAAC,MAAA,IAAA;AAAM,MAAA,aAAA;AAAe,MAAA;;AAC7C,IAAA,IAAIC,UAAa,GAAA,KAAA;AAEjB,IAAA,KAAA,MAAW,CAACxD,GAAK0B,EAAAA,KAAAA,KAAUG,MAAOO,CAAAA,OAAAA,CAAQU,eAAAA,CAAkB,EAAA;AAC1D,MAAA,IAAI,CAACS,cAAAA,CAAeE,QAASzD,CAAAA,GAAAA,CAAM,EAAA;AACjCwD,QAAa,UAAA,GAAA,IAAA;AAEb,QAAA,IAAI9B,KAAS,IAAA,OAAOA,KAAU,KAAA,QAAA,IAAaA,MAAcgC,YAAc,EAAA;AACrE,UAAMrC,MAAAA,MAAAA,GAAUK,KAAcJ,CAAAA,UAAAA,IAAc,EAAA;AAC5CyB,UAAQE,OAAAA,CAAAA,OAAAA,CAAQE,YAAYnD,GAAAA,CAAAA,GAAO,aAAaqB,MAAOE,CAAAA,IAAAA,CAAK,IAAA,CAAA,CAAA,EAAA,CAAA;AAC9D,SAAA,MAAA,IAAWG,SAAS,OAAOA,KAAAA,KAAU,QAAYA,IAAAA,KAAAA,CAAMb,SAAS,YAAc,EAAA;AAE5E,UAAA,MAAMY,GAAMC,GAAAA,KAAAA,CAAMA,KAASA,IAAAA,KAAAA,CAAMC,cAAc,EAAC;AAChD,UAAMN,MAAAA,MAAAA,GAASI,GAAIH,CAAAA,UAAAA,IAAc,EAAA;AACjCyB,UAAQE,OAAAA,CAAAA,OAAAA,CAAQE,YAAYnD,GAAAA,CAAAA,GAAO,aAAaqB,MAAOE,CAAAA,IAAAA,CAAK,IAAA,CAAA,CAAA,EAAA,CAAA;SACvD,MAAA;AACLwB,UAAQE,OAAAA,CAAAA,OAAAA,CAAQC,SAAUlD,CAAAA,GAAAA,CAAO0B,GAAAA,KAAAA;AACnC;AACF;AACF;AAGA,IAAA,IAAI,CAAC8B,UAAY,EAAA;AACf,MAAA,OAAOT,OAAQE,CAAAA,OAAAA;AACjB;AAGA,IAAA,IAAIpB,OAAOyB,IAAKP,CAAAA,OAAAA,CAAQC,WAAW,CAAA,CAAEtC,WAAW,CAAG,EAAA;AACjD,MAAA,OAAOqC,OAAQC,CAAAA,WAAAA;AACjB;AAGA,IAAA,IAAInB,MAAOyB,CAAAA,IAAAA,CAAKP,OAAAA,CAAAA,CAASrC,WAAW,CAAG,EAAA;AACrC,MAAO,OAAA,IAAA;AACT;AAEA,IAAO,OAAA,IAAA,CAAK4B,UAAUS,OAAS,EAAA;MAAEP,MAAQ,EAAA,IAAA;MAAME,iBAAmB,EAAA;KAAM,CAAA;AAC1E;AACF,CAAA;AA5EaL,MAAAA,CAAAA,cAAAA,EAAAA,eAAAA,CAAAA;AAAN,IAAMA,aAAN,GAAA","file":"chunk-VFHGNRP2.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    return JSON.stringify(value, replacer, pretty ? indent : undefined);\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}"]}