{"version":3,"file":"_getComponentCfgForStaticMarkup.mjs","sources":[""],"sourcesContent":["import type { ReactElement, ReactNode, RefObject } from \"react\";\r\n\r\ninterface IReactElementLike {\r\n  $$typeof?: symbol;\r\n  props?: Record<string, unknown>;\r\n}\r\n\r\nfunction isReactChildren(obj: unknown): obj is ReactElement | ReactNode {\r\n  if (!obj || typeof obj !== \"object\") {\r\n    return false;\r\n  }\r\n\r\n  // Проверка на React элемент через Symbol\r\n  const reactElementSymbol = Symbol.for(\"react.element\");\r\n  const reactFragmentSymbol = Symbol.for(\"react.fragment\");\r\n\r\n  const reactObj = obj as IReactElementLike;\r\n\r\n  if (reactObj.$$typeof === reactElementSymbol || reactObj.$$typeof === reactFragmentSymbol) {\r\n    return true;\r\n  }\r\n\r\n  // Проверка на массив React элементов\r\n  if (Array.isArray(reactObj)) {\r\n    return reactObj.some((item) => isReactChildren(item));\r\n  }\r\n\r\n  // Проверка на объект с React-подобными свойствами\r\n  if (reactObj.props && typeof reactObj.props === \"object\") {\r\n    return true;\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nfunction isReactRef(obj: unknown): obj is RefObject<unknown> {\r\n  if (!obj || typeof obj !== \"object\") {\r\n    return false;\r\n  }\r\n\r\n  // Проверяем специфическую структуру ref объекта\r\n  const isRefLike = (\r\n    Object.keys(obj).length === 1 &&\r\n    \"current\" in obj &&\r\n    Object.getOwnPropertyDescriptor(obj, \"current\")?.writable === true\r\n  );\r\n\r\n  return isRefLike;\r\n}\r\n\r\n\r\ntype TCleanedValue =\r\n  | string\r\n  | number\r\n  | boolean\r\n  | null\r\n  | TCleanedValue[]\r\n  | { [key: string]: TCleanedValue; };\r\n\r\nconst BLOCKED_MARKERS = [\r\n  \"[Circular]\",\r\n  \"[React Children]\",\r\n  \"[React Ref]\",\r\n] as const;\r\n\r\nconst hasBlockedMarker = (value: unknown): boolean => {\r\n  if (typeof value !== \"string\") {\r\n    return false;\r\n  }\r\n\r\n  return BLOCKED_MARKERS.some((marker) => value.includes(marker));\r\n};\r\n\r\n/**\n * Получает JSON-конфигурацию из объекта, очищая его от неподдерживаемых типов данных\n * @internal\n * @returns {String} Возвращает сериализованную JSON-строку с очищенной конфигурацией для статической разметки.\n * @example\n * const cfg = _getComponentCfgForStaticMarkup({\n *   id: \"card\",\n *   children: \"[React Children]\",\n *   nested: { value: 10 },\n * });\n */\nexport const _getComponentCfgForStaticMarkup = (obj: unknown = {}, isClear: boolean = true): string => {\n  try {\r\n    // Используем WeakSet для отслеживания посещенных объектов\r\n    const seen = new WeakSet();\r\n\r\n    const clean = (currentObj: unknown): TCleanedValue | undefined => {\r\n      // Обрабатываем null и undefined\r\n      if (currentObj === null || currentObj === undefined) {\r\n        return null;\r\n      }\r\n\r\n      // Обрабатываем примитивные типы\r\n      const type = typeof currentObj;\r\n      if (type !== \"object\" && type !== \"function\") {\r\n        if (isClear && hasBlockedMarker(currentObj)) {\r\n          return undefined;\r\n        }\r\n        return currentObj as string | number | boolean;\r\n      }\r\n\r\n      // Проверяем на циклические ссылки\r\n      if (seen.has(currentObj)) {\r\n        return isClear ? undefined : \"[Circular]\";\r\n      }\r\n\r\n      // Проверяем на React-элемента\r\n      if (isReactChildren(currentObj)) {\r\n        return isClear ? undefined : \"[React Children]\";\r\n      }\r\n\r\n      // Проверяем на React-ref\r\n      if (isReactRef(currentObj)) {\r\n        return isClear ? undefined : \"[React Ref]\";\r\n      }\r\n\r\n      // Добавляем объект в множество посещенных\r\n      seen.add(currentObj);\r\n\r\n      try {\r\n        // Пропускаем функции\r\n        if (typeof currentObj === \"function\") {\r\n          return undefined;\r\n        }\r\n\r\n        // Обрабатываем специальные объекты\r\n        if (currentObj instanceof Date) {\r\n          return currentObj.toISOString();\r\n        }\r\n\r\n        if (currentObj instanceof RegExp) {\r\n          return currentObj.toString();\r\n        }\r\n\r\n        if (currentObj instanceof Map) {\r\n          const result: Record<string, TCleanedValue> = {};\r\n          for (const [ key, value ] of currentObj.entries()) {\r\n            // Для ключей Map используем отдельную очистку без добавления в seen\r\n            const cleanedKey = typeof key === \"object\" && key !== null ?\r\n              JSON.stringify(key) : String(key);\r\n            if (isClear && hasBlockedMarker(cleanedKey)) {\r\n              continue;\r\n            }\r\n            const cleanedValue = clean(value);\r\n            if (cleanedValue !== undefined && !(isClear && hasBlockedMarker(cleanedValue))) {\r\n              result[cleanedKey] = cleanedValue;\r\n            }\r\n          }\r\n          return result;\r\n        }\r\n\r\n        if (currentObj instanceof Set) {\r\n          return Array.from(currentObj).map((item) => clean(item))\r\n            .filter((item) => item !== undefined && !(isClear && hasBlockedMarker(item))) as TCleanedValue[];\r\n        }\r\n\r\n        // Обрабатываем массивы\r\n        if (Array.isArray(currentObj)) {\r\n          return currentObj.map((item) => clean(item))\r\n            .filter((item) => item !== undefined && !(isClear && hasBlockedMarker(item))) as TCleanedValue[];\r\n        }\r\n\r\n        // Обрабатываем обычные объекты\r\n        const result: Record<string, TCleanedValue> = {};\r\n\r\n        for (const [ key, value ] of Object.entries(currentObj)) {\r\n          // Пропускаем символьные ключи\r\n          if (typeof key === \"symbol\") {\r\n            continue;\r\n          }\r\n\r\n          if (isClear && hasBlockedMarker(key)) {\r\n            continue;\r\n          }\r\n\r\n          const cleanedValue = clean(value);\r\n\r\n          if (cleanedValue !== undefined && !(isClear && hasBlockedMarker(cleanedValue))) {\r\n            result[key] = cleanedValue;\r\n          }\r\n        }\r\n\r\n        return Object.keys(result).length === 0 ? undefined : result;\r\n\r\n      } finally {\r\n        seen.delete(currentObj);\r\n      }\r\n    };\r\n\r\n    const result = clean(obj);\r\n    return JSON.stringify(result !== undefined ? (result as Record<string, TCleanedValue>) : {});\r\n\r\n  } catch (e) {\r\n    console.error(`[getComponentCfgForStaticMarkup] Can't parse config for serialization`, e, obj);\r\n    return \"\";\r\n  }\r\n};\r\n"],"names":["isReactChildren","obj","reactElementSymbol","Symbol","for","reactFragmentSymbol","reactObj","$$typeof","Array","isArray","some","item","props","isReactRef","isRefLike","Object","keys","length","getOwnPropertyDescriptor","writable","BLOCKED_MARKERS","hasBlockedMarker","value","marker","includes","_getComponentCfgForStaticMarkup","isClear","seen","WeakSet","clean","currentObj","undefined","type","has","add","Date","toISOString","RegExp","toString","Map","result","key","entries","cleanedKey","JSON","stringify","String","cleanedValue","Set","from","map","filter","delete","e","console","error"],"mappings":"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"}