catalyst-core 0.3.0-beta.5 → 0.3.0-canary.2

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 (316) hide show
  1. package/changelog.md +185 -71
  2. package/dist/errors/generateDocs.js +100 -0
  3. package/dist/errors/index.js +243 -0
  4. package/dist/errors/registry.js +483 -0
  5. package/dist/errors-index.json +506 -0
  6. package/dist/globals.d.ts +62 -0
  7. package/dist/index.d.ts +5 -0
  8. package/dist/index.jsx +5 -8
  9. package/dist/logger.js +1 -1
  10. package/dist/native/androidProject/app/build.gradle.kts +142 -7
  11. package/dist/native/androidProject/app/src/main/AndroidManifest.xml +4 -0
  12. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/NativeBridge.kt +2 -2
  13. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/camera/BarcodeDetector.kt +3 -0
  14. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/camera/CameraSessionManager.kt +3 -0
  15. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/FrameworkServerUtils.kt +43 -8
  16. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/BridgeUtilsTest.kt +181 -1
  17. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/CameraUtilsTest.kt +156 -236
  18. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/FileSizeRouterUtilsTest.kt +471 -0
  19. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/FileUtilsTest.kt +222 -226
  20. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/FrameworkServerUtilsTest.kt +300 -0
  21. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/IntentUtilsTest.kt +244 -0
  22. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/MetricsMonitorTest.kt +359 -0
  23. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/NativeBridgeTest.kt +108 -63
  24. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/NotificationUtilsTest.kt +329 -385
  25. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/OfflineCacheServiceTest.kt +302 -0
  26. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/PerfEventBufferTest.kt +133 -0
  27. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/UtilsKtTest.kt +152 -0
  28. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/WebCacheManagerTest.kt +145 -324
  29. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/BarcodeDetectorTest.kt +132 -0
  30. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/HoldControllerTest.kt +155 -0
  31. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/TorchControllerTest.kt +150 -0
  32. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/VideoStreamStateMachineTest.kt +120 -0
  33. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/VideoStreamStateTest.kt +62 -0
  34. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/ViewfinderMapperTest.kt +143 -0
  35. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/ZoomControllerTest.kt +421 -0
  36. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/design/DesignTokensTest.kt +207 -0
  37. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/plugins/PluginBridgeTest.kt +368 -0
  38. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/security/FridaDetectorTest.kt +193 -0
  39. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/security/SecurityCheckManagerTest.kt +260 -0
  40. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/security/SecurityCheckSchedulerTest.kt +166 -0
  41. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/DeviceInfoUtilsTest.kt +167 -0
  42. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/DownloadUtilsTest.kt +197 -0
  43. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/NetworkMonitorTest.kt +271 -0
  44. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/PushNotificationUtilsTest.kt +119 -0
  45. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/SafeAreaUtilsTest.kt +108 -0
  46. package/dist/native/androidProject/build.gradle.kts +1 -0
  47. package/dist/native/androidProject/gradle/libs.versions.toml +26 -0
  48. package/dist/native/androidProject/settings.gradle.kts +11 -8
  49. package/dist/native/androidSetup.js +2 -2
  50. package/dist/native/bridge/WebBridge.d.ts +98 -0
  51. package/dist/native/bridge/WebBridge.js +40 -6
  52. package/dist/native/bridge/constants/NativeInterfaces.d.ts +391 -0
  53. package/dist/native/bridge/errors.d.ts +67 -0
  54. package/dist/native/bridge/errors.js +66 -151
  55. package/dist/native/bridge/hooks/index.d.ts +13 -0
  56. package/dist/native/bridge/hooks/index.js +0 -6
  57. package/dist/native/bridge/hooks/useAI.d.ts +1 -0
  58. package/dist/native/bridge/hooks/useAI.js +3 -1
  59. package/dist/native/bridge/hooks/useCamera.d.ts +86 -0
  60. package/dist/native/bridge/hooks/useCamera.js +35 -6
  61. package/dist/native/bridge/hooks/useDataProtection.d.ts +17 -0
  62. package/dist/native/bridge/hooks/useDeviceInfo.d.ts +34 -0
  63. package/dist/native/bridge/hooks/useDeviceInfo.js +5 -0
  64. package/dist/native/bridge/hooks/useFilePicker.d.ts +53 -0
  65. package/dist/native/bridge/hooks/useFilePicker.js +13 -0
  66. package/dist/native/bridge/hooks/useGoogleSignIn.d.ts +12 -0
  67. package/dist/native/bridge/hooks/useHapticFeedback.d.ts +76 -0
  68. package/dist/native/bridge/hooks/useHapticFeedback.js +6 -1
  69. package/dist/native/bridge/hooks/useIntent.d.ts +33 -0
  70. package/dist/native/bridge/hooks/useIntent.js +2 -0
  71. package/dist/native/bridge/hooks/useNativeTransition.d.ts +53 -0
  72. package/dist/native/bridge/hooks/useNativeTransition.js +12 -5
  73. package/dist/native/bridge/hooks/useNetworkStatus.d.ts +22 -0
  74. package/dist/native/bridge/hooks/useNetworkStatus.js +7 -0
  75. package/dist/native/bridge/hooks/useNotification.d.ts +83 -0
  76. package/dist/native/bridge/hooks/useNotification.js +81 -34
  77. package/dist/native/bridge/hooks/useSafeArea.d.ts +12 -0
  78. package/dist/native/bridge/hooks/useSafeArea.js +8 -0
  79. package/dist/native/bridge/hooks/useVideoStream.d.ts +67 -0
  80. package/dist/native/bridge/hooks/useVideoStream.js +38 -52
  81. package/dist/native/bridge/hooks/utils.d.ts +4 -0
  82. package/dist/native/bridge/hooks.d.ts +1 -0
  83. package/dist/native/bridge/perf/collectors/ApiCollector.d.ts +30 -0
  84. package/dist/native/bridge/perf/collectors/ApiCollector.js +4 -0
  85. package/dist/native/bridge/perf/collectors/CacheCollector.d.ts +43 -0
  86. package/dist/native/bridge/perf/collectors/CacheCollector.js +4 -0
  87. package/dist/native/bridge/perf/collectors/HookCollector.d.ts +37 -0
  88. package/dist/native/bridge/perf/collectors/HookCollector.js +4 -0
  89. package/dist/native/bridge/perf/collectors/InsightsCollector.d.ts +103 -0
  90. package/dist/native/bridge/perf/collectors/InsightsCollector.js +4 -0
  91. package/dist/native/bridge/perf/collectors/InteractionCollector.d.ts +53 -0
  92. package/dist/native/bridge/perf/collectors/InteractionCollector.js +4 -0
  93. package/dist/native/bridge/perf/collectors/KeyboardCollector.d.ts +30 -0
  94. package/dist/native/bridge/perf/collectors/KeyboardCollector.js +4 -0
  95. package/dist/native/bridge/perf/collectors/NavigationCollector.d.ts +37 -0
  96. package/dist/native/bridge/perf/collectors/NavigationCollector.js +4 -0
  97. package/dist/native/bridge/perf/collectors/NetworkTimingCollector.d.ts +30 -0
  98. package/dist/native/bridge/perf/collectors/NetworkTimingCollector.js +4 -0
  99. package/dist/native/bridge/perf/collectors/RenderCollector.d.ts +47 -0
  100. package/dist/native/bridge/perf/collectors/RenderCollector.js +8 -0
  101. package/dist/native/bridge/perf/collectors/ScrollCollector.d.ts +29 -0
  102. package/dist/native/bridge/perf/collectors/ScrollCollector.js +4 -0
  103. package/dist/native/bridge/perf/collectors/ThreadCollector.d.ts +31 -0
  104. package/dist/native/bridge/perf/collectors/ThreadCollector.js +4 -0
  105. package/dist/native/bridge/perf/core/constants.d.ts +76 -0
  106. package/dist/native/bridge/perf/core/measure.d.ts +39 -0
  107. package/dist/native/bridge/perf/core/measure.js +4 -0
  108. package/dist/native/bridge/perf/core/session.d.ts +49 -0
  109. package/dist/native/bridge/perf/core/session.js +4 -0
  110. package/dist/native/bridge/perf/core/store.d.ts +37 -0
  111. package/dist/native/bridge/perf/core/store.js +4 -0
  112. package/dist/native/bridge/perf/core/summary.d.ts +60 -0
  113. package/dist/native/bridge/perf/core/traceExport.d.ts +10 -0
  114. package/dist/native/bridge/perf/core/waterfalls.d.ts +2 -0
  115. package/dist/native/bridge/perf/index.d.ts +63 -0
  116. package/dist/native/bridge/perf/index.js +4 -0
  117. package/dist/native/bridge/safeArea.d.ts +11 -0
  118. package/dist/native/bridge/safeArea.js +2 -0
  119. package/dist/native/bridge/useBaseHook.d.ts +137 -0
  120. package/dist/native/bridge/useBaseHook.js +34 -4
  121. package/dist/native/bridge/utils/CameraUtils.d.ts +94 -0
  122. package/dist/native/bridge/utils/CameraUtils.js +4 -0
  123. package/dist/native/bridge/utils/FileObjectConverter.d.ts +36 -0
  124. package/dist/native/bridge/utils/NativeBridge.d.ts +270 -0
  125. package/dist/native/bridge/utils/NativeBridge.js +10 -0
  126. package/dist/native/buildAndroid/index.js +1 -1
  127. package/dist/native/buildAppAndroid.js +9 -0
  128. package/dist/native/buildAppIos.js +16 -1
  129. package/dist/native/buildErrorFormat.js +57 -0
  130. package/dist/native/buildIos/config.js +15 -1
  131. package/dist/native/buildIos/index.js +1 -1
  132. package/dist/native/buildIos/plugins.js +10 -1
  133. package/dist/native/iosnativeWebView/CoreLogic/Package.swift +36 -0
  134. package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Camera/VideoStreamState.swift +1 -1
  135. package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Camera/VideoStreamStateMachine.swift +6 -4
  136. package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/BootTimingUtility.swift +3 -3
  137. package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/FrameworkServerUtils.swift +14 -9
  138. package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/NetworkMonitor.swift +11 -9
  139. package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/NotificationHandlerProvider.swift +1 -1
  140. package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/URLWhitelistManager.swift +7 -7
  141. package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/AnyCodableTests.swift +154 -0
  142. package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/BootTimingUtilityTests.swift +23 -5
  143. package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/CatalystConstantsTests.swift +192 -0
  144. package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/ConfigMappingTests.swift +1 -1
  145. package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/FrameworkServerUtilsErrorPathTests.swift +106 -0
  146. package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/FrameworkServerUtilsLoopbackTests.swift +243 -0
  147. package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/FrameworkServerUtilsTests.swift +1 -1
  148. package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/NetworkMonitorTests.swift +119 -0
  149. package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/NotificationHandlerProviderTests.swift +59 -0
  150. package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/NotificationHandlerTests.swift +1 -1
  151. package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/URLWhitelistManagerTests.swift +1 -1
  152. package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/VideoStreamStateMachineTests.swift +171 -0
  153. package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/VideoStreamStateTests.swift +91 -0
  154. package/dist/native/iosnativeWebView/Package.swift +10 -9
  155. package/dist/native/iosnativeWebView/Sources/CatalystNotifications/LocalNotificationHandler.swift +7 -2
  156. package/dist/native/iosnativeWebView/Sources/CatalystNotifications/NotificationManager.swift +1 -2
  157. package/dist/native/iosnativeWebView/Sources/CatalystNotifications/PushNotificationHandler.swift +5 -4
  158. package/dist/native/iosnativeWebView/Sources/Core/Camera/CameraSessionManager.swift +1 -0
  159. package/dist/native/iosnativeWebView/Sources/Core/Camera/HoldController.swift +1 -0
  160. package/dist/native/iosnativeWebView/Sources/Core/Camera/NativeCameraManager.swift +6 -5
  161. package/dist/native/iosnativeWebView/Sources/Core/Camera/ZoomController.swift +1 -0
  162. package/dist/native/iosnativeWebView/Sources/Core/Plugins/PluginBridge.swift +1 -0
  163. package/dist/native/iosnativeWebView/Sources/Core/Utils/CacheManager.swift +31 -30
  164. package/dist/native/iosnativeWebView/Sources/Core/Utils/CameraTransportUtils.swift +2 -1
  165. package/dist/native/iosnativeWebView/Sources/Core/Utils/DeviceInfoUtils.swift +1 -1
  166. package/dist/native/iosnativeWebView/Sources/Core/Utils/FilePickerHandler.swift +22 -19
  167. package/dist/native/iosnativeWebView/Sources/Core/Utils/ImageHandler.swift +40 -39
  168. package/dist/native/iosnativeWebView/Sources/Core/Utils/PerfEventBuffer.swift +1 -0
  169. package/dist/native/iosnativeWebView/Sources/Core/Utils/ResourceURLProtocol.swift +15 -15
  170. package/dist/native/iosnativeWebView/Sources/Core/Utils/WebKitConfig.swift +4 -3
  171. package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeCommandHandler.swift +6 -1
  172. package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeDelegateHandler.swift +1 -0
  173. package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeFileHandler.swift +2 -1
  174. package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeJavaScriptInterface.swift +2 -1
  175. package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeMessageValidator.swift +3 -5
  176. package/dist/native/iosnativeWebView/Sources/Core/WebView/NativeBridge.swift +20 -13
  177. package/dist/native/iosnativeWebView/Sources/Core/WebView/SplashView.swift +6 -5
  178. package/dist/native/iosnativeWebView/Sources/Core/WebView/SplashViewModel.swift +14 -13
  179. package/dist/native/iosnativeWebView/Sources/Core/WebView/TransitionManager.swift +3 -3
  180. package/dist/native/iosnativeWebView/Sources/Core/WebView/WebView.swift +9 -8
  181. package/dist/native/iosnativeWebView/Sources/Core/WebView/WebViewModel.swift +7 -6
  182. package/dist/native/iosnativeWebView/Sources/Core/WebView/WebViewNavigationDelegate.swift +24 -25
  183. package/dist/native/iosnativeWebView/iosnativeWebView/AppDelegate.swift +6 -1
  184. package/dist/native/iosnativeWebView/iosnativeWebView/ContentView.swift +1 -0
  185. package/dist/native/iosnativeWebView/iosnativeWebView/iosnativeWebViewApp.swift +4 -0
  186. package/dist/native/iosnativeWebView/iosnativeWebView.xcodeproj/project.pbxproj +2 -22
  187. package/dist/native/iosnativeWebView/iosnativeWebViewTests/BridgeMessageValidatorTests.swift +1 -0
  188. package/dist/native/iosnativeWebView/iosnativeWebViewTests/CacheManagerTests.swift +1 -0
  189. package/dist/native/iosnativeWebView/iosnativeWebViewTests/FilePickerHandlerTests.swift +2 -1
  190. package/dist/native/iosnativeWebView/iosnativeWebViewTests/NativeBridgeTests.swift +15 -9
  191. package/dist/native/iosnativeWebView/iosnativeWebViewTests/WebViewTests.swift +1 -0
  192. package/dist/native/setupEmulatorIos.js +2 -2
  193. package/dist/native/terminalProgress.js +17 -17
  194. package/dist/router/ClientRouter.d.ts +8 -0
  195. package/dist/router/ClientRouter.js +13 -11
  196. package/dist/router/ServerRouter.d.ts +13 -0
  197. package/dist/router/ServerRouter.js +19 -7
  198. package/dist/scripts/build.js +14 -2
  199. package/dist/scripts/loadEnvironmentVariables.js +3 -2
  200. package/dist/scripts/plugins.js +1 -1
  201. package/dist/scripts/preServerInit.js +49 -3
  202. package/dist/scripts/preflight.js +111 -0
  203. package/dist/scripts/scriptUtils.js +46 -1
  204. package/dist/scripts/serve.js +7 -3
  205. package/dist/scripts/start.js +8 -3
  206. package/dist/server/expressServer.d.ts +1 -0
  207. package/dist/server/expressServer.js +247 -271
  208. package/dist/server/manifestCache.d.ts +2 -0
  209. package/dist/server/manifestCache.js +25 -33
  210. package/dist/server/renderer/ChunkExtractor.d.ts +44 -0
  211. package/dist/server/renderer/ChunkExtractor.js +113 -125
  212. package/dist/server/renderer/document/Body.d.ts +21 -0
  213. package/dist/server/renderer/document/Body.jsx +45 -45
  214. package/dist/server/renderer/document/FastRefresh.d.ts +3 -0
  215. package/dist/server/renderer/document/FastRefresh.jsx +7 -13
  216. package/dist/server/renderer/document/Head.d.ts +20 -0
  217. package/dist/server/renderer/document/Head.jsx +32 -32
  218. package/dist/server/renderer/document/index.d.ts +2 -0
  219. package/dist/server/renderer/document/index.jsx +2 -2
  220. package/dist/server/renderer/extract.d.ts +67 -0
  221. package/dist/server/renderer/extract.js +92 -89
  222. package/dist/server/renderer/handler.d.ts +2 -0
  223. package/dist/server/renderer/handler.jsx +401 -404
  224. package/dist/server/renderer/index.d.ts +2 -0
  225. package/dist/server/renderer/index.js +5 -8
  226. package/dist/server/renderer/render.d.ts +35 -0
  227. package/dist/server/renderer/render.js +25 -32
  228. package/dist/server/utils/botDetectionMiddleware.d.ts +1 -0
  229. package/dist/server/utils/botDetectionMiddleware.js +33 -23
  230. package/dist/server/utils/cjsRequire.d.ts +8 -0
  231. package/dist/server/utils/cjsRequire.js +2 -2
  232. package/dist/server/utils/userAgentUtil.d.ts +7 -0
  233. package/dist/server/utils/userAgentUtil.js +68 -71
  234. package/dist/server/utils/validator.d.ts +31 -0
  235. package/dist/server/utils/validator.js +133 -158
  236. package/dist/vite/inject-cache-key-plugin.js +3 -27
  237. package/dist/vite/moduleAliases.js +36 -0
  238. package/dist/vite/node-loader.mjs +2 -29
  239. package/dist/vite/resolveDevServerConfig.js +4 -1
  240. package/dist/vite/vite.config.js +2 -29
  241. package/dist/web-router/components/MetaTag.d.ts +4 -0
  242. package/dist/web-router/components/MetaTag.jsx +26 -28
  243. package/dist/web-router/components/MetaTag.test.jsx +100 -0
  244. package/dist/web-router/components/RouterDataProvider.d.ts +96 -0
  245. package/dist/web-router/components/RouterDataProvider.jsx +260 -259
  246. package/dist/web-router/components/RouterDataProvider.server.test.jsx +98 -0
  247. package/dist/web-router/components/RouterDataProvider.test.jsx +310 -0
  248. package/dist/web-router/components/Split.d.ts +74 -0
  249. package/dist/web-router/components/Split.jsx +147 -156
  250. package/dist/web-router/components/Split.server.test.jsx +52 -0
  251. package/dist/web-router/components/Split.test.jsx +167 -0
  252. package/dist/web-router/components/SplitInview.d.ts +22 -0
  253. package/dist/web-router/components/SplitInview.jsx +78 -89
  254. package/dist/web-router/components/SplitInview.test.jsx +112 -0
  255. package/dist/web-router/components/SsrRequestContext.d.ts +20 -0
  256. package/dist/web-router/components/SsrRequestContext.jsx +17 -7
  257. package/dist/web-router/components/SsrRequestContext.test.jsx +53 -0
  258. package/dist/web-router/context.d.ts +15 -0
  259. package/dist/web-router/context.jsx +5 -5
  260. package/dist/web-router/context.test.jsx +10 -0
  261. package/dist/web-router/utils/metaDataUtils.d.ts +24 -0
  262. package/dist/web-router/utils/metaDataUtils.jsx +86 -86
  263. package/dist/web-router/utils/metaDataUtils.test.jsx +188 -0
  264. package/dist/web-router/vitest.setup.js +12 -0
  265. package/mcp_v2/knowledge-base.json +115 -17
  266. package/mcp_v2/mcp.js +141 -3
  267. package/mcp_v2/package-lock.json +2031 -0
  268. package/mcp_v2/package.json +13 -2
  269. package/mcp_v2/scripts/copyErrorsIndex.cjs +34 -0
  270. package/mcp_v2/test/errors.test.ts +123 -0
  271. package/mcp_v2/test/github.test.ts +177 -0
  272. package/mcp_v2/tools/errors.d.ts +20 -0
  273. package/mcp_v2/tools/errors.js +63 -0
  274. package/mcp_v2/tools/github.d.ts +41 -0
  275. package/mcp_v2/tools/github.js +231 -0
  276. package/mcp_v2/vitest.config.mjs +22 -0
  277. package/package.json +60 -11
  278. package/test/errors/docsDrift.test.ts +113 -0
  279. package/test/errors/index.test.ts +200 -0
  280. package/test/errors/registry.test.ts +108 -0
  281. package/test/scripts/preflight.test.ts +118 -0
  282. package/test/server/ChunkExtractor.test.ts +97 -0
  283. package/test/server/extract.test.ts +128 -0
  284. package/test/server/fixtures/template/server/document.jsx +19 -0
  285. package/test/server/fixtures/template/server/index.js +10 -0
  286. package/test/server/fixtures/template/src/js/containers/App/index.jsx +33 -0
  287. package/test/server/fixtures/template/src/js/routes/index.jsx +72 -0
  288. package/test/server/fixtures/template/src/js/routes/utils.jsx +39 -0
  289. package/test/server/fixtures/template/src/js/store/index.js +19 -0
  290. package/test/server/handler.assets.test.ts +330 -0
  291. package/test/server/handler.test.ts +208 -0
  292. package/test/server/manifestCache.test.ts +71 -0
  293. package/test/server/render.test.ts +71 -0
  294. package/test/server/scriptUtils.test.ts +103 -0
  295. package/test/server/userAgentUtil.test.ts +48 -0
  296. package/test/server/validator.test.ts +225 -0
  297. package/test/vite/resolveDevServerConfig.test.js +4 -1
  298. package/tsconfig.test.json +23 -0
  299. package/vitest.config.ts +93 -0
  300. package/dist/caching.js +0 -1
  301. package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/DeviceInfoUtilsTest.kt +0 -187
  302. package/dist/native/bridge/standardizedHooks.js +0 -611
  303. package/dist/router.js +0 -1
  304. package/dist/scripts/validator.js +0 -149
  305. package/dist/web-router/hooks.jsx +0 -72
  306. package/dist/web-router/types/components/MetaTag.d.ts +0 -2
  307. package/dist/web-router/types/components/RouterDataProvider.d.ts +0 -95
  308. package/dist/web-router/types/context.d.ts +0 -14
  309. package/dist/web-router/types/hooks.d.ts +0 -1
  310. package/dist/web-router/types/index.d.ts +0 -3
  311. package/dist/web-router/types/utils/metaDataUtils.d.ts +0 -40
  312. /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Constants/CatalystConstants.swift +0 -0
  313. /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Constants/ConfigConstants.swift +0 -0
  314. /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Notifications/NotificationModels.swift +0 -0
  315. /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Protocols/NotificationHandlerProtocol.swift +0 -0
  316. /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/NullNotificationHandler.swift +0 -0
