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,296 +1,216 @@
1
1
  package io.yourname.androidproject
2
2
 
3
+ import android.app.Activity
4
+ import android.content.pm.PackageManager
5
+ import android.os.Environment
6
+ import androidx.core.content.ContextCompat
3
7
  import io.yourname.androidproject.utils.CameraUtils
8
+ import org.junit.After
4
9
  import org.junit.Assert.*
10
+ import org.junit.Before
5
11
  import org.junit.Test
6
- import java.text.SimpleDateFormat
7
- import java.util.*
12
+ import org.mockito.MockedStatic
13
+ import org.mockito.Mockito.mockStatic
14
+ import org.mockito.kotlin.any
15
+ import org.mockito.kotlin.doReturn
16
+ import org.mockito.kotlin.mock
17
+ import org.mockito.kotlin.whenever
18
+ import java.io.File
19
+ import kotlin.io.path.createTempDirectory
8
20
 
9
21
  /**
10
- * Unit tests for CameraUtils
22
+ * Unit tests for CameraUtils.
11
23
  *
12
- * Tests cover:
13
- * - Photo URI creation (2 tests)
14
- * - Image quality handling (3 tests)
15
- * - Permission status validation (2 tests)
16
- * - File cleanup logic (2 tests)
24
+ * The previous version of this file imported CameraUtils but never called
25
+ * a single method on it — every assertion was against hand-reimplemented
26
+ * logic (a locally constructed SimpleDateFormat, a locally built filename
27
+ * string) instead of the real class, so it passed while contributing 0%
28
+ * coverage. Rewritten to call CameraUtils directly, following the
29
+ * mockStatic(...) + mocked Activity pattern established in
30
+ * OfflineCacheServiceTest.kt for Context/Android-stub-bound classes.
17
31
  *
18
- * Total: 9 tests
19
- *
20
- * Note: Tests focus on testable logic and algorithms without Android Context
21
- * following the same pattern as FileUtilsTest.kt
32
+ * ContextCompat.checkSelfPermission and Environment.getExternalStorageState
33
+ * are static Android SDK calls with no real implementation in a JVM unit
34
+ * test (the stub jar throws/returns defaults) — mocked statically here so
35
+ * hasCameraPermission/getPermissionStatus/validateCameraRequirements
36
+ * exercise CameraUtils' actual branching logic against controlled inputs.
22
37
  */
