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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (328) hide show
  1. package/Unistyles.podspec +3 -2
  2. package/cxx/common/Constants.h +3 -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 +58 -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/expo-example/app/(tabs)/_layout.d.ts +3 -0
  172. package/lib/typescript/expo-example/app/(tabs)/_layout.d.ts.map +1 -0
  173. package/lib/typescript/expo-example/app/(tabs)/explore.d.ts +3 -0
  174. package/lib/typescript/expo-example/app/(tabs)/explore.d.ts.map +1 -0
  175. package/lib/typescript/expo-example/app/(tabs)/index.d.ts +3 -0
  176. package/lib/typescript/expo-example/app/(tabs)/index.d.ts.map +1 -0
  177. package/lib/typescript/expo-example/app/+html.d.ts +4 -0
  178. package/lib/typescript/expo-example/app/+html.d.ts.map +1 -0
  179. package/lib/typescript/expo-example/app/+not-found.d.ts +3 -0
  180. package/lib/typescript/expo-example/app/+not-found.d.ts.map +1 -0
  181. package/lib/typescript/expo-example/app/_layout.d.ts +3 -0
  182. package/lib/typescript/expo-example/app/_layout.d.ts.map +1 -0
  183. package/lib/typescript/src/specs/ShadowRegistry/index.d.ts +3 -3
  184. package/lib/typescript/src/specs/ShadowRegistry/index.d.ts.map +1 -1
  185. package/lib/typescript/src/specs/StyleSheet/index.d.ts +2 -1
  186. package/lib/typescript/src/specs/StyleSheet/index.d.ts.map +1 -1
  187. package/lib/typescript/src/specs/index.web.d.ts +1 -1
  188. package/lib/typescript/src/specs/index.web.d.ts.map +1 -1
  189. package/lib/typescript/src/types/stylesheet.d.ts +2 -2
  190. package/lib/typescript/src/types/stylesheet.d.ts.map +1 -1
  191. package/lib/typescript/src/web/convert/boxShadow.d.ts.map +1 -0
  192. package/lib/typescript/src/web/convert/breakpoint.d.ts.map +1 -0
  193. package/lib/typescript/{web → src/web}/convert/index.d.ts +1 -1
  194. package/lib/typescript/src/web/convert/index.d.ts.map +1 -0
  195. package/lib/typescript/src/web/convert/shadow.d.ts.map +1 -0
  196. package/lib/typescript/src/web/convert/style.d.ts.map +1 -0
  197. package/lib/typescript/src/web/convert/textShadow.d.ts.map +1 -0
  198. package/lib/typescript/src/web/convert/transform.d.ts.map +1 -0
  199. package/lib/typescript/{web → src/web}/convert/types.d.ts +1 -1
  200. package/lib/typescript/src/web/convert/types.d.ts.map +1 -0
  201. package/lib/typescript/src/web/convert/utils.d.ts.map +1 -0
  202. package/lib/typescript/{web → src/web}/create.d.ts +11 -11
  203. package/lib/typescript/{web → src/web}/create.d.ts.map +1 -1
  204. package/lib/typescript/src/web/createUnistylesComponent.d.ts +3 -0
  205. package/lib/typescript/src/web/createUnistylesComponent.d.ts.map +1 -0
  206. package/lib/typescript/{web → src/web}/index.d.ts +14 -13
  207. package/lib/typescript/{web → src/web}/index.d.ts.map +1 -1
  208. package/lib/typescript/src/web/listener/index.d.ts +3 -0
  209. package/lib/typescript/src/web/listener/index.d.ts.map +1 -0
  210. package/lib/typescript/src/web/listener/listenToDependencies.d.ts +12 -0
  211. package/lib/typescript/src/web/listener/listenToDependencies.d.ts.map +1 -0
  212. package/lib/typescript/{web → src/web}/listener/listener.d.ts +3 -2
  213. package/lib/typescript/src/web/listener/listener.d.ts.map +1 -0
  214. package/lib/typescript/src/web/mock.d.ts +5 -0
  215. package/lib/typescript/src/web/mock.d.ts.map +1 -0
  216. package/lib/typescript/src/web/mq.d.ts.map +1 -0
  217. package/lib/typescript/src/web/pseudo.d.ts +6 -0
  218. package/lib/typescript/src/web/pseudo.d.ts.map +1 -0
  219. package/lib/typescript/src/web/registry.d.ts +15 -0
  220. package/lib/typescript/src/web/registry.d.ts.map +1 -0
  221. package/lib/typescript/{web → src/web}/runtime.d.ts +6 -7
  222. package/lib/typescript/src/web/runtime.d.ts.map +1 -0
  223. package/lib/typescript/src/web/shadowRegistry.d.ts +17 -0
  224. package/lib/typescript/src/web/shadowRegistry.d.ts.map +1 -0
  225. package/lib/typescript/{web → src/web}/state.d.ts +4 -9
  226. package/lib/typescript/src/web/state.d.ts.map +1 -0
  227. package/lib/typescript/src/web/utils.d.ts +35 -0
  228. package/lib/typescript/src/web/utils.d.ts.map +1 -0
  229. package/lib/typescript/src/web/variants/getVariants.d.ts +3 -0
  230. package/lib/typescript/src/web/variants/getVariants.d.ts.map +1 -0
  231. package/lib/typescript/src/web/variants/index.d.ts +3 -0
  232. package/lib/typescript/src/web/variants/index.d.ts.map +1 -0
  233. package/lib/typescript/src/web/variants/useVariants.d.ts +3 -0
  234. package/lib/typescript/src/web/variants/useVariants.d.ts.map +1 -0
  235. package/nitrogen/generated/android/c++/JHybridNativePlatformSpec.hpp +6 -3
  236. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unistyles/HybridNativePlatformSpec.kt +8 -3
  237. package/nitrogen/generated/ios/c++/HybridNativePlatformSpecSwift.hpp +1 -1
  238. package/nitrogen/generated/ios/swift/HybridNativePlatformSpec.swift +1 -1
  239. package/nitrogen/generated/ios/swift/HybridNativePlatformSpecCxx.swift +14 -2
  240. package/nitrogen/generated/shared/c++/HybridNativePlatformSpec.hpp +3 -0
  241. package/nitrogen/generated/shared/c++/HybridUnistylesNavigationBarSpec.hpp +3 -0
  242. package/nitrogen/generated/shared/c++/HybridUnistylesRuntimeSpec.hpp +3 -0
  243. package/nitrogen/generated/shared/c++/HybridUnistylesShadowRegistrySpec.hpp +3 -0
  244. package/nitrogen/generated/shared/c++/HybridUnistylesStatusBarSpec.hpp +3 -0
  245. package/nitrogen/generated/shared/c++/HybridUnistylesStyleSheetSpec.cpp +1 -1
  246. package/nitrogen/generated/shared/c++/HybridUnistylesStyleSheetSpec.hpp +4 -1
  247. package/package.json +3 -3
  248. package/plugin/__tests__/dependencies.spec.js +199 -111
  249. package/plugin/__tests__/ref.spec.js +638 -202
  250. package/plugin/__tests__/stylesheet.spec.js +182 -71
  251. package/plugin/index.js +110 -23
  252. package/plugin/ref.js +64 -13
  253. package/plugin/style.js +82 -22
  254. package/plugin/stylesheet.js +44 -1
  255. package/plugin/variants.js +33 -0
  256. package/src/index.ts +3 -0
  257. package/src/specs/NavigtionBar/index.ts +1 -1
  258. package/src/specs/ShadowRegistry/index.ts +10 -9
  259. package/src/specs/StatusBar/index.ts +1 -1
  260. package/src/specs/StyleSheet/index.ts +3 -1
  261. package/src/specs/UnistylesRuntime/index.ts +1 -1
  262. package/src/specs/index.web.ts +1 -1
  263. package/src/types/stylesheet.ts +2 -2
  264. package/{web → src/web}/convert/breakpoint.ts +1 -1
  265. package/{web → src/web}/convert/index.ts +2 -2
  266. package/{web → src/web}/convert/types.ts +1 -1
  267. package/src/web/create.ts +50 -0
  268. package/src/web/createUnistylesComponent.tsx +54 -0
  269. package/{web → src/web}/index.ts +3 -2
  270. package/src/web/listener/index.ts +2 -0
  271. package/src/web/listener/listenToDependencies.ts +45 -0
  272. package/{web → src/web}/listener/listener.ts +2 -2
  273. package/{web → src/web}/mock.ts +2 -12
  274. package/src/web/pseudo.ts +137 -0
  275. package/src/web/registry.ts +60 -0
  276. package/{web → src/web}/runtime.ts +4 -6
  277. package/src/web/shadowRegistry.ts +124 -0
  278. package/{web → src/web}/state.ts +5 -49
  279. package/{web → src/web}/utils.ts +91 -17
  280. package/src/web/variants/getVariants.ts +42 -0
  281. package/src/web/variants/index.ts +2 -0
  282. package/src/web/variants/useVariants.ts +65 -0
  283. package/lib/typescript/web/convert/boxShadow.d.ts.map +0 -1
  284. package/lib/typescript/web/convert/breakpoint.d.ts.map +0 -1
  285. package/lib/typescript/web/convert/index.d.ts.map +0 -1
  286. package/lib/typescript/web/convert/shadow.d.ts.map +0 -1
  287. package/lib/typescript/web/convert/style.d.ts.map +0 -1
  288. package/lib/typescript/web/convert/textShadow.d.ts.map +0 -1
  289. package/lib/typescript/web/convert/transform.d.ts.map +0 -1
  290. package/lib/typescript/web/convert/types.d.ts.map +0 -1
  291. package/lib/typescript/web/convert/utils.d.ts.map +0 -1
  292. package/lib/typescript/web/listener/index.d.ts +0 -2
  293. package/lib/typescript/web/listener/index.d.ts.map +0 -1
  294. package/lib/typescript/web/listener/listener.d.ts.map +0 -1
  295. package/lib/typescript/web/mock.d.ts +0 -14
  296. package/lib/typescript/web/mock.d.ts.map +0 -1
  297. package/lib/typescript/web/mq.d.ts.map +0 -1
  298. package/lib/typescript/web/pseudo.d.ts +0 -4
  299. package/lib/typescript/web/pseudo.d.ts.map +0 -1
  300. package/lib/typescript/web/registry.d.ts +0 -12
  301. package/lib/typescript/web/registry.d.ts.map +0 -1
  302. package/lib/typescript/web/runtime.d.ts.map +0 -1
  303. package/lib/typescript/web/state.d.ts.map +0 -1
  304. package/lib/typescript/web/useVariants.d.ts +0 -3
  305. package/lib/typescript/web/useVariants.d.ts.map +0 -1
  306. package/lib/typescript/web/utils.d.ts +0 -18
  307. package/lib/typescript/web/utils.d.ts.map +0 -1
  308. package/web/create.ts +0 -102
  309. package/web/listener/index.ts +0 -1
  310. package/web/pseudo.ts +0 -11
  311. package/web/registry.ts +0 -41
  312. package/web/useVariants.ts +0 -99
  313. /package/lib/typescript/{web → src/web}/convert/boxShadow.d.ts +0 -0
  314. /package/lib/typescript/{web → src/web}/convert/breakpoint.d.ts +0 -0
  315. /package/lib/typescript/{web → src/web}/convert/shadow.d.ts +0 -0
  316. /package/lib/typescript/{web → src/web}/convert/style.d.ts +0 -0
  317. /package/lib/typescript/{web → src/web}/convert/textShadow.d.ts +0 -0
  318. /package/lib/typescript/{web → src/web}/convert/transform.d.ts +0 -0
  319. /package/lib/typescript/{web → src/web}/convert/utils.d.ts +0 -0
  320. /package/lib/typescript/{web → src/web}/mq.d.ts +0 -0
  321. /package/{web → src/web}/convert/boxShadow.ts +0 -0
  322. /package/{web → src/web}/convert/module.d.ts +0 -0
  323. /package/{web → src/web}/convert/shadow.ts +0 -0
  324. /package/{web → src/web}/convert/style.ts +0 -0
  325. /package/{web → src/web}/convert/textShadow.ts +0 -0
  326. /package/{web → src/web}/convert/transform.ts +0 -0
  327. /package/{web → src/web}/convert/utils.ts +0 -0
  328. /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
  }