@salve-software/mako-react-native 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/LICENSE +21 -0
  2. package/NitroMako.podspec +31 -0
  3. package/README.md +90 -0
  4. package/android/CMakeLists.txt +32 -0
  5. package/android/build.gradle +148 -0
  6. package/android/fix-prefab.gradle +51 -0
  7. package/android/gradle.properties +5 -0
  8. package/android/src/main/AndroidManifest.xml +2 -0
  9. package/android/src/main/cpp/cpp-adapter.cpp +9 -0
  10. package/android/src/main/java/com/margelo/nitro/mako/HybridMako.kt +235 -0
  11. package/android/src/main/java/com/margelo/nitro/mako/MakoPackage.kt +18 -0
  12. package/android/src/main/java/com/margelo/nitro/mako/PerformanceMonitor.kt +260 -0
  13. package/ios/Bridge.h +8 -0
  14. package/ios/HybridMako.swift +245 -0
  15. package/ios/PerformanceMonitor.swift +223 -0
  16. package/lib/commonjs/index.js +17 -0
  17. package/lib/commonjs/index.js.map +1 -0
  18. package/lib/commonjs/library/client/constants.js +34 -0
  19. package/lib/commonjs/library/client/constants.js.map +1 -0
  20. package/lib/commonjs/library/client/index.js +28 -0
  21. package/lib/commonjs/library/client/index.js.map +1 -0
  22. package/lib/commonjs/library/client/mako-client.js +419 -0
  23. package/lib/commonjs/library/client/mako-client.js.map +1 -0
  24. package/lib/commonjs/library/component-handler/component-handler.js +158 -0
  25. package/lib/commonjs/library/component-handler/component-handler.js.map +1 -0
  26. package/lib/commonjs/library/component-handler/index.js +39 -0
  27. package/lib/commonjs/library/component-handler/index.js.map +1 -0
  28. package/lib/commonjs/library/component-handler/types.js +6 -0
  29. package/lib/commonjs/library/component-handler/types.js.map +1 -0
  30. package/lib/commonjs/library/component-handler/utils/index.js +26 -0
  31. package/lib/commonjs/library/component-handler/utils/index.js.map +1 -0
  32. package/lib/commonjs/library/device/device-handler.js +80 -0
  33. package/lib/commonjs/library/device/device-handler.js.map +1 -0
  34. package/lib/commonjs/library/device/index.js +9 -0
  35. package/lib/commonjs/library/device/index.js.map +1 -0
  36. package/lib/commonjs/library/device/types.js +2 -0
  37. package/lib/commonjs/library/device/types.js.map +1 -0
  38. package/lib/commonjs/library/device/utils/generate-uuid.js +14 -0
  39. package/lib/commonjs/library/device/utils/generate-uuid.js.map +1 -0
  40. package/lib/commonjs/library/index.js +156 -0
  41. package/lib/commonjs/library/index.js.map +1 -0
  42. package/lib/commonjs/library/interceptors/index.js +13 -0
  43. package/lib/commonjs/library/interceptors/index.js.map +1 -0
  44. package/lib/commonjs/library/interceptors/js-console.js +88 -0
  45. package/lib/commonjs/library/interceptors/js-console.js.map +1 -0
  46. package/lib/commonjs/library/interceptors/react-devtools.js +219 -0
  47. package/lib/commonjs/library/interceptors/react-devtools.js.map +1 -0
  48. package/lib/commonjs/library/interceptors/xhr.js +74 -0
  49. package/lib/commonjs/library/interceptors/xhr.js.map +1 -0
  50. package/lib/commonjs/library/network-handler/index.js +17 -0
  51. package/lib/commonjs/library/network-handler/index.js.map +1 -0
  52. package/lib/commonjs/library/network-handler/network-handler.js +103 -0
  53. package/lib/commonjs/library/network-handler/network-handler.js.map +1 -0
  54. package/lib/commonjs/library/network-handler/types.js +6 -0
  55. package/lib/commonjs/library/network-handler/types.js.map +1 -0
  56. package/lib/commonjs/library/network-handler/utils/generate-request-id.js +13 -0
  57. package/lib/commonjs/library/network-handler/utils/generate-request-id.js.map +1 -0
  58. package/lib/commonjs/library/network-handler/utils/index.js +41 -0
  59. package/lib/commonjs/library/network-handler/utils/index.js.map +1 -0
  60. package/lib/commonjs/library/network-handler/utils/parse-response-headers.js +26 -0
  61. package/lib/commonjs/library/network-handler/utils/parse-response-headers.js.map +1 -0
  62. package/lib/commonjs/library/network-handler/utils/read-blob-as-text.js +18 -0
  63. package/lib/commonjs/library/network-handler/utils/read-blob-as-text.js.map +1 -0
  64. package/lib/commonjs/library/network-handler/utils/response-to-string.js +35 -0
  65. package/lib/commonjs/library/network-handler/utils/response-to-string.js.map +1 -0
  66. package/lib/commonjs/library/network-handler/utils/should-ignore-url.js +13 -0
  67. package/lib/commonjs/library/network-handler/utils/should-ignore-url.js.map +1 -0
  68. package/lib/commonjs/library/performance-handler/index.js +13 -0
  69. package/lib/commonjs/library/performance-handler/index.js.map +1 -0
  70. package/lib/commonjs/library/performance-handler/performance-handler.js +94 -0
  71. package/lib/commonjs/library/performance-handler/performance-handler.js.map +1 -0
  72. package/lib/commonjs/library/performance-handler/types.js +6 -0
  73. package/lib/commonjs/library/performance-handler/types.js.map +1 -0
  74. package/lib/commonjs/library/project/index.js +15 -0
  75. package/lib/commonjs/library/project/index.js.map +1 -0
  76. package/lib/commonjs/library/project/project-handler.js +31 -0
  77. package/lib/commonjs/library/project/project-handler.js.map +1 -0
  78. package/lib/commonjs/library/types.js +2 -0
  79. package/lib/commonjs/library/types.js.map +1 -0
  80. package/lib/commonjs/package.json +1 -0
  81. package/lib/commonjs/specs/mako.nitro.js +6 -0
  82. package/lib/commonjs/specs/mako.nitro.js.map +1 -0
  83. package/lib/module/index.js +6 -0
  84. package/lib/module/index.js.map +1 -0
  85. package/lib/module/library/client/constants.js +30 -0
  86. package/lib/module/library/client/constants.js.map +1 -0
  87. package/lib/module/library/client/index.js +6 -0
  88. package/lib/module/library/client/index.js.map +1 -0
  89. package/lib/module/library/client/mako-client.js +415 -0
  90. package/lib/module/library/client/mako-client.js.map +1 -0
  91. package/lib/module/library/component-handler/component-handler.js +153 -0
  92. package/lib/module/library/component-handler/component-handler.js.map +1 -0
  93. package/lib/module/library/component-handler/index.js +6 -0
  94. package/lib/module/library/component-handler/index.js.map +1 -0
  95. package/lib/module/library/component-handler/types.js +4 -0
  96. package/lib/module/library/component-handler/types.js.map +1 -0
  97. package/lib/module/library/component-handler/utils/index.js +21 -0
  98. package/lib/module/library/component-handler/utils/index.js.map +1 -0
  99. package/lib/module/library/device/device-handler.js +75 -0
  100. package/lib/module/library/device/device-handler.js.map +1 -0
  101. package/lib/module/library/device/index.js +5 -0
  102. package/lib/module/library/device/index.js.map +1 -0
  103. package/lib/module/library/device/types.js +2 -0
  104. package/lib/module/library/device/types.js.map +1 -0
  105. package/lib/module/library/device/utils/generate-uuid.js +10 -0
  106. package/lib/module/library/device/utils/generate-uuid.js.map +1 -0
  107. package/lib/module/library/index.js +155 -0
  108. package/lib/module/library/index.js.map +1 -0
  109. package/lib/module/library/interceptors/index.js +9 -0
  110. package/lib/module/library/interceptors/index.js.map +1 -0
  111. package/lib/module/library/interceptors/js-console.js +83 -0
  112. package/lib/module/library/interceptors/js-console.js.map +1 -0
  113. package/lib/module/library/interceptors/react-devtools.js +214 -0
  114. package/lib/module/library/interceptors/react-devtools.js.map +1 -0
  115. package/lib/module/library/interceptors/xhr.js +69 -0
  116. package/lib/module/library/interceptors/xhr.js.map +1 -0
  117. package/lib/module/library/network-handler/index.js +4 -0
  118. package/lib/module/library/network-handler/index.js.map +1 -0
  119. package/lib/module/library/network-handler/network-handler.js +98 -0
  120. package/lib/module/library/network-handler/network-handler.js.map +1 -0
  121. package/lib/module/library/network-handler/types.js +4 -0
  122. package/lib/module/library/network-handler/types.js.map +1 -0
  123. package/lib/module/library/network-handler/utils/generate-request-id.js +9 -0
  124. package/lib/module/library/network-handler/utils/generate-request-id.js.map +1 -0
  125. package/lib/module/library/network-handler/utils/index.js +8 -0
  126. package/lib/module/library/network-handler/utils/index.js.map +1 -0
  127. package/lib/module/library/network-handler/utils/parse-response-headers.js +22 -0
  128. package/lib/module/library/network-handler/utils/parse-response-headers.js.map +1 -0
  129. package/lib/module/library/network-handler/utils/read-blob-as-text.js +14 -0
  130. package/lib/module/library/network-handler/utils/read-blob-as-text.js.map +1 -0
  131. package/lib/module/library/network-handler/utils/response-to-string.js +31 -0
  132. package/lib/module/library/network-handler/utils/response-to-string.js.map +1 -0
  133. package/lib/module/library/network-handler/utils/should-ignore-url.js +9 -0
  134. package/lib/module/library/network-handler/utils/should-ignore-url.js.map +1 -0
  135. package/lib/module/library/performance-handler/index.js +4 -0
  136. package/lib/module/library/performance-handler/index.js.map +1 -0
  137. package/lib/module/library/performance-handler/performance-handler.js +89 -0
  138. package/lib/module/library/performance-handler/performance-handler.js.map +1 -0
  139. package/lib/module/library/performance-handler/types.js +4 -0
  140. package/lib/module/library/performance-handler/types.js.map +1 -0
  141. package/lib/module/library/project/index.js +6 -0
  142. package/lib/module/library/project/index.js.map +1 -0
  143. package/lib/module/library/project/project-handler.js +26 -0
  144. package/lib/module/library/project/project-handler.js.map +1 -0
  145. package/lib/module/library/types.js +2 -0
  146. package/lib/module/library/types.js.map +1 -0
  147. package/lib/module/specs/mako.nitro.js +4 -0
  148. package/lib/module/specs/mako.nitro.js.map +1 -0
  149. package/lib/typescript/src/index.d.ts +4 -0
  150. package/lib/typescript/src/index.d.ts.map +1 -0
  151. package/lib/typescript/src/library/client/constants.d.ts +24 -0
  152. package/lib/typescript/src/library/client/constants.d.ts.map +1 -0
  153. package/lib/typescript/src/library/client/index.d.ts +4 -0
  154. package/lib/typescript/src/library/client/index.d.ts.map +1 -0
  155. package/lib/typescript/src/library/client/mako-client.d.ts +87 -0
  156. package/lib/typescript/src/library/client/mako-client.d.ts.map +1 -0
  157. package/lib/typescript/src/library/component-handler/component-handler.d.ts +21 -0
  158. package/lib/typescript/src/library/component-handler/component-handler.d.ts.map +1 -0
  159. package/lib/typescript/src/library/component-handler/index.d.ts +4 -0
  160. package/lib/typescript/src/library/component-handler/index.d.ts.map +1 -0
  161. package/lib/typescript/src/library/component-handler/types.d.ts +22 -0
  162. package/lib/typescript/src/library/component-handler/types.d.ts.map +1 -0
  163. package/lib/typescript/src/library/component-handler/utils/index.d.ts +13 -0
  164. package/lib/typescript/src/library/component-handler/utils/index.d.ts.map +1 -0
  165. package/lib/typescript/src/library/device/__tests__/device-handler.test.d.ts +2 -0
  166. package/lib/typescript/src/library/device/__tests__/device-handler.test.d.ts.map +1 -0
  167. package/lib/typescript/src/library/device/device-handler.d.ts +11 -0
  168. package/lib/typescript/src/library/device/device-handler.d.ts.map +1 -0
  169. package/lib/typescript/src/library/device/index.d.ts +3 -0
  170. package/lib/typescript/src/library/device/index.d.ts.map +1 -0
  171. package/lib/typescript/src/library/device/types.d.ts +8 -0
  172. package/lib/typescript/src/library/device/types.d.ts.map +1 -0
  173. package/lib/typescript/src/library/device/utils/generate-uuid.d.ts +2 -0
  174. package/lib/typescript/src/library/device/utils/generate-uuid.d.ts.map +1 -0
  175. package/lib/typescript/src/library/index.d.ts +120 -0
  176. package/lib/typescript/src/library/index.d.ts.map +1 -0
  177. package/lib/typescript/src/library/interceptors/__tests__/js-console.test.d.ts +2 -0
  178. package/lib/typescript/src/library/interceptors/__tests__/js-console.test.d.ts.map +1 -0
  179. package/lib/typescript/src/library/interceptors/__tests__/react-devtools.test.d.ts +2 -0
  180. package/lib/typescript/src/library/interceptors/__tests__/react-devtools.test.d.ts.map +1 -0
  181. package/lib/typescript/src/library/interceptors/__tests__/xhr.test.d.ts +2 -0
  182. package/lib/typescript/src/library/interceptors/__tests__/xhr.test.d.ts.map +1 -0
  183. package/lib/typescript/src/library/interceptors/index.d.ts +7 -0
  184. package/lib/typescript/src/library/interceptors/index.d.ts.map +1 -0
  185. package/lib/typescript/src/library/interceptors/js-console.d.ts +17 -0
  186. package/lib/typescript/src/library/interceptors/js-console.d.ts.map +1 -0
  187. package/lib/typescript/src/library/interceptors/react-devtools.d.ts +54 -0
  188. package/lib/typescript/src/library/interceptors/react-devtools.d.ts.map +1 -0
  189. package/lib/typescript/src/library/interceptors/xhr.d.ts +14 -0
  190. package/lib/typescript/src/library/interceptors/xhr.d.ts.map +1 -0
  191. package/lib/typescript/src/library/network-handler/__tests__/network-handler.test.d.ts +2 -0
  192. package/lib/typescript/src/library/network-handler/__tests__/network-handler.test.d.ts.map +1 -0
  193. package/lib/typescript/src/library/network-handler/index.d.ts +2 -0
  194. package/lib/typescript/src/library/network-handler/index.d.ts.map +1 -0
  195. package/lib/typescript/src/library/network-handler/network-handler.d.ts +19 -0
  196. package/lib/typescript/src/library/network-handler/network-handler.d.ts.map +1 -0
  197. package/lib/typescript/src/library/network-handler/types.d.ts +6 -0
  198. package/lib/typescript/src/library/network-handler/types.d.ts.map +1 -0
  199. package/lib/typescript/src/library/network-handler/utils/__tests__/generate-request-id.test.d.ts +2 -0
  200. package/lib/typescript/src/library/network-handler/utils/__tests__/generate-request-id.test.d.ts.map +1 -0
  201. package/lib/typescript/src/library/network-handler/utils/__tests__/parse-response-headers.test.d.ts +2 -0
  202. package/lib/typescript/src/library/network-handler/utils/__tests__/parse-response-headers.test.d.ts.map +1 -0
  203. package/lib/typescript/src/library/network-handler/utils/__tests__/read-blob-as-text.test.d.ts +2 -0
  204. package/lib/typescript/src/library/network-handler/utils/__tests__/read-blob-as-text.test.d.ts.map +1 -0
  205. package/lib/typescript/src/library/network-handler/utils/__tests__/response-to-string.test.d.ts +2 -0
  206. package/lib/typescript/src/library/network-handler/utils/__tests__/response-to-string.test.d.ts.map +1 -0
  207. package/lib/typescript/src/library/network-handler/utils/__tests__/should-ignore-url.test.d.ts +2 -0
  208. package/lib/typescript/src/library/network-handler/utils/__tests__/should-ignore-url.test.d.ts.map +1 -0
  209. package/lib/typescript/src/library/network-handler/utils/generate-request-id.d.ts +5 -0
  210. package/lib/typescript/src/library/network-handler/utils/generate-request-id.d.ts.map +1 -0
  211. package/lib/typescript/src/library/network-handler/utils/index.d.ts +6 -0
  212. package/lib/typescript/src/library/network-handler/utils/index.d.ts.map +1 -0
  213. package/lib/typescript/src/library/network-handler/utils/parse-response-headers.d.ts +5 -0
  214. package/lib/typescript/src/library/network-handler/utils/parse-response-headers.d.ts.map +1 -0
  215. package/lib/typescript/src/library/network-handler/utils/read-blob-as-text.d.ts +5 -0
  216. package/lib/typescript/src/library/network-handler/utils/read-blob-as-text.d.ts.map +1 -0
  217. package/lib/typescript/src/library/network-handler/utils/response-to-string.d.ts +5 -0
  218. package/lib/typescript/src/library/network-handler/utils/response-to-string.d.ts.map +1 -0
  219. package/lib/typescript/src/library/network-handler/utils/should-ignore-url.d.ts +5 -0
  220. package/lib/typescript/src/library/network-handler/utils/should-ignore-url.d.ts.map +1 -0
  221. package/lib/typescript/src/library/performance-handler/index.d.ts +3 -0
  222. package/lib/typescript/src/library/performance-handler/index.d.ts.map +1 -0
  223. package/lib/typescript/src/library/performance-handler/performance-handler.d.ts +27 -0
  224. package/lib/typescript/src/library/performance-handler/performance-handler.d.ts.map +1 -0
  225. package/lib/typescript/src/library/performance-handler/types.d.ts +20 -0
  226. package/lib/typescript/src/library/performance-handler/types.d.ts.map +1 -0
  227. package/lib/typescript/src/library/project/index.d.ts +4 -0
  228. package/lib/typescript/src/library/project/index.d.ts.map +1 -0
  229. package/lib/typescript/src/library/project/project-handler.d.ts +7 -0
  230. package/lib/typescript/src/library/project/project-handler.d.ts.map +1 -0
  231. package/lib/typescript/src/library/types.d.ts +41 -0
  232. package/lib/typescript/src/library/types.d.ts.map +1 -0
  233. package/lib/typescript/src/specs/mako.nitro.d.ts +100 -0
  234. package/lib/typescript/src/specs/mako.nitro.d.ts.map +1 -0
  235. package/nitro.json +24 -0
  236. package/nitrogen/generated/.gitattributes +1 -0
  237. package/nitrogen/generated/android/NitroMako+autolinking.cmake +81 -0
  238. package/nitrogen/generated/android/NitroMako+autolinking.gradle +27 -0
  239. package/nitrogen/generated/android/NitroMakoOnLoad.cpp +58 -0
  240. package/nitrogen/generated/android/NitroMakoOnLoad.hpp +34 -0
  241. package/nitrogen/generated/android/c++/JDeviceInfoResult.hpp +69 -0
  242. package/nitrogen/generated/android/c++/JFunc_void_NativeLogEntry.hpp +80 -0
  243. package/nitrogen/generated/android/c++/JFunc_void_PerformanceMetrics.hpp +77 -0
  244. package/nitrogen/generated/android/c++/JHybridNitroMakoSpec.cpp +124 -0
  245. package/nitrogen/generated/android/c++/JHybridNitroMakoSpec.hpp +74 -0
  246. package/nitrogen/generated/android/c++/JNativeLogEntry.hpp +71 -0
  247. package/nitrogen/generated/android/c++/JNativeLogLevel.hpp +64 -0
  248. package/nitrogen/generated/android/c++/JPerformanceMetrics.hpp +69 -0
  249. package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/DeviceInfoResult.kt +47 -0
  250. package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/Func_void_NativeLogEntry.kt +80 -0
  251. package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/Func_void_PerformanceMetrics.kt +80 -0
  252. package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/HybridNitroMakoSpec.kt +108 -0
  253. package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/NativeLogEntry.kt +47 -0
  254. package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/NativeLogLevel.kt +25 -0
  255. package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/NitroMakoOnLoad.kt +35 -0
  256. package/nitrogen/generated/android/kotlin/com/margelo/nitro/mako/PerformanceMetrics.kt +47 -0
  257. package/nitrogen/generated/ios/NitroMako+autolinking.rb +62 -0
  258. package/nitrogen/generated/ios/NitroMako-Swift-Cxx-Bridge.cpp +49 -0
  259. package/nitrogen/generated/ios/NitroMako-Swift-Cxx-Bridge.hpp +185 -0
  260. package/nitrogen/generated/ios/NitroMako-Swift-Cxx-Umbrella.hpp +58 -0
  261. package/nitrogen/generated/ios/NitroMakoAutolinking.mm +33 -0
  262. package/nitrogen/generated/ios/NitroMakoAutolinking.swift +26 -0
  263. package/nitrogen/generated/ios/c++/HybridNitroMakoSpecSwift.cpp +11 -0
  264. package/nitrogen/generated/ios/c++/HybridNitroMakoSpecSwift.hpp +175 -0
  265. package/nitrogen/generated/ios/swift/DeviceInfoResult.swift +44 -0
  266. package/nitrogen/generated/ios/swift/Func_void_NativeLogEntry.swift +46 -0
  267. package/nitrogen/generated/ios/swift/Func_void_PerformanceMetrics.swift +46 -0
  268. package/nitrogen/generated/ios/swift/HybridNitroMakoSpec.swift +66 -0
  269. package/nitrogen/generated/ios/swift/HybridNitroMakoSpec_cxx.swift +289 -0
  270. package/nitrogen/generated/ios/swift/NativeLogEntry.swift +44 -0
  271. package/nitrogen/generated/ios/swift/NativeLogLevel.swift +48 -0
  272. package/nitrogen/generated/ios/swift/PerformanceMetrics.swift +44 -0
  273. package/nitrogen/generated/shared/c++/DeviceInfoResult.hpp +95 -0
  274. package/nitrogen/generated/shared/c++/HybridNitroMakoSpec.cpp +32 -0
  275. package/nitrogen/generated/shared/c++/HybridNitroMakoSpec.hpp +83 -0
  276. package/nitrogen/generated/shared/c++/NativeLogEntry.hpp +97 -0
  277. package/nitrogen/generated/shared/c++/NativeLogLevel.hpp +84 -0
  278. package/nitrogen/generated/shared/c++/PerformanceMetrics.hpp +95 -0
  279. package/package.json +128 -0
  280. package/react-native.config.js +16 -0
  281. package/src/index.ts +7 -0
  282. package/src/library/client/constants.ts +36 -0
  283. package/src/library/client/index.ts +9 -0
  284. package/src/library/client/mako-client.ts +494 -0
  285. package/src/library/component-handler/component-handler.ts +162 -0
  286. package/src/library/component-handler/index.ts +3 -0
  287. package/src/library/component-handler/types.ts +24 -0
  288. package/src/library/component-handler/utils/index.ts +23 -0
  289. package/src/library/device/__tests__/device-handler.test.ts +86 -0
  290. package/src/library/device/device-handler.ts +85 -0
  291. package/src/library/device/index.ts +3 -0
  292. package/src/library/device/types.ts +7 -0
  293. package/src/library/device/utils/generate-uuid.ts +7 -0
  294. package/src/library/index.ts +183 -0
  295. package/src/library/interceptors/__tests__/js-console.test.ts +186 -0
  296. package/src/library/interceptors/__tests__/react-devtools.test.ts +848 -0
  297. package/src/library/interceptors/__tests__/xhr.test.ts +313 -0
  298. package/src/library/interceptors/index.ts +7 -0
  299. package/src/library/interceptors/js-console.ts +93 -0
  300. package/src/library/interceptors/react-devtools.ts +268 -0
  301. package/src/library/interceptors/xhr.ts +123 -0
  302. package/src/library/network-handler/__tests__/network-handler.test.ts +265 -0
  303. package/src/library/network-handler/index.ts +1 -0
  304. package/src/library/network-handler/network-handler.ts +141 -0
  305. package/src/library/network-handler/types.ts +6 -0
  306. package/src/library/network-handler/utils/__tests__/generate-request-id.test.ts +22 -0
  307. package/src/library/network-handler/utils/__tests__/parse-response-headers.test.ts +71 -0
  308. package/src/library/network-handler/utils/__tests__/read-blob-as-text.test.ts +79 -0
  309. package/src/library/network-handler/utils/__tests__/response-to-string.test.ts +85 -0
  310. package/src/library/network-handler/utils/__tests__/should-ignore-url.test.ts +45 -0
  311. package/src/library/network-handler/utils/generate-request-id.ts +6 -0
  312. package/src/library/network-handler/utils/index.ts +5 -0
  313. package/src/library/network-handler/utils/parse-response-headers.ts +20 -0
  314. package/src/library/network-handler/utils/read-blob-as-text.ts +11 -0
  315. package/src/library/network-handler/utils/response-to-string.ts +32 -0
  316. package/src/library/network-handler/utils/should-ignore-url.ts +6 -0
  317. package/src/library/performance-handler/index.ts +2 -0
  318. package/src/library/performance-handler/performance-handler.ts +104 -0
  319. package/src/library/performance-handler/types.ts +22 -0
  320. package/src/library/project/index.ts +4 -0
  321. package/src/library/project/project-handler.ts +28 -0
  322. package/src/library/types.ts +82 -0
  323. package/src/specs/mako.nitro.ts +114 -0
