react-native-unistyles 3.0.0-beta.6 → 3.0.0-beta.7

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 (246) hide show
  1. package/README.md +3 -0
  2. package/android/CMakeLists.txt +1 -1
  3. package/android/src/main/java/com/unistyles/NativePlatform+android.kt +4 -0
  4. package/android/src/main/java/com/unistyles/NativePlatform+insets.kt +20 -1
  5. package/android/src/main/java/com/unistyles/NativePlatform+listener.kt +4 -0
  6. package/android/src/main/java/com/unistyles/UnistylesModule.kt +5 -0
  7. package/cxx/core/HashGenerator.cpp +1 -1
  8. package/cxx/core/HostUnistyle.cpp +28 -4
  9. package/cxx/core/HostUnistyle.h +1 -0
  10. package/cxx/core/UnistyleWrapper.h +6 -6
  11. package/cxx/parser/Parser.cpp +5 -5
  12. package/lib/commonjs/components/native/Animated.js +2 -2
  13. package/lib/commonjs/components/native/Animated.js.map +1 -1
  14. package/lib/commonjs/components/native/ImageBackground.js +5 -5
  15. package/lib/commonjs/components/native/ImageBackground.js.map +1 -1
  16. package/lib/commonjs/components/native/NativeText.native.js.map +1 -1
  17. package/lib/commonjs/components/native/NativeView.native.js.map +1 -1
  18. package/lib/commonjs/components/native/Pressable.js +1 -1
  19. package/lib/commonjs/components/native/Pressable.js.map +1 -1
  20. package/lib/commonjs/components/native/Pressable.native.js +6 -10
  21. package/lib/commonjs/components/native/Pressable.native.js.map +1 -1
  22. package/lib/commonjs/core/createUnistylesElement.js +5 -5
  23. package/lib/commonjs/core/createUnistylesElement.js.map +1 -1
  24. package/lib/commonjs/core/createUnistylesElement.native.js +1 -1
  25. package/lib/commonjs/core/createUnistylesElement.native.js.map +1 -1
  26. package/lib/commonjs/core/createUnistylesImageBackground.js +1 -1
  27. package/lib/commonjs/core/createUnistylesImageBackground.js.map +1 -1
  28. package/lib/commonjs/core/useProxifiedUnistyles/useProxifiedUnistyles.js +2 -2
  29. package/lib/commonjs/core/useProxifiedUnistyles/useProxifiedUnistyles.js.map +1 -1
  30. package/lib/commonjs/core/warn.js +1 -1
  31. package/lib/commonjs/core/withUnistyles/withUnistyles.js +2 -2
  32. package/lib/commonjs/core/withUnistyles/withUnistyles.js.map +1 -1
  33. package/lib/commonjs/core/withUnistyles/withUnistyles.native.js +5 -3
  34. package/lib/commonjs/core/withUnistyles/withUnistyles.native.js.map +1 -1
  35. package/lib/commonjs/hooks/useMedia.native.js +1 -1
  36. package/lib/commonjs/hooks/useMedia.native.js.map +1 -1
  37. package/lib/commonjs/mq.js.map +1 -1
  38. package/lib/commonjs/server/getServerUnistyles.js +1 -1
  39. package/lib/commonjs/server/getServerUnistyles.js.map +1 -1
  40. package/lib/commonjs/server/hydrateServerUnistyles.js +1 -1
  41. package/lib/commonjs/server/hydrateServerUnistyles.js.map +1 -1
  42. package/lib/commonjs/server/resetServerUnistyles.js +1 -1
  43. package/lib/commonjs/server/resetServerUnistyles.js.map +1 -1
  44. package/lib/commonjs/server/useServerUnistyles.js +2 -2
  45. package/lib/commonjs/server/useServerUnistyles.js.map +1 -1
  46. package/lib/commonjs/specs/StatusBar/index.js.map +1 -1
  47. package/lib/commonjs/specs/StyleSheet/index.js +1 -1
  48. package/lib/commonjs/specs/StyleSheet/index.js.map +1 -1
  49. package/lib/commonjs/specs/UnistylesRuntime/index.js +1 -1
  50. package/lib/commonjs/specs/UnistylesRuntime/index.js.map +1 -1
  51. package/lib/commonjs/specs/index.native.js +3 -3
  52. package/lib/commonjs/specs/index.native.js.map +1 -1
  53. package/lib/commonjs/web/convert/index.js +4 -4
  54. package/lib/commonjs/web/convert/index.js.map +1 -1
  55. package/lib/commonjs/web/convert/object/boxShadow.js +4 -4
  56. package/lib/commonjs/web/convert/object/boxShadow.js.map +1 -1
  57. package/lib/commonjs/web/convert/object/filter.js +3 -3
  58. package/lib/commonjs/web/convert/object/filter.js.map +1 -1
  59. package/lib/commonjs/web/convert/object/transform.js +1 -1
  60. package/lib/commonjs/web/convert/object/transform.js.map +1 -1
  61. package/lib/commonjs/web/convert/utils.js.map +1 -1
  62. package/lib/commonjs/web/index.js +1 -1
  63. package/lib/commonjs/web/index.js.map +1 -1
  64. package/lib/commonjs/web/registry.js +1 -1
  65. package/lib/commonjs/web/registry.js.map +1 -1
  66. package/lib/commonjs/web/runtime.js.map +1 -1
  67. package/lib/commonjs/web/shadowRegistry.js +1 -1
  68. package/lib/commonjs/web/shadowRegistry.js.map +1 -1
  69. package/lib/commonjs/web/state.js +1 -1
  70. package/lib/commonjs/web/state.js.map +1 -1
  71. package/lib/commonjs/web/utils/common.js +1 -1
  72. package/lib/commonjs/web/utils/unistyle.js +5 -5
  73. package/lib/commonjs/web/utils/unistyle.js.map +1 -1
  74. package/lib/module/components/native/Animated.js +2 -2
  75. package/lib/module/components/native/Animated.js.map +1 -1
  76. package/lib/module/components/native/ImageBackground.js +3 -3
  77. package/lib/module/components/native/ImageBackground.js.map +1 -1
  78. package/lib/module/components/native/NativeText.native.js.map +1 -1
  79. package/lib/module/components/native/NativeView.native.js.map +1 -1
  80. package/lib/module/components/native/Pressable.js +1 -1
  81. package/lib/module/components/native/Pressable.js.map +1 -1
  82. package/lib/module/components/native/Pressable.native.js +6 -10
  83. package/lib/module/components/native/Pressable.native.js.map +1 -1
  84. package/lib/module/core/createUnistylesElement.js +3 -3
  85. package/lib/module/core/createUnistylesElement.js.map +1 -1
  86. package/lib/module/core/createUnistylesElement.native.js +1 -1
  87. package/lib/module/core/createUnistylesElement.native.js.map +1 -1
  88. package/lib/module/core/createUnistylesImageBackground.js +1 -1
  89. package/lib/module/core/createUnistylesImageBackground.js.map +1 -1
  90. package/lib/module/core/useProxifiedUnistyles/useProxifiedUnistyles.js +2 -2
  91. package/lib/module/core/useProxifiedUnistyles/useProxifiedUnistyles.js.map +1 -1
  92. package/lib/module/core/warn.js +1 -1
  93. package/lib/module/core/withUnistyles/withUnistyles.js +2 -2
  94. package/lib/module/core/withUnistyles/withUnistyles.js.map +1 -1
  95. package/lib/module/core/withUnistyles/withUnistyles.native.js +6 -4
  96. package/lib/module/core/withUnistyles/withUnistyles.native.js.map +1 -1
  97. package/lib/module/hooks/useMedia.native.js +1 -1
  98. package/lib/module/hooks/useMedia.native.js.map +1 -1
  99. package/lib/module/mq.js.map +1 -1
  100. package/lib/module/server/getServerUnistyles.js +1 -1
  101. package/lib/module/server/getServerUnistyles.js.map +1 -1
  102. package/lib/module/server/hydrateServerUnistyles.js +1 -1
  103. package/lib/module/server/hydrateServerUnistyles.js.map +1 -1
  104. package/lib/module/server/resetServerUnistyles.js +1 -1
  105. package/lib/module/server/resetServerUnistyles.js.map +1 -1
  106. package/lib/module/server/useServerUnistyles.js +2 -2
  107. package/lib/module/server/useServerUnistyles.js.map +1 -1
  108. package/lib/module/specs/StatusBar/index.js.map +1 -1
  109. package/lib/module/specs/StyleSheet/index.js +1 -1
  110. package/lib/module/specs/StyleSheet/index.js.map +1 -1
  111. package/lib/module/specs/UnistylesRuntime/index.js +1 -1
  112. package/lib/module/specs/UnistylesRuntime/index.js.map +1 -1
  113. package/lib/module/specs/index.native.js +4 -4
  114. package/lib/module/specs/index.native.js.map +1 -1
  115. package/lib/module/web/convert/index.js +5 -5
  116. package/lib/module/web/convert/index.js.map +1 -1
  117. package/lib/module/web/convert/object/boxShadow.js +2 -2
  118. package/lib/module/web/convert/object/boxShadow.js.map +1 -1
  119. package/lib/module/web/convert/object/filter.js +3 -3
  120. package/lib/module/web/convert/object/filter.js.map +1 -1
  121. package/lib/module/web/convert/object/transform.js +1 -1
  122. package/lib/module/web/convert/object/transform.js.map +1 -1
  123. package/lib/module/web/convert/utils.js.map +1 -1
  124. package/lib/module/web/index.js +1 -1
  125. package/lib/module/web/index.js.map +1 -1
  126. package/lib/module/web/registry.js +1 -1
  127. package/lib/module/web/registry.js.map +1 -1
  128. package/lib/module/web/runtime.js.map +1 -1
  129. package/lib/module/web/shadowRegistry.js +1 -1
  130. package/lib/module/web/shadowRegistry.js.map +1 -1
  131. package/lib/module/web/state.js +1 -1
  132. package/lib/module/web/state.js.map +1 -1
  133. package/lib/module/web/utils/common.js +1 -1
  134. package/lib/module/web/utils/unistyle.js +5 -5
  135. package/lib/module/web/utils/unistyle.js.map +1 -1
  136. package/lib/typescript/src/components/native/Pressable.d.ts.map +1 -1
  137. package/lib/typescript/src/components/native/Pressable.native.d.ts.map +1 -1
  138. package/lib/typescript/src/core/useProxifiedUnistyles/useProxifiedUnistyles.d.ts +2 -1
  139. package/lib/typescript/src/core/useProxifiedUnistyles/useProxifiedUnistyles.d.ts.map +1 -1
  140. package/lib/typescript/src/core/withUnistyles/withUnistyles.d.ts.map +1 -1
  141. package/lib/typescript/src/core/withUnistyles/withUnistyles.native.d.ts.map +1 -1
  142. package/lib/typescript/src/mq.d.ts +1 -1
  143. package/lib/typescript/src/mq.d.ts.map +1 -1
  144. package/lib/typescript/src/server/hydrateServerUnistyles.d.ts.map +1 -1
  145. package/lib/typescript/src/server/useServerUnistyles.d.ts.map +1 -1
  146. package/lib/typescript/src/specs/StatusBar/index.d.ts +1 -1
  147. package/lib/typescript/src/specs/StatusBar/index.d.ts.map +1 -1
  148. package/lib/typescript/src/specs/StyleSheet/index.d.ts +1 -1
  149. package/lib/typescript/src/specs/StyleSheet/index.d.ts.map +1 -1
  150. package/lib/typescript/src/specs/UnistylesRuntime/UnistylesRuntime.nitro.d.ts +1 -1
  151. package/lib/typescript/src/specs/UnistylesRuntime/UnistylesRuntime.nitro.d.ts.map +1 -1
  152. package/lib/typescript/src/specs/UnistylesRuntime/index.d.ts +5 -5
  153. package/lib/typescript/src/specs/UnistylesRuntime/index.d.ts.map +1 -1
  154. package/lib/typescript/src/specs/index.native.d.ts +4 -4
  155. package/lib/typescript/src/specs/index.native.d.ts.map +1 -1
  156. package/lib/typescript/src/types/breakpoints.d.ts +2 -2
  157. package/lib/typescript/src/types/breakpoints.d.ts.map +1 -1
  158. package/lib/typescript/src/types/core.d.ts +1 -1
  159. package/lib/typescript/src/types/core.d.ts.map +1 -1
  160. package/lib/typescript/src/types/stylesheet.d.ts +4 -4
  161. package/lib/typescript/src/types/stylesheet.d.ts.map +1 -1
  162. package/lib/typescript/src/web/convert/object/filter.d.ts.map +1 -1
  163. package/lib/typescript/src/web/convert/object/transform.d.ts.map +1 -1
  164. package/lib/typescript/src/web/convert/types.d.ts +1 -1
  165. package/lib/typescript/src/web/convert/types.d.ts.map +1 -1
  166. package/lib/typescript/src/web/convert/utils.d.ts +2 -2
  167. package/lib/typescript/src/web/convert/utils.d.ts.map +1 -1
  168. package/lib/typescript/src/web/create.d.ts +1 -1
  169. package/lib/typescript/src/web/create.d.ts.map +1 -1
  170. package/lib/typescript/src/web/index.d.ts +1 -1
  171. package/lib/typescript/src/web/index.d.ts.map +1 -1
  172. package/lib/typescript/src/web/registry.d.ts +1 -1
  173. package/lib/typescript/src/web/registry.d.ts.map +1 -1
  174. package/lib/typescript/src/web/runtime.d.ts +1 -1
  175. package/lib/typescript/src/web/runtime.d.ts.map +1 -1
  176. package/lib/typescript/src/web/shadowRegistry.d.ts.map +1 -1
  177. package/lib/typescript/src/web/state.d.ts +1 -1
  178. package/lib/typescript/src/web/state.d.ts.map +1 -1
  179. package/lib/typescript/src/web/utils/unistyle.d.ts.map +1 -1
  180. package/nitrogen/generated/android/c++/JHybridNativePlatformSpec.hpp +1 -1
  181. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unistyles/HybridNativePlatformSpec.kt +23 -39
  182. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unistyles/unistylesOnLoad.kt +35 -0
  183. package/nitrogen/generated/ios/Unistyles+autolinking.rb +2 -0
  184. package/nitrogen/generated/ios/Unistyles-Swift-Cxx-Bridge.cpp +1 -1
  185. package/nitrogen/generated/ios/c++/HybridNativePlatformSpecSwift.hpp +3 -1
  186. package/nitrogen/generated/ios/swift/HybridNativePlatformSpec.swift +2 -3
  187. package/nitrogen/generated/ios/swift/HybridNativePlatformSpec_cxx.swift +18 -18
  188. package/nitrogen/generated/shared/c++/ColorScheme.hpp +1 -1
  189. package/nitrogen/generated/shared/c++/Dimensions.hpp +1 -1
  190. package/nitrogen/generated/shared/c++/HybridNativePlatformSpec.hpp +1 -1
  191. package/nitrogen/generated/shared/c++/HybridUnistylesNavigationBarSpec.hpp +1 -1
  192. package/nitrogen/generated/shared/c++/HybridUnistylesRuntimeSpec.hpp +1 -1
  193. package/nitrogen/generated/shared/c++/HybridUnistylesShadowRegistrySpec.hpp +1 -1
  194. package/nitrogen/generated/shared/c++/HybridUnistylesStatusBarSpec.hpp +1 -1
  195. package/nitrogen/generated/shared/c++/HybridUnistylesStyleSheetSpec.hpp +1 -1
  196. package/nitrogen/generated/shared/c++/Insets.hpp +1 -1
  197. package/nitrogen/generated/shared/c++/Orientation.hpp +1 -1
  198. package/nitrogen/generated/shared/c++/UnistyleDependency.hpp +1 -1
  199. package/nitrogen/generated/shared/c++/UnistylesCxxMiniRuntime.hpp +1 -1
  200. package/nitrogen/generated/shared/c++/UnistylesNativeMiniRuntime.hpp +1 -1
  201. package/package.json +6 -4
  202. package/plugin/import.js +1 -1
  203. package/plugin/index.js +27 -38
  204. package/plugin/stylesheet.js +454 -128
  205. package/src/components/native/Animated.tsx +2 -2
  206. package/src/components/native/ImageBackground.tsx +4 -4
  207. package/src/components/native/NativeText.native.tsx +1 -1
  208. package/src/components/native/NativeView.native.tsx +1 -1
  209. package/src/components/native/Pressable.native.tsx +7 -12
  210. package/src/components/native/Pressable.tsx +1 -1
  211. package/src/core/createUnistylesElement.native.tsx +1 -1
  212. package/src/core/createUnistylesElement.tsx +3 -3
  213. package/src/core/createUnistylesImageBackground.tsx +1 -1
  214. package/src/core/useProxifiedUnistyles/useProxifiedUnistyles.ts +3 -3
  215. package/src/core/warn.ts +1 -1
  216. package/src/core/withUnistyles/withUnistyles.native.tsx +8 -6
  217. package/src/core/withUnistyles/withUnistyles.tsx +4 -4
  218. package/src/hooks/useMedia.native.ts +1 -1
  219. package/src/mq.ts +1 -1
  220. package/src/server/getServerUnistyles.tsx +1 -1
  221. package/src/server/hydrateServerUnistyles.ts +1 -1
  222. package/src/server/resetServerUnistyles.ts +1 -1
  223. package/src/server/useServerUnistyles.tsx +2 -2
  224. package/src/specs/StatusBar/index.ts +1 -1
  225. package/src/specs/StyleSheet/index.ts +3 -3
  226. package/src/specs/UnistylesRuntime/UnistylesRuntime.nitro.ts +1 -1
  227. package/src/specs/UnistylesRuntime/index.ts +5 -5
  228. package/src/specs/index.native.ts +4 -4
  229. package/src/types/breakpoints.ts +2 -2
  230. package/src/types/core.ts +1 -1
  231. package/src/types/stylesheet.ts +4 -4
  232. package/src/web/convert/index.ts +5 -5
  233. package/src/web/convert/object/boxShadow.ts +2 -2
  234. package/src/web/convert/object/filter.ts +3 -3
  235. package/src/web/convert/object/transform.ts +2 -2
  236. package/src/web/convert/types.ts +1 -1
  237. package/src/web/convert/utils.ts +2 -2
  238. package/src/web/create.ts +1 -1
  239. package/src/web/index.ts +3 -3
  240. package/src/web/registry.ts +2 -2
  241. package/src/web/runtime.ts +2 -2
  242. package/src/web/shadowRegistry.ts +2 -2
  243. package/src/web/state.ts +4 -4
  244. package/src/web/utils/common.ts +1 -1
  245. package/src/web/utils/unistyle.ts +6 -6
  246. package/plugin/common.js +0 -142