@@ -1,119 +1,119 @@
1
- import React from "react"
1
+ import React from "react";
2
2
  /**
3
3
  * Merges multiple lists of head elements, ensuring that later lists override earlier ones in case of duplicates.
4
4
  * Handles all types of head elements, including title, meta, link, etc.
5
5
  *
6
- * @param {...Array<JSX.Element>} lists - Multiple lists of JSX head elements, where the first argument is the parent and the rest are children in order.
7
- * @returns {Array<JSX.Element>} - The combined list with later lists overriding duplicates from earlier ones.
6
+ * @param lists - Multiple lists of JSX head elements, where the first argument is the parent and the rest are children in order.
7
+ * @returns The combined list with later lists overriding duplicates from earlier ones.
8
8
  */
9
9
  export function mergeHeadElements(...lists) {
10
- const elementMap = new Map()
10
+ const elementMap = new Map();
11
11
 
12
- /**
13
- * Function to get a unique key for a head element based on its type and attributes.
14
- * @param {JSX.Element} element - The head element from which to derive a key.
15
- * @returns {string} - A unique key representing the element.
16
- */
17
- const getKey = (element) => {
18
- const { type, props } = element
19
-
20
- if (type === "title") {
21
- return "title" // Only one title should exist in a document
22
- }
12
+ /**
13
+ * Function to get a unique key for a head element based on its type and attributes.
14
+ * @param element - The head element from which to derive a key.
15
+ * @returns A unique key representing the element.
16
+ */
17
+ const getKey = element => {
18
+ const {
19
+ type,
20
+ props
21
+ } = element;
22
+ if (type === "title") {
23
+ return "title"; // Only one title should exist in a document
24
+ }
23
25
 
24
- // For meta tags, use 'name' or 'property' as unique identifiers
25
- if (type === "meta") {
26
- if (props.charset) {
27
- return "charset" // Charset should be unique in a document
28
- }
29
- return props.name || props.property || props["http-equiv"] || props.httpEquiv || ""
30
- }
26
+ // For meta tags, use 'name' or 'property' as unique identifiers
27
+ if (type === "meta") {
28
+ if (props.charset) {
29
+ return "charset"; // Charset should be unique in a document
30
+ }
31
+ return props.name || props.property || props["http-equiv"] || props.httpEquiv || "";
32
+ }
31
33
 
32
- // For link tags, use 'rel' as a unique identifier
33
- // if (type === "link") {
34
- // return props.rel || "";
35
- // }
34
+ // For link tags, use 'rel' as a unique identifier
35
+ // if (type === "link") {
36
+ // return props.rel || "";
37
+ // }
36
38
 
37
- // Create a unique representation for other types of elements
38
- return `${type}:${Object.entries(props)
39
- .map(([key, value]) => `${key}=${value}`)
40
- .join(",")}`
41
- }
39
+ // Create a unique representation for other types of elements
40
+ return `${type}:${Object.entries(props).map(([key, value]) => `${key}=${value}`).join(",")}`;
41
+ };
42
42
 
43
- // Loop through all the lists, ensuring later lists override earlier ones
44
- lists?.forEach((list) => {
45
- list?.forEach((element) => {
46
- const key = getKey(element)
47
- if (key) {
48
- elementMap.set(key, element) // Overwrite earlier elements with later ones
49
- }
50
- })
51
- })
43
+ // Loop through all the lists, ensuring later lists override earlier ones
44
+ lists?.forEach(list => {
45
+ list?.forEach(element => {
46
+ const key = getKey(element);
47
+ if (key) {
48
+ elementMap.set(key, element); // Overwrite earlier elements with later ones
49
+ }
50
+ });
51
+ });
52
52
 
53
- // Return the combined list of head elements
54
- return Array.from(elementMap.values())
53
+ // Return the combined list of head elements
54
+ return Array.from(elementMap.values());
55
55
  }
