catalyst-core 0.2.0-beta.3 → 0.3.0-beta.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 (167) hide show
  1. package/babel.native.config.cjs +8 -0
  2. package/bin/catalyst.js +49 -105
  3. package/changelog.md +8 -0
  4. package/dist/caching.js +1 -1
  5. package/dist/globals.d.ts +7 -0
  6. package/dist/index.jsx +8 -0
  7. package/dist/logger.js +74 -3
  8. package/dist/native/androidProject/app/build.gradle.kts +45 -4
  9. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/NativeBridge.kt +86 -0
  10. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/BridgeUtils.kt +8 -0
  11. package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/FrameworkServerUtils.kt +173 -13
  12. package/dist/native/androidProject/settings.gradle.kts +10 -0
  13. package/dist/native/androidSetup.js +300 -8
  14. package/dist/native/bridge/WebBridge.js +481 -59
  15. package/dist/native/bridge/constants/NativeInterfaces.js +304 -45
  16. package/dist/native/bridge/errors.js +250 -26
  17. package/dist/native/bridge/hooks/index.js +132 -1
  18. package/dist/native/bridge/hooks/useAI.js +94 -0
  19. package/dist/native/bridge/hooks/useCamera.js +347 -9
  20. package/dist/native/bridge/hooks/useDataProtection.js +200 -2
  21. package/dist/native/bridge/hooks/useDeviceInfo.js +71 -2
  22. package/dist/native/bridge/hooks/useFilePicker.js +429 -2
  23. package/dist/native/bridge/hooks/useGoogleSignIn.js +81 -1
  24. package/dist/native/bridge/hooks/useHapticFeedback.js +196 -1
  25. package/dist/native/bridge/hooks/useIntent.js +95 -1
  26. package/dist/native/bridge/hooks/useNativeTransition.js +202 -27
  27. package/dist/native/bridge/hooks/useNetworkStatus.js +84 -3
  28. package/dist/native/bridge/hooks/useNotification.js +318 -2
  29. package/dist/native/bridge/hooks/useSafeArea.js +84 -2
  30. package/dist/native/bridge/hooks/useVideoStream.js +434 -6
  31. package/dist/native/bridge/hooks/utils.js +27 -1
  32. package/dist/native/bridge/hooks.js +16 -1
  33. package/dist/native/bridge/perf/collectors/ApiCollector.js +66 -3
  34. package/dist/native/bridge/perf/collectors/CacheCollector.js +186 -11
  35. package/dist/native/bridge/perf/collectors/HookCollector.js +141 -19
  36. package/dist/native/bridge/perf/collectors/InsightsCollector.js +481 -23
  37. package/dist/native/bridge/perf/collectors/InteractionCollector.js +245 -10
  38. package/dist/native/bridge/perf/collectors/KeyboardCollector.js +107 -8
  39. package/dist/native/bridge/perf/collectors/NavigationCollector.js +273 -32
  40. package/dist/native/bridge/perf/collectors/NetworkTimingCollector.js +178 -2
  41. package/dist/native/bridge/perf/collectors/RenderCollector.js +258 -14
  42. package/dist/native/bridge/perf/collectors/ScrollCollector.js +95 -9
  43. package/dist/native/bridge/perf/collectors/ThreadCollector.js +90 -6
  44. package/dist/native/bridge/perf/core/constants.js +103 -20
  45. package/dist/native/bridge/perf/core/measure.js +179 -30
  46. package/dist/native/bridge/perf/core/session.js +89 -23
  47. package/dist/native/bridge/perf/core/store.js +554 -1
  48. package/dist/native/bridge/perf/core/summary.js +174 -1
  49. package/dist/native/bridge/perf/core/traceExport.js +240 -1
  50. package/dist/native/bridge/perf/core/waterfalls.js +146 -1
  51. package/dist/native/bridge/perf/index.js +359 -38
  52. package/dist/native/bridge/safeArea.js +53 -5
  53. package/dist/native/bridge/standardizedHooks.js +595 -82
  54. package/dist/native/bridge/useBaseHook.js +274 -38
  55. package/dist/native/bridge/utils/CameraUtils.js +201 -56
  56. package/dist/native/bridge/utils/FileObjectConverter.js +129 -18
  57. package/dist/native/bridge/utils/NativeBridge.js +425 -141
  58. package/dist/native/buildAndroid/assets.js +510 -13
  59. package/dist/native/buildAndroid/build.js +296 -19
  60. package/dist/native/buildAndroid/config.js +87 -1
  61. package/dist/native/buildAndroid/index.js +406 -1
  62. package/dist/native/buildAppAndroid.js +34 -2
  63. package/dist/native/buildAppIos.js +62 -2
  64. package/dist/native/buildIos/assets.js +609 -8
  65. package/dist/native/buildIos/build.js +639 -20
  66. package/dist/native/buildIos/config.js +294 -12
  67. package/dist/native/buildIos/index.js +343 -6
  68. package/dist/native/buildIos/plugins.js +343 -16
  69. package/dist/native/internal-plugins/device-info-plugin/android/DeviceInfoPlugin.kt +43 -0
  70. package/dist/native/internal-plugins/device-info-plugin/ios/DeviceInfoPlugin.swift +28 -0
  71. package/dist/native/internal-plugins/device-info-plugin/manifest.json +19 -0
  72. package/dist/native/internalPluginUtils.js +232 -7
  73. package/dist/native/package.json +3 -0
  74. package/dist/native/plugin-bridge/PluginBridge.js +227 -1
  75. package/dist/native/pluginComposerAndroid.js +407 -23
  76. package/dist/native/pluginComposerIos.js +435 -11
  77. package/dist/native/renameAndroidProject.js +1094 -88
  78. package/dist/native/setupEmulatorIos.js +289 -22
  79. package/dist/native/setupServer.js +160 -19
  80. package/dist/native/terminalProgress.js +199 -11
  81. package/dist/native/utils.js +193 -15
  82. package/dist/offline/catalyst-sw.js +145 -1
  83. package/dist/offline/registerServiceWorker.js +33 -1
  84. package/dist/otel.js +375 -46
  85. package/dist/router/ClientRouter.js +14 -2
  86. package/dist/router/ServerRouter.js +9 -1
  87. package/dist/router.js +1 -1
  88. package/dist/scripts/build.js +112 -3
  89. package/dist/scripts/checkVersion.js +3 -1
  90. package/dist/scripts/cleanCache.js +30 -1
  91. package/dist/scripts/generateOfflineManifest.js +116 -1
  92. package/dist/scripts/loadEnvironmentVariables.js +32 -6
  93. package/dist/scripts/plugins.js +309 -1
  94. package/dist/scripts/preServerInit.js +13 -0
  95. package/dist/scripts/scriptUtils.js +54 -3
  96. package/dist/scripts/serve.js +51 -4
  97. package/dist/scripts/start.js +47 -10
  98. package/dist/scripts/validator.js +149 -1
  99. package/dist/sentry.cjs +127 -0
  100. package/dist/sentry.js +125 -5
  101. package/dist/server/expressServer.js +296 -5
  102. package/dist/server/manifestCache.js +36 -0
  103. package/dist/server/renderer/ChunkExtractor.js +144 -0
  104. package/dist/server/renderer/document/Body.jsx +59 -0
  105. package/dist/server/renderer/document/FastRefresh.jsx +20 -0
  106. package/dist/server/renderer/document/Head.jsx +60 -0
  107. package/dist/server/renderer/document/index.jsx +2 -0
  108. package/dist/server/renderer/extract.js +149 -31
  109. package/dist/server/renderer/handler.jsx +450 -0
  110. package/dist/server/renderer/index.js +8 -1
  111. package/dist/server/renderer/render.js +47 -0
  112. package/dist/server/utils/botDetectionMiddleware.js +29 -0
  113. package/dist/server/utils/cjsRequire.js +10 -0
  114. package/dist/server/utils/userAgentUtil.js +87 -9
  115. package/dist/server/utils/validator.js +164 -1
  116. package/dist/vite/FastRefresh.jsx +20 -0
  117. package/dist/vite/inject-cache-key-plugin.js +276 -0
  118. package/dist/vite/loadCustomViteConfig.js +22 -0
  119. package/dist/vite/manifest-categorization-plugin.js +455 -0
  120. package/dist/vite/node-loader.mjs +458 -0
  121. package/dist/vite/scssParams.js +21 -0
  122. package/dist/vite/vite.config.client.js +130 -0
  123. package/dist/vite/vite.config.js +498 -0
  124. package/dist/vite/vite.config.server.js +84 -0
  125. package/dist/web-router/components/MetaTag.jsx +34 -0
  126. package/dist/web-router/components/RouterDataProvider.jsx +332 -0
  127. package/dist/web-router/components/Split.jsx +200 -0
  128. package/dist/web-router/components/SplitInview.jsx +106 -0
  129. package/dist/web-router/components/SsrRequestContext.jsx +14 -0
  130. package/dist/web-router/context.jsx +12 -0
  131. package/dist/web-router/hooks.jsx +72 -0
  132. package/dist/web-router/types/components/MetaTag.d.ts +2 -0
  133. package/dist/web-router/types/components/RouterDataProvider.d.ts +95 -0
  134. package/dist/web-router/types/context.d.ts +14 -0
  135. package/dist/web-router/types/hooks.d.ts +1 -0
  136. package/dist/web-router/types/index.d.ts +3 -0
  137. package/dist/web-router/types/utils/metaDataUtils.d.ts +24 -0
  138. package/dist/web-router/utils/metaDataUtils.jsx +119 -0
  139. package/mcp_v2/conversion-tasks.json +35 -17
  140. package/mcp_v2/knowledge-base.json +176 -17
  141. package/mcp_v2/lib/helpers.js +10 -0
  142. package/mcp_v2/mcp.js +40 -8
  143. package/mcp_v2/package.json +1 -0
  144. package/mcp_v2/tools/build.js +161 -37
  145. package/mcp_v2/tools/conversion.js +106 -5
  146. package/mcp_v2/tools/tasks.js +18 -14
  147. package/package.json +35 -68
  148. package/babel.config.js +0 -32
  149. package/dist/index.js +0 -1
  150. package/dist/scripts/devBuild.js +0 -3
  151. package/dist/scripts/devServe.js +0 -3
  152. package/dist/scripts/loadScriptsBeforeServerStarts.js +0 -4
  153. package/dist/scripts/registerAliases.js +0 -6
  154. package/dist/server/renderer/document/Body.js +0 -11
  155. package/dist/server/renderer/document/Head.js +0 -9
  156. package/dist/server/renderer/document/index.js +0 -1
  157. package/dist/server/renderer/handler.js +0 -47
  158. package/dist/server/startServer.js +0 -57
  159. package/dist/webpack/babel-plugins/remove-client.plugin.js +0 -5
  160. package/dist/webpack/babel-plugins/remove-ssr.plugin.js +0 -5
  161. package/dist/webpack/babel.config.client.js +0 -1
  162. package/dist/webpack/babel.config.ssr.js +0 -1
  163. package/dist/webpack/base.babel.js +0 -7
  164. package/dist/webpack/development.client.babel.js +0 -10
  165. package/dist/webpack/production.client.babel.js +0 -4
  166. package/dist/webpack/production.ssr.babel.js +0 -8
  167. package/dist/webpack/scssParams.js +0 -9