@@ -1,5 +1,3 @@
1
- const { getIdentifierNameFromExpression, getSecondPropertyName } = require('./common')
2
-
3
1
  const UnistyleDependency = {
4
2
  Theme: 0,
5
3
  ThemeName: 1,
@@ -19,7 +17,7 @@ const UnistyleDependency = {
19
17
  }
20
18
 
21
19
  function stringToUniqueId(str) {
22
- let hash = 0;
20
+ let hash = 0
23
21
 
24
22
  for (let i = 0; i < str.length; i++) {
25
23
  hash = (hash << 5) - hash + str.charCodeAt(i)
@@ -43,7 +41,7 @@ function isUnistylesStyleSheet(t, path, state) {
43
41
  }
44
42
 
45
43
  function isKindOfStyleSheet(t, path, state) {
46
- if (!state.file.forceProcessing) {
44
+ if (!state.file.forceProcessing && !state.file.hasUnistylesImport) {
47
45
  return false
48
46
  }
49
47
 
@@ -63,177 +61,505 @@ function addStyleSheetTag(t, path, state) {
63
61
  callee.container.arguments.push(t.numericLiteral(uniqueId))
64
62
  }
65
63
 
66
- /** @param {import('./index').UnistylesPluginPass} state */
67
- function analyzeDependencies(t, state, name, unistyleObj, themeName, rtName) {
68
- const debugMessage = deps => {
69
- if (state.opts.debug) {
70
- const mappedDeps = deps
71
- .map(dep => Object.keys(UnistyleDependency).find(key => UnistyleDependency[key] === dep))
72
- .join(', ')
64
+ const getProperty = (t, property) => {
65
+ if (!property) {
66
+ return undefined
67
+ }
73
68
 
74
- console.log(`${state.filename.replace(`${state.file.opts.root}/`, '')}: styles.${name}: [${mappedDeps}]`)
69
+ if (t.isIdentifier(property)) {
70
+ return {
71
+ properties: [property.name]
75
72
  }
76
73
  }
77
- const unistyle = unistyleObj.properties
78
- const dependencies = []
79
74
 
80
- Object.values(unistyle).forEach(uni => {
81
- const identifier = getIdentifierNameFromExpression(t, uni.value)
75
+ if (t.isObjectPattern(property)) {
76
+ const matchingProperties = property.properties.flatMap(p => getProperty(t, p))
82
77
 
83
- if (identifier.includes(themeName)) {
84
- dependencies.push(UnistyleDependency.Theme)
78
+ return {
79
+ properties: matchingProperties.flatMap(properties => properties.properties)
85
80
  }
81
+ }
86
82
 
87
- if (identifier.includes(rtName)) {
88
- const propertyNames = getSecondPropertyName(t, uni.value)
83
+ if (t.isObjectProperty(property) && t.isIdentifier(property.value)) {
84
+ return {
85
+ properties: [property.key.name]
86
+ }
87
+ }
89
88
 
90
- propertyNames
91
- .filter(Boolean)
92
- .forEach(propertyName => {
93
- switch (propertyName) {
94
- case 'themeName': {
95
- dependencies.push(UnistyleDependency.ThemeName)
89
+ if (t.isObjectProperty(property) && t.isObjectPattern(property.value)) {
90
+ const matchingProperties = property.value.properties.flatMap(p => getProperty(t, p))
96
91
 
97
- return
98
- }
99
- case 'adaptiveThemes': {
100
- dependencies.push(UnistyleDependency.AdaptiveThemes)
92
+ return {
93
+ parent: property.key.name,
94
+ properties: matchingProperties.flatMap(properties => properties.properties)
95
+ }
96
+ }
101
97
 
102
- return
103
- }
104
- case 'breakpoint': {
105
- dependencies.push(UnistyleDependency.Breakpoints)
98
+ return undefined
99
+ }
106
100
 
107
- return
108
- }
109
- case 'colorScheme': {
110
- dependencies.push(UnistyleDependency.ColorScheme)
101
+ function getStylesDependenciesFromObject(t, path) {
102
+ const detectedStylesWithVariants = new Set()
103
+ const stylesheet = path.node.arguments[0]
111
104
 
112
- return
113
- }
114
- case 'screen': {
115
- dependencies.push(UnistyleDependency.Dimensions)
105
+ stylesheet.properties.forEach(property => {
106
+ if (!t.isIdentifier(property.key)) {
107
+ return
108
+ }
116
109
 
117
- return
118
- }
119
- case 'isPortrait':
120
- case 'isLandscape': {
121
- dependencies.push(UnistyleDependency.Orientation)
110
+ if (t.isObjectProperty(property)) {
111
+ if(t.isObjectExpression(property.value)) {
112
+ property.value.properties.forEach(innerProp => {
113
+ if (t.isIdentifier(innerProp.key) && innerProp.key.name === 'variants') {
114
+ detectedStylesWithVariants.add({
115
+ label: 'variants',
116
+ key: property.key.name
117
+ })
118
+ }
119
+ })
122
120
 
123
- return
124
- }
125
- case 'contentSizeCategory': {
126
- dependencies.push(UnistyleDependency.ContentSizeCategory)
121
+ }
122
+ }
127
123
 
128
- return
129
- }
130
- case 'ime': {
131
- dependencies.push(UnistyleDependency.Ime)
124
+ if (t.isArrowFunctionExpression(property.value)) {
125
+ if(t.isObjectExpression(property.value.body)) {
126
+ property.value.body.properties.forEach(innerProp => {
127
+ if (t.isIdentifier(innerProp.key) && innerProp.key.name === 'variants') {
128
+ detectedStylesWithVariants.add({
129
+ label: 'variants',
130
+ key: property.key.name
131
+ })
132
+ }
133
+ })
132
134
 
133
- return
134
- }
135
- case 'insets': {
136
- dependencies.push(UnistyleDependency.Insets)
135
+ }
136
+ }
137
+ })
137
138
 
138
- return
139
- }
140
- case 'pixelRatio': {
141
- dependencies.push(UnistyleDependency.PixelRatio)
139
+ const variants = Array.from(detectedStylesWithVariants)
140
+
141
+ return variants.reduce((acc, { key, label }) => {
142
+ if (acc[key]) {
143
+ return {
144
+ ...acc,
145
+ [key]: [
146
+ ...acc[key],
147
+ label
148
+ ]
149
+ }
150
+ }
142
151
 
143
- return
144
- }
145
- case 'fontScale': {
146
- dependencies.push(UnistyleDependency.FontScale)
152
+ return {
153
+ ...acc,
154
+ [key]: [label]
155
+ }
156
+ }, {})
157
+ }
147
158
 
148
- return
149
- }
150
- case 'statusBar': {
151
- dependencies.push(UnistyleDependency.StatusBar)
159
+ function getStylesDependenciesFromFunction(t, path) {
160
+ const funcPath = path.get('arguments.0')
152
161
 
153
- return
154
- }
155
- case 'navigationBar': {
156
- dependencies.push(UnistyleDependency.NavigationBar)
162
+ if (!funcPath) {
163
+ return
164
+ }
157
165
 
158
- return
159
- }
160
- }
166
+ const params = funcPath.node.params
167
+ const [themeParam, rtParam] = params
168
+
169
+ let themeNames = []
170
+
171
+ // destructured theme object
172
+ if (themeParam && themeParam.type === 'ObjectPattern') {
173
+ // If destructured, collect all property names
174
+ for (const prop of themeParam.properties) {
175
+ themeNames.push(getProperty(t, prop))
176
+ }
177
+ }
178
+
179
+ // user used 'theme' without destructuring
180
+ if (themeParam && themeParam.type === 'Identifier') {
181
+ themeNames.push({
182
+ properties: [themeParam.name]
183
+ })
184
+ }
185
+
186
+ let rtNames = []
187
+
188
+ // destructured rt object
189
+ if (rtParam && rtParam.type === 'ObjectPattern') {
190
+ // If destructured, collect all property names
191
+ for (const prop of rtParam.properties) {
192
+ rtNames.push(getProperty(t, prop))
193
+ }
194
+ }
195
+
196
+ // user used 'rt' without destructuring
197
+ if (rtParam && rtParam.type === 'Identifier') {
198
+ rtNames.push({
199
+ properties: [rtParam.name]
200
+ })
201
+ }
202
+
203
+ // get returned object or return statement from StyleSheet.create function
204
+ let returnedObjectPath = null
205
+
206
+ if (funcPath.get('body').isObjectExpression()) {
207
+ returnedObjectPath = funcPath.get('body')
208
+ } else {
209
+ funcPath.traverse({
210
+ ReturnStatement(retPath) {
211
+ if (!returnedObjectPath && retPath.get('argument').isObjectExpression()) {
212
+ returnedObjectPath = retPath.get('argument')
213
+ }
214
+ }
215
+ })
216
+ }
217
+
218
+ if (!returnedObjectPath) {
219
+ // there is no returned object
220
+ // abort
221
+
222
+ return
223
+ }
224
+
225
+ const detectedStylesWithVariants = new Set()
226
+
227
+ // detect variants via Scope
228
+ returnedObjectPath.get('properties').forEach(propPath => {
229
+ // get style name
230
+ const stylePath = propPath.get('key')
231
+
232
+ if (!stylePath.isIdentifier()) {
233
+ return
234
+ }
235
+
236
+ const styleKey = stylePath.node.name
237
+
238
+ const valuePath = propPath.get('value')
239
+
240
+ if (valuePath.isObjectExpression()) {
241
+ const hasVariants = valuePath.get('properties').some(innerProp => {
242
+ const innerKey = innerProp.get('key')
243
+
244
+ return innerKey.isIdentifier() && innerKey.node.name === 'variants'
245
+ })
246
+
247
+ if (hasVariants) {
248
+ detectedStylesWithVariants.add({
249
+ label: 'variants',
250
+ key: styleKey
161
251
  })
252
+ }
162
253
  }
163
254
 
164
- if (uni.key && uni.key.name === 'variants') {
165
- dependencies.push(UnistyleDependency.Variants)
255
+ if (valuePath.isArrowFunctionExpression()) {
256
+ if(t.isObjectExpression(valuePath.node.body)) {
257
+ const hasVariants = valuePath.node.body.properties.some(innerProp => {
258
+
259
+ return t.isIdentifier(innerProp.key) && innerProp.key.name === 'variants'
260
+ })
261
+
262
+ if (hasVariants) {
263
+ detectedStylesWithVariants.add({
264
+ label: 'variants',
265
+ key: styleKey
266
+ })
267
+ }
268
+ }
166
269
  }
270
+ })
167
271
 
168
- // breakpoints are too complex and are handled by C++
272
+ const detectedStylesWithTheme = new Set()
273
+
274
+ // detect theme dependencies via Scope
275
+ themeNames.forEach(({ properties }) => {
276
+ properties.forEach(property => {
277
+ const binding = funcPath.scope.getBinding(property)
278
+
279
+ if (!binding) {
280
+ return
281
+ }
282
+
283
+ binding.referencePaths.forEach(refPath => {
284
+ // find key of the style that we are referring to
285
+ const containerProp = refPath
286
+ .findParent(parent => parent.isObjectProperty() && parent.parentPath === returnedObjectPath)
287
+
288
+ if (!containerProp) {
289
+ return
290
+ }
291
+
292
+ const keyNode = containerProp.get('key')
293
+ const styleKey = keyNode.isIdentifier()
294
+ ? keyNode.node.name
295
+ : keyNode.isLiteral()
296
+ ? keyNode.node.value
297
+ : null
298
+
299
+ if (styleKey) {
300
+ detectedStylesWithTheme.add({
301
+ label: 'theme',
302
+ key: styleKey
303
+ })
304
+ }
305
+ })
306
+ })
169
307
  })
170
308
 
171
- // add dependencies to the unistyle object if any found
172
- if (dependencies.length > 0) {
173
- const uniqueDependencies = Array.from(new Set(dependencies))
309
+ const detectedStylesWithRt = new Set()
310
+ const localRtName = t.isIdentifier(rtParam)
311
+ ? rtParam.name
312
+ : undefined
174
313
 
175
- debugMessage(uniqueDependencies)
314
+ // detect rt dependencies via Scope
315
+ rtNames.forEach(({ properties, parent }) => {
316
+ properties.forEach(property => {
317
+ const rtBinding = funcPath.scope.getBinding(property)
176
318
 
177
- unistyleObj.properties.push(
178
- t.objectProperty(
179
- t.identifier('uni__dependencies'),
180
- t.arrayExpression(uniqueDependencies.map(dep => t.numericLiteral(dep)))
181
- )
182
- )
183
- }
184
- }
319
+ if (!rtBinding) {
320
+ return
321
+ }
185
322
 
186
- function getUnistyles(t, property) {
187
- const propertyValue = t.isArrowFunctionExpression(property.value)
188
- ? property.value.body
189
- : property.value
323
+ const isValidDependency = Boolean(toUnistylesDependency(property))
190
324
 
191
- if (t.isObjectExpression(propertyValue)) {
192
- return [propertyValue]
193
- }
325
+ let validRtName = property
194
326
 
195
- if (t.isBlockStatement(propertyValue)) {
196
- // here we might have single return statement
197
- // or if-else statements with return statements
198
- return propertyValue.body
199
- .flatMap(value => {
200
- if (t.isReturnStatement(value)) {
201
- return [value]
327
+ // user used nested destructing, find out parent key
328
+ if (!isValidDependency && (!localRtName || (localRtName && localRtName !== property))) {
329
+ if (!parent) {
330
+ return
202
331
  }
203
332
 
204
- if (!t.isIfStatement(value)) {
205
- return []
333
+ if (!Boolean(toUnistylesDependency(parent))) {
334
+ return
206
335
  }
207
336
 
208
- return [value.consequent, value.alternate]
209
- .filter(Boolean)
210
- .flatMap(value => {
211
- if (t.isBlockStatement(value)) {
212
- return value.body.filter(t.isReturnStatement)
337
+ validRtName = parent
338
+ }
339
+
340
+ rtBinding.referencePaths.forEach(refPath => {
341
+ // to detect rt dependencies we need to get parameter not rt itself
342
+ // eg. rt.screen.width -> screen
343
+ // rt.insets.top -> insets
344
+ // special case: rt.insets.ime -> ime
345
+
346
+ let usedLabel = validRtName
347
+
348
+ if (refPath.parentPath.isMemberExpression() && refPath.parentPath.get('object') === refPath) {
349
+ const memberExpr = refPath.parentPath
350
+ const propPath = memberExpr.get('property')
351
+
352
+ if (propPath.isIdentifier()) {
353
+ if (localRtName) {
354
+ usedLabel = propPath.node.name
213
355
  }
356
+
357
+ if (
358
+ usedLabel === 'insets' &&
359
+ memberExpr.parentPath.isMemberExpression() &&
360
+ memberExpr.parentPath.get('object') === memberExpr
361
+ ) {
362
+ const secondPropPath = memberExpr.parentPath.get('property')
363
+
364
+ if (secondPropPath.isIdentifier() && secondPropPath.node.name === 'ime') {
365
+ usedLabel = 'ime'
366
+ }
367
+ }
368
+ }
369
+ }
370
+
371
+ // find key of the style that we are referring to
372
+ const containerProp = refPath
373
+ .findParent(parent => parent.isObjectProperty() && parent.parentPath === returnedObjectPath)
374
+
375
+ if (!containerProp) {
376
+ return
377
+ }
378
+
379
+ const keyNode = containerProp.get('key')
380
+ const styleKey = keyNode.isIdentifier()
381
+ ? keyNode.node.name
382
+ : keyNode.isLiteral()
383
+ ? keyNode.node.value
384
+ : null
385
+
386
+ if (styleKey) {
387
+ detectedStylesWithRt.add({
388
+ label: usedLabel,
389
+ key: styleKey
214
390
  })
391
+ }
215
392
  })
216
- .map(value => value.argument)
393
+ })
394
+ })
395
+
396
+ const variants = Array.from(detectedStylesWithVariants)
397
+ const theme = Array.from(detectedStylesWithTheme)
398
+ const rt = Array.from(detectedStylesWithRt)
399
+
400
+ return theme
401
+ .concat(rt)
402
+ .concat(variants)
403
+ .reduce((acc, { key, label }) => {
404
+ if (acc[key]) {
405
+ return {
406
+ ...acc,
407
+ [key]: [
408
+ ...acc[key],
409
+ label
410
+ ]
411
+ }
412
+ }
413
+
414
+ return {
415
+ ...acc,
416
+ [key]: [label]
417
+ }
418
+ }, {})
419
+ }
420
+
421
+ function toUnistylesDependency(dependency) {
422
+ switch (dependency) {
423
+ case 'theme': {
424
+ return UnistyleDependency.Theme
425
+ }
426
+ case 'themeName': {
427
+ return UnistyleDependency.ThemeName
428
+ }
429
+ case 'adaptiveThemes': {
430
+ return UnistyleDependency.AdaptiveThemes
431
+ }
432
+ case 'breakpoint': {
433
+ return UnistyleDependency.Breakpoints
434
+ }
435
+ case 'colorScheme': {
436
+ return UnistyleDependency.ColorScheme
437
+ }
438
+ case 'screen': {
439
+ return UnistyleDependency.Dimensions
440
+ }
441
+ case 'isPortrait':
442
+ case 'isLandscape': {
443
+ return UnistyleDependency.Orientation
444
+ }
445
+ case 'contentSizeCategory': {
446
+ return UnistyleDependency.ContentSizeCategory
447
+ }
448
+ case 'ime': {
449
+ return UnistyleDependency.Ime
450
+ }
451
+ case 'insets': {
452
+ return UnistyleDependency.Insets
453
+ }
454
+ case 'pixelRatio': {
455
+ return UnistyleDependency.PixelRatio
456
+ }
457
+ case 'fontScale': {
458
+ return UnistyleDependency.FontScale
459
+ }
460
+ case 'statusBar': {
461
+ return UnistyleDependency.StatusBar
462
+ }
463
+ case 'navigationBar': {
464
+ return UnistyleDependency.NavigationBar
465
+ }
466
+ case 'variants': {
467
+ return UnistyleDependency.Variants
468
+ }
469
+
470
+ // breakpoints are too complex and are handled by C++
471
+ }
472
+ }
473
+
474
+ function getReturnStatementsFromBody(t, node, results = []) {
475
+ if (t.isReturnStatement(node)) {
476
+ results.push(node)
477
+ }
478
+
479
+ if (t.isBlockStatement(node)) {
480
+ node.body.forEach(child => getReturnStatementsFromBody(t, child, results))
481
+ }
482
+
483
+ if (t.isIfStatement(node)) {
484
+ getReturnStatementsFromBody(t, node.consequent, results)
485
+
486
+ if (node.alternate) {
487
+ getReturnStatementsFromBody(t, node.alternate, results)
488
+ }
217
489
  }
218
490
 
219
- return []
491
+ return results
220
492
  }
221
493
 
222
- function addThemeDependencyToMemberExpression(t, path) {
223
- path.value = t.objectExpression([
224
- t.spreadElement(path.value),
225
- t.objectProperty(
226
- t.identifier('uni__dependencies'),
227
- t.arrayExpression([t.numericLiteral(UnistyleDependency.Theme)])
228
- )
229
- ])
494
+ function addDependencies(t, state, styleName, unistyle, detectedDependencies) {
495
+ const debugMessage = deps => {
496
+ if (state.opts.debug) {
497
+ const mappedDeps = deps
498
+ .map(dep => Object.keys(UnistyleDependency).find(key => UnistyleDependency[key] === dep))
499
+ .join(', ')
500
+
501
+ console.log(`${state.filename.replace(`${state.file.opts.root}/`, '')}: styles.${styleName}: [${mappedDeps}]`)
502
+ }
503
+ }
504
+
505
+ const styleDependencies = detectedDependencies.map(toUnistylesDependency)
506
+
507
+ // add metadata about dependencies
508
+ if (styleDependencies.length > 0) {
509
+ const uniqueDependencies = Array.from(new Set(styleDependencies))
510
+
511
+ debugMessage(uniqueDependencies)
512
+
513
+ let targets = []
514
+
515
+ if (t.isArrowFunctionExpression(unistyle.value) || t.isFunctionExpression(unistyle.value)) {
516
+ if (t.isObjectExpression(unistyle.value.body)) {
517
+ targets.push(unistyle.value.body)
518
+ }
519
+
520
+ if (t.isBlockStatement(unistyle.value.body)) {
521
+ targets = getReturnStatementsFromBody(t, unistyle.value.body)
522
+ .map(node => {
523
+ if (t.isIdentifier(node.argument)) {
524
+ node.argument = t.objectExpression([
525
+ t.spreadElement(node.argument)
526
+ ])
527
+ }
528
+
529
+ return node.argument
530
+ })
531
+ }
532
+ }
533
+
534
+ if (t.isObjectExpression(unistyle.value)) {
535
+ targets.push(unistyle.value)
536
+ }
537
+
538
+ if (t.isMemberExpression(unistyle.value)) {
539
+ // convert to object
540
+ unistyle.value = t.objectExpression([t.spreadElement(unistyle.value)])
541
+
542
+ targets.push(unistyle.value)
543
+ }
544
+
545
+ if (targets.length > 0) {
546
+ targets.forEach(target => {
547
+ target.properties.push(
548
+ t.objectProperty(
549
+ t.identifier('uni__dependencies'),
550
+ t.arrayExpression(uniqueDependencies.map(dep => t.numericLiteral(dep)))
551
+ )
552
+ )
553
+ })
554
+ }
555
+ }
230
556
  }
231
557
 
232
558
  module.exports = {
233
559
  isUnistylesStyleSheet,
234
- analyzeDependencies,
560
+ addDependencies,
235
561
  addStyleSheetTag,
236
- getUnistyles,
237
- isKindOfStyleSheet,
238
- addThemeDependencyToMemberExpression
562
+ getStylesDependenciesFromObject,
563
+ getStylesDependenciesFromFunction,
564
+ isKindOfStyleSheet
239
565
  }
@@ -1,10 +1,10 @@
1
1
  import { Animated as RNAnimated } from 'react-native'
2
- import { View } from './View'
3
- import { Text } from './Text'
4
2
  import { FlatList } from './FlatList'
5
3
  import { Image } from './Image'
6
4
  import { ScrollView } from './ScrollView'
7
5
  import { SectionList } from './SectionList'
6
+ import { Text } from './Text'
7
+ import { View } from './View'
8
8
 
9
9
  export const Animated = {
10
10
  ...RNAnimated,
@@ -1,11 +1,11 @@
1
1
  import React from 'react'
2
- import { ImageBackground as NativeImageBackground } from 'react-native'
3
2
  import { forwardRef } from 'react'
4
- import type { UnistylesValues } from '../../types'
3
+ import { ImageBackground as NativeImageBackground } from 'react-native'
5
4
  import { getClassName } from '../../core'
6
- import { isServer } from '../../web/utils'
7
- import { UnistylesShadowRegistry } from '../../web'
5
+ import type { UnistylesValues } from '../../types'
8
6
  import { copyComponentProperties } from '../../utils'
7
+ import { UnistylesShadowRegistry } from '../../web'
8
+ import { isServer } from '../../web/utils'
9
9
 
10
10
  type Props = {
11
11
  style?: UnistylesValues