56
56
 
57
57
  /**
58
58
  * Deletes all elements in the head with a specific data attribute.
59
59
  *
60
- * @param {string} attributeName - The name of the data attribute to search for.
61
- * @param {string} [attributeValue] - The specific value of the data attribute to match (optional).
60
+ * @param attributeName - The name of the data attribute to search for.
61
+ * @param attributeValue - The specific value of the data attribute to match (optional).
62
62
  */
63
63
  export function deleteHeadTagsByDataAttribute(attributeName, attributeValue) {
64
- const head = document.head
65
- const tagsToDelete = []
64
+ const head = document.head;
65
+ const tagsToDelete = [];
66
66
 
67
- // Iterate over all children in the head section
68
- Array.from(head.children).forEach((element) => {
69
- const hasAttribute = element.hasAttribute(`data-${attributeName}`)
67
+ // Iterate over all children in the head section
68
+ Array.from(head.children).forEach(element => {
69
+ const hasAttribute = element.hasAttribute(`data-${attributeName}`);
70
70
 
71
- // If a specific attribute value is provided, check for it
72
- if (attributeValue && hasAttribute) {
73
- const matchesValue = element.getAttribute(`data-${attributeName}`) === attributeValue
74
- if (matchesValue) {
75
- tagsToDelete.push(element)
76
- }
77
- } else if (hasAttribute) {
78
- // If no specific value, just check if the attribute is present
79
- tagsToDelete.push(element)
80
- }
81
- })
71
+ // If a specific attribute value is provided, check for it
72
+ if (attributeValue && hasAttribute) {
73
+ const matchesValue = element.getAttribute(`data-${attributeName}`) === attributeValue;
74
+ if (matchesValue) {
75
+ tagsToDelete.push(element);
76
+ }
77
+ } else if (hasAttribute) {
78
+ // If no specific value, just check if the attribute is present
79
+ tagsToDelete.push(element);
80
+ }
81
+ });
82
82
 
83
- // Delete all the tags that matched the attribute condition
84
- tagsToDelete.forEach((tag) => {
85
- head.removeChild(tag)
86
- })
83
+ // Delete all the tags that matched the attribute condition
84
+ tagsToDelete.forEach(tag => {
85
+ head.removeChild(tag);
86
+ });
87
87
  }