@@ -1,59 +1,481 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _NativeInterfaces=require("./constants/NativeInterfaces.js");var _NativeBridge=_interopRequireDefault(require("./utils/NativeBridge.js"));var _CameraUtils=_interopRequireDefault(require("./utils/CameraUtils.js"));var _PluginBridge=_interopRequireDefault(require("../plugin-bridge/PluginBridge.js"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e};}function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(i.get||i.set)?o(f,t,i):f[t]=e[t]);return f;})(e,t);}const DEVICE_INFO_PLUGIN={pluginId:"io.catalyst.device_info",command:"getDeviceInfo",successEvent:"onSuccess",errorEvent:"onError"};const DEVICE_INFO_REQUEST_TIMEOUT_MS=5000;const DEVICE_INFO_PLUGIN_FALLBACK_CODES=new Set(["PLUGIN_NOT_FOUND","COMMAND_NOT_SUPPORTED","PLUGIN_NOT_REGISTERED"]);const DEVICE_INFO_PLUGIN_FALLBACK_MESSAGES=["pluginbridge is not available in this environment","pluginbridge is not available","device info plugin request timed out"];const normalizeDeviceInfoPayload=payload=>{if(typeof payload!=="string"){return payload;}try{return JSON.parse(payload);}catch{return{message:payload};}};const createDeviceInfoError=(payload,fallbackMessage)=>{const parsed=normalizeDeviceInfoPayload(payload);const message=parsed?.message||parsed?.error||fallbackMessage;const error=new Error(message);if(parsed?.code){error.code=parsed.code;}if(parsed?.pluginId){error.pluginId=parsed.pluginId;}if(parsed?.command){error.command=parsed.command;}return error;};class WebBridge{constructor(){this.handlers=new Map();this.initialized=false;this._logInitialization();}/**
2
- * Log initialization info
3
- */_logInitialization(){console.log("🌉 WebBridge initialized");console.log("🌉 Available callback interfaces:",_NativeInterfaces.ALL_CALLBACKS.length);if(process.env.NODE_ENV==="development"){(0,_NativeInterfaces.debugInterfaces)();}}/**
4
- * Static method to initialize WebBridge on window object
5
- */static init=()=>{if(typeof window==="undefined"){console.error("🌉 WebBridge cannot be initialized outside the browser!");return null;}if(window.WebBridge){console.warn("🌉 WebBridge already initialized!");return window.WebBridge;}const bridge=new WebBridge();window.WebBridge=bridge;bridge.initialized=true;const{platform}=_NativeBridge.default.getEnvironmentInfo();if(window.__CATALYST_PROFILER_ENABLED===true){Promise.resolve().then(()=>_interopRequireWildcard(require("./perf/index.js"))).then(({default:WebPerfCollector})=>{WebPerfCollector.init(bridge);});}console.log("🌉 WebBridge created and attached to window");return{bridge,platform,getDeviceInfo:bridge.getDeviceInfo};};/**
6
- * Main callback handler called by native platforms
7
- * @param {string} interfaceName - The callback interface name
8
- * @param {any} data - Data from native platform
9
- */callback=(interfaceName,data)=>{console.log(`🌉 WebBridge callback: ${interfaceName}`,data?{data}:"");// Validate interface
10
- if(!(0,_NativeInterfaces.isValidCallback)(interfaceName)){console.error(`🌉 Invalid callback interface: ${interfaceName}`);console.log("🌉 Available callbacks:",_NativeInterfaces.ALL_CALLBACKS);return;}if(!this.handlers.has(interfaceName)){console.warn(`🌉 No handler registered for interface: ${interfaceName}`);return;}try{const handler=this.handlers.get(interfaceName);handler(data);}catch(error){console.error(`🌉 Error executing callback for ${interfaceName}:`,error);// In development, provide more helpful error info
11
- if(process.env.NODE_ENV==="development"){console.error("🌉 Handler details:",{interfaceName,data,handlerType:typeof this.handlers.get(interfaceName)});}}};/**
12
- * Register a callback handler for a native interface
13
- * @param {string} interfaceName - The callback interface name (from NATIVE_CALLBACKS)
14
- * @param {function} callback - The callback function to execute
15
- * @returns {boolean} - Success status
16
- */register=(interfaceName,callback)=>{// Validate callback function
17
- if(typeof callback!=="function"){console.error("🌉 Callback must be a function!");return false;}// Validate interface name
18
- if(!(0,_NativeInterfaces.isValidCallback)(interfaceName)){console.error(`🌉 Invalid callback interface: ${interfaceName}`);console.log("🌉 Available callback interfaces:",_NativeInterfaces.ALL_CALLBACKS);return false;}// Warn if overriding existing handler
19
- if(this.handlers.has(interfaceName)){console.warn(`🌉 Interface ${interfaceName} already registered! Overriding existing handler.`);}console.log(`🌉 Registering callback interface: ${interfaceName}`);this.handlers.set(interfaceName,callback);return true;};/**
20
- * Unregister a callback handler
21
- * @param {string} interfaceName - The callback interface name to unregister
22
- * @returns {boolean} - Success status
23
- */unregister=interfaceName=>{if(!this.handlers.has(interfaceName)){console.warn(`🌉 Interface ${interfaceName} not registered, nothing to unregister.`);return false;}console.log(`🌉 Unregistering callback interface: ${interfaceName}`);this.handlers.delete(interfaceName);return true;};/**
24
- * Check if a callback interface is registered
25
- * @param {string} interfaceName - The callback interface name
26
- * @returns {boolean} - Registration status
27
- */isRegistered=interfaceName=>{return this.handlers.has(interfaceName);};/**
28
- * Get all registered callback interfaces
29
- * @returns {string[]} - Array of registered interface names
30
- */getRegisteredInterfaces=()=>{return Array.from(this.handlers.keys());};/**
31
- * Get handler for a specific interface (for debugging)
32
- * @param {string} interfaceName - The callback interface name
33
- * @returns {function|null} - The registered handler or null
34
- */getHandler=interfaceName=>{return this.handlers.get(interfaceName)||null;};/**
35
- * Clear all registered handlers
36
- */clearAll=()=>{const count=this.handlers.size;this.handlers.clear();console.log(`🌉 Cleared ${count} registered callback handlers`);};/**
37
- * Debug method to log current state
38
- */debug=()=>{console.group("🌉 WebBridge Debug Info");console.log("Initialized:",this.initialized);console.log("Available callback interfaces:",_NativeInterfaces.ALL_CALLBACKS);console.log("Registered interfaces:",this.getRegisteredInterfaces());console.log("Total handlers:",this.handlers.size);if(this.handlers.size>0){console.log("Handler details:");this.handlers.forEach((handler,interfaceName)=>{console.log(` ${interfaceName}:`,typeof handler);});}console.groupEnd();};/**
39
- * Test callback functionality (for debugging)
40
- * @param {string} interfaceName - The callback interface to test
41
- * @param {any} testData - Test data to pass
42
- */testCallback=(interfaceName,testData="test")=>{if(process.env.NODE_ENV!=="development"){console.warn("🌉 testCallback is only available in development mode");return;}console.log(`🌉 Testing callback: ${interfaceName}`);this.callback(interfaceName,testData);};/**
43
- * Request haptic feedback
44
- * @param {string} feedbackType - Type of haptic feedback (VIRTUAL_KEY, LONG_PRESS, DEFAULT)
45
- * @returns {Promise<Object>} - Promise that resolves with haptic feedback result or rejects with error
46
- */requestHapticFeedback=(feedbackType="VIRTUAL_KEY")=>{return new Promise((resolve,reject)=>{const cleanup=()=>{this.unregister(_NativeInterfaces.NATIVE_CALLBACKS.HAPTIC_FEEDBACK);};this.register(_NativeInterfaces.NATIVE_CALLBACKS.HAPTIC_FEEDBACK,data=>{cleanup();try{const result=typeof data==="string"?JSON.parse(data):data;if(result.error){reject(new Error(result.error));}else{resolve(result);}}catch(error){reject(error);}});try{_NativeBridge.default.haptic.feedback(feedbackType);}catch(error){cleanup();reject(error);}});};/**
47
- * Open camera and capture image
48
- * @param {Object} options - Camera options (quality, format, cameraDevice, flashMode, allowEditing)
49
- * @returns {Promise<Object>} - Promise that resolves with camera result or rejects with error
50
- */openCamera=(options={})=>{return _CameraUtils.default.openCamera(options,this.register,this.unregister);};/**
51
- * Request camera permission
52
- * @param {Object} config - Permission configuration (includeDetails)
53
- * @returns {Promise<Object>} - Promise that resolves with permission status or rejects with error
54
- */requestCameraPermission=(config={})=>{return _CameraUtils.default.requestCameraPermission(config,this.register,this.unregister);};getDeviceInfoFromLegacyBridge=parseDeviceInfo=>{return new Promise((resolve,reject)=>{let timeoutId=null;const cleanup=()=>{if(timeoutId!=null){clearTimeout(timeoutId);}this.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_SUCCESS);this.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_ERROR);};this.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_SUCCESS,data=>{cleanup();resolve(parseDeviceInfo(data));});this.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_ERROR,error=>{cleanup();reject(new Error(error));});try{const dispatched=_NativeBridge.default.device.getDeviceInfo();if(dispatched===false){cleanup();reject(new Error("Legacy device info bridge failed to dispatch"));return;}timeoutId=setTimeout(()=>{cleanup();reject(new Error("Legacy device info request timed out"));},DEVICE_INFO_REQUEST_TIMEOUT_MS);}catch(error){cleanup();reject(error);}});};getDeviceInfoFromPluginBridge=parseDeviceInfo=>{return new Promise((resolve,reject)=>{_PluginBridge.default.init();let isSettled=false;let timeoutId=null;const cleanups=[];const cleanup=()=>{if(timeoutId!=null){clearTimeout(timeoutId);}while(cleanups.length>0){const unregister=cleanups.pop();unregister();}};const settle=callback=>{if(isSettled){return;}isSettled=true;cleanup();callback();};cleanups.push(_PluginBridge.default.register({pluginId:DEVICE_INFO_PLUGIN.pluginId,eventName:DEVICE_INFO_PLUGIN.successEvent,command:DEVICE_INFO_PLUGIN.command,handler:payload=>{settle(()=>{try{resolve(parseDeviceInfo(payload));}catch(error){reject(error);}});}}));cleanups.push(_PluginBridge.default.register({pluginId:DEVICE_INFO_PLUGIN.pluginId,eventName:DEVICE_INFO_PLUGIN.errorEvent,command:DEVICE_INFO_PLUGIN.command,handler:payload=>{settle(()=>{reject(createDeviceInfoError(payload,"Device info plugin failed"));});}}));cleanups.push(_PluginBridge.default.register({pluginId:"__bridge__",eventName:"PLUGIN_BRIDGE_ERROR",command:DEVICE_INFO_PLUGIN.command,handler:payload=>{const pluginId=normalizeDeviceInfoPayload(payload)?.pluginId;if(pluginId!==DEVICE_INFO_PLUGIN.pluginId){return;}settle(()=>{reject(createDeviceInfoError(payload,"Device info plugin unavailable"));});}}));try{_PluginBridge.default.emit({pluginId:DEVICE_INFO_PLUGIN.pluginId,command:DEVICE_INFO_PLUGIN.command});timeoutId=setTimeout(()=>{settle(()=>{reject(new Error("Device info plugin request timed out"));});},DEVICE_INFO_REQUEST_TIMEOUT_MS);}catch(error){cleanup();reject(error);}});};shouldFallbackToLegacyDeviceInfo=error=>{if(!error){return false;}if(DEVICE_INFO_PLUGIN_FALLBACK_CODES.has(error.code)){return true;}if(typeof error.message!=="string"){return false;}const normalizedMessage=error.message.toLowerCase();return DEVICE_INFO_PLUGIN_FALLBACK_MESSAGES.some(message=>normalizedMessage.includes(message));};/**
55
- * Get device information
56
- * @returns {Promise<Object>} - Promise that resolves with device info or rejects with error
57
- */getDeviceInfo=async()=>{const{platform,isNativeEnvironment}=_NativeBridge.default.getEnvironmentInfo();// Handle web environment
58
- if(!isNativeEnvironment||platform==="web"){return{model:navigator.userAgent,manufacturer:"browser",platform:"web",screenWidth:screen.width,screenHeight:screen.height,screenDensity:window.devicePixelRatio};}// Key mapping from native to web keys
59
- const DEVICE_INFO_KEY_MAP={android:{model:"model",manufacturer:"manufacturer",platform:"platform",screenWidth:"screenWidth",screenHeight:"screenHeight",screenDensity:"screenDensity",appInfo:"appInfo"},ios:{model:"model",manufacturer:"manufacturer",platform:"platform",screenWidth:"screenWidth",screenHeight:"screenHeight",screenDensity:"screenDensity",appInfo:"appInfo"}};const parseDeviceInfo=data=>{const rawDeviceInfo=typeof data==="string"?JSON.parse(data):data;const platformMapping=DEVICE_INFO_KEY_MAP[platform]||{};return Object.fromEntries(Object.entries(rawDeviceInfo).map(([key,value])=>[platformMapping[key]||key,value]));};try{return await this.getDeviceInfoFromPluginBridge(parseDeviceInfo);}catch(error){if(!this.shouldFallbackToLegacyDeviceInfo(error)){throw error;}return this.getDeviceInfoFromLegacyBridge(parseDeviceInfo);}};}var _default=exports.default=WebBridge;
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _NativeInterfaces = require("./constants/NativeInterfaces.js");
8
+ var _NativeBridge = _interopRequireDefault(require("./utils/NativeBridge.js"));
9
+ var _CameraUtils = _interopRequireDefault(require("./utils/CameraUtils.js"));
10
+ var _PluginBridge = _interopRequireDefault(require("../plugin-bridge/PluginBridge.js"));
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
+ const DEVICE_INFO_PLUGIN = {
14
+ pluginId: "io.catalyst.device_info",
15
+ command: "getDeviceInfo",
16
+ successEvent: "onSuccess",
17
+ errorEvent: "onError"
18
+ };
19
+ const DEVICE_INFO_REQUEST_TIMEOUT_MS = 5000;
20
+ const DEVICE_INFO_PLUGIN_FALLBACK_CODES = new Set(["PLUGIN_NOT_FOUND", "COMMAND_NOT_SUPPORTED", "PLUGIN_NOT_REGISTERED"]);
21
+ const DEVICE_INFO_PLUGIN_FALLBACK_MESSAGES = ["pluginbridge is not available in this environment", "pluginbridge is not available", "device info plugin request timed out"];
22
+ const normalizeDeviceInfoPayload = payload => {
23
+ if (typeof payload !== "string") {
24
+ return payload;
25
+ }
26
+ try {
27
+ return JSON.parse(payload);
28
+ } catch {
29
+ return {
30
+ message: payload
31
+ };
32
+ }
33
+ };
34
+ const createDeviceInfoError = (payload, fallbackMessage) => {
35
+ const parsed = normalizeDeviceInfoPayload(payload);
36
+ const message = parsed?.message || parsed?.error || fallbackMessage;
37
+ const error = new Error(message);
38
+ if (parsed?.code) {
39
+ error.code = parsed.code;
40
+ }
41
+ if (parsed?.pluginId) {
42
+ error.pluginId = parsed.pluginId;
43
+ }
44
+ if (parsed?.command) {
45
+ error.command = parsed.command;
46
+ }
47
+ return error;
48
+ };
49
+ class WebBridge {
50
+ constructor() {
51
+ this.handlers = new Map();
52
+ this.initialized = false;
53
+ this._logInitialization();
54
+ }
55
+
56
+ /**
57
+ * Log initialization info
58
+ */
59
+ _logInitialization() {
60
+ console.log("🌉 WebBridge initialized");
61
+ console.log("🌉 Available callback interfaces:", _NativeInterfaces.ALL_CALLBACKS.length);
62
+ if (process.env.NODE_ENV === "development") {
63
+ (0, _NativeInterfaces.debugInterfaces)();
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Static method to initialize WebBridge on window object
69
+ */
70
+ static init = () => {
71
+ if (typeof window === "undefined") {
72
+ console.error("🌉 WebBridge cannot be initialized outside the browser!");
73
+ return null;
74
+ }
75
+ if (window.WebBridge) {
76
+ console.warn("🌉 WebBridge already initialized!");
77
+ return window.WebBridge;
78
+ }
79
+ const bridge = new WebBridge();
80
+ window.WebBridge = bridge;
81
+ bridge.initialized = true;
82
+ const {
83
+ platform
84
+ } = _NativeBridge.default.getEnvironmentInfo();
85
+ if (window.__CATALYST_PROFILER_ENABLED === true) {
86
+ Promise.resolve().then(() => _interopRequireWildcard(require("./perf/index.js"))).then(({
87
+ default: WebPerfCollector
88
+ }) => {
89
+ WebPerfCollector.init(bridge);
90
+ });
91
+ }
92
+ console.log("🌉 WebBridge created and attached to window");
93
+ return {
94
+ bridge,
95
+ platform,
96
+ getDeviceInfo: bridge.getDeviceInfo
97
+ };
98
+ };
99
+
100
+ /**
101
+ * Main callback handler called by native platforms
102
+ * @param {string} interfaceName - The callback interface name
103
+ * @param {any} data - Data from native platform
104
+ */
105
+ callback = (interfaceName, data) => {
106
+ console.log(`🌉 WebBridge callback: ${interfaceName}`, data ? {
107
+ data
108
+ } : "");
109
+
110
+ // Validate interface
111
+ if (!(0, _NativeInterfaces.isValidCallback)(interfaceName)) {
112
+ console.error(`🌉 Invalid callback interface: ${interfaceName}`);
113
+ console.log("🌉 Available callbacks:", _NativeInterfaces.ALL_CALLBACKS);
114
+ return;
115
+ }
116
+ if (!this.handlers.has(interfaceName)) {
117
+ console.warn(`🌉 No handler registered for interface: ${interfaceName}`);
118
+ return;
119
+ }
120
+ try {
121
+ const handler = this.handlers.get(interfaceName);
122
+ handler(data);
123
+ } catch (error) {
124
+ console.error(`🌉 Error executing callback for ${interfaceName}:`, error);
125
+
126
+ // In development, provide more helpful error info
127
+ if (process.env.NODE_ENV === "development") {
128
+ console.error("🌉 Handler details:", {
129
+ interfaceName,
130
+ data,
131
+ handlerType: typeof this.handlers.get(interfaceName)
132
+ });
133
+ }
134
+ }
135
+ };
136
+
137
+ /**
138
+ * Register a callback handler for a native interface
139
+ * @param {string} interfaceName - The callback interface name (from NATIVE_CALLBACKS)
140
+ * @param {function} callback - The callback function to execute
141
+ * @returns {boolean} - Success status
142
+ */
143
+ register = (interfaceName, callback) => {
144
+ // Validate callback function
145
+ if (typeof callback !== "function") {
146
+ console.error("🌉 Callback must be a function!");
147
+ return false;
148
+ }
149
+
150
+ // Validate interface name
151
+ if (!(0, _NativeInterfaces.isValidCallback)(interfaceName)) {
152
+ console.error(`🌉 Invalid callback interface: ${interfaceName}`);
153
+ console.log("🌉 Available callback interfaces:", _NativeInterfaces.ALL_CALLBACKS);
154
+ return false;
155
+ }
156
+
157
+ // Warn if overriding existing handler
158
+ if (this.handlers.has(interfaceName)) {
159
+ console.warn(`🌉 Interface ${interfaceName} already registered! Overriding existing handler.`);
160
+ }
161
+ console.log(`🌉 Registering callback interface: ${interfaceName}`);
162
+ this.handlers.set(interfaceName, callback);
163
+ return true;
164
+ };
165
+
166
+ /**
167
+ * Unregister a callback handler
168
+ * @param {string} interfaceName - The callback interface name to unregister
169
+ * @returns {boolean} - Success status
170
+ */
171
+ unregister = interfaceName => {
172
+ if (!this.handlers.has(interfaceName)) {
173
+ console.warn(`🌉 Interface ${interfaceName} not registered, nothing to unregister.`);
174
+ return false;
175
+ }
176
+ console.log(`🌉 Unregistering callback interface: ${interfaceName}`);
177
+ this.handlers.delete(interfaceName);
178
+ return true;
179
+ };
180
+
181
+ /**
182
+ * Check if a callback interface is registered
183
+ * @param {string} interfaceName - The callback interface name
184
+ * @returns {boolean} - Registration status
185
+ */
186
+ isRegistered = interfaceName => {
187
+ return this.handlers.has(interfaceName);
188
+ };
189
+
190
+ /**
191
+ * Get all registered callback interfaces
192
+ * @returns {string[]} - Array of registered interface names
193
+ */
194
+ getRegisteredInterfaces = () => {
195
+ return Array.from(this.handlers.keys());
196
+ };
197
+
198
+ /**
199
+ * Get handler for a specific interface (for debugging)
200
+ * @param {string} interfaceName - The callback interface name
201
+ * @returns {function|null} - The registered handler or null
202
+ */
203
+ getHandler = interfaceName => {
204
+ return this.handlers.get(interfaceName) || null;
205
+ };
206
+
207
+ /**
208
+ * Clear all registered handlers
209
+ */
210
+ clearAll = () => {
211
+ const count = this.handlers.size;
212
+ this.handlers.clear();
213
+ console.log(`🌉 Cleared ${count} registered callback handlers`);
214
+ };
215
+
216
+ /**
217
+ * Debug method to log current state
218
+ */
219
+ debug = () => {
220
+ console.group("🌉 WebBridge Debug Info");
221
+ console.log("Initialized:", this.initialized);
222
+ console.log("Available callback interfaces:", _NativeInterfaces.ALL_CALLBACKS);
223
+ console.log("Registered interfaces:", this.getRegisteredInterfaces());
224
+ console.log("Total handlers:", this.handlers.size);
225
+ if (this.handlers.size > 0) {
226
+ console.log("Handler details:");
227
+ this.handlers.forEach((handler, interfaceName) => {
228
+ console.log(` ${interfaceName}:`, typeof handler);
229
+ });
230
+ }
231
+ console.groupEnd();
232
+ };
233
+
234
+ /**
235
+ * Test callback functionality (for debugging)
236
+ * @param {string} interfaceName - The callback interface to test
237
+ * @param {any} testData - Test data to pass
238
+ */
239
+ testCallback = (interfaceName, testData = "test") => {
240
+ if (process.env.NODE_ENV !== "development") {
241
+ console.warn("🌉 testCallback is only available in development mode");
242
+ return;
243
+ }
244
+ console.log(`🌉 Testing callback: ${interfaceName}`);
245
+ this.callback(interfaceName, testData);
246
+ };
247
+
248
+ /**
249
+ * Request haptic feedback
250
+ * @param {string} feedbackType - Type of haptic feedback (VIRTUAL_KEY, LONG_PRESS, DEFAULT)
251
+ * @returns {Promise<Object>} - Promise that resolves with haptic feedback result or rejects with error
252
+ */
253
+ requestHapticFeedback = (feedbackType = "VIRTUAL_KEY") => {
254
+ return new Promise((resolve, reject) => {
255
+ const cleanup = () => {
256
+ this.unregister(_NativeInterfaces.NATIVE_CALLBACKS.HAPTIC_FEEDBACK);
257
+ };
258
+ this.register(_NativeInterfaces.NATIVE_CALLBACKS.HAPTIC_FEEDBACK, data => {
259
+ cleanup();
260
+ try {
261
+ const result = typeof data === "string" ? JSON.parse(data) : data;
262
+ if (result.error) {
263
+ reject(new Error(result.error));
264
+ } else {
265
+ resolve(result);
266
+ }
267
+ } catch (error) {
268
+ reject(error);
269
+ }
270
+ });
271
+ try {
272
+ _NativeBridge.default.haptic.feedback(feedbackType);
273
+ } catch (error) {
274
+ cleanup();
275
+ reject(error);
276
+ }
277
+ });
278
+ };
279
+
280
+ /**
281
+ * Open camera and capture image
282
+ * @param {Object} options - Camera options (quality, format, cameraDevice, flashMode, allowEditing)
283
+ * @returns {Promise<Object>} - Promise that resolves with camera result or rejects with error
284
+ */
285
+ openCamera = (options = {}) => {
286
+ return _CameraUtils.default.openCamera(options, this.register, this.unregister);
287
+ };
288
+
289
+ /**
290
+ * Request camera permission
291
+ * @param {Object} config - Permission configuration (includeDetails)
292
+ * @returns {Promise<Object>} - Promise that resolves with permission status or rejects with error
293
+ */
294
+ requestCameraPermission = (config = {}) => {
295
+ return _CameraUtils.default.requestCameraPermission(config, this.register, this.unregister);
296
+ };
297
+ getDeviceInfoFromLegacyBridge = parseDeviceInfo => {
298
+ return new Promise((resolve, reject) => {
299
+ let timeoutId = null;
300
+ const cleanup = () => {
301
+ if (timeoutId != null) {
302
+ clearTimeout(timeoutId);
303
+ }
304
+ this.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_SUCCESS);
305
+ this.unregister(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_ERROR);
306
+ };
307
+ this.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_SUCCESS, data => {
308
+ cleanup();
309
+ resolve(parseDeviceInfo(data));
310
+ });
311
+ this.register(_NativeInterfaces.NATIVE_CALLBACKS.ON_DEVICE_INFO_ERROR, error => {
312
+ cleanup();
313
+ reject(new Error(error));
314
+ });
315
+ try {
316
+ const dispatched = _NativeBridge.default.device.getDeviceInfo();
317
+ if (dispatched === false) {
318
+ cleanup();
319
+ reject(new Error("Legacy device info bridge failed to dispatch"));
320
+ return;
321
+ }
322
+ timeoutId = setTimeout(() => {
323
+ cleanup();
324
+ reject(new Error("Legacy device info request timed out"));
325
+ }, DEVICE_INFO_REQUEST_TIMEOUT_MS);
326
+ } catch (error) {
327
+ cleanup();
328
+ reject(error);
329
+ }
330
+ });
331
+ };
332
+ getDeviceInfoFromPluginBridge = parseDeviceInfo => {
333
+ return new Promise((resolve, reject) => {
334
+ _PluginBridge.default.init();
335
+ let isSettled = false;
336
+ let timeoutId = null;
337
+ const cleanups = [];
338
+ const cleanup = () => {
339
+ if (timeoutId != null) {
340
+ clearTimeout(timeoutId);
341
+ }
342
+ while (cleanups.length > 0) {
343
+ const unregister = cleanups.pop();
344
+ unregister();
345
+ }
346
+ };
347
+ const settle = callback => {
348
+ if (isSettled) {
349
+ return;
350
+ }
351
+ isSettled = true;
352
+ cleanup();
353
+ callback();
354
+ };
355
+ cleanups.push(_PluginBridge.default.register({
356
+ pluginId: DEVICE_INFO_PLUGIN.pluginId,
357
+ eventName: DEVICE_INFO_PLUGIN.successEvent,
358
+ command: DEVICE_INFO_PLUGIN.command,
359
+ handler: payload => {
360
+ settle(() => {
361
+ try {
362
+ resolve(parseDeviceInfo(payload));
363
+ } catch (error) {
364
+ reject(error);
365
+ }
366
+ });
367
+ }
368
+ }));
369
+ cleanups.push(_PluginBridge.default.register({
370
+ pluginId: DEVICE_INFO_PLUGIN.pluginId,
371
+ eventName: DEVICE_INFO_PLUGIN.errorEvent,
372
+ command: DEVICE_INFO_PLUGIN.command,
373
+ handler: payload => {
374
+ settle(() => {
375
+ reject(createDeviceInfoError(payload, "Device info plugin failed"));
376
+ });
377
+ }
378
+ }));
379
+ cleanups.push(_PluginBridge.default.register({
380
+ pluginId: "__bridge__",
381
+ eventName: "PLUGIN_BRIDGE_ERROR",
382
+ command: DEVICE_INFO_PLUGIN.command,
383
+ handler: payload => {
384
+ const pluginId = normalizeDeviceInfoPayload(payload)?.pluginId;
385
+ if (pluginId !== DEVICE_INFO_PLUGIN.pluginId) {
386
+ return;
387
+ }
388
+ settle(() => {
389
+ reject(createDeviceInfoError(payload, "Device info plugin unavailable"));
390
+ });
391
+ }
392
+ }));
393
+ try {
394
+ _PluginBridge.default.emit({
395
+ pluginId: DEVICE_INFO_PLUGIN.pluginId,
396
+ command: DEVICE_INFO_PLUGIN.command
397
+ });
398
+ timeoutId = setTimeout(() => {
399
+ settle(() => {
400
+ reject(new Error("Device info plugin request timed out"));
401
+ });
402
+ }, DEVICE_INFO_REQUEST_TIMEOUT_MS);
403
+ } catch (error) {
404
+ cleanup();
405
+ reject(error);
406
+ }
407
+ });
408
+ };
409
+ shouldFallbackToLegacyDeviceInfo = error => {
410
+ if (!error) {
411
+ return false;
412
+ }
413
+ if (DEVICE_INFO_PLUGIN_FALLBACK_CODES.has(error.code)) {
414
+ return true;
415
+ }
416
+ if (typeof error.message !== "string") {
417
+ return false;
418
+ }
419
+ const normalizedMessage = error.message.toLowerCase();
420
+ return DEVICE_INFO_PLUGIN_FALLBACK_MESSAGES.some(message => normalizedMessage.includes(message));
421
+ };
422
+
423
+ /**
424
+ * Get device information
425
+ * @returns {Promise<Object>} - Promise that resolves with device info or rejects with error
426
+ */
427
+ getDeviceInfo = async () => {
428
+ const {
429
+ platform,
430
+ isNativeEnvironment
431
+ } = _NativeBridge.default.getEnvironmentInfo();
432
+
433
+ // Handle web environment
434
+ if (!isNativeEnvironment || platform === "web") {
435
+ return {
436
+ model: navigator.userAgent,
437
+ manufacturer: "browser",
438
+ platform: "web",
439
+ screenWidth: screen.width,
440
+ screenHeight: screen.height,
441
+ screenDensity: window.devicePixelRatio
442
+ };
443
+ }
444
+
445
+ // Key mapping from native to web keys
446
+ const DEVICE_INFO_KEY_MAP = {
447
+ android: {
448
+ model: "model",
449
+ manufacturer: "manufacturer",
450
+ platform: "platform",
451
+ screenWidth: "screenWidth",
452
+ screenHeight: "screenHeight",
453
+ screenDensity: "screenDensity",
454
+ appInfo: "appInfo"
455
+ },
456
+ ios: {
457
+ model: "model",
458
+ manufacturer: "manufacturer",
459
+ platform: "platform",
460
+ screenWidth: "screenWidth",
461
+ screenHeight: "screenHeight",
462
+ screenDensity: "screenDensity",
463
+ appInfo: "appInfo"
464
+ }
465
+ };
466
+ const parseDeviceInfo = data => {
467
+ const rawDeviceInfo = typeof data === "string" ? JSON.parse(data) : data;
468
+ const platformMapping = DEVICE_INFO_KEY_MAP[platform] || {};
469
+ return Object.fromEntries(Object.entries(rawDeviceInfo).map(([key, value]) => [platformMapping[key] || key, value]));
470
+ };
471
+ try {
472
+ return await this.getDeviceInfoFromPluginBridge(parseDeviceInfo);
473
+ } catch (error) {
474
+ if (!this.shouldFallbackToLegacyDeviceInfo(error)) {
475
+ throw error;
476
+ }
477
+ return this.getDeviceInfoFromLegacyBridge(parseDeviceInfo);
478
+ }
479
+ };
480
+ }
481
+ var _default = exports.default = WebBridge;