{"version":3,"file":"autoDecorateContent.mjs","names":[],"sources":["../../../src/utils/autoDecorateContent.ts"],"sourcesContent":["import { getMarkdownMetadata } from '@intlayer/core/markdown';\nimport {\n  getInsertionValues,\n  html,\n  insert,\n  md,\n} from '@intlayer/core/transpiler';\nimport * as NodeTypes from '@intlayer/types/nodeType';\n\n/**\n * Check if a string is a markdown string\n */\nconst isMarkdown = (str: string): boolean => {\n  // Check for common markdown indicators\n  const patterns = [\n    /^\\s*---/m, // Front Matter\n    /^\\s*#+\\s/m, // Headers: # Title\n    /^\\s*[-*+]\\s/m, // Unordered lists: - Item or * Item\n    /^\\s*\\d+\\.\\s/m, // Ordered lists: 1. Item\n    /^\\s*>\\s/m, // Blockquotes: > Quote\n    /\\[.+\\]\\(.+\\)/, // Links: [text](url)\n    /!\\[.+\\]\\(.+\\)/, // Images: ![alt](url)\n    /`{1,3}.+`{1,3}/, // Code blocks or inline code: `code` or ```code```\n    /\\*\\*.+\\*\\*/, // Bold: **text**\n    /__.+__/, // Bold: __text__\n    /<(https?:\\/\\/[^\\s>]+)>/, // Autolinks: <http://...>\n  ];\n\n  return patterns.some((pattern) => pattern.test(str));\n};\n\n/**\n * Check if a string is an insertion string\n */\nconst isInsertion = (str: string): boolean =>\n  getInsertionValues(str).length > 0;\n\n/**\n * Check if a string is an HTML/JSX string\n * Matches:\n * - <Tag>\n * - </Tag>\n * - <Tag />\n * - <Tag attribute=\"value\">\n * - <Component.SubComponent>\n */\nconst isHTML = (str: string): boolean => {\n  // 1. Matches opening or self-closing tags: <Tag ... > or <Tag ... />\n  //    - Must start with < followed by a letter (to avoid math comparisons like a < b)\n  //    - Allows alphanumeric, hyphens, and dots (for Namespaced components) in tag name\n  //    - Allows attributes until the closing >\n  const openTagRegex = /<[a-zA-Z][a-zA-Z0-9\\-.]*(\\s+[^>]*)?\\/?>/;\n\n  // 2. Matches closing tags: </Tag>\n  const closeTagRegex = /<\\/[a-zA-Z][a-zA-Z0-9\\-.]*\\s*>/;\n\n  return openTagRegex.test(str) || closeTagRegex.test(str);\n};\n\nconst leafNodeTypes: string[] = [\n  NodeTypes.HTML,\n  NodeTypes.MARKDOWN,\n  NodeTypes.INSERTION,\n  NodeTypes.FILE,\n  NodeTypes.REACT_NODE,\n  NodeTypes.TEXT,\n  NodeTypes.NUMBER,\n  NodeTypes.BOOLEAN,\n  NodeTypes.NULL,\n  NodeTypes.UNKNOWN,\n];\n\ntype AutoTransformationOptions = {\n  markdown?: boolean;\n  html?: boolean;\n  insertion?: boolean;\n};\n\n/**\n * Automatically decorate content strings with md() or insert() if they match\n */\nexport const autoDecorateContent = (\n  content: any,\n  options: boolean | AutoTransformationOptions = true\n): any => {\n  if (options === false) {\n    return content;\n  }\n\n  const {\n    markdown = true,\n    html: htmlOption = true,\n    insertion = true,\n  } = typeof options === 'object' ? options : {};\n\n  if (typeof content === 'string') {\n    if (markdown && isMarkdown(content)) {\n      const markdownNode = md(content);\n\n      return {\n        ...markdownNode,\n        metadata: getMarkdownMetadata(content),\n      };\n    }\n\n    if (htmlOption && isHTML(content)) {\n      return html(content);\n    }\n\n    if (insertion && isInsertion(content)) {\n      return insert(content);\n    }\n\n    return content;\n  }\n\n  if (Array.isArray(content)) {\n    return content.map((item) => autoDecorateContent(item, options));\n  }\n\n  if (content && typeof content === 'object') {\n    // If it's already a decorated node (has nodeType)\n    if ('nodeType' in content) {\n      const nodeType = content.nodeType;\n\n      // If it's a leaf node type, don't re-decorate its content\n      if (leafNodeTypes.includes(nodeType)) {\n        return content;\n      }\n\n      // If it's a container node type (like translation, enumeration, etc.), recurse into its content field\n      if (nodeType in content) {\n        return {\n          ...content,\n          [nodeType]: autoDecorateContent(content[nodeType], options),\n        };\n      }\n\n      return content;\n    }\n\n    // Plain object, recurse into all keys\n    const result: Record<string, any> = {};\n    for (const key of Object.keys(content)) {\n      result[key] = autoDecorateContent(content[key], options);\n    }\n    return result;\n  }\n\n  return content;\n};\n"],"mappings":";;;;;;;;AAYA,MAAM,cAAc,QAAyB;CAgB3C,OAAO;EAbL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAGY,EAAE,MAAM,YAAY,QAAQ,KAAK,GAAG,CAAC;AACrD;;;;AAKA,MAAM,eAAe,QACnB,mBAAmB,GAAG,EAAE,SAAS;;;;;;;;;;AAWnC,MAAM,UAAU,QAAyB;CAUvC,OAAO,0CAAa,KAAK,GAAG,KAAK,iCAAc,KAAK,GAAG;AACzD;AAEA,MAAM,gBAA0B;CAC9B,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;AACZ;;;;AAWA,MAAa,uBACX,SACA,UAA+C,SACvC;CACR,IAAI,YAAY,OACd,OAAO;CAGT,MAAM,EACJ,WAAW,MACX,MAAM,aAAa,MACnB,YAAY,SACV,OAAO,YAAY,WAAW,UAAU,CAAC;CAE7C,IAAI,OAAO,YAAY,UAAU;EAC/B,IAAI,YAAY,WAAW,OAAO,GAGhC,OAAO;GACL,GAHmB,GAAG,OAGR;GACd,UAAU,oBAAoB,OAAO;EACvC;EAGF,IAAI,cAAc,OAAO,OAAO,GAC9B,OAAO,KAAK,OAAO;EAGrB,IAAI,aAAa,YAAY,OAAO,GAClC,OAAO,OAAO,OAAO;EAGvB,OAAO;CACT;CAEA,IAAI,MAAM,QAAQ,OAAO,GACvB,OAAO,QAAQ,KAAK,SAAS,oBAAoB,MAAM,OAAO,CAAC;CAGjE,IAAI,WAAW,OAAO,YAAY,UAAU;EAE1C,IAAI,cAAc,SAAS;GACzB,MAAM,WAAW,QAAQ;GAGzB,IAAI,cAAc,SAAS,QAAQ,GACjC,OAAO;GAIT,IAAI,YAAY,SACd,OAAO;IACL,GAAG;KACF,WAAW,oBAAoB,QAAQ,WAAW,OAAO;GAC5D;GAGF,OAAO;EACT;EAGA,MAAM,SAA8B,CAAC;EACrC,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,GACnC,OAAO,OAAO,oBAAoB,QAAQ,MAAM,OAAO;EAEzD,OAAO;CACT;CAEA,OAAO;AACT"}