23
38
  class CameraUtilsTest {
24
39
 
40
+ private lateinit var activity: Activity
41
+ private lateinit var picturesDir: File
42
+ private lateinit var contextCompatMock: MockedStatic<ContextCompat>
43
+ private lateinit var environmentMock: MockedStatic<Environment>
44
+
45
+ @Before
46
+ fun setUp() {
47
+ picturesDir = createTempDirectory(prefix = "catalyst-camera-test").toFile()
48
+ activity = mock {
49
+ on { getExternalFilesDir(Environment.DIRECTORY_PICTURES) } doReturn picturesDir
50
+ }
51
+
52
+ contextCompatMock = mockStatic(ContextCompat::class.java)
53
+ environmentMock = mockStatic(Environment::class.java)
54
+ // getExternalStorageState() is a real method on the mocked static
55
+ // Environment class object, not a constant — default to MOUNTED so
56
+ // validateCameraRequirements' happy path is the default and tests
57
+ // only override it for the failure case.
58
+ environmentMock.`when`<String> { Environment.getExternalStorageState() }
59
+ .thenReturn(Environment.MEDIA_MOUNTED)
60
+ }
61
+
62
+ @After
63
+ fun tearDown() {
64
+ contextCompatMock.close()
65
+ environmentMock.close()
66
+ picturesDir.deleteRecursively()
67
+ }
68
+
69
+ private fun stubPermission(granted: Boolean) {
70
+ contextCompatMock.`when`<Int> { ContextCompat.checkSelfPermission(any(), any()) }
71
+ .thenReturn(if (granted) PackageManager.PERMISSION_GRANTED else PackageManager.PERMISSION_DENIED)
72
+ }
73
+
25
74
  // ============================================================
26
- // CATEGORY 1: Photo URI Creation (2 tests)
75
+ // hasCameraPermission / getPermissionStatus
27
76
  // ============================================================
28
77
 
29
- /**
30
- * Test image file naming convention
31
- * Validates JPEG_timestamp_.jpg format
32
- */
33
78
  @Test
34
- fun testImageFileNaming_timestampFormat() {
35
- // Test timestamp format used in createImageFile
36
- val dateFormat = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault())
37
- val timestamp1 = dateFormat.format(Date())
38
-
39
- // Validate format
40
- assertTrue(timestamp1.matches(Regex("\\d{8}_\\d{6}")))
41
-
42
- // Test filename construction
43
- val filename1 = "JPEG_${timestamp1}_.jpg"
44
- assertTrue(filename1.startsWith("JPEG_"))
45
- assertTrue(filename1.endsWith(".jpg"))
46
- assertTrue(filename1.contains(timestamp1))
47
-
48
- // Ensure uniqueness by timestamp
49
- Thread.sleep(1000) // Wait 1 second for different timestamp
50
- val timestamp2 = dateFormat.format(Date())
51
- val filename2 = "JPEG_${timestamp2}_.jpg"
52
-
53
- assertNotEquals(filename1, filename2)
79
+ fun `hasCameraPermission returns true when ContextCompat reports granted`() {
80
+ stubPermission(granted = true)
81
+ assertTrue(CameraUtils.hasCameraPermission(activity))
54
82
  }
55
83
 
56
- /**
57
- * Test photo file extension validation
58
- * Validates .jpg extension requirement
59
- */
60
84
  @Test
61
- fun testPhotoFileExtension_validation() {
62
- val validExtensions = listOf(".jpg", ".jpeg")
63
- val invalidExtensions = listOf(".png", ".gif", ".bmp", ".webp")
64
-
65
- // Test valid extensions
66
- validExtensions.forEach { ext ->
67
- val filename = "JPEG_20231203_123456_$ext"
68
- assertTrue(filename.endsWith(".jpg") || filename.endsWith(".jpeg"))
69
- }
85
+ fun `hasCameraPermission returns false when ContextCompat reports denied`() {
86
+ stubPermission(granted = false)
87
+ assertFalse(CameraUtils.hasCameraPermission(activity))
88
+ }
70
89
 
71
- // Test that our camera files use .jpg
72
- val cameraFile = "JPEG_20231203_123456_.jpg"
73
- assertTrue(cameraFile.endsWith(".jpg"))
74
- assertFalse(cameraFile.endsWith(".png"))
90
+ @Test
91
+ fun `getPermissionStatus returns GRANTED when permission is granted`() {
92
+ stubPermission(granted = true)
93
+ assertEquals("GRANTED", CameraUtils.getPermissionStatus(activity))
94
+ }
95
+
96
+ @Test
97
+ fun `getPermissionStatus returns DENIED when permission is denied`() {
98
+ stubPermission(granted = false)
99
+ assertEquals("DENIED", CameraUtils.getPermissionStatus(activity))
75
100
  }
76
101
 
77
102
  // ============================================================
78
- // CATEGORY 2: Image Quality Handling (3 tests)
103
+ // createImageFile
79
104
  // ============================================================
80
105
 
81
- /**
82
- * Test base64 size limit validation
83
- * Validates 10 MB threshold for base64 conversion
84
- */
85
106
  @Test
86
- fun testBase64SizeLimit_imageConversion() {
87
- val base64Limit = 10 * 1024 * 1024L // 10 MB
88
-
89
- // Small image - should be eligible for base64
90
- val smallImage = 500 * 1024L // 500 KB
91
- assertTrue(smallImage <= base64Limit)
92
-
93
- // Medium image - should be eligible
94
- val mediumImage = 5 * 1024 * 1024L // 5 MB
95
- assertTrue(mediumImage <= base64Limit)
96
-
97
- // Exactly at limit - should be eligible
98
- val atLimit = base64Limit
99
- assertTrue(atLimit <= base64Limit)
107
+ fun `createImageFile creates a real JPEG_ prefixed jpg file in the pictures dir`() {
108
+ val file = CameraUtils.createImageFile(activity)
100
109
 
101
- // Large image - should NOT be eligible for base64
102
- val largeImage = 15 * 1024 * 1024L // 15 MB
103
- assertFalse(largeImage <= base64Limit)
110
+ assertTrue(file.exists())
111
+ assertTrue(file.name.startsWith("JPEG_"))
112
+ assertTrue(file.name.endsWith(".jpg"))
113
+ assertEquals(picturesDir.canonicalPath, file.parentFile?.canonicalPath)
104
114
 
105
- // Very large image - should NOT be eligible
106
- val veryLargeImage = 50 * 1024 * 1024L // 50 MB
107
- assertFalse(veryLargeImage <= base64Limit)
115
+ file.delete()
108
116
  }
109
117
 
110
- /**
111
- * Test image file size estimation
112
- * Validates size calculation for different resolutions
113
- */
114
118
  @Test
115
- fun testImageFileSizeEstimation_byResolution() {
116
- // Typical JPEG compression ratios (rough estimates)
117
- // 1 MP = ~300-500 KB
118
- // 5 MP = ~1.5-2.5 MB
119
- // 12 MP = ~3-4 MB
120
- // 20 MP = ~5-7 MB
121
-
122
- val oneMegapixel = 400 * 1024L // ~400 KB
123
- val fiveMegapixel = 2 * 1024 * 1024L // ~2 MB
124
- val twelveMegapixel = 3.5 * 1024 * 1024 // ~3.5 MB
125
- val twentyMegapixel = 6 * 1024 * 1024L // ~6 MB
126
-
127
- // Validate relative sizes
128
- assertTrue(oneMegapixel < fiveMegapixel)
129
- assertTrue(fiveMegapixel < twelveMegapixel)
130
- assertTrue(twelveMegapixel < twentyMegapixel)
131
-
132
- // Validate base64 eligibility
133
- val base64Limit = 10 * 1024 * 1024L
134
- assertTrue(oneMegapixel <= base64Limit)
135
- assertTrue(fiveMegapixel <= base64Limit)
136
- assertTrue(twelveMegapixel <= base64Limit)
137
- assertTrue(twentyMegapixel <= base64Limit)
138
- }
119
+ fun `createImageFile produces distinct files on successive calls`() {
120
+ val file1 = CameraUtils.createImageFile(activity)
121
+ val file2 = CameraUtils.createImageFile(activity)
139
122
 
140
- /**
141
- * Test image quality parameter validation
142
- * Validates quality values for different use cases
143
- */
144
- @Test
145
- fun testImageQuality_parameterValidation() {
146
- // Quality values typically range 0-100
147
- val lowQuality = 30
148
- val mediumQuality = 60
149
- val highQuality = 90
150
- val maxQuality = 100
151
-
152
- // Validate range
153
- assertTrue(lowQuality in 0..100)
154
- assertTrue(mediumQuality in 0..100)
155
- assertTrue(highQuality in 0..100)
156
- assertTrue(maxQuality in 0..100)
157
-
158
- // Validate ordering
159
- assertTrue(lowQuality < mediumQuality)
160
- assertTrue(mediumQuality < highQuality)
161
- assertTrue(highQuality <= maxQuality)
162
-
163
- // Test invalid values
164
- val tooLow = -10
165
- val tooHigh = 150
166
- assertFalse(tooLow in 0..100)
167
- assertFalse(tooHigh in 0..100)
123
+ assertNotEquals(file1.name, file2.name)
124
+
125
+ file1.delete()
126
+ file2.delete()
168
127
  }
169
128
 
170
129
  // ============================================================
171
- // CATEGORY 3: Permission Status Validation (2 tests)
130
+ // validateCameraRequirements
172
131
  // ============================================================
173
132
 
174
- /**
175
- * Test camera permission status strings
176
- * Validates GRANTED, DENIED, NOT_DETERMINED states
177
- */
178
133
  @Test
179
- fun testPermissionStatus_stateStrings() {
180
- val validStates = setOf("GRANTED", "DENIED", "NOT_DETERMINED")
134
+ fun `validateCameraRequirements passes when device has a camera and storage is mounted`() {
135
+ val packageManager = mock<PackageManager> {
136
+ on { hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) } doReturn true
137
+ }
138
+ whenever(activity.packageManager) doReturn packageManager
181
139
 
182
- // Test each valid state
183
- assertTrue(validStates.contains("GRANTED"))
184
- assertTrue(validStates.contains("DENIED"))
185
- assertTrue(validStates.contains("NOT_DETERMINED"))
140
+ // Does not throw.
141
+ CameraUtils.validateCameraRequirements(activity)
142
+ }
186
143
 
187
- // Test invalid states
188
- assertFalse(validStates.contains("UNKNOWN"))
189
- assertFalse(validStates.contains("PENDING"))
190
- assertFalse(validStates.contains("granted")) // Case sensitive
144
+ @Test
145
+ fun `validateCameraRequirements throws when device has no camera`() {
146
+ val packageManager = mock<PackageManager> {
147
+ on { hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) } doReturn false
148
+ }
149
+ whenever(activity.packageManager) doReturn packageManager
191
150
 
192
- // Test state count
193
- assertEquals(3, validStates.size)
151
+ val error = assertThrows(IllegalStateException::class.java) {
152
+ CameraUtils.validateCameraRequirements(activity)
153
+ }
154
+ assertEquals("Device does not have a camera", error.message)
194
155
  }
195
156
 
196
- /**
197
- * Test permission status logic flow
198
- * Validates permission check decision tree
199
- */
200
157
  @Test
201
- fun testPermissionStatus_logicFlow() {
202
- // Simulate permission check logic
203
- data class PermissionState(val hasPermission: Boolean, val wasDenied: Boolean)
204
-
205
- fun getStatusString(state: PermissionState): String {
206
- return if (state.hasPermission) {
207
- "GRANTED"
208
- } else {
209
- when {
210
- state.wasDenied -> "DENIED"
211
- else -> "NOT_DETERMINED"
212
- }
213
- }
158
+ fun `validateCameraRequirements throws when external storage is not mounted`() {
159
+ val packageManager = mock<PackageManager> {
160
+ on { hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) } doReturn true
214
161
  }
162
+ whenever(activity.packageManager) doReturn packageManager
163
+ environmentMock.`when`<String> { Environment.getExternalStorageState() }
164
+ .thenReturn(Environment.MEDIA_UNMOUNTED)
215
165
 
216
- // Test scenarios
217
- assertEquals("GRANTED", getStatusString(PermissionState(true, false)))
218
- assertEquals("DENIED", getStatusString(PermissionState(false, true)))
219
- assertEquals("NOT_DETERMINED", getStatusString(PermissionState(false, false)))
220
-
221
- // Edge case: has permission but was previously denied (shouldn't happen)
222
- assertEquals("GRANTED", getStatusString(PermissionState(true, true)))
166
+ val error = assertThrows(IllegalStateException::class.java) {
167
+ CameraUtils.validateCameraRequirements(activity)
168
+ }
169
+ assertEquals("External storage not available", error.message)
223
170
  }
224
171
 
225
172
  // ============================================================
226
- // CATEGORY 4: File Cleanup Logic (2 tests)
173
+ // cleanupOldCameraFiles
227
174
  // ============================================================
228
175
 
229
- /**
230
- * Test camera file age threshold validation
231
- * Validates 7-day default cleanup threshold
232
- */
233
176
  @Test
234
- fun testCameraFileCleanup_ageThreshold() {
235
- val maxAgeMillis = 7 * 24 * 60 * 60 * 1000L // 7 days
236
- val currentTime = System.currentTimeMillis()
237
-
238
- // Recent file - should NOT be deleted
239
- val recentFileModified = currentTime - (1 * 24 * 60 * 60 * 1000L) // 1 day old
240
- val recentAge = currentTime - recentFileModified
241
- assertFalse(recentAge > maxAgeMillis)
242
-
243
- // File at threshold - should NOT be deleted
244
- val thresholdFileModified = currentTime - maxAgeMillis
245
- val thresholdAge = currentTime - thresholdFileModified
246
- assertFalse(thresholdAge > maxAgeMillis)
247
-
248
- // Old file - should be deleted
249
- val oldFileModified = currentTime - (10 * 24 * 60 * 60 * 1000L) // 10 days old
250
- val oldAge = currentTime - oldFileModified
251
- assertTrue(oldAge > maxAgeMillis)
252
-
253
- // Very old file - should be deleted
254
- val veryOldFileModified = currentTime - (30 * 24 * 60 * 60 * 1000L) // 30 days old
255
- val veryOldAge = currentTime - veryOldFileModified
256
- assertTrue(veryOldAge > maxAgeMillis)
177
+ fun `cleanupOldCameraFiles deletes files older than maxAgeMillis`() {
178
+ val maxAge = 7 * 24 * 60 * 60 * 1000L
179
+ val oldFile = File(picturesDir, "JPEG_20200101_000000_.jpg").apply {
180
+ createNewFile()
181
+ setLastModified(System.currentTimeMillis() - (10 * 24 * 60 * 60 * 1000L))
182
+ }
183
+
184
+ CameraUtils.cleanupOldCameraFiles(activity, maxAge)
185
+
186
+ assertFalse(oldFile.exists())
257
187
  }
258
188
 
259
- /**
260
- * Test camera file pattern matching
261
- * Validates JPEG_timestamp_.jpg pattern recognition
262
- */
263
189
  @Test
264
- fun testCameraFilePattern_matching() {
265
- // Valid camera file patterns
266
- val validFiles = listOf(
267
- "JPEG_20231203_123456_.jpg",
268
- "JPEG_20240101_000000_.jpg",
269
- "JPEG_20231231_235959_.jpg"
270
- )
271
-
272
- // Invalid patterns
273
- val invalidFiles = listOf(
274
- "photo.jpg",
275
- "image_20231203.jpg",
276
- "JPEG_123456.jpg",
277
- "jpeg_20231203_123456_.jpg", // lowercase
278
- "JPEG_20231203_123456_.png", // wrong extension
279
- "JPEG_20231203_123456.jpg" // missing underscore before extension
280
- )
281
-
282
- // Test valid files match pattern
283
- val cameraFilePattern = Regex("^JPEG_\\d{8}_\\d{6}_.*\\.jpg$")
284
- validFiles.forEach { filename ->
285
- assertTrue("$filename should match camera file pattern",
286
- filename.startsWith("JPEG_") && filename.endsWith(".jpg"))
190
+ fun `cleanupOldCameraFiles keeps files younger than maxAgeMillis`() {
191
+ val maxAge = 7 * 24 * 60 * 60 * 1000L
192
+ val recentFile = File(picturesDir, "JPEG_20991231_235959_.jpg").apply {
193
+ createNewFile()
194
+ setLastModified(System.currentTimeMillis() - (1 * 24 * 60 * 60 * 1000L))
287
195
  }
288
196
 
289
- // Test invalid files don't match exact pattern
290
- invalidFiles.forEach { filename ->
291
- val matches = filename.startsWith("JPEG_") &&
292
- filename.matches(Regex("JPEG_\\d{8}_\\d{6}_.*\\.jpg"))
293
- assertFalse("$filename should not match camera file pattern", matches)
197
+ CameraUtils.cleanupOldCameraFiles(activity, maxAge)
198
+
199
+ assertTrue(recentFile.exists())
200
+ recentFile.delete()
201
+ }
202
+
203
+ @Test
204
+ fun `cleanupOldCameraFiles ignores files not matching the JPEG_ prefix pattern`() {
205
+ val maxAge = 7 * 24 * 60 * 60 * 1000L
206
+ val unrelatedOldFile = File(picturesDir, "notes.txt").apply {
207
+ createNewFile()
208
+ setLastModified(System.currentTimeMillis() - (30 * 24 * 60 * 60 * 1000L))
294
209
  }
210
+
211
+ CameraUtils.cleanupOldCameraFiles(activity, maxAge)
212
+
213
+ assertTrue(unrelatedOldFile.exists())
214
+ unrelatedOldFile.delete()
295
215
  }
296
216
  }