88
88
 
89
89
  /**
90
90
  * Returns resolved array of meta data elements.
91
91
  *
92
92
  *
93
- * @param {Array<Match>} matchedRoutes - Array of all matches.
94
- * @param {Object} routeData - Data returned from Router.
95
- * @returns {Array<JSX.Element>} - List of all meta tags for the matched location.
93
+ * @param matchedRoutes - Array of all matches.
94
+ * @param routeData - Data returned from Router.
95
+ * @returns List of all meta tags for the matched location.
96
96
  */
97
97
 
98
98
  export function getMetaData(matchedRoutes, routeData) {
99
- let allTags = []
100
- try {
101
- matchedRoutes?.forEach?.((match) => {
102
- const setMetaData = match?.route?.component?.setMetaData
103
- if (setMetaData) {
104
- let tags = setMetaData(routeData)
105
- allTags = [...allTags, tags]
106
- }
107
- })
108
- if (Array.isArray(allTags) && allTags.length > 0) {
109
- let mergedTags = mergeHeadElements(...allTags)
110
- allTags = mergedTags.map((el, index) =>
111
- React.cloneElement(el, { "data-catalyst": true, key: index })
112
- )
113
- }
114
- } catch (er) {
115
- console.log("meta tags error is ===>", er)
99
+ let allTags = [];
100
+ try {
101
+ matchedRoutes?.forEach?.(match => {
102
+ const setMetaData = match?.route?.component?.setMetaData;
103
+ if (setMetaData) {
104
+ let tags = setMetaData(routeData);
105
+ allTags = [...allTags, tags];
106
+ }
107
+ });
108
+ if (Array.isArray(allTags) && allTags.length > 0) {
109
+ let mergedTags = mergeHeadElements(...allTags);
110
+ allTags = mergedTags.map((el, index) => React.cloneElement(el, {
111
+ "data-catalyst": true,
112
+ key: index
113
+ }));
116
114
  }
117
-
118
- return allTags
115
+ } catch (er) {
116
+ console.log("meta tags error is ===>", er);
117
+ }
118
+ return allTags;
119
119
  }
@@ -0,0 +1,188 @@
1
+ import React from "react"
2
+ import { describe, expect, it, vi, afterEach } from "vitest"
3
+ import { mergeHeadElements, deleteHeadTagsByDataAttribute, getMetaData } from "./metaDataUtils.jsx"
4
+
5
+ describe("mergeHeadElements", () => {
6
+ it("returns an empty array when given no lists", () => {
7
+ expect(mergeHeadElements()).toEqual([])
8
+ })
9
+
10
+ it("keeps only the last title element when multiple titles are given", () => {
11
+ const first = <title key="a">First</title>
12
+ const second = <title key="b">Second</title>
13
+ const result = mergeHeadElements([first], [second])
14
+ expect(result).toHaveLength(1)
15
+ expect(result[0].props.children).toBe("Second")
16
+ })
17
+
18
+ it("dedupes meta tags by name, keeping the later one", () => {
19
+ const first = <meta name="description" content="first" />
20
+ const second = <meta name="description" content="second" />
21
+ const result = mergeHeadElements([first], [second])
22
+ expect(result).toHaveLength(1)
23
+ expect(result[0].props.content).toBe("second")
24
+ })
25
+
26
+ it("dedupes meta tags by property when name is absent", () => {
27
+ const first = <meta property="og:title" content="first" />
28
+ const second = <meta property="og:title" content="second" />
29
+ const result = mergeHeadElements([first, second])
30
+ expect(result).toHaveLength(1)
31
+ expect(result[0].props.content).toBe("second")
32
+ })
33
+
34
+ it("treats charset meta tags as a single unique slot", () => {
35
+ const first = <meta charSet="utf-8" charset="utf-8" />
36
+ const second = <meta charSet="iso-8859-1" charset="iso-8859-1" />
37
+ const result = mergeHeadElements([first], [second])
38
+ expect(result).toHaveLength(1)
39
+ })
40
+
41
+ it("keeps distinct meta tags with different names", () => {
42
+ const description = <meta name="description" content="desc" />
43
+ const keywords = <meta name="keywords" content="kw" />
44
+ const result = mergeHeadElements([description, keywords])
45
+ expect(result).toHaveLength(2)
46
+ })
47
+
48
+ it("preserves order across multiple non-overlapping lists", () => {
49
+ const a = <meta name="a" content="1" />
50
+ const b = <meta name="b" content="2" />
51
+ const c = <meta name="c" content="3" />
52
+ const result = mergeHeadElements([a], [b], [c])
53
+ expect(result.map((el) => el.props.name)).toEqual(["a", "b", "c"])
54
+ })
55
+
56
+ it("ignores null/undefined lists mixed in with real ones", () => {
57
+ const a = <meta name="a" content="1" />
58
+ const result = mergeHeadElements(null, [a], undefined)
59
+ expect(result).toHaveLength(1)
60
+ })
61
+
62
+ it("keys non-title/non-meta elements (e.g. link) by type + serialized props, so later ones override", () => {
63
+ const first = <link rel="canonical" href="https://a.example" />
64
+ const second = <link rel="canonical" href="https://a.example" data-x="2" />
65
+ // different serialized props -> different keys -> both kept
66
+ const kept = mergeHeadElements([first], [second])
67
+ expect(kept).toHaveLength(2)
68
+
69
+ // identical props -> same key -> later overrides
70
+ const dupA = <link rel="stylesheet" href="/x.css" />
71
+ const dupB = <link rel="stylesheet" href="/x.css" />
72
+ const deduped = mergeHeadElements([dupA], [dupB])
73
+ expect(deduped).toHaveLength(1)
74
+ expect(deduped[0]).toBe(dupB)
75
+ })
76
+ })
77
+
78
+ describe("deleteHeadTagsByDataAttribute", () => {
79
+ afterEach(() => {
80
+ document.head.innerHTML = ""
81
+ })
82
+
83
+ it("removes every element carrying the given data attribute", () => {
84
+ document.head.innerHTML = `
85
+ <meta data-catalyst="true" name="a">
86
+ <meta data-catalyst="true" name="b">
87
+ <meta name="c">
88
+ `
89
+ deleteHeadTagsByDataAttribute("catalyst")
90
+ expect(document.head.querySelectorAll("[data-catalyst]")).toHaveLength(0)
91
+ expect(document.head.querySelectorAll("meta")).toHaveLength(1)
92
+ })
93
+
94
+ it("removes only elements matching a specific attribute value when given one", () => {
95
+ document.head.innerHTML = `
96
+ <meta data-catalyst="route-a" name="a">
97
+ <meta data-catalyst="route-b" name="b">
98
+ `
99
+ deleteHeadTagsByDataAttribute("catalyst", "route-a")
100
+ expect(document.head.querySelector('[data-catalyst="route-a"]')).toBeNull()
101
+ expect(document.head.querySelector('[data-catalyst="route-b"]')).not.toBeNull()
102
+ })
103
+
104
+ it("does nothing when no elements match", () => {
105
+ document.head.innerHTML = `<meta name="untouched">`
106
+ expect(() => deleteHeadTagsByDataAttribute("catalyst")).not.toThrow()
107
+ expect(document.head.querySelectorAll("meta")).toHaveLength(1)
108
+ })
109
+ })
110
+
111
+ describe("getMetaData", () => {
112
+ it("returns an empty array when matchedRoutes is undefined", () => {
113
+ expect(getMetaData(undefined, {})).toEqual([])
114
+ })
115
+
116
+ it("returns an empty array when no route defines setMetaData", () => {
117
+ const matchedRoutes = [{ route: { component: {} } }]
118
+ expect(getMetaData(matchedRoutes, {})).toEqual([])
119
+ })
120
+
121
+ it("calls each route's setMetaData with the route data and merges results", () => {
122
+ const routeData = { title: "Home" }
123
+ const matchedRoutes = [
124
+ {
125
+ route: {
126
+ component: {
127
+ setMetaData: (data) => [<title key="t">{data.title}</title>],
128
+ },
129
+ },
130
+ },
131
+ ]
132
+ const result = getMetaData(matchedRoutes, routeData)
133
+ expect(result).toHaveLength(1)
134
+ expect(result[0].props.children).toBe("Home")
135
+ })
136
+
137
+ it("stamps every returned element with data-catalyst and a stable key", () => {
138
+ const matchedRoutes = [
139
+ {
140
+ route: {
141
+ component: {
142
+ setMetaData: () => [
143
+ <meta key="a" name="a" content="1" />,
144
+ <meta key="b" name="b" content="2" />,
145
+ ],
146
+ },
147
+ },
148
+ },
149
+ ]
150
+ const result = getMetaData(matchedRoutes, {})
151
+ expect(result).toHaveLength(2)
152
+ for (const el of result) {
153
+ expect(el.props["data-catalyst"]).toBe(true)
154
+ }
155
+ })
156
+
157
+ it("merges tags from multiple matched routes, later routes winning on conflict", () => {
158
+ const matchedRoutes = [
159
+ {
160
+ route: { component: { setMetaData: () => [<meta key="a" name="shared" content="parent" />] } },
161
+ },
162
+ {
163
+ route: { component: { setMetaData: () => [<meta key="b" name="shared" content="child" />] } },
164
+ },
165
+ ]
166
+ const result = getMetaData(matchedRoutes, {})
167
+ expect(result).toHaveLength(1)
168
+ expect(result[0].props.content).toBe("child")
169
+ })
170
+
171
+ it("swallows errors from a misbehaving setMetaData and returns an empty array", () => {
172
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => {})
173
+ const matchedRoutes = [
174
+ {
175
+ route: {
176
+ component: {
177
+ setMetaData: () => {
178
+ throw new Error("boom")
179
+ },
180
+ },
181
+ },
182
+ },
183
+ ]
184
+ expect(() => getMetaData(matchedRoutes, {})).not.toThrow()
185
+ expect(getMetaData(matchedRoutes, {})).toEqual([])
186
+ consoleSpy.mockRestore()
187
+ })
188
+ })
@@ -0,0 +1,12 @@
1
+ import "@testing-library/jest-dom/vitest"
2
+ import { cleanup } from "@testing-library/react"
3
+ import { afterEach } from "vitest"
4
+
5
+ // RTL only auto-cleans up between tests when a test framework's globals
6
+ // are detected in a way it recognizes (works out of the box with Jest);
7
+ // under Vitest it needs to be wired explicitly, or renders from one test
8
+ // leak into the next and multi-render tests using the same testids across
9
+ // `it` blocks start finding duplicate elements.
10
+ afterEach(() => {
11
+ cleanup()
12
+ })