react-native-unistyles 3.0.0-alpha.2 → 3.0.0-alpha.20

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/Unistyles.podspec +3 -2
  2. package/cxx/common/Constants.h +2 -0
  3. package/cxx/common/Helpers.h +97 -5
  4. package/cxx/core/HostStyle.cpp +19 -13
  5. package/cxx/core/HostStyle.h +4 -0
  6. package/cxx/core/StyleSheet.h +0 -2
  7. package/cxx/core/StyleSheetRegistry.cpp +10 -13
  8. package/cxx/core/StyleSheetRegistry.h +4 -4
  9. package/cxx/core/Unistyle.h +7 -10
  10. package/cxx/core/UnistyleData.h +23 -0
  11. package/cxx/core/UnistyleWrapper.h +78 -10
  12. package/cxx/core/UnistylesCommitHook.cpp +22 -13
  13. package/cxx/core/UnistylesCommitHook.h +8 -1
  14. package/cxx/core/UnistylesCommitShadowNode.h +13 -0
  15. package/cxx/core/UnistylesMountHook.cpp +37 -0
  16. package/cxx/core/UnistylesMountHook.h +31 -0
  17. package/cxx/core/UnistylesRegistry.cpp +56 -81
  18. package/cxx/core/UnistylesRegistry.h +15 -13
  19. package/cxx/core/UnistylesState.cpp +14 -8
  20. package/cxx/core/UnistylesState.h +1 -0
  21. package/cxx/hybridObjects/HybridShadowRegistry.cpp +15 -9
  22. package/cxx/hybridObjects/HybridStyleSheet.cpp +43 -38
  23. package/cxx/hybridObjects/HybridStyleSheet.h +10 -7
  24. package/cxx/hybridObjects/HybridUnistylesRuntime.cpp +35 -16
  25. package/cxx/hybridObjects/HybridUnistylesRuntime.h +2 -0
  26. package/cxx/parser/Parser.cpp +105 -164
  27. package/cxx/parser/Parser.h +8 -14
  28. package/cxx/shadowTree/ShadowLeafUpdate.h +1 -1
  29. package/cxx/shadowTree/ShadowTrafficController.h +33 -0
  30. package/cxx/shadowTree/ShadowTreeManager.cpp +13 -11
  31. package/cxx/shadowTree/ShadowTreeManager.h +1 -0
  32. package/ios/Unistyles.h +1 -0
  33. package/ios/UnistylesModuleOnLoad.h +2 -0
  34. package/ios/UnistylesModuleOnLoad.mm +8 -1
  35. package/lib/commonjs/index.js +4 -0
  36. package/lib/commonjs/index.js.map +1 -1
  37. package/lib/commonjs/specs/NavigtionBar/index.js +1 -1
  38. package/lib/commonjs/specs/NavigtionBar/index.js.map +1 -1
  39. package/lib/commonjs/specs/ShadowRegistry/index.js +7 -6
  40. package/lib/commonjs/specs/ShadowRegistry/index.js.map +1 -1
  41. package/lib/commonjs/specs/StatusBar/index.js +1 -1
  42. package/lib/commonjs/specs/StatusBar/index.js.map +1 -1
  43. package/lib/commonjs/specs/StyleSheet/index.js.map +1 -1
  44. package/lib/commonjs/specs/UnistylesRuntime/index.js +1 -1
  45. package/lib/commonjs/specs/UnistylesRuntime/index.js.map +1 -1
  46. package/lib/commonjs/specs/index.web.js +1 -1
  47. package/lib/commonjs/web/convert/boxShadow.js +77 -0
  48. package/lib/commonjs/web/convert/boxShadow.js.map +1 -0
  49. package/lib/commonjs/web/convert/breakpoint.js +25 -0
  50. package/lib/commonjs/web/convert/breakpoint.js.map +1 -0
  51. package/lib/commonjs/web/convert/index.js +76 -0
  52. package/lib/commonjs/web/convert/index.js.map +1 -0
  53. package/lib/commonjs/web/convert/module.d.js +2 -0
  54. package/lib/commonjs/web/convert/module.d.js.map +1 -0
  55. package/lib/commonjs/web/convert/shadow.js +68 -0
  56. package/lib/commonjs/web/convert/shadow.js.map +1 -0
  57. package/lib/commonjs/web/convert/style.js +89 -0
  58. package/lib/commonjs/web/convert/style.js.map +1 -0
  59. package/lib/commonjs/web/convert/textShadow.js +73 -0
  60. package/lib/commonjs/web/convert/textShadow.js.map +1 -0
  61. package/lib/commonjs/web/convert/transform.js +72 -0
  62. package/lib/commonjs/web/convert/transform.js.map +1 -0
  63. package/lib/commonjs/web/convert/types.js +9 -0
  64. package/lib/commonjs/web/convert/types.js.map +1 -0
  65. package/lib/commonjs/web/convert/utils.js +55 -0
  66. package/lib/commonjs/web/convert/utils.js.map +1 -0
  67. package/lib/commonjs/web/create.js +51 -0
  68. package/lib/commonjs/web/create.js.map +1 -0
  69. package/lib/commonjs/web/createUnistylesComponent.js +61 -0
  70. package/lib/commonjs/web/createUnistylesComponent.js.map +1 -0
  71. package/lib/commonjs/web/index.js +60 -0
  72. package/lib/commonjs/web/index.js.map +1 -0
  73. package/lib/commonjs/web/listener/index.js +20 -0
  74. package/lib/commonjs/web/listener/index.js.map +1 -0
  75. package/lib/commonjs/web/listener/listenToDependencies.js +38 -0
  76. package/lib/commonjs/web/listener/listenToDependencies.js.map +1 -0
  77. package/lib/commonjs/web/listener/listener.js +35 -0
  78. package/lib/commonjs/web/listener/listener.js.map +1 -0
  79. package/lib/commonjs/web/mock.js +28 -0
  80. package/lib/commonjs/web/mock.js.map +1 -0
  81. package/lib/commonjs/web/mq.js +23 -0
  82. package/lib/commonjs/web/mq.js.map +1 -0
  83. package/lib/commonjs/web/pseudo.js +10 -0
  84. package/lib/commonjs/web/pseudo.js.map +1 -0
  85. package/lib/commonjs/web/registry.js +50 -0
  86. package/lib/commonjs/web/registry.js.map +1 -0
  87. package/lib/commonjs/web/runtime.js +163 -0
  88. package/lib/commonjs/web/runtime.js.map +1 -0
  89. package/lib/commonjs/web/shadowRegistry.js +123 -0
  90. package/lib/commonjs/web/shadowRegistry.js.map +1 -0
  91. package/lib/commonjs/web/state.js +81 -0
  92. package/lib/commonjs/web/state.js.map +1 -0
  93. package/lib/commonjs/web/utils.js +130 -0
  94. package/lib/commonjs/web/utils.js.map +1 -0
  95. package/lib/commonjs/web/variants/getVariants.js +39 -0
  96. package/lib/commonjs/web/variants/getVariants.js.map +1 -0
  97. package/lib/commonjs/web/variants/index.js +28 -0
  98. package/lib/commonjs/web/variants/index.js.map +1 -0
  99. package/lib/commonjs/web/variants/useVariants.js +59 -0
  100. package/lib/commonjs/web/variants/useVariants.js.map +1 -0
  101. package/lib/module/index.js +4 -0
  102. package/lib/module/index.js.map +1 -1
  103. package/lib/module/specs/NavigtionBar/index.js +1 -1
  104. package/lib/module/specs/NavigtionBar/index.js.map +1 -1
  105. package/lib/module/specs/ShadowRegistry/index.js +7 -6
  106. package/lib/module/specs/ShadowRegistry/index.js.map +1 -1
  107. package/lib/module/specs/StatusBar/index.js +1 -1
  108. package/lib/module/specs/StatusBar/index.js.map +1 -1
  109. package/lib/module/specs/StyleSheet/index.js.map +1 -1
  110. package/lib/module/specs/UnistylesRuntime/index.js +1 -1
  111. package/lib/module/specs/UnistylesRuntime/index.js.map +1 -1
  112. package/lib/module/specs/index.web.js +1 -1
  113. package/lib/module/specs/index.web.js.map +1 -1
  114. package/lib/module/web/convert/boxShadow.js +72 -0
  115. package/lib/module/web/convert/boxShadow.js.map +1 -0
  116. package/lib/module/web/convert/breakpoint.js +20 -0
  117. package/lib/module/web/convert/breakpoint.js.map +1 -0
  118. package/lib/module/web/convert/index.js +71 -0
  119. package/lib/module/web/convert/index.js.map +1 -0
  120. package/lib/module/web/convert/module.d.js +2 -0
  121. package/lib/module/web/convert/module.d.js.map +1 -0
  122. package/lib/module/web/convert/shadow.js +63 -0
  123. package/lib/module/web/convert/shadow.js.map +1 -0
  124. package/lib/module/web/convert/style.js +84 -0
  125. package/lib/module/web/convert/style.js.map +1 -0
  126. package/lib/module/web/convert/textShadow.js +68 -0
  127. package/lib/module/web/convert/textShadow.js.map +1 -0
  128. package/lib/module/web/convert/transform.js +67 -0
  129. package/lib/module/web/convert/transform.js.map +1 -0
  130. package/lib/module/web/convert/types.js +5 -0
  131. package/lib/module/web/convert/types.js.map +1 -0
  132. package/lib/module/web/convert/utils.js +43 -0
  133. package/lib/module/web/convert/utils.js.map +1 -0
  134. package/lib/module/web/create.js +46 -0
  135. package/lib/module/web/create.js.map +1 -0
  136. package/lib/module/web/createUnistylesComponent.js +54 -0
  137. package/lib/module/web/createUnistylesComponent.js.map +1 -0
  138. package/lib/module/web/index.js +26 -0
  139. package/lib/module/web/index.js.map +1 -0
  140. package/lib/module/web/listener/index.js +5 -0
  141. package/lib/module/web/listener/index.js.map +1 -0
  142. package/lib/module/web/listener/listenToDependencies.js +33 -0
  143. package/lib/module/web/listener/listenToDependencies.js.map +1 -0
  144. package/lib/module/web/listener/listener.js +31 -0
  145. package/lib/module/web/listener/listener.js.map +1 -0
  146. package/lib/module/web/mock.js +24 -0
  147. package/lib/module/web/mock.js.map +1 -0
  148. package/lib/module/web/mq.js +17 -0
  149. package/lib/module/web/mq.js.map +1 -0
  150. package/lib/module/web/pseudo.js +5 -0
  151. package/lib/module/web/pseudo.js.map +1 -0
  152. package/lib/module/web/registry.js +46 -0
  153. package/lib/module/web/registry.js.map +1 -0
  154. package/lib/module/web/runtime.js +159 -0
  155. package/lib/module/web/runtime.js.map +1 -0
  156. package/lib/module/web/shadowRegistry.js +119 -0
  157. package/lib/module/web/shadowRegistry.js.map +1 -0
  158. package/lib/module/web/state.js +77 -0
  159. package/lib/module/web/state.js.map +1 -0
  160. package/lib/module/web/utils.js +112 -0
  161. package/lib/module/web/utils.js.map +1 -0
  162. package/lib/module/web/variants/getVariants.js +34 -0
  163. package/lib/module/web/variants/getVariants.js.map +1 -0
  164. package/lib/module/web/variants/index.js +5 -0
  165. package/lib/module/web/variants/index.js.map +1 -0
  166. package/lib/module/web/variants/useVariants.js +54 -0
  167. package/lib/module/web/variants/useVariants.js.map +1 -0
  168. package/lib/typescript/example/App.d.ts.map +1 -1
  169. package/lib/typescript/example/Typography.d.ts +12 -0
  170. package/lib/typescript/example/Typography.d.ts.map +1 -0
  171. package/lib/typescript/src/specs/ShadowRegistry/index.d.ts +3 -3
  172. package/lib/typescript/src/specs/ShadowRegistry/index.d.ts.map +1 -1
  173. package/lib/typescript/src/specs/StyleSheet/index.d.ts +2 -1
  174. package/lib/typescript/src/specs/StyleSheet/index.d.ts.map +1 -1
  175. package/lib/typescript/src/specs/index.web.d.ts +1 -1
  176. package/lib/typescript/src/specs/index.web.d.ts.map +1 -1
  177. package/lib/typescript/src/types/stylesheet.d.ts +2 -2
  178. package/lib/typescript/src/types/stylesheet.d.ts.map +1 -1
  179. package/lib/typescript/src/web/convert/boxShadow.d.ts.map +1 -0
  180. package/lib/typescript/src/web/convert/breakpoint.d.ts.map +1 -0
  181. package/lib/typescript/{web → src/web}/convert/index.d.ts +1 -1
  182. package/lib/typescript/src/web/convert/index.d.ts.map +1 -0
  183. package/lib/typescript/src/web/convert/shadow.d.ts.map +1 -0
  184. package/lib/typescript/src/web/convert/style.d.ts.map +1 -0
  185. package/lib/typescript/src/web/convert/textShadow.d.ts.map +1 -0
  186. package/lib/typescript/src/web/convert/transform.d.ts.map +1 -0
  187. package/lib/typescript/{web → src/web}/convert/types.d.ts +1 -1
  188. package/lib/typescript/src/web/convert/types.d.ts.map +1 -0
  189. package/lib/typescript/src/web/convert/utils.d.ts.map +1 -0
  190. package/lib/typescript/{web → src/web}/create.d.ts +11 -11
  191. package/lib/typescript/{web → src/web}/create.d.ts.map +1 -1
  192. package/lib/typescript/src/web/createUnistylesComponent.d.ts +3 -0
  193. package/lib/typescript/src/web/createUnistylesComponent.d.ts.map +1 -0
  194. package/lib/typescript/{web → src/web}/index.d.ts +14 -13
  195. package/lib/typescript/{web → src/web}/index.d.ts.map +1 -1
  196. package/lib/typescript/src/web/listener/index.d.ts +3 -0
  197. package/lib/typescript/src/web/listener/index.d.ts.map +1 -0
  198. package/lib/typescript/src/web/listener/listenToDependencies.d.ts +12 -0
  199. package/lib/typescript/src/web/listener/listenToDependencies.d.ts.map +1 -0
  200. package/lib/typescript/{web → src/web}/listener/listener.d.ts +3 -2
  201. package/lib/typescript/src/web/listener/listener.d.ts.map +1 -0
  202. package/lib/typescript/src/web/mock.d.ts +5 -0
  203. package/lib/typescript/src/web/mock.d.ts.map +1 -0
  204. package/lib/typescript/src/web/mq.d.ts.map +1 -0
  205. package/lib/typescript/src/web/pseudo.d.ts +6 -0
  206. package/lib/typescript/src/web/pseudo.d.ts.map +1 -0
  207. package/lib/typescript/src/web/registry.d.ts +15 -0
  208. package/lib/typescript/src/web/registry.d.ts.map +1 -0
  209. package/lib/typescript/{web → src/web}/runtime.d.ts +6 -7
  210. package/lib/typescript/src/web/runtime.d.ts.map +1 -0
  211. package/lib/typescript/src/web/shadowRegistry.d.ts +17 -0
  212. package/lib/typescript/src/web/shadowRegistry.d.ts.map +1 -0
  213. package/lib/typescript/{web → src/web}/state.d.ts +4 -9
  214. package/lib/typescript/src/web/state.d.ts.map +1 -0
  215. package/lib/typescript/src/web/utils.d.ts +35 -0
  216. package/lib/typescript/src/web/utils.d.ts.map +1 -0
  217. package/lib/typescript/src/web/variants/getVariants.d.ts +3 -0
  218. package/lib/typescript/src/web/variants/getVariants.d.ts.map +1 -0
  219. package/lib/typescript/src/web/variants/index.d.ts +3 -0
  220. package/lib/typescript/src/web/variants/index.d.ts.map +1 -0
  221. package/lib/typescript/src/web/variants/useVariants.d.ts +3 -0
  222. package/lib/typescript/src/web/variants/useVariants.d.ts.map +1 -0
  223. package/nitrogen/generated/android/c++/JHybridNativePlatformSpec.hpp +6 -3
  224. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unistyles/HybridNativePlatformSpec.kt +8 -3
  225. package/nitrogen/generated/ios/c++/HybridNativePlatformSpecSwift.hpp +1 -1
  226. package/nitrogen/generated/ios/swift/HybridNativePlatformSpec.swift +1 -1
  227. package/nitrogen/generated/ios/swift/HybridNativePlatformSpecCxx.swift +14 -2
  228. package/nitrogen/generated/shared/c++/HybridNativePlatformSpec.hpp +3 -0
  229. package/nitrogen/generated/shared/c++/HybridUnistylesNavigationBarSpec.hpp +3 -0
  230. package/nitrogen/generated/shared/c++/HybridUnistylesRuntimeSpec.hpp +3 -0
  231. package/nitrogen/generated/shared/c++/HybridUnistylesShadowRegistrySpec.hpp +3 -0
  232. package/nitrogen/generated/shared/c++/HybridUnistylesStatusBarSpec.hpp +3 -0
  233. package/nitrogen/generated/shared/c++/HybridUnistylesStyleSheetSpec.cpp +1 -1
  234. package/nitrogen/generated/shared/c++/HybridUnistylesStyleSheetSpec.hpp +4 -1
  235. package/package.json +3 -3
  236. package/plugin/__tests__/dependencies.spec.js +199 -111
  237. package/plugin/__tests__/ref.spec.js +638 -202
  238. package/plugin/__tests__/stylesheet.spec.js +182 -71
  239. package/plugin/index.js +110 -23
  240. package/plugin/ref.js +64 -13
  241. package/plugin/style.js +82 -22
  242. package/plugin/stylesheet.js +44 -1
  243. package/plugin/variants.js +33 -0
  244. package/src/index.ts +3 -0
  245. package/src/specs/NavigtionBar/index.ts +1 -1
  246. package/src/specs/ShadowRegistry/index.ts +10 -9
  247. package/src/specs/StatusBar/index.ts +1 -1
  248. package/src/specs/StyleSheet/index.ts +3 -1
  249. package/src/specs/UnistylesRuntime/index.ts +1 -1
  250. package/src/specs/index.web.ts +1 -1
  251. package/src/types/stylesheet.ts +2 -2
  252. package/{web → src/web}/convert/breakpoint.ts +1 -1
  253. package/{web → src/web}/convert/index.ts +2 -2
  254. package/{web → src/web}/convert/types.ts +1 -1
  255. package/src/web/create.ts +50 -0
  256. package/src/web/createUnistylesComponent.tsx +54 -0
  257. package/{web → src/web}/index.ts +3 -2
  258. package/src/web/listener/index.ts +2 -0
  259. package/src/web/listener/listenToDependencies.ts +45 -0
  260. package/{web → src/web}/listener/listener.ts +2 -2
  261. package/{web → src/web}/mock.ts +2 -12
  262. package/src/web/pseudo.ts +137 -0
  263. package/src/web/registry.ts +60 -0
  264. package/{web → src/web}/runtime.ts +4 -6
  265. package/src/web/shadowRegistry.ts +124 -0
  266. package/{web → src/web}/state.ts +5 -49
  267. package/{web → src/web}/utils.ts +91 -17
  268. package/src/web/variants/getVariants.ts +42 -0
  269. package/src/web/variants/index.ts +2 -0
  270. package/src/web/variants/useVariants.ts +65 -0
  271. package/lib/typescript/web/convert/boxShadow.d.ts.map +0 -1
  272. package/lib/typescript/web/convert/breakpoint.d.ts.map +0 -1
  273. package/lib/typescript/web/convert/index.d.ts.map +0 -1
  274. package/lib/typescript/web/convert/shadow.d.ts.map +0 -1
  275. package/lib/typescript/web/convert/style.d.ts.map +0 -1
  276. package/lib/typescript/web/convert/textShadow.d.ts.map +0 -1
  277. package/lib/typescript/web/convert/transform.d.ts.map +0 -1
  278. package/lib/typescript/web/convert/types.d.ts.map +0 -1
  279. package/lib/typescript/web/convert/utils.d.ts.map +0 -1
  280. package/lib/typescript/web/listener/index.d.ts +0 -2
  281. package/lib/typescript/web/listener/index.d.ts.map +0 -1
  282. package/lib/typescript/web/listener/listener.d.ts.map +0 -1
  283. package/lib/typescript/web/mock.d.ts +0 -14
  284. package/lib/typescript/web/mock.d.ts.map +0 -1
  285. package/lib/typescript/web/mq.d.ts.map +0 -1
  286. package/lib/typescript/web/pseudo.d.ts +0 -4
  287. package/lib/typescript/web/pseudo.d.ts.map +0 -1
  288. package/lib/typescript/web/registry.d.ts +0 -12
  289. package/lib/typescript/web/registry.d.ts.map +0 -1
  290. package/lib/typescript/web/runtime.d.ts.map +0 -1
  291. package/lib/typescript/web/state.d.ts.map +0 -1
  292. package/lib/typescript/web/useVariants.d.ts +0 -3
  293. package/lib/typescript/web/useVariants.d.ts.map +0 -1
  294. package/lib/typescript/web/utils.d.ts +0 -18
  295. package/lib/typescript/web/utils.d.ts.map +0 -1
  296. package/web/create.ts +0 -102
  297. package/web/listener/index.ts +0 -1
  298. package/web/pseudo.ts +0 -11
  299. package/web/registry.ts +0 -41
  300. package/web/useVariants.ts +0 -99
  301. /package/lib/typescript/{web → src/web}/convert/boxShadow.d.ts +0 -0
  302. /package/lib/typescript/{web → src/web}/convert/breakpoint.d.ts +0 -0
  303. /package/lib/typescript/{web → src/web}/convert/shadow.d.ts +0 -0
  304. /package/lib/typescript/{web → src/web}/convert/style.d.ts +0 -0
  305. /package/lib/typescript/{web → src/web}/convert/textShadow.d.ts +0 -0
  306. /package/lib/typescript/{web → src/web}/convert/transform.d.ts +0 -0
  307. /package/lib/typescript/{web → src/web}/convert/utils.d.ts +0 -0
  308. /package/lib/typescript/{web → src/web}/mq.d.ts +0 -0
  309. /package/{web → src/web}/convert/boxShadow.ts +0 -0
  310. /package/{web → src/web}/convert/module.d.ts +0 -0
  311. /package/{web → src/web}/convert/shadow.ts +0 -0
  312. /package/{web → src/web}/convert/style.ts +0 -0
  313. /package/{web → src/web}/convert/textShadow.ts +0 -0
  314. /package/{web → src/web}/convert/transform.ts +0 -0
  315. /package/{web → src/web}/convert/utils.ts +0 -0
  316. /package/{web → src/web}/mq.ts +0 -0