@@ -0,0 +1,313 @@
1
+ import { XHRInterceptor } from '../xhr'
2
+
3
+ describe('XHRInterceptor', () => {
4
+ let interceptor: XHRInterceptor
5
+
6
+ const originalXMLHttpRequest = global.XMLHttpRequest
7
+
8
+ const openMock = jest.fn()
9
+ const sendMock = jest.fn()
10
+ const setRequestHeaderMock = jest.fn()
11
+
12
+ class MockXMLHttpRequest {
13
+ static HEADERS_RECEIVED = 2
14
+ static DONE = 4
15
+
16
+ public readonly HEADERS_RECEIVED =
17
+ MockXMLHttpRequest.HEADERS_RECEIVED
18
+
19
+ public readonly DONE =
20
+ MockXMLHttpRequest.DONE
21
+
22
+ public readyState = 0
23
+ public status = 200
24
+ public timeout = 0
25
+ public response = '{"success":true}'
26
+ public responseURL = 'https://api.test.com'
27
+ public responseType = 'json'
28
+
29
+ private listeners: Record<string, Array<() => void>> = {}
30
+
31
+ open(method: string, url: string) {
32
+ openMock(method, url)
33
+ }
34
+
35
+ send(data?: unknown) {
36
+ sendMock(data)
37
+ }
38
+
39
+ setRequestHeader(header: string, value: string) {
40
+ setRequestHeaderMock(header, value)
41
+ }
42
+
43
+ addEventListener(event: string, callback: () => void) {
44
+ if (!this.listeners[event]) {
45
+ this.listeners[event] = []
46
+ }
47
+
48
+ this.listeners[event].push(callback)
49
+ }
50
+
51
+ emit(event: string) {
52
+ this.listeners[event]?.forEach(listener => listener())
53
+ }
54
+
55
+ getResponseHeader(name: string) {
56
+ if (name === 'Content-Type') {
57
+ return 'application/json; charset=utf-8'
58
+ }
59
+
60
+ if (name === 'Content-Length') {
61
+ return '128'
62
+ }
63
+
64
+ return null
65
+ }
66
+
67
+ getAllResponseHeaders() {
68
+ return 'Content-Type: application/json'
69
+ }
70
+ }
71
+
72
+ beforeEach(() => {
73
+ jest.clearAllMocks()
74
+
75
+ jest.spyOn(console, 'log').mockImplementation(() => {})
76
+ jest.spyOn(console, 'warn').mockImplementation(() => {})
77
+
78
+ global.XMLHttpRequest = MockXMLHttpRequest as any
79
+
80
+ interceptor = XHRInterceptor.getInstance()
81
+
82
+ interceptor.disable()
83
+ })
84
+
85
+ afterEach(() => {
86
+ jest.restoreAllMocks()
87
+ })
88
+
89
+ afterAll(() => {
90
+ global.XMLHttpRequest = originalXMLHttpRequest
91
+ })
92
+
93
+ it('should enable interceptor', () => {
94
+ const result = interceptor.enable({
95
+ onOpen: jest.fn(),
96
+ onSend: jest.fn(),
97
+ onRequestHeader: jest.fn(),
98
+ onHeaderReceived: jest.fn(),
99
+ onResponse: jest.fn(),
100
+ })
101
+
102
+ expect(result).toBe(true)
103
+ expect(interceptor.isEnabled()).toBe(true)
104
+ })
105
+
106
+ it('should prevent double enable', () => {
107
+ interceptor.enable({
108
+ onOpen: jest.fn(),
109
+ onSend: jest.fn(),
110
+ onRequestHeader: jest.fn(),
111
+ onHeaderReceived: jest.fn(),
112
+ onResponse: jest.fn(),
113
+ })
114
+
115
+ const result = interceptor.enable({
116
+ onOpen: jest.fn(),
117
+ onSend: jest.fn(),
118
+ onRequestHeader: jest.fn(),
119
+ onHeaderReceived: jest.fn(),
120
+ onResponse: jest.fn(),
121
+ })
122
+
123
+ expect(result).toBe(false)
124
+
125
+ expect(console.warn).toHaveBeenCalledWith(
126
+ '[Mako] Network interceptor already enabled'
127
+ )
128
+ })
129
+
130
+ it('should intercept open calls', () => {
131
+ const onOpen = jest.fn()
132
+
133
+ interceptor.enable({
134
+ onOpen,
135
+ onSend: jest.fn(),
136
+ onRequestHeader: jest.fn(),
137
+ onHeaderReceived: jest.fn(),
138
+ onResponse: jest.fn(),
139
+ })
140
+
141
+ const xhr = new XMLHttpRequest()
142
+
143
+ xhr.open('GET', 'https://api.test.com')
144
+
145
+ expect(onOpen).toHaveBeenCalledTimes(1)
146
+
147
+ expect(onOpen).toHaveBeenCalledWith(
148
+ 'GET',
149
+ 'https://api.test.com',
150
+ xhr
151
+ )
152
+
153
+ expect(openMock).toHaveBeenCalledTimes(1)
154
+
155
+ expect(openMock).toHaveBeenCalledWith(
156
+ 'GET',
157
+ 'https://api.test.com'
158
+ )
159
+ })
160
+
161
+ it('should intercept request headers', () => {
162
+ const onRequestHeader = jest.fn()
163
+
164
+ interceptor.enable({
165
+ onOpen: jest.fn(),
166
+ onSend: jest.fn(),
167
+ onRequestHeader,
168
+ onHeaderReceived: jest.fn(),
169
+ onResponse: jest.fn(),
170
+ })
171
+
172
+ const xhr = new XMLHttpRequest()
173
+
174
+ xhr.setRequestHeader('Authorization', 'Bearer token')
175
+
176
+ expect(onRequestHeader).toHaveBeenCalledTimes(1)
177
+
178
+ expect(onRequestHeader).toHaveBeenCalledWith(
179
+ 'Authorization',
180
+ 'Bearer token',
181
+ xhr
182
+ )
183
+
184
+ expect(setRequestHeaderMock).toHaveBeenCalledTimes(1)
185
+
186
+ expect(setRequestHeaderMock).toHaveBeenCalledWith(
187
+ 'Authorization',
188
+ 'Bearer token'
189
+ )
190
+ })
191
+
192
+ it('should intercept send calls', () => {
193
+ const onSend = jest.fn()
194
+
195
+ interceptor.enable({
196
+ onOpen: jest.fn(),
197
+ onSend,
198
+ onRequestHeader: jest.fn(),
199
+ onHeaderReceived: jest.fn(),
200
+ onResponse: jest.fn(),
201
+ })
202
+
203
+ const xhr = new XMLHttpRequest()
204
+
205
+ xhr.send({ hello: true })
206
+
207
+ expect(onSend).toHaveBeenCalledTimes(1)
208
+
209
+ expect(onSend).toHaveBeenCalledWith(
210
+ { hello: true },
211
+ xhr
212
+ )
213
+
214
+ expect(sendMock).toHaveBeenCalledTimes(1)
215
+
216
+ expect(sendMock).toHaveBeenCalledWith({
217
+ hello: true,
218
+ })
219
+ })
220
+
221
+ it('should intercept HEADERS_RECEIVED state', () => {
222
+ const onHeaderReceived = jest.fn()
223
+
224
+ interceptor.enable({
225
+ onOpen: jest.fn(),
226
+ onSend: jest.fn(),
227
+ onRequestHeader: jest.fn(),
228
+ onHeaderReceived,
229
+ onResponse: jest.fn(),
230
+ })
231
+
232
+ const xhr = new XMLHttpRequest() as any
233
+
234
+ xhr.send()
235
+
236
+ xhr.readyState = xhr.HEADERS_RECEIVED
237
+
238
+ xhr.emit('readystatechange')
239
+
240
+ expect(onHeaderReceived).toHaveBeenCalledTimes(1)
241
+
242
+ expect(onHeaderReceived).toHaveBeenCalledWith(
243
+ 'application/json',
244
+ 128,
245
+ 'Content-Type: application/json',
246
+ xhr
247
+ )
248
+ })
249
+
250
+ it('should intercept DONE state', () => {
251
+ const onResponse = jest.fn()
252
+
253
+ interceptor.enable({
254
+ onOpen: jest.fn(),
255
+ onSend: jest.fn(),
256
+ onRequestHeader: jest.fn(),
257
+ onHeaderReceived: jest.fn(),
258
+ onResponse,
259
+ })
260
+
261
+ const xhr = new XMLHttpRequest() as any
262
+
263
+ xhr.send()
264
+
265
+ xhr.readyState = xhr.DONE
266
+
267
+ xhr.emit('readystatechange')
268
+
269
+ expect(onResponse).toHaveBeenCalledTimes(1)
270
+
271
+ expect(onResponse).toHaveBeenCalledWith(
272
+ 200,
273
+ false,
274
+ '{"success":true}',
275
+ 'https://api.test.com',
276
+ 'json',
277
+ xhr
278
+ )
279
+ })
280
+
281
+ it('should restore original methods on disable', () => {
282
+ const originalOpen = XMLHttpRequest.prototype.open
283
+ const originalSend = XMLHttpRequest.prototype.send
284
+ const originalSetRequestHeader =
285
+ XMLHttpRequest.prototype.setRequestHeader
286
+
287
+ interceptor.enable({
288
+ onOpen: jest.fn(),
289
+ onSend: jest.fn(),
290
+ onRequestHeader: jest.fn(),
291
+ onHeaderReceived: jest.fn(),
292
+ onResponse: jest.fn(),
293
+ })
294
+
295
+ expect(XMLHttpRequest.prototype.open).not.toBe(originalOpen)
296
+
297
+ expect(XMLHttpRequest.prototype.send).not.toBe(originalSend)
298
+
299
+ expect(XMLHttpRequest.prototype.setRequestHeader).not.toBe(
300
+ originalSetRequestHeader
301
+ )
302
+
303
+ interceptor.disable()
304
+
305
+ expect(XMLHttpRequest.prototype.open).toBe(originalOpen)
306
+
307
+ expect(XMLHttpRequest.prototype.send).toBe(originalSend)
308
+
309
+ expect(XMLHttpRequest.prototype.setRequestHeader).toBe(
310
+ originalSetRequestHeader
311
+ )
312
+ })
313
+ })
@@ -0,0 +1,7 @@
1
+ import { XHRInterceptor } from './xhr'
2
+ import { ReactDevToolsInterceptor } from './react-devtools'
3
+ import { JSConsoleInterceptor } from './js-console'
4
+
5
+ export const xhrInterceptor = XHRInterceptor.getInstance()
6
+ export const reactDevToolsInterceptor = ReactDevToolsInterceptor.getInstance()
7
+ export const jsConsoleInterceptor = JSConsoleInterceptor.getInstance()
@@ -0,0 +1,93 @@
1
+ import type { LogLevel } from '../types'
2
+
3
+ export interface JSConsoleCallbacks {
4
+ onLog: (level: LogLevel, message: string, metadata?: Record<string, unknown>) => void
5
+ }
6
+
7
+ export class JSConsoleInterceptor {
8
+ private static instance: JSConsoleInterceptor | null = null
9
+
10
+ private enabled = false
11
+ private callbacks: JSConsoleCallbacks | null = null
12
+
13
+ private readonly originalLog = console.log
14
+ private readonly originalWarn = console.warn
15
+ private readonly originalError = console.error
16
+
17
+ public static getInstance(): JSConsoleInterceptor {
18
+ if (!JSConsoleInterceptor.instance) {
19
+ JSConsoleInterceptor.instance = new JSConsoleInterceptor()
20
+ }
21
+ return JSConsoleInterceptor.instance
22
+ }
23
+
24
+ public isEnabled(): boolean {
25
+ return this.enabled
26
+ }
27
+
28
+ public start(callbacks: JSConsoleCallbacks): boolean {
29
+ if (this.enabled) {
30
+ return false
31
+ }
32
+
33
+ this.callbacks = callbacks
34
+
35
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
36
+ const self = this
37
+
38
+ console.log = function (...args: unknown[]) {
39
+ self.originalLog.apply(console, args)
40
+ try {
41
+ const first = args[0]
42
+ if (typeof first === 'string' && first.startsWith('[Mako]')) return
43
+ const message = String(args[0])
44
+ const metadata = args.length > 1 ? { args: args.slice(1) } : undefined
45
+ self.callbacks?.onLog('log', message, metadata)
46
+ } catch {
47
+ // swallow forwarding errors
48
+ }
49
+ }
50
+
51
+ console.warn = function (...args: unknown[]) {
52
+ self.originalWarn.apply(console, args)
53
+ try {
54
+ const first = args[0]
55
+ if (typeof first === 'string' && first.startsWith('[Mako]')) return
56
+ const message = String(args[0])
57
+ const metadata = args.length > 1 ? { args: args.slice(1) } : undefined
58
+ self.callbacks?.onLog('warn', message, metadata)
59
+ } catch {
60
+ // swallow forwarding errors
61
+ }
62
+ }
63
+
64
+ console.error = function (...args: unknown[]) {
65
+ self.originalError.apply(console, args)
66
+ try {
67
+ const first = args[0]
68
+ if (typeof first === 'string' && first.startsWith('[Mako]')) return
69
+ const message = String(args[0])
70
+ const metadata = args.length > 1 ? { args: args.slice(1) } : undefined
71
+ self.callbacks?.onLog('error', message, metadata)
72
+ } catch {
73
+ // swallow forwarding errors
74
+ }
75
+ }
76
+
77
+ this.enabled = true
78
+ return true
79
+ }
80
+
81
+ public stop(): void {
82
+ if (!this.enabled) {
83
+ return
84
+ }
85
+
86
+ console.log = this.originalLog
87
+ console.warn = this.originalWarn
88
+ console.error = this.originalError
89
+
90
+ this.callbacks = null
91
+ this.enabled = false
92
+ }
93
+ }
@@ -0,0 +1,268 @@
1
+ /**
2
+ * React DevTools Hook Interceptor
3
+ * Captures component render events by hooking into React's DevTools global hook
4
+ */
5
+
6
+ // Fiber tags for composite components (those that execute render functions)
7
+ const COMPONENT_TAGS = new Set([
8
+ 0, // FunctionComponent
9
+ 1, // ClassComponent
10
+ 9, // ContextConsumer
11
+ 11, // ForwardRef
12
+ 14, // MemoComponent
13
+ 15, // SimpleMemoComponent
14
+ ]);
15
+
16
+ const MEMO_TAGS = new Set([14, 15]); // MemoComponent, SimpleMemoComponent
17
+
18
+ interface Fiber {
19
+ tag: number;
20
+ type: any;
21
+ elementType: any;
22
+ stateNode: any;
23
+ return: Fiber | null;
24
+ child: Fiber | null;
25
+ sibling: Fiber | null;
26
+ alternate: Fiber | null;
27
+ memoizedProps: any;
28
+ memoizedState: any;
29
+ updateQueue: any;
30
+ dependencies: any;
31
+ actualDuration?: number;
32
+ actualStartTime?: number;
33
+ ref?: any;
34
+ }
35
+
36
+ interface DevToolsHook {
37
+ supportsFiber: boolean;
38
+ inject: (renderer: any) => number;
39
+ onCommitFiberRoot?: (rendererID: number, root: any, priorityLevel?: any) => void;
40
+ onCommitFiberUnmount?: (rendererID: number, fiber: Fiber) => void;
41
+ }
42
+
43
+ export interface ComponentRenderInfo {
44
+ componentId: string;
45
+ componentName: string;
46
+ renderDuration: number;
47
+ parentId: string | null;
48
+ propsChanged: boolean;
49
+ stateChanged: boolean;
50
+ contextChanged: boolean;
51
+ isMemoized: boolean;
52
+ memoType: 'none' | 'React.memo' | 'useMemo' | 'useCallback' | 'PureComponent';
53
+ }
54
+
55
+ export interface ComponentRenderCallbacks {
56
+ onComponentRender: (info: ComponentRenderInfo) => void;
57
+ }
58
+
59
+ export class ReactDevToolsInterceptor {
60
+ private static instance: ReactDevToolsInterceptor | null = null;
61
+
62
+ private enabled = false;
63
+ private callbacks: ComponentRenderCallbacks | null = null;
64
+ private hook: DevToolsHook | null = null;
65
+ private originalOnCommitFiberRoot: DevToolsHook['onCommitFiberRoot'] | null = null;
66
+
67
+ // Fiber tracking
68
+ private fiberIdCounter = 0;
69
+ private fiberIdMap = new WeakMap<Fiber, string>();
70
+ private seenFiberIds = new Set<string>();
71
+ private currentCommitFibers = new WeakSet<Fiber>();
72
+
73
+ public static getInstance(): ReactDevToolsInterceptor {
74
+ if (!ReactDevToolsInterceptor.instance) {
75
+ ReactDevToolsInterceptor.instance = new ReactDevToolsInterceptor();
76
+ }
77
+ return ReactDevToolsInterceptor.instance;
78
+ }
79
+
80
+ public isEnabled(): boolean {
81
+ return this.enabled;
82
+ }
83
+
84
+ public enable(callbacks: ComponentRenderCallbacks): boolean {
85
+ if (this.enabled) {
86
+ console.warn('[Mako] Component inspector already enabled');
87
+ return false;
88
+ }
89
+
90
+ const hook = (global as any).__REACT_DEVTOOLS_GLOBAL_HOOK__ as DevToolsHook | undefined;
91
+ if (!hook?.supportsFiber) {
92
+ console.warn('[Mako] React DevTools hook not found or does not support Fiber');
93
+ return false;
94
+ }
95
+
96
+ this.hook = hook;
97
+ this.callbacks = callbacks;
98
+ this.originalOnCommitFiberRoot = hook.onCommitFiberRoot;
99
+
100
+ hook.onCommitFiberRoot = (rendererID, root, priorityLevel) => {
101
+ this.originalOnCommitFiberRoot?.(rendererID, root, priorityLevel);
102
+
103
+ if (this.enabled && root?.current) {
104
+ this.currentCommitFibers = new WeakSet();
105
+ this.traverseFiber(root.current);
106
+ }
107
+ };
108
+
109
+ this.enabled = true;
110
+ console.log('[Mako] Component inspector enabled (React DevTools hook)');
111
+ return true;
112
+ }
113
+
114
+ public disable(): void {
115
+ if (!this.enabled || !this.hook) return;
116
+
117
+ if (this.originalOnCommitFiberRoot) {
118
+ this.hook.onCommitFiberRoot = this.originalOnCommitFiberRoot;
119
+ }
120
+
121
+ this.callbacks = null;
122
+ this.enabled = false;
123
+ this.fiberIdMap = new WeakMap();
124
+ this.seenFiberIds = new Set();
125
+ console.log('[Mako] Component inspector disabled');
126
+ }
127
+
128
+ // --- Fiber Traversal ---
129
+
130
+ private traverseFiber(fiber: Fiber | null): void {
131
+ if (!fiber || !this.callbacks) return;
132
+
133
+ if (this.isComponentFiber(fiber) && this.didFiberRender(fiber)) {
134
+ const info = this.extractComponentInfo(fiber);
135
+ if (info) {
136
+ this.callbacks.onComponentRender(info);
137
+ }
138
+ }
139
+
140
+ this.traverseFiber(fiber.child);
141
+ this.traverseFiber(fiber.sibling);
142
+ }
143
+
144
+ private isComponentFiber(fiber: Fiber): boolean {
145
+ return COMPONENT_TAGS.has(fiber.tag);
146
+ }
147
+
148
+ // --- Render Detection ---
149
+
150
+ /**
151
+ * Checks if a fiber actually performed work during this render.
152
+ *
153
+ * Key insight: When React bails out on a component, it reuses the SAME
154
+ * memoizedProps reference. When a component re-renders, the parent creates
155
+ * NEW JSX which means a NEW props object.
156
+ *
157
+ * Additional fix: React sometimes reuses fiber objects across commits without
158
+ * proper alternate linking. We track seen fiber IDs to avoid counting these
159
+ * as false "first renders".
160
+ */
161
+ private didFiberRender(fiber: Fiber): boolean {
162
+ if (this.currentCommitFibers.has(fiber)) return false;
163
+ this.currentCommitFibers.add(fiber);
164
+
165
+ const fiberId = this.getFiberId(fiber);
166
+ const wasSeenBefore = this.seenFiberIds.has(fiberId);
167
+
168
+ // No alternate = potential first mount OR React quirk
169
+ if (!fiber.alternate) {
170
+ if (wasSeenBefore) return false; // Already seen = not real mount
171
+ this.seenFiberIds.add(fiberId);
172
+ return true;
173
+ }
174
+
175
+ // Re-render: check if props reference changed (composite components only check props)
176
+ const didRender = fiber.memoizedProps !== fiber.alternate.memoizedProps;
177
+ if (didRender) this.seenFiberIds.add(fiberId);
178
+ return didRender;
179
+ }
180
+
181
+ // --- Component Info Extraction ---
182
+
183
+ private extractComponentInfo(fiber: Fiber): ComponentRenderInfo | null {
184
+ const componentName = this.getComponentName(fiber);
185
+ if (!componentName || componentName === 'Anonymous') return null;
186
+
187
+ const alternate = fiber.alternate;
188
+
189
+ return {
190
+ componentId: this.getFiberId(fiber),
191
+ componentName,
192
+ renderDuration: fiber.actualDuration ?? 0,
193
+ parentId: this.getParentFiberId(fiber),
194
+ propsChanged: alternate ? fiber.memoizedProps !== alternate.memoizedProps : true,
195
+ stateChanged: alternate ? fiber.memoizedState !== alternate.memoizedState : true,
196
+ contextChanged: alternate ? fiber.dependencies !== alternate.dependencies : false,
197
+ ...this.detectMemoization(fiber),
198
+ };
199
+ }
200
+
201
+ private detectMemoization(fiber: Fiber): {
202
+ isMemoized: boolean;
203
+ memoType: 'none' | 'React.memo' | 'useMemo' | 'useCallback' | 'PureComponent';
204
+ } {
205
+ if (MEMO_TAGS.has(fiber.tag)) {
206
+ return { isMemoized: true, memoType: 'React.memo' };
207
+ }
208
+ if (fiber.tag === 1 && fiber.type?.prototype?.isPureReactComponent) {
209
+ return { isMemoized: true, memoType: 'PureComponent' };
210
+ }
211
+ return { isMemoized: false, memoType: 'none' };
212
+ }
213
+
214
+ // --- Fiber Identity ---
215
+
216
+ private getFiberId(fiber: Fiber): string {
217
+ let id = this.fiberIdMap.get(fiber);
218
+ if (id) return id;
219
+
220
+ // Reuse ID from alternate (same component across renders)
221
+ if (fiber.alternate) {
222
+ id = this.fiberIdMap.get(fiber.alternate);
223
+ if (id) {
224
+ this.fiberIdMap.set(fiber, id);
225
+ return id;
226
+ }
227
+ }
228
+
229
+ id = `fiber-${this.fiberIdCounter++}`;
230
+ this.fiberIdMap.set(fiber, id);
231
+ return id;
232
+ }
233
+
234
+ private getParentFiberId(fiber: Fiber): string | null {
235
+ let parent = fiber.return;
236
+
237
+ while (parent) {
238
+ if (this.isComponentFiber(parent)) {
239
+ const parentName = this.getComponentName(parent);
240
+ if (parentName && parentName !== 'Anonymous') {
241
+ return this.getFiberId(parent);
242
+ }
243
+ }
244
+ parent = parent.return;
245
+ }
246
+
247
+ return null;
248
+ }
249
+
250
+ private getComponentName(fiber: Fiber): string | null {
251
+ const type = fiber.type || fiber.elementType;
252
+
253
+ if (typeof type === 'string') return type;
254
+
255
+ if (typeof type === 'function') {
256
+ return type.displayName || type.name || 'Anonymous';
257
+ }
258
+
259
+ // Handle React.memo wrapped components
260
+ if (type?.$$typeof && type.type) {
261
+ return this.getComponentName({ ...fiber, type: type.type });
262
+ }
263
+
264
+ return null;
265
+ }
266
+ }
267
+
268
+ export const reactDevToolsInterceptor = ReactDevToolsInterceptor.getInstance();