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.
- package/changelog.md +185 -71
- package/dist/errors/generateDocs.js +100 -0
- package/dist/errors/index.js +243 -0
- package/dist/errors/registry.js +483 -0
- package/dist/errors-index.json +506 -0
- package/dist/globals.d.ts +62 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.jsx +5 -8
- package/dist/logger.js +1 -1
- package/dist/native/androidProject/app/build.gradle.kts +142 -7
- package/dist/native/androidProject/app/src/main/AndroidManifest.xml +4 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/NativeBridge.kt +2 -2
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/camera/BarcodeDetector.kt +3 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/camera/CameraSessionManager.kt +3 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/FrameworkServerUtils.kt +43 -8
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/BridgeUtilsTest.kt +181 -1
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/CameraUtilsTest.kt +156 -236
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/FileSizeRouterUtilsTest.kt +471 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/FileUtilsTest.kt +222 -226
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/FrameworkServerUtilsTest.kt +300 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/IntentUtilsTest.kt +244 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/MetricsMonitorTest.kt +359 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/NativeBridgeTest.kt +108 -63
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/NotificationUtilsTest.kt +329 -385
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/OfflineCacheServiceTest.kt +302 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/PerfEventBufferTest.kt +133 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/UtilsKtTest.kt +152 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/WebCacheManagerTest.kt +145 -324
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/BarcodeDetectorTest.kt +132 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/HoldControllerTest.kt +155 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/TorchControllerTest.kt +150 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/VideoStreamStateMachineTest.kt +120 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/VideoStreamStateTest.kt +62 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/ViewfinderMapperTest.kt +143 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/ZoomControllerTest.kt +421 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/design/DesignTokensTest.kt +207 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/plugins/PluginBridgeTest.kt +368 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/security/FridaDetectorTest.kt +193 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/security/SecurityCheckManagerTest.kt +260 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/security/SecurityCheckSchedulerTest.kt +166 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/DeviceInfoUtilsTest.kt +167 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/DownloadUtilsTest.kt +197 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/NetworkMonitorTest.kt +271 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/PushNotificationUtilsTest.kt +119 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/SafeAreaUtilsTest.kt +108 -0
- package/dist/native/androidProject/build.gradle.kts +1 -0
- package/dist/native/androidProject/gradle/libs.versions.toml +26 -0
- package/dist/native/androidProject/settings.gradle.kts +11 -8
- package/dist/native/androidSetup.js +2 -2
- package/dist/native/bridge/WebBridge.d.ts +98 -0
- package/dist/native/bridge/WebBridge.js +40 -6
- package/dist/native/bridge/constants/NativeInterfaces.d.ts +391 -0
- package/dist/native/bridge/errors.d.ts +67 -0
- package/dist/native/bridge/errors.js +66 -151
- package/dist/native/bridge/hooks/index.d.ts +13 -0
- package/dist/native/bridge/hooks/index.js +0 -6
- package/dist/native/bridge/hooks/useAI.d.ts +1 -0
- package/dist/native/bridge/hooks/useAI.js +3 -1
- package/dist/native/bridge/hooks/useCamera.d.ts +86 -0
- package/dist/native/bridge/hooks/useCamera.js +35 -6
- package/dist/native/bridge/hooks/useDataProtection.d.ts +17 -0
- package/dist/native/bridge/hooks/useDeviceInfo.d.ts +34 -0
- package/dist/native/bridge/hooks/useDeviceInfo.js +5 -0
- package/dist/native/bridge/hooks/useFilePicker.d.ts +53 -0
- package/dist/native/bridge/hooks/useFilePicker.js +13 -0
- package/dist/native/bridge/hooks/useGoogleSignIn.d.ts +12 -0
- package/dist/native/bridge/hooks/useHapticFeedback.d.ts +76 -0
- package/dist/native/bridge/hooks/useHapticFeedback.js +6 -1
- package/dist/native/bridge/hooks/useIntent.d.ts +33 -0
- package/dist/native/bridge/hooks/useIntent.js +2 -0
- package/dist/native/bridge/hooks/useNativeTransition.d.ts +53 -0
- package/dist/native/bridge/hooks/useNativeTransition.js +12 -5
- package/dist/native/bridge/hooks/useNetworkStatus.d.ts +22 -0
- package/dist/native/bridge/hooks/useNetworkStatus.js +7 -0
- package/dist/native/bridge/hooks/useNotification.d.ts +83 -0
- package/dist/native/bridge/hooks/useNotification.js +81 -34
- package/dist/native/bridge/hooks/useSafeArea.d.ts +12 -0
- package/dist/native/bridge/hooks/useSafeArea.js +8 -0
- package/dist/native/bridge/hooks/useVideoStream.d.ts +67 -0
- package/dist/native/bridge/hooks/useVideoStream.js +38 -52
- package/dist/native/bridge/hooks/utils.d.ts +4 -0
- package/dist/native/bridge/hooks.d.ts +1 -0
- package/dist/native/bridge/perf/collectors/ApiCollector.d.ts +30 -0
- package/dist/native/bridge/perf/collectors/ApiCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/CacheCollector.d.ts +43 -0
- package/dist/native/bridge/perf/collectors/CacheCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/HookCollector.d.ts +37 -0
- package/dist/native/bridge/perf/collectors/HookCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/InsightsCollector.d.ts +103 -0
- package/dist/native/bridge/perf/collectors/InsightsCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/InteractionCollector.d.ts +53 -0
- package/dist/native/bridge/perf/collectors/InteractionCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/KeyboardCollector.d.ts +30 -0
- package/dist/native/bridge/perf/collectors/KeyboardCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/NavigationCollector.d.ts +37 -0
- package/dist/native/bridge/perf/collectors/NavigationCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/NetworkTimingCollector.d.ts +30 -0
- package/dist/native/bridge/perf/collectors/NetworkTimingCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/RenderCollector.d.ts +47 -0
- package/dist/native/bridge/perf/collectors/RenderCollector.js +8 -0
- package/dist/native/bridge/perf/collectors/ScrollCollector.d.ts +29 -0
- package/dist/native/bridge/perf/collectors/ScrollCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/ThreadCollector.d.ts +31 -0
- package/dist/native/bridge/perf/collectors/ThreadCollector.js +4 -0
- package/dist/native/bridge/perf/core/constants.d.ts +76 -0
- package/dist/native/bridge/perf/core/measure.d.ts +39 -0
- package/dist/native/bridge/perf/core/measure.js +4 -0
- package/dist/native/bridge/perf/core/session.d.ts +49 -0
- package/dist/native/bridge/perf/core/session.js +4 -0
- package/dist/native/bridge/perf/core/store.d.ts +37 -0
- package/dist/native/bridge/perf/core/store.js +4 -0
- package/dist/native/bridge/perf/core/summary.d.ts +60 -0
- package/dist/native/bridge/perf/core/traceExport.d.ts +10 -0
- package/dist/native/bridge/perf/core/waterfalls.d.ts +2 -0
- package/dist/native/bridge/perf/index.d.ts +63 -0
- package/dist/native/bridge/perf/index.js +4 -0
- package/dist/native/bridge/safeArea.d.ts +11 -0
- package/dist/native/bridge/safeArea.js +2 -0
- package/dist/native/bridge/useBaseHook.d.ts +137 -0
- package/dist/native/bridge/useBaseHook.js +34 -4
- package/dist/native/bridge/utils/CameraUtils.d.ts +94 -0
- package/dist/native/bridge/utils/CameraUtils.js +4 -0
- package/dist/native/bridge/utils/FileObjectConverter.d.ts +36 -0
- package/dist/native/bridge/utils/NativeBridge.d.ts +270 -0
- package/dist/native/bridge/utils/NativeBridge.js +10 -0
- package/dist/native/buildAndroid/index.js +1 -1
- package/dist/native/buildAppAndroid.js +9 -0
- package/dist/native/buildAppIos.js +16 -1
- package/dist/native/buildErrorFormat.js +57 -0
- package/dist/native/buildIos/config.js +15 -1
- package/dist/native/buildIos/index.js +1 -1
- package/dist/native/buildIos/plugins.js +10 -1
- package/dist/native/iosnativeWebView/CoreLogic/Package.swift +36 -0
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Camera/VideoStreamState.swift +1 -1
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Camera/VideoStreamStateMachine.swift +6 -4
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/BootTimingUtility.swift +3 -3
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/FrameworkServerUtils.swift +14 -9
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/NetworkMonitor.swift +11 -9
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/NotificationHandlerProvider.swift +1 -1
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/URLWhitelistManager.swift +7 -7
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/AnyCodableTests.swift +154 -0
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/BootTimingUtilityTests.swift +23 -5
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/CatalystConstantsTests.swift +192 -0
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/ConfigMappingTests.swift +1 -1
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/FrameworkServerUtilsErrorPathTests.swift +106 -0
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/FrameworkServerUtilsLoopbackTests.swift +243 -0
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/FrameworkServerUtilsTests.swift +1 -1
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/NetworkMonitorTests.swift +119 -0
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/NotificationHandlerProviderTests.swift +59 -0
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/NotificationHandlerTests.swift +1 -1
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/URLWhitelistManagerTests.swift +1 -1
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/VideoStreamStateMachineTests.swift +171 -0
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/VideoStreamStateTests.swift +91 -0
- package/dist/native/iosnativeWebView/Package.swift +10 -9
- package/dist/native/iosnativeWebView/Sources/CatalystNotifications/LocalNotificationHandler.swift +7 -2
- package/dist/native/iosnativeWebView/Sources/CatalystNotifications/NotificationManager.swift +1 -2
- package/dist/native/iosnativeWebView/Sources/CatalystNotifications/PushNotificationHandler.swift +5 -4
- package/dist/native/iosnativeWebView/Sources/Core/Camera/CameraSessionManager.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Camera/HoldController.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Camera/NativeCameraManager.swift +6 -5
- package/dist/native/iosnativeWebView/Sources/Core/Camera/ZoomController.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Plugins/PluginBridge.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/CacheManager.swift +31 -30
- package/dist/native/iosnativeWebView/Sources/Core/Utils/CameraTransportUtils.swift +2 -1
- package/dist/native/iosnativeWebView/Sources/Core/Utils/DeviceInfoUtils.swift +1 -1
- package/dist/native/iosnativeWebView/Sources/Core/Utils/FilePickerHandler.swift +22 -19
- package/dist/native/iosnativeWebView/Sources/Core/Utils/ImageHandler.swift +40 -39
- package/dist/native/iosnativeWebView/Sources/Core/Utils/PerfEventBuffer.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/ResourceURLProtocol.swift +15 -15
- package/dist/native/iosnativeWebView/Sources/Core/Utils/WebKitConfig.swift +4 -3
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeCommandHandler.swift +6 -1
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeDelegateHandler.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeFileHandler.swift +2 -1
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeJavaScriptInterface.swift +2 -1
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeMessageValidator.swift +3 -5
- package/dist/native/iosnativeWebView/Sources/Core/WebView/NativeBridge.swift +20 -13
- package/dist/native/iosnativeWebView/Sources/Core/WebView/SplashView.swift +6 -5
- package/dist/native/iosnativeWebView/Sources/Core/WebView/SplashViewModel.swift +14 -13
- package/dist/native/iosnativeWebView/Sources/Core/WebView/TransitionManager.swift +3 -3
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebView.swift +9 -8
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebViewModel.swift +7 -6
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebViewNavigationDelegate.swift +24 -25
- package/dist/native/iosnativeWebView/iosnativeWebView/AppDelegate.swift +6 -1
- package/dist/native/iosnativeWebView/iosnativeWebView/ContentView.swift +1 -0
- package/dist/native/iosnativeWebView/iosnativeWebView/iosnativeWebViewApp.swift +4 -0
- package/dist/native/iosnativeWebView/iosnativeWebView.xcodeproj/project.pbxproj +2 -22
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/BridgeMessageValidatorTests.swift +1 -0
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/CacheManagerTests.swift +1 -0
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/FilePickerHandlerTests.swift +2 -1
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/NativeBridgeTests.swift +15 -9
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/WebViewTests.swift +1 -0
- package/dist/native/setupEmulatorIos.js +2 -2
- package/dist/native/terminalProgress.js +17 -17
- package/dist/router/ClientRouter.d.ts +8 -0
- package/dist/router/ClientRouter.js +13 -11
- package/dist/router/ServerRouter.d.ts +13 -0
- package/dist/router/ServerRouter.js +19 -7
- package/dist/scripts/build.js +14 -2
- package/dist/scripts/loadEnvironmentVariables.js +3 -2
- package/dist/scripts/plugins.js +1 -1
- package/dist/scripts/preServerInit.js +49 -3
- package/dist/scripts/preflight.js +111 -0
- package/dist/scripts/scriptUtils.js +46 -1
- package/dist/scripts/serve.js +7 -3
- package/dist/scripts/start.js +8 -3
- package/dist/server/expressServer.d.ts +1 -0
- package/dist/server/expressServer.js +247 -271
- package/dist/server/manifestCache.d.ts +2 -0
- package/dist/server/manifestCache.js +25 -33
- package/dist/server/renderer/ChunkExtractor.d.ts +44 -0
- package/dist/server/renderer/ChunkExtractor.js +113 -125
- package/dist/server/renderer/document/Body.d.ts +21 -0
- package/dist/server/renderer/document/Body.jsx +45 -45
- package/dist/server/renderer/document/FastRefresh.d.ts +3 -0
- package/dist/server/renderer/document/FastRefresh.jsx +7 -13
- package/dist/server/renderer/document/Head.d.ts +20 -0
- package/dist/server/renderer/document/Head.jsx +32 -32
- package/dist/server/renderer/document/index.d.ts +2 -0
- package/dist/server/renderer/document/index.jsx +2 -2
- package/dist/server/renderer/extract.d.ts +67 -0
- package/dist/server/renderer/extract.js +92 -89
- package/dist/server/renderer/handler.d.ts +2 -0
- package/dist/server/renderer/handler.jsx +401 -404
- package/dist/server/renderer/index.d.ts +2 -0
- package/dist/server/renderer/index.js +5 -8
- package/dist/server/renderer/render.d.ts +35 -0
- package/dist/server/renderer/render.js +25 -32
- package/dist/server/utils/botDetectionMiddleware.d.ts +1 -0
- package/dist/server/utils/botDetectionMiddleware.js +33 -23
- package/dist/server/utils/cjsRequire.d.ts +8 -0
- package/dist/server/utils/cjsRequire.js +2 -2
- package/dist/server/utils/userAgentUtil.d.ts +7 -0
- package/dist/server/utils/userAgentUtil.js +68 -71
- package/dist/server/utils/validator.d.ts +31 -0
- package/dist/server/utils/validator.js +133 -158
- package/dist/vite/inject-cache-key-plugin.js +3 -27
- package/dist/vite/moduleAliases.js +36 -0
- package/dist/vite/node-loader.mjs +2 -29
- package/dist/vite/resolveDevServerConfig.js +4 -1
- package/dist/vite/vite.config.js +2 -29
- package/dist/web-router/components/MetaTag.d.ts +4 -0
- package/dist/web-router/components/MetaTag.jsx +26 -28
- package/dist/web-router/components/MetaTag.test.jsx +100 -0
- package/dist/web-router/components/RouterDataProvider.d.ts +96 -0
- package/dist/web-router/components/RouterDataProvider.jsx +260 -259
- package/dist/web-router/components/RouterDataProvider.server.test.jsx +98 -0
- package/dist/web-router/components/RouterDataProvider.test.jsx +310 -0
- package/dist/web-router/components/Split.d.ts +74 -0
- package/dist/web-router/components/Split.jsx +147 -156
- package/dist/web-router/components/Split.server.test.jsx +52 -0
- package/dist/web-router/components/Split.test.jsx +167 -0
- package/dist/web-router/components/SplitInview.d.ts +22 -0
- package/dist/web-router/components/SplitInview.jsx +78 -89
- package/dist/web-router/components/SplitInview.test.jsx +112 -0
- package/dist/web-router/components/SsrRequestContext.d.ts +20 -0
- package/dist/web-router/components/SsrRequestContext.jsx +17 -7
- package/dist/web-router/components/SsrRequestContext.test.jsx +53 -0
- package/dist/web-router/context.d.ts +15 -0
- package/dist/web-router/context.jsx +5 -5
- package/dist/web-router/context.test.jsx +10 -0
- package/dist/web-router/utils/metaDataUtils.d.ts +24 -0
- package/dist/web-router/utils/metaDataUtils.jsx +86 -86
- package/dist/web-router/utils/metaDataUtils.test.jsx +188 -0
- package/dist/web-router/vitest.setup.js +12 -0
- package/mcp_v2/knowledge-base.json +115 -17
- package/mcp_v2/mcp.js +141 -3
- package/mcp_v2/package-lock.json +2031 -0
- package/mcp_v2/package.json +13 -2
- package/mcp_v2/scripts/copyErrorsIndex.cjs +34 -0
- package/mcp_v2/test/errors.test.ts +123 -0
- package/mcp_v2/test/github.test.ts +177 -0
- package/mcp_v2/tools/errors.d.ts +20 -0
- package/mcp_v2/tools/errors.js +63 -0
- package/mcp_v2/tools/github.d.ts +41 -0
- package/mcp_v2/tools/github.js +231 -0
- package/mcp_v2/vitest.config.mjs +22 -0
- package/package.json +60 -11
- package/test/errors/docsDrift.test.ts +113 -0
- package/test/errors/index.test.ts +200 -0
- package/test/errors/registry.test.ts +108 -0
- package/test/scripts/preflight.test.ts +118 -0
- package/test/server/ChunkExtractor.test.ts +97 -0
- package/test/server/extract.test.ts +128 -0
- package/test/server/fixtures/template/server/document.jsx +19 -0
- package/test/server/fixtures/template/server/index.js +10 -0
- package/test/server/fixtures/template/src/js/containers/App/index.jsx +33 -0
- package/test/server/fixtures/template/src/js/routes/index.jsx +72 -0
- package/test/server/fixtures/template/src/js/routes/utils.jsx +39 -0
- package/test/server/fixtures/template/src/js/store/index.js +19 -0
- package/test/server/handler.assets.test.ts +330 -0
- package/test/server/handler.test.ts +208 -0
- package/test/server/manifestCache.test.ts +71 -0
- package/test/server/render.test.ts +71 -0
- package/test/server/scriptUtils.test.ts +103 -0
- package/test/server/userAgentUtil.test.ts +48 -0
- package/test/server/validator.test.ts +225 -0
- package/test/vite/resolveDevServerConfig.test.js +4 -1
- package/tsconfig.test.json +23 -0
- package/vitest.config.ts +93 -0
- package/dist/caching.js +0 -1
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/DeviceInfoUtilsTest.kt +0 -187
- package/dist/native/bridge/standardizedHooks.js +0 -611
- package/dist/router.js +0 -1
- package/dist/scripts/validator.js +0 -149
- package/dist/web-router/hooks.jsx +0 -72
- package/dist/web-router/types/components/MetaTag.d.ts +0 -2
- package/dist/web-router/types/components/RouterDataProvider.d.ts +0 -95
- package/dist/web-router/types/context.d.ts +0 -14
- package/dist/web-router/types/hooks.d.ts +0 -1
- package/dist/web-router/types/index.d.ts +0 -3
- package/dist/web-router/types/utils/metaDataUtils.d.ts +0 -40
- /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Constants/CatalystConstants.swift +0 -0
- /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Constants/ConfigConstants.swift +0 -0
- /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Notifications/NotificationModels.swift +0 -0
- /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Protocols/NotificationHandlerProtocol.swift +0 -0
- /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
|
|
7
|
-
* @returns
|
|
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
|
-
|
|
10
|
+
const elementMap = new Map();
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
// For link tags, use 'rel' as a unique identifier
|
|
35
|
+
// if (type === "link") {
|
|
36
|
+
// return props.rel || "";
|
|
37
|
+
// }
|
|
36
38
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
54
|
-
|
|
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
|
|
61
|
-
* @param
|
|
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
|
-
|
|
65
|
-
|
|
64
|
+
const head = document.head;
|
|
65
|
+
const tagsToDelete = [];
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
|
94
|
-
* @param
|
|
95
|
-
* @returns
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
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
|
+
})
|