@@ -11,16 +11,17 @@
11
11
  #include "Parser.h"
12
12
  #include "ShadowTreeManager.h"
13
13
  #include "UnistylesCommitHook.h"
14
+ #include "UnistylesMountHook.h"
14
15
 
15
16
  using namespace margelo::nitro::unistyles;
16
17
  using namespace facebook::react;
17
18
 
18
19
  struct HybridStyleSheet: public HybridUnistylesStyleSheetSpec {
19
- HybridStyleSheet(std::shared_ptr<HybridUnistylesRuntime> unistylesRuntime)
20
- : HybridObject(TAG), _unistylesRuntime{unistylesRuntime} {
21
- this->_unistylesRuntime->registerPlatformListener(
22
- std::bind(&HybridStyleSheet::onPlatformDependenciesChange, this, std::placeholders::_1)
23
- );
20
+ HybridStyleSheet(std::shared_ptr<HybridUnistylesRuntime> unistylesRuntime, std::shared_ptr<UIManager> uiManager)
21
+ : HybridObject(TAG), _unistylesRuntime{unistylesRuntime}, _uiManager{uiManager} {
22
+ this->_unistylesRuntime->registerPlatformListener(
23
+ std::bind(&HybridStyleSheet::onPlatformDependenciesChange, this, std::placeholders::_1)
24
+ );
24
25
  }
25
26
 
26
27
  jsi::Value create(jsi::Runtime& rt,
@@ -42,7 +43,7 @@ struct HybridStyleSheet: public HybridUnistylesStyleSheetSpec {
42
43
  };
43
44
 
44
45
  double getHairlineWidth() override;
45
- double get___unid() override;
46
+ double get__unid() override;
46
47
 
47
48
  private:
48
49
  void parseSettings(jsi::Runtime& rt, jsi::Object settings);
@@ -51,11 +52,13 @@ private:
51
52
  void verifyAndSelectTheme(jsi::Runtime &rt);
52
53
  void setThemeFromColorScheme(jsi::Runtime& rt);
53
54
  void loadExternalMethods(const jsi::Value& thisValue, jsi::Runtime& rt);
55
+ void registerHooks(jsi::Runtime& rt);
54
56
  void onPlatformDependenciesChange(std::vector<UnistyleDependency> dependencies);
55
- void registerCommitHook(jsi::Runtime& rt);
56
57
 
57
58
  double __unid = -1;
58
59
  std::shared_ptr<HybridUnistylesRuntime> _unistylesRuntime;
59
60
  std::shared_ptr<core::UnistylesCommitHook> _unistylesCommitHook;
61
+ std::shared_ptr<core::UnistylesMountHook> _unistylesMountHook;
62
+ std::shared_ptr<UIManager> _uiManager;
60
63
  };
61
64
 
@@ -45,7 +45,7 @@ Insets HybridUnistylesRuntime::getInsets() {
45
45
 
46
46
  Orientation HybridUnistylesRuntime::getOrientation() {
47
47
  int orientation = this->_nativePlatform.getOrientation();
48
-
48
+
49
49
  return static_cast<Orientation>(orientation);
50
50
  };
51
51
 
@@ -58,7 +58,7 @@ double HybridUnistylesRuntime::getFontScale() {
58
58
  };
59
59
 
60
60
  void HybridUnistylesRuntime::setTheme(const std::string &themeName) {
61
- helpers::assertThat(*_rt, !this->getHasAdaptiveThemes(), "You're trying to set theme to: '" + themeName + "', but adaptiveThemes are enabled.");
61
+ helpers::assertThat(*_rt, !this->getHasAdaptiveThemes(), "Unistyles: You're trying to set theme to: '" + themeName + "', but adaptiveThemes are enabled.");
62
62
 
63
63
  auto& state = core::UnistylesRegistry::get().getState(*_rt);
64
64
 
@@ -68,14 +68,17 @@ void HybridUnistylesRuntime::setTheme(const std::string &themeName) {
68
68
 
69
69
  void HybridUnistylesRuntime::setAdaptiveThemes(bool isEnabled) {
70
70
  auto& registry = core::UnistylesRegistry::get();
71
-
71
+
72
72
  std::vector<UnistyleDependency> changedDependencies{};
73
+
74
+ changedDependencies.reserve(3);
75
+
73
76
  bool hadAdaptiveThemes = this->getHasAdaptiveThemes();
74
77
 
75
78
  registry.setPrefersAdaptiveThemes(*_rt, isEnabled);
76
-
79
+
77
80
  bool haveAdaptiveThemes = this->getHasAdaptiveThemes();
78
-
81
+
79
82
  if (hadAdaptiveThemes != haveAdaptiveThemes) {
80
83
  changedDependencies.push_back(UnistyleDependency::ADAPTIVETHEMES);
81
84
  }
@@ -83,12 +86,17 @@ void HybridUnistylesRuntime::setAdaptiveThemes(bool isEnabled) {
83
86
  // if user disabled it, or can't have adaptive themes, do nothing
84
87
  if (!this->getHasAdaptiveThemes()) {
85
88
  this->_onDependenciesChange(changedDependencies);
86
-
89
+
87
90
  return;
88
91
  }
89
92
 
90
93
  // if user enabled adaptive themes, then we need to make sure
91
94
  // we selected theme based on color scheme
95
+ this->calculateNewThemeAndDependencies(changedDependencies);
96
+ this->_onDependenciesChange(changedDependencies);
97
+ };
98
+
99
+ void HybridUnistylesRuntime::calculateNewThemeAndDependencies(std::vector<UnistyleDependency>& changedDependencies) {
92
100
  auto& state = core::UnistylesRegistry::get().getState(*_rt);
93
101
  auto colorScheme = this->getColorScheme();
94
102
  auto currentThemeName = this->getThemeName();
@@ -99,24 +107,23 @@ void HybridUnistylesRuntime::setAdaptiveThemes(bool isEnabled) {
99
107
  if (!currentThemeName.has_value() || nextTheme != currentThemeName.value()) {
100
108
  changedDependencies.push_back(UnistyleDependency::THEME);
101
109
  changedDependencies.push_back(UnistyleDependency::THEMENAME);
102
-
110
+
103
111
  state.setTheme(nextTheme);
104
112
  }
105
-
106
- this->_onDependenciesChange(changedDependencies);
107
- };
113
+ }
108
114
 
109
115
  jsi::Value HybridUnistylesRuntime::updateTheme(jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) {
110
- helpers::assertThat(rt, args[0].isString(), "first argument expected to be a string.");
111
- helpers::assertThat(rt, args[1].isObject(), "second argument expected to be a function.");
116
+ helpers::assertThat(rt, count == 2, "UnistylesRuntime.updateTheme expected to be called with 2 arguments.");
117
+ helpers::assertThat(rt, args[0].isString(), "UnistylesRuntime.updateTheme expected first argument to be a string.");
118
+ helpers::assertThat(rt, args[1].isObject(), "UnistylesRuntime.updateTheme expected first argument to be a function.");
112
119
 
113
120
  auto& registry = core::UnistylesRegistry::get();
114
121
  auto themeName = args[0].asString(rt).utf8(rt);
115
122
 
116
- helpers::assertThat(rt, args[1].asObject(rt).isFunction(rt), "second argument expected to be a function.");
123
+ helpers::assertThat(rt, args[1].asObject(rt).isFunction(rt), "UnistylesRuntime.updateTheme expected second argument to be a function.");
117
124
 
118
125
  registry.updateTheme(rt, themeName, args[1].asObject(rt).asFunction(rt));
119
-
126
+
120
127
  this->_onDependenciesChange({UnistyleDependency::THEME});
121
128
 
122
129
  return jsi::Value::undefined();
@@ -163,7 +170,7 @@ UnistylesCxxMiniRuntime HybridUnistylesRuntime::getMiniRuntime() {
163
170
  nativeMiniRuntime.statusBar,
164
171
  nativeMiniRuntime.navigationBar
165
172
  };
166
-
173
+
167
174
  return cxxMiniRuntime;
168
175
  }
169
176
 
@@ -185,7 +192,7 @@ jsi::Value HybridUnistylesRuntime::getMiniRuntimeAsValue(jsi::Runtime& rt) {
185
192
  obj.setProperty(rt, "rtl", JSIConverter<bool>::toJSI(rt, miniRuntime.rtl));
186
193
  obj.setProperty(rt, "statusBar", JSIConverter<Dimensions>::toJSI(rt, miniRuntime.statusBar));
187
194
  obj.setProperty(rt, "navigationBar", JSIConverter<Dimensions>::toJSI(rt, miniRuntime.navigationBar));
188
-
195
+
189
196
  return obj;
190
197
  }
191
198
 
@@ -197,3 +204,15 @@ void HybridUnistylesRuntime::registerPlatformListener(const std::function<void(s
197
204
  this->_nativePlatform.registerPlatformListener(listener);
198
205
  this->_onDependenciesChange = listener;
199
206
  }
207
+
208
+ void HybridUnistylesRuntime::includeDependenciesForColorSchemeChange(std::vector<UnistyleDependency>& deps) {
209
+ auto& registry = core::UnistylesRegistry::get();
210
+ auto& state = registry.getState(*this->_rt);
211
+
212
+ // ignore color scheme changes if user has no adaptive themes
213
+ if (!state.hasAdaptiveThemes()) {
214
+ return;
215
+ }
216
+
217
+ this->calculateNewThemeAndDependencies(deps);
218
+ }
@@ -58,6 +58,8 @@ struct HybridUnistylesRuntime: public HybridUnistylesRuntimeSpec {
58
58
  UnistylesCxxMiniRuntime getMiniRuntime() override;
59
59
  jsi::Value getMiniRuntimeAsValue(jsi::Runtime& rt);
60
60
  jsi::Runtime& getRuntime();
61
+ void includeDependenciesForColorSchemeChange(std::vector<UnistyleDependency>& deps);
62
+ void calculateNewThemeAndDependencies(std::vector<UnistyleDependency>& deps);
61
63
 
62
64
  private:
63
65
  jsi::Runtime* _rt;
@@ -11,7 +11,7 @@ void parser::Parser::buildUnistyles(jsi::Runtime& rt, std::shared_ptr<StyleSheet
11
11
  jsi::Object unwrappedStyleSheet = this->unwrapStyleSheet(rt, styleSheet);
12
12
 
13
13
  helpers::enumerateJSIObject(rt, unwrappedStyleSheet, [&](const std::string& styleKey, jsi::Value& propertyValue){
14
- helpers::assertThat(rt, propertyValue.isObject(), "style with name '" + styleKey + "' is not a function or object.");
14
+ helpers::assertThat(rt, propertyValue.isObject(), "Unistyles: Style with name '" + styleKey + "' is not a function or object.");
15
15
 
16
16
  jsi::Object styleValue = propertyValue.asObject(rt);
17
17
 
@@ -20,7 +20,8 @@ void parser::Parser::buildUnistyles(jsi::Runtime& rt, std::shared_ptr<StyleSheet
20
20
  styleSheet->unistyles[styleKey] = std::make_shared<UnistyleDynamicFunction>(
21
21
  UnistyleType::DynamicFunction,
22
22
  styleKey,
23
- styleValue
23
+ styleValue,
24
+ styleSheet
24
25
  );
25
26
 
26
27
  return;
@@ -29,7 +30,8 @@ void parser::Parser::buildUnistyles(jsi::Runtime& rt, std::shared_ptr<StyleSheet
29
30
  styleSheet->unistyles[styleKey] = std::make_shared<Unistyle>(
30
31
  UnistyleType::Object,
31
32
  styleKey,
32
- styleValue
33
+ styleValue,
34
+ styleSheet
33
35
  );
34
36
  });
35
37
  }
@@ -68,14 +70,14 @@ jsi::Object parser::Parser::unwrapStyleSheet(jsi::Runtime& rt, std::shared_ptr<S
68
70
  void parser::Parser::parseUnistyles(jsi::Runtime& rt, std::shared_ptr<StyleSheet> styleSheet) {
69
71
  for (const auto& [_, unistyle] : styleSheet->unistyles) {
70
72
  if (unistyle->type == core::UnistyleType::Object) {
71
- auto result = this->parseFirstLevel(rt, unistyle, styleSheet->variants);
73
+ auto result = this->parseFirstLevel(rt, unistyle, std::nullopt);
72
74
 
73
75
  unistyle->parsedStyle = std::move(result);
74
76
  unistyle->seal();
75
77
  }
76
78
 
77
79
  if (unistyle->type == core::UnistyleType::DynamicFunction) {
78
- auto hostFn = this->createDynamicFunctionProxy(rt, unistyle, styleSheet->variants);
80
+ auto hostFn = this->createDynamicFunctionProxy(rt, unistyle);
79
81
  auto unistyleFn = std::dynamic_pointer_cast<UnistyleDynamicFunction>(unistyle);
80
82
 
81
83
  // defer parsing dynamic functions
@@ -85,57 +87,72 @@ void parser::Parser::parseUnistyles(jsi::Runtime& rt, std::shared_ptr<StyleSheet
85
87
  }
86
88
 
87
89
  // rebuild all unistyles in StyleSheet that depends on variants
88
- void parser::Parser::rebuildUnistylesWithVariants(jsi::Runtime& rt, std::shared_ptr<StyleSheet> styleSheet) {
90
+ void parser::Parser::rebuildUnistylesWithVariants(jsi::Runtime& rt, std::shared_ptr<StyleSheet> styleSheet, Variants& variants) {
89
91
  for (const auto& [_, unistyle] : styleSheet->unistyles) {
90
92
  if (!unistyle->dependsOn(UnistyleDependency::VARIANTS)) {
91
93
  continue;
92
94
  }
93
95
 
94
- this->rebuildUnistyle(rt, styleSheet, unistyle);
96
+ // todo skip dynamic functions
97
+ this->rebuildUnistyle(rt, styleSheet, unistyle, variants, std::nullopt);
95
98
  }
96
99
  }
97
100
 
98
101
  // rebuild all unistyles that are affected by platform event
99
102
  void parser::Parser::rebuildUnistylesInDependencyMap(jsi::Runtime& rt, DependencyMap& dependencyMap) {
100
- for (const auto& [styleSheet, map] : dependencyMap) {
101
- jsi::Object unwrappedStyleSheet = this->unwrapStyleSheet(rt, styleSheet);
102
-
103
- for (const auto& [shadowNode, unistyles] : map) {
104
- for (const auto& unistyle : unistyles) {
105
- // StyleSheet might have styles that are not affected
106
- if (!unwrappedStyleSheet.hasProperty(rt, unistyle->styleKey.c_str())) {
107
- continue;
108
- }
109
-
110
- unistyle->rawValue = unwrappedStyleSheet.getProperty(rt, unistyle->styleKey.c_str()).asObject(rt);
111
- this->rebuildUnistyle(rt, styleSheet, unistyle);
103
+ std::unordered_map<std::shared_ptr<StyleSheet>, jsi::Value> parsedStyleSheets{};
104
+
105
+ for (auto& [shadowNode, unistyles] : dependencyMap) {
106
+ auto styleSheet = unistyles.begin()->get()->unistyle->parent;
107
+
108
+ // stylesheet may be optional for exotic unistyles
109
+ if (styleSheet != nullptr && !parsedStyleSheets.contains(styleSheet)) {
110
+ parsedStyleSheets.emplace(styleSheet, this->unwrapStyleSheet(rt, styleSheet));
111
+ }
112
+
113
+ for (auto& unistyleData : unistyles) {
114
+ auto& unistyle = unistyleData->unistyle;
115
+
116
+ // for RN styles or inline styles, compute styles only once
117
+ if (unistyle->styleKey == helpers::EXOTIC_STYLE_KEY.c_str() && !unistyleData->parsedStyle.has_value()) {
118
+ unistyleData->parsedStyle = jsi::Value(rt, unistyle->rawValue).asObject(rt);
119
+
120
+ continue;
112
121
  }
122
+
123
+ // StyleSheet might have styles that are not affected
124
+ if (!parsedStyleSheets[styleSheet].asObject(rt).hasProperty(rt, unistyle->styleKey.c_str())) {
125
+ continue;
126
+ }
127
+
128
+ unistyle->rawValue = parsedStyleSheets[styleSheet].asObject(rt).getProperty(rt, unistyle->styleKey.c_str()).asObject(rt);
129
+ this->rebuildUnistyle(rt, styleSheet, unistyle, unistyleData->variants, unistyleData->dynamicFunctionMetadata);
130
+ unistyleData->parsedStyle = jsi::Value(rt, unistyle->parsedStyle.value()).asObject(rt);
113
131
  }
114
132
  }
115
133
  }
116
134
 
117
135
  // rebuild single unistyle
118
- void parser::Parser::rebuildUnistyle(jsi::Runtime& rt, std::shared_ptr<StyleSheet> styleSheet, Unistyle::Shared unistyle) {
136
+ void parser::Parser::rebuildUnistyle(jsi::Runtime& rt, std::shared_ptr<StyleSheet> styleSheet, Unistyle::Shared unistyle, const Variants& variants, std::optional<std::vector<folly::dynamic>> metadata) {
119
137
  if (unistyle->type == core::UnistyleType::Object) {
120
- auto result = this->parseFirstLevel(rt, unistyle, styleSheet->variants);
138
+ auto result = this->parseFirstLevel(rt, unistyle, variants);
121
139
 
122
140
  unistyle->parsedStyle = std::move(result);
123
141
  }
124
142
 
125
143
  // for functions we need to call memoized function
126
144
  // with last know arguments and parse it with new theme and mini runtime
127
- if (unistyle->type == core::UnistyleType::DynamicFunction) {
145
+ if (unistyle->type == core::UnistyleType::DynamicFunction && metadata.has_value()) {
128
146
  auto unistyleFn = std::dynamic_pointer_cast<UnistyleDynamicFunction>(unistyle);
129
- auto maybeMetadata = unistyleFn->dynamicFunctionMetadata;
130
-
131
- helpers::assertThat(rt, maybeMetadata.has_value(), "Your dynamic function '" + unistyleFn->styleKey + "' has no metadata and can't be processed.");
132
147
 
133
148
  // convert arguments to jsi::Value
134
- auto metadata = unistyleFn->dynamicFunctionMetadata.value();
149
+ auto dynamicFunctionMetadata = metadata.value();
135
150
  std::vector<jsi::Value> args{};
136
151
 
137
- for (int i = 0; i < metadata.count; i++) {
138
- folly::dynamic& arg = metadata.arguments.at(i);
152
+ args.reserve(dynamicFunctionMetadata.size());
153
+
154
+ for (int i = 0; i < dynamicFunctionMetadata.size(); i++) {
155
+ folly::dynamic& arg = dynamicFunctionMetadata.at(i);
139
156
 
140
157
  args.emplace_back(jsi::valueFromDynamic(rt, arg));
141
158
  }
@@ -143,94 +160,33 @@ void parser::Parser::rebuildUnistyle(jsi::Runtime& rt, std::shared_ptr<StyleShee
143
160
  const jsi::Value *argStart = args.data();
144
161
 
145
162
  // call cached function with memoized arguments
146
- auto functionResult = unistyleFn->proxiedFunction.value().callAsConstructor(rt, argStart, metadata.count).asObject(rt);
163
+ auto functionResult = unistyleFn->rawValue
164
+ .asFunction(rt)
165
+ .call(rt, argStart, dynamicFunctionMetadata.size())
166
+ .asObject(rt);
147
167
 
148
168
  unistyleFn->unprocessedValue = std::move(functionResult);
149
- unistyleFn->parsedStyle = this->parseFirstLevel(rt, unistyleFn, styleSheet->variants);
169
+ unistyleFn->parsedStyle = this->parseFirstLevel(rt, unistyleFn, variants);
150
170
  }
151
171
  }
152
172
 
153
173
  // convert dependency map to shadow tree updates
154
- shadow::ShadowLeafUpdates parser::Parser::dependencyMapToShadowLeafUpdates(DependencyMap& dependencyMap) {
174
+ shadow::ShadowLeafUpdates parser::Parser::dependencyMapToShadowLeafUpdates(core::DependencyMap& dependencyMap) {
155
175
  shadow::ShadowLeafUpdates updates;
156
176
  auto& rt = this->_unistylesRuntime->getRuntime();
157
177
 
158
- for (const auto& [styleSheet, map] : dependencyMap) {
159
- for (const auto& [shadowNode, unistyles] : map) {
160
- for (const auto& unistyle : unistyles) {
161
- auto rawProps = this->parseStylesToShadowTreeStyles(rt, unistyle->parsedStyle.value());
162
-
163
- if (updates.contains(shadowNode)) {
164
- updates[shadowNode].emplace_back(std::move(rawProps));
178
+ for (const auto& [shadowNode, unistyles] : dependencyMap) {
179
+ auto rawProps = this->parseStylesToShadowTreeStyles(rt, unistyles);
165
180
 
166
- continue;
167
- }
168
-
169
- updates.emplace(shadowNode, std::vector<RawProps>{std::move(rawProps)});
170
- }
171
- }
181
+ updates.emplace(shadowNode, std::move(rawProps));
172
182
  }
173
183
 
174
184
  return updates;
175
185
  }
176
186
 
177
- // convert jsi::Value arguments to folly::dynamic
178
- std::vector<folly::dynamic> parser::Parser::parseDynamicFunctionArguments(jsi::Runtime& rt, size_t count, const jsi::Value* arguments) {
179
- std::vector<folly::dynamic> parsedArgument{};
180
-
181
- for (size_t i = 0; i < count; i++) {
182
- auto& arg = arguments[i];
183
-
184
- if (arg.isBool()) {
185
- parsedArgument.push_back(folly::dynamic(arg.asBool()));
186
-
187
- continue;
188
- }
189
-
190
- if (arg.isNumber()) {
191
- parsedArgument.push_back(folly::dynamic(arg.asNumber()));
192
-
193
- continue;
194
- }
195
-
196
- if (arg.isString()) {
197
- parsedArgument.push_back(folly::dynamic(arg.asString(rt).utf8(rt)));
198
-
199
- continue;
200
- }
201
-
202
- if (arg.isUndefined()) {
203
- parsedArgument.push_back(folly::dynamic());
204
-
205
- continue;
206
- }
207
-
208
- if (arg.isNull()) {
209
- parsedArgument.push_back(folly::dynamic(nullptr));
210
-
211
- continue;
212
- }
213
-
214
- if (!arg.isObject()) {
215
- continue;;
216
- }
217
-
218
- auto argObj = arg.asObject(rt);
219
-
220
- // allow arrays and objects too
221
- if (!argObj.isFunction(rt) && !argObj.isArrayBuffer(rt)) {
222
- parsedArgument.push_back(jsi::dynamicFromValue(rt, arg));
223
-
224
- continue;
225
- }
226
- }
227
-
228
- return parsedArgument;
229
- }
230
-
231
187
  // first level of StyleSheet, we can expect here different properties than on second level
232
188
  // eg. variants, compoundVariants, mq, breakpoints etc.
233
- jsi::Object parser::Parser::parseFirstLevel(jsi::Runtime& rt, Unistyle::Shared unistyle, Variants& variants) {
189
+ jsi::Object parser::Parser::parseFirstLevel(jsi::Runtime& rt, Unistyle::Shared unistyle, std::optional<Variants> variants) {
234
190
  // for objects - we simply operate on them
235
191
  // for functions we need to work on the unprocessed result (object)
236
192
  auto& style = unistyle->type == core::UnistyleType::Object
@@ -312,20 +268,16 @@ jsi::Object parser::Parser::parseFirstLevel(jsi::Runtime& rt, Unistyle::Shared u
312
268
 
313
269
  parsedStyle.setProperty(rt, jsi::PropNameID::forUtf8(rt, propertyName), this->parseSecondLevel(rt, unistyle, valueFromBreakpoint));
314
270
  });
315
-
316
- if (shouldParseVariants) {
317
- unistyle->addDependency(UnistyleDependency::VARIANTS);
318
- }
319
271
 
320
- if (shouldParseVariants && !variants.empty()) {
272
+ if (shouldParseVariants && variants.has_value() && !variants.value().empty()) {
321
273
  auto propertyValueObject = style.getProperty(rt, "variants").asObject(rt);
322
- auto parsedVariant = this->parseVariants(rt, unistyle, propertyValueObject, variants);
274
+ auto parsedVariant = this->parseVariants(rt, unistyle, propertyValueObject, variants.value());
323
275
 
324
276
  helpers::mergeJSIObjects(rt, parsedStyle, parsedVariant);
325
277
 
326
278
  if (shouldParseCompoundVariants) {
327
279
  auto compoundVariants = style.getProperty(rt, "compoundVariants").asObject(rt);
328
- auto parsedCompoundVariants = this->parseCompoundVariants(rt, unistyle, compoundVariants, variants);
280
+ auto parsedCompoundVariants = this->parseCompoundVariants(rt, unistyle, compoundVariants, variants.value());
329
281
 
330
282
  helpers::mergeJSIObjects(rt, parsedStyle, parsedCompoundVariants);
331
283
  }
@@ -335,14 +287,14 @@ jsi::Object parser::Parser::parseFirstLevel(jsi::Runtime& rt, Unistyle::Shared u
335
287
  }
336
288
 
337
289
  // function replaces original user dynamic function with additional logic to memoize arguments
338
- jsi::Function parser::Parser::createDynamicFunctionProxy(jsi::Runtime& rt, Unistyle::Shared unistyle, Variants& variants) {
290
+ jsi::Function parser::Parser::createDynamicFunctionProxy(jsi::Runtime& rt, Unistyle::Shared unistyle) {
339
291
  auto unistylesRuntime = this->_unistylesRuntime;
340
292
 
341
293
  return jsi::Function::createFromHostFunction(
342
294
  rt,
343
295
  jsi::PropNameID::forUtf8(rt, unistyle->styleKey),
344
296
  1,
345
- [this, unistylesRuntime, unistyle, &variants](jsi::Runtime& rt, const jsi::Value& thisVal, const jsi::Value* args, size_t count) {
297
+ [this, unistylesRuntime, unistyle](jsi::Runtime& rt, const jsi::Value& thisVal, const jsi::Value* args, size_t count) {
346
298
  auto thisObject = thisVal.asObject(rt);
347
299
  auto parser = parser::Parser(unistylesRuntime);
348
300
 
@@ -352,12 +304,15 @@ jsi::Function parser::Parser::createDynamicFunctionProxy(jsi::Runtime& rt, Unist
352
304
  // memoize metadata to call it later
353
305
  auto unistyleFn = std::dynamic_pointer_cast<UnistyleDynamicFunction>(unistyle);
354
306
 
355
- unistyleFn->dynamicFunctionMetadata = core::DynamicFunctionMetadata{
356
- count,
357
- this->parseDynamicFunctionArguments(rt, count, args)
358
- };
359
-
360
307
  unistyleFn->unprocessedValue = jsi::Value(rt, result).asObject(rt);
308
+
309
+ jsi::Value rawVariants = thisObject.hasProperty(rt, helpers::STYLE_VARIANTS.c_str())
310
+ ? thisObject.getProperty(rt, helpers::STYLE_VARIANTS.c_str())
311
+ : jsi::Value::undefined();
312
+ std::optional<Variants> variants = rawVariants.isUndefined()
313
+ ? std::nullopt
314
+ : std::optional<Variants>(helpers::variantsToPairs(rt, rawVariants.asObject(rt)));
315
+
361
316
  unistyleFn->parsedStyle = this->parseFirstLevel(rt, unistyleFn, variants);
362
317
  unistyleFn->seal();
363
318
 
@@ -367,9 +322,11 @@ jsi::Function parser::Parser::createDynamicFunctionProxy(jsi::Runtime& rt, Unist
367
322
 
368
323
  // function convert babel generated dependencies to C++ dependencies
369
324
  std::vector<UnistyleDependency> parser::Parser::parseDependencies(jsi::Runtime &rt, jsi::Object&& dependencies) {
370
- helpers::assertThat(rt, dependencies.isArray(rt), "babel transform is invalid. Unexpected type for dependencies. Please report new Github issue.");
325
+ helpers::assertThat(rt, dependencies.isArray(rt), "Unistyles: Babel transform is invalid - unexpected type for dependencies.");
371
326
 
372
- std::vector<UnistyleDependency> parsedDependencies;
327
+ std::vector<UnistyleDependency> parsedDependencies{};
328
+
329
+ parsedDependencies.reserve(5);
373
330
 
374
331
  helpers::iterateJSIArray(rt, dependencies.asArray(rt), [&](size_t i, jsi::Value& value){
375
332
  auto dependency = static_cast<UnistyleDependency>(value.asNumber());
@@ -388,6 +345,8 @@ jsi::Value parser::Parser::parseTransforms(jsi::Runtime& rt, Unistyle::Shared un
388
345
 
389
346
  std::vector<jsi::Value> parsedTransforms{};
390
347
 
348
+ parsedTransforms.reserve(2);
349
+
391
350
  helpers::iterateJSIArray(rt, obj.asArray(rt), [&](size_t i, jsi::Value& value){
392
351
  if (!value.isObject()) {
393
352
  return;
@@ -434,7 +393,7 @@ jsi::Value parser::Parser::getValueFromBreakpoints(jsi::Runtime& rt, Unistyle::S
434
393
  auto propertyName = propertyNames.getValueAtIndex(rt, i).asString(rt).utf8(rt);
435
394
  auto propertyValue = obj.getProperty(rt, propertyName.c_str());
436
395
  auto mq = core::UnistylesMQ{propertyName};
437
-
396
+
438
397
  if (mq.isMQ()) {
439
398
  unistyle->addDependency(UnistyleDependency::BREAKPOINTS);
440
399
  }
@@ -447,11 +406,11 @@ jsi::Value parser::Parser::getValueFromBreakpoints(jsi::Runtime& rt, Unistyle::S
447
406
 
448
407
  // check orientation breakpoints if user didn't register own breakpoint
449
408
  bool hasOrientationBreakpoint = obj.hasProperty(rt, currentOrientation);
450
-
409
+
451
410
  if (hasOrientationBreakpoint) {
452
411
  unistyle->addDependency(UnistyleDependency::BREAKPOINTS);
453
412
  }
454
-
413
+
455
414
  if (!hasBreakpoints && hasOrientationBreakpoint) {
456
415
  return obj.getProperty(rt, currentOrientation);
457
416
  }
@@ -459,7 +418,7 @@ jsi::Value parser::Parser::getValueFromBreakpoints(jsi::Runtime& rt, Unistyle::S
459
418
  if (!currentBreakpoint.has_value()) {
460
419
  return jsi::Value::undefined();
461
420
  }
462
-
421
+
463
422
  unistyle->addDependency(UnistyleDependency::BREAKPOINTS);
464
423
 
465
424
  // if you're still here it means that there is no
@@ -505,7 +464,7 @@ jsi::Object parser::Parser::parseVariants(jsi::Runtime& rt, Unistyle::Shared uni
505
464
  : std::nullopt;
506
465
 
507
466
  // we've got a match, but we need to check some condition
508
- auto styles = this->getStylesForVariant(rt, groupValue.asObject(rt), selectedVariant);
467
+ auto styles = this->getStylesForVariant(rt, groupName, groupValue.asObject(rt), selectedVariant, variants);
509
468
 
510
469
  // oops, invalid variant
511
470
  if (styles.isUndefined() || !styles.isObject()) {
@@ -521,13 +480,19 @@ jsi::Object parser::Parser::parseVariants(jsi::Runtime& rt, Unistyle::Shared uni
521
480
  }
522
481
 
523
482
  // helpers function to support 'default' variants
524
- jsi::Value parser::Parser::getStylesForVariant(jsi::Runtime& rt, jsi::Object&& groupValue, std::optional<std::string> selectedVariant) {
483
+ jsi::Value parser::Parser::getStylesForVariant(jsi::Runtime& rt, const std::string groupName, jsi::Object&& groupValue, std::optional<std::string> selectedVariant, Variants& variants) {
525
484
  // if there is no value, let's try 'default'
526
485
  auto selectedVariantKey = selectedVariant.has_value()
527
486
  ? selectedVariant.value().c_str()
528
487
  : "default";
488
+ auto hasKey = groupValue.hasProperty(rt, selectedVariantKey);
489
+
490
+ if (!hasKey || !selectedVariant.has_value()) {
491
+ // for no key, add 'default' selection to variants map
492
+ variants.emplace_back(groupName, selectedVariantKey);
493
+ }
529
494
 
530
- if (groupValue.hasProperty(rt, selectedVariantKey)) {
495
+ if (hasKey) {
531
496
  return groupValue.getProperty(rt, selectedVariantKey);
532
497
  }
533
498
 
@@ -567,28 +532,20 @@ bool parser::Parser::shouldApplyCompoundVariants(jsi::Runtime& rt, const Variant
567
532
  return false;
568
533
  }
569
534
 
570
- jsi::Array propertyNames = compoundVariant.getPropertyNames(rt);
571
- size_t length = propertyNames.size(rt);
572
- size_t allConditions = compoundVariant.hasProperty(rt, "styles")
573
- ? length - 1
574
- : length;
575
-
576
- if (allConditions != variants.size()) {
577
- return false;
578
- }
579
-
580
535
  for (auto it = variants.cbegin(); it != variants.cend(); ++it) {
581
536
  auto variantKey = it->first;
582
537
  auto variantValue = it->second;
583
538
 
584
539
  if (!compoundVariant.hasProperty(rt, variantKey.c_str())) {
585
- return false;
540
+ continue;
586
541
  }
587
542
 
588
543
  auto property = compoundVariant.getProperty(rt, variantKey.c_str());
589
544
  auto propertyName = property.isBool()
590
545
  ? (property.asBool() ? "true" : "false")
591
- : property.asString(rt).utf8(rt);
546
+ : property.isString()
547
+ ? property.asString(rt).utf8(rt)
548
+ : "";
592
549
 
593
550
  if (propertyName != variantValue) {
594
551
  return false;
@@ -666,41 +623,25 @@ jsi::Value parser::Parser::parseSecondLevel(jsi::Runtime &rt, Unistyle::Shared u
666
623
  return parsedStyle;
667
624
  }
668
625
 
669
- // helpers function that convert variants from JS to C++ variants
670
- Variants parser::Parser::variantsToPairs(jsi::Runtime& rt, jsi::Object&& variants) {
671
- Variants pairs{};
672
-
673
- helpers::enumerateJSIObject(rt, variants, [&](const std::string& variantName, jsi::Value& variantValue){
674
- if (variantValue.isUndefined() || variantValue.isNull()) {
675
- return;
676
- }
677
-
678
- if (variantValue.isBool()) {
679
- pairs.emplace_back(std::make_pair(variantName, variantValue.asBool() ? "true" : "false"));
680
-
681
- return;
682
- }
683
-
684
- if (variantValue.isString()) {
685
- pairs.emplace_back(std::make_pair(variantName, variantValue.asString(rt).utf8(rt)));
686
- }
687
- });
688
-
689
- return pairs;
690
- }
691
-
692
- // convert jsi::Object to RawValue with int colors
693
- RawProps parser::Parser::parseStylesToShadowTreeStyles(jsi::Runtime& rt, jsi::Object& styles) {
626
+ // convert unistyles to RawValue with int colors
627
+ RawProps parser::Parser::parseStylesToShadowTreeStyles(jsi::Runtime& rt, const std::vector<std::shared_ptr<UnistyleData>>& unistyles) {
694
628
  jsi::Object convertedStyles = jsi::Object(rt);
695
629
  auto& state = core::UnistylesRegistry::get().getState(rt);
696
630
 
697
- helpers::enumerateJSIObject(rt, styles, [&](const std::string& propertyName, jsi::Value& propertyValue){
698
- if (this->isColor(propertyName)) {
699
- return convertedStyles.setProperty(rt, propertyName.c_str(), jsi::Value(state.parseColor(propertyValue)));
631
+ for (const auto& unistyleData : unistyles) {
632
+ if (!unistyleData->parsedStyle.has_value()) {
633
+ // todo this something happens with large dataset, debug it
634
+ continue;
700
635
  }
701
636
 
702
- convertedStyles.setProperty(rt, propertyName.c_str(), propertyValue);
703
- });
637
+ helpers::enumerateJSIObject(rt, unistyleData->parsedStyle.value(), [&](const std::string& propertyName, jsi::Value& propertyValue){
638
+ if (this->isColor(propertyName)) {
639
+ return convertedStyles.setProperty(rt, propertyName.c_str(), jsi::Value(state.parseColor(propertyValue)));
640
+ }
641
+
642
+ convertedStyles.setProperty(rt, propertyName.c_str(), propertyValue);
643
+ });
644
+ }
704
645
 
705
646
  return RawProps(rt, std::move(convertedStyles));
706
647
  }