{"version":3,"file":"deepTransform.mjs","names":[],"sources":["../../../../src/interpreter/getContent/deepTransform.ts"],"sourcesContent":["import type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { NodeProps } from './plugins';\n\n/**\n * Recursively traverses a node (object/array/primitive).\n * Applies the *first* plugin that can transform a node, then stops descending further.\n * If no plugin transforms it, it recurses into its children.\n */\nexport const deepTransformNode = (node: any, props: NodeProps): any => {\n  // Otherwise, if it's an object, check if any plugin can handle it:\n  for (const plugin of props.plugins ?? []) {\n    if (plugin.canHandle(node)) {\n      // Return the transformed node => do NOT recurse further\n      return plugin.transform(node, props, (node: any, props: any) =>\n        deepTransformNode(node, props)\n      );\n    }\n  }\n\n  // If it's null/undefined or not an object, just return it directly:\n  if (node === null || typeof node !== 'object') {\n    return node;\n  }\n\n  // If it's a framework-specific virtual node or already a transformed Proxy,\n  // return it directly to avoid re-transforming its internal properties.\n  if (\n    (node as any).$$typeof !== undefined ||\n    (node as any).__v_isVNode !== undefined ||\n    (node as any)._isVNode !== undefined ||\n    (node as any).isJSX !== undefined ||\n    typeof node === 'function' // Proxies for html/markdown are functions\n  ) {\n    return node;\n  }\n\n  // If it's an array, transform each element:\n  if (Array.isArray(node)) {\n    return node.map((child, index) => {\n      const childProps = {\n        ...props,\n        children: child,\n        keyPath: [\n          ...props.keyPath,\n          { type: NodeTypes.ARRAY, key: index } as KeyPath,\n        ],\n      };\n      return deepTransformNode(child, childProps);\n    });\n  }\n\n  // If no plugin transforms it, we keep traversing its properties.\n  const result: Record<string, any> = {};\n  for (const key in node) {\n    const childProps = {\n      ...props,\n      children: node[key],\n      keyPath: [...props.keyPath, { type: NodeTypes.OBJECT, key } as KeyPath],\n    };\n\n    if (props.eager) {\n      // Eager mode: recurse immediately so plugins fire on every node, even\n      // when the caller discards the returned tree (e.g. side-effect-only\n      // plugins like missing-locale detection).\n      result[key] = deepTransformNode(node[key], childProps);\n      continue;\n    }\n\n    Object.defineProperty(result, key, {\n      enumerable: true,\n      configurable: true,\n      get: function () {\n        const transformed = deepTransformNode(node[key], childProps);\n\n        // Memoize the result onto the property to avoid re-calculating on next read\n        Object.defineProperty(this, key, {\n          value: transformed,\n          enumerable: true,\n          configurable: true,\n        });\n        return transformed;\n      },\n    });\n  }\n\n  return result;\n};\n"],"mappings":";;;;;;;;AASA,MAAa,qBAAqB,MAAW,UAA0B;AAErE,MAAK,MAAM,UAAU,MAAM,WAAW,EAAE,CACtC,KAAI,OAAO,UAAU,KAAK,CAExB,QAAO,OAAO,UAAU,MAAM,QAAQ,MAAW,UAC/C,kBAAkB,MAAM,MAAM,CAC/B;AAKL,KAAI,SAAS,QAAQ,OAAO,SAAS,SACnC,QAAO;AAKT,KACG,KAAa,aAAa,UAC1B,KAAa,gBAAgB,UAC7B,KAAa,aAAa,UAC1B,KAAa,UAAU,UACxB,OAAO,SAAS,WAEhB,QAAO;AAIT,KAAI,MAAM,QAAQ,KAAK,CACrB,QAAO,KAAK,KAAK,OAAO,UAAU;AAShC,SAAO,kBAAkB,OAAO;GAP9B,GAAG;GACH,UAAU;GACV,SAAS,CACP,GAAG,MAAM,SACT;IAAE,MAAM,UAAU;IAAO,KAAK;IAAO,CACtC;GAEuC,CAAC;GAC3C;CAIJ,MAAM,SAA8B,EAAE;AACtC,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,aAAa;GACjB,GAAG;GACH,UAAU,KAAK;GACf,SAAS,CAAC,GAAG,MAAM,SAAS;IAAE,MAAM,UAAU;IAAQ;IAAK,CAAY;GACxE;AAED,MAAI,MAAM,OAAO;AAIf,UAAO,OAAO,kBAAkB,KAAK,MAAM,WAAW;AACtD;;AAGF,SAAO,eAAe,QAAQ,KAAK;GACjC,YAAY;GACZ,cAAc;GACd,KAAK,WAAY;IACf,MAAM,cAAc,kBAAkB,KAAK,MAAM,WAAW;AAG5D,WAAO,eAAe,MAAM,KAAK;KAC/B,OAAO;KACP,YAAY;KACZ,cAAc;KACf,CAAC;AACF,WAAO;;GAEV,CAAC;;AAGJ,QAAO"}