@tamagui/static 1.0.0-alpha.8 → 1.0.0-beta.179

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 (231) hide show
  1. package/README.md +3 -19
  2. package/dist/cjs/constants.js +36 -0
  3. package/dist/cjs/constants.js.map +7 -0
  4. package/dist/cjs/extractor/accessSafe.js +32 -0
  5. package/dist/cjs/extractor/accessSafe.js.map +7 -0
  6. package/dist/cjs/extractor/babelParse.js +51 -0
  7. package/dist/cjs/extractor/babelParse.js.map +7 -0
  8. package/dist/cjs/extractor/buildClassName.js +61 -0
  9. package/dist/cjs/extractor/buildClassName.js.map +7 -0
  10. package/dist/cjs/extractor/createEvaluator.js +73 -0
  11. package/dist/cjs/extractor/createEvaluator.js.map +7 -0
  12. package/dist/cjs/extractor/createExtractor.js +1091 -0
  13. package/dist/cjs/extractor/createExtractor.js.map +7 -0
  14. package/dist/cjs/extractor/ensureImportingConcat.js +45 -0
  15. package/dist/cjs/extractor/ensureImportingConcat.js.map +7 -0
  16. package/dist/cjs/extractor/evaluateAstNode.js +115 -0
  17. package/dist/cjs/extractor/evaluateAstNode.js.map +7 -0
  18. package/dist/cjs/extractor/extractHelpers.js +124 -0
  19. package/dist/cjs/extractor/extractHelpers.js.map +7 -0
  20. package/dist/cjs/extractor/extractMediaStyle.js +186 -0
  21. package/dist/cjs/extractor/extractMediaStyle.js.map +7 -0
  22. package/dist/cjs/extractor/extractToClassNames.js +324 -0
  23. package/dist/cjs/extractor/extractToClassNames.js.map +7 -0
  24. package/dist/cjs/extractor/findTopmostFunction.js +41 -0
  25. package/dist/cjs/extractor/findTopmostFunction.js.map +7 -0
  26. package/dist/cjs/extractor/generatedUid.js +49 -0
  27. package/dist/cjs/extractor/generatedUid.js.map +7 -0
  28. package/dist/cjs/extractor/getPrefixLogs.js +29 -0
  29. package/dist/cjs/extractor/getPrefixLogs.js.map +7 -0
  30. package/dist/cjs/extractor/getPropValueFromAttributes.js +70 -0
  31. package/dist/cjs/extractor/getPropValueFromAttributes.js.map +7 -0
  32. package/dist/cjs/extractor/getSourceModule.js +90 -0
  33. package/dist/cjs/extractor/getSourceModule.js.map +7 -0
  34. package/dist/cjs/extractor/getStaticBindingsForScope.js +149 -0
  35. package/dist/cjs/extractor/getStaticBindingsForScope.js.map +7 -0
  36. package/dist/cjs/extractor/hoistClassNames.js +65 -0
  37. package/dist/cjs/extractor/hoistClassNames.js.map +7 -0
  38. package/dist/cjs/extractor/literalToAst.js +114 -0
  39. package/dist/cjs/extractor/literalToAst.js.map +7 -0
  40. package/dist/cjs/extractor/loadTamagui.js +83 -0
  41. package/dist/cjs/extractor/loadTamagui.js.map +7 -0
  42. package/dist/cjs/extractor/logLines.js +40 -0
  43. package/dist/cjs/extractor/logLines.js.map +7 -0
  44. package/dist/cjs/extractor/normalizeTernaries.js +101 -0
  45. package/dist/cjs/extractor/normalizeTernaries.js.map +7 -0
  46. package/dist/cjs/extractor/removeUnusedHooks.js +100 -0
  47. package/dist/cjs/extractor/removeUnusedHooks.js.map +7 -0
  48. package/dist/cjs/extractor/validHTMLAttributes.js +71 -0
  49. package/dist/cjs/extractor/validHTMLAttributes.js.map +7 -0
  50. package/dist/cjs/index.js +34 -0
  51. package/dist/cjs/index.js.map +7 -0
  52. package/dist/cjs/patchReactNativeWeb.js +151 -0
  53. package/dist/cjs/patchReactNativeWeb.js.map +7 -0
  54. package/dist/cjs/types.js +16 -0
  55. package/dist/cjs/types.js.map +7 -0
  56. package/dist/{constants.js → esm/constants.js} +4 -0
  57. package/dist/{constants.js.map → esm/constants.js.map} +3 -3
  58. package/dist/{extractor → esm/extractor}/accessSafe.js +0 -0
  59. package/dist/{extractor → esm/extractor}/accessSafe.js.map +2 -2
  60. package/dist/{extractor → esm/extractor}/babelParse.js +0 -0
  61. package/dist/{extractor → esm/extractor}/babelParse.js.map +2 -2
  62. package/dist/{extractor → esm/extractor}/buildClassName.js +0 -0
  63. package/dist/{extractor → esm/extractor}/buildClassName.js.map +2 -2
  64. package/dist/{extractor → esm/extractor}/createEvaluator.js +3 -2
  65. package/dist/esm/extractor/createEvaluator.js.map +7 -0
  66. package/dist/{extractor → esm/extractor}/createExtractor.js +411 -196
  67. package/dist/esm/extractor/createExtractor.js.map +7 -0
  68. package/dist/{extractor → esm/extractor}/ensureImportingConcat.js +1 -1
  69. package/dist/esm/extractor/ensureImportingConcat.js.map +7 -0
  70. package/dist/{extractor → esm/extractor}/evaluateAstNode.js +0 -0
  71. package/dist/esm/extractor/evaluateAstNode.js.map +7 -0
  72. package/dist/{extractor → esm/extractor}/extractHelpers.js +20 -11
  73. package/dist/esm/extractor/extractHelpers.js.map +7 -0
  74. package/dist/{extractor → esm/extractor}/extractMediaStyle.js +3 -2
  75. package/dist/esm/extractor/extractMediaStyle.js.map +7 -0
  76. package/dist/{extractor → esm/extractor}/extractToClassNames.js +100 -47
  77. package/dist/esm/extractor/extractToClassNames.js.map +7 -0
  78. package/dist/{extractor → esm/extractor}/findTopmostFunction.js +0 -0
  79. package/dist/{extractor → esm/extractor}/findTopmostFunction.js.map +2 -2
  80. package/dist/{extractor → esm/extractor}/generatedUid.js +0 -0
  81. package/dist/{extractor → esm/extractor}/generatedUid.js.map +2 -2
  82. package/dist/esm/extractor/getPrefixLogs.js +12 -0
  83. package/dist/esm/extractor/getPrefixLogs.js.map +7 -0
  84. package/dist/{extractor → esm/extractor}/getPropValueFromAttributes.js +0 -0
  85. package/dist/{extractor → esm/extractor}/getPropValueFromAttributes.js.map +2 -2
  86. package/dist/{extractor → esm/extractor}/getSourceModule.js +0 -0
  87. package/dist/{extractor → esm/extractor}/getSourceModule.js.map +2 -2
  88. package/dist/{extractor → esm/extractor}/getStaticBindingsForScope.js +0 -0
  89. package/dist/esm/extractor/getStaticBindingsForScope.js.map +7 -0
  90. package/dist/{extractor → esm/extractor}/hoistClassNames.js +0 -0
  91. package/dist/{extractor → esm/extractor}/hoistClassNames.js.map +2 -2
  92. package/dist/esm/extractor/literalToAst.js +80 -0
  93. package/dist/esm/extractor/literalToAst.js.map +7 -0
  94. package/dist/{extractor → esm/extractor}/loadTamagui.js +27 -3
  95. package/dist/esm/extractor/loadTamagui.js.map +7 -0
  96. package/dist/esm/extractor/logLines.js +22 -0
  97. package/dist/esm/extractor/logLines.js.map +7 -0
  98. package/dist/{extractor → esm/extractor}/normalizeTernaries.js +3 -2
  99. package/dist/esm/extractor/normalizeTernaries.js.map +7 -0
  100. package/dist/{extractor → esm/extractor}/removeUnusedHooks.js +5 -3
  101. package/dist/esm/extractor/removeUnusedHooks.js.map +7 -0
  102. package/dist/esm/extractor/validHTMLAttributes.js +52 -0
  103. package/dist/esm/extractor/validHTMLAttributes.js.map +7 -0
  104. package/dist/{index.js → esm/index.js} +0 -0
  105. package/dist/{index.js.map → esm/index.js.map} +1 -1
  106. package/dist/{patchReactNativeWeb.js → esm/patchReactNativeWeb.js} +37 -14
  107. package/dist/esm/patchReactNativeWeb.js.map +7 -0
  108. package/dist/{types.js → esm/types.js} +0 -0
  109. package/dist/{types.js.map → esm/types.js.map} +0 -0
  110. package/dist/jsx/constants.js +13 -0
  111. package/dist/jsx/extractor/accessSafe.js +10 -0
  112. package/dist/jsx/extractor/babelParse.js +29 -0
  113. package/dist/jsx/extractor/buildClassName.js +39 -0
  114. package/dist/jsx/extractor/createEvaluator.js +51 -0
  115. package/dist/jsx/extractor/createExtractor.js +1041 -0
  116. package/dist/jsx/extractor/ensureImportingConcat.js +23 -0
  117. package/dist/jsx/extractor/evaluateAstNode.js +93 -0
  118. package/dist/jsx/extractor/extractHelpers.js +102 -0
  119. package/dist/jsx/extractor/extractMediaStyle.js +151 -0
  120. package/dist/jsx/extractor/extractToClassNames.js +287 -0
  121. package/dist/jsx/extractor/findTopmostFunction.js +22 -0
  122. package/dist/jsx/extractor/generatedUid.js +27 -0
  123. package/dist/jsx/extractor/getPrefixLogs.js +11 -0
  124. package/dist/jsx/extractor/getPropValueFromAttributes.js +48 -0
  125. package/dist/jsx/extractor/getSourceModule.js +68 -0
  126. package/dist/jsx/extractor/getStaticBindingsForScope.js +127 -0
  127. package/dist/jsx/extractor/hoistClassNames.js +43 -0
  128. package/dist/jsx/extractor/literalToAst.js +79 -0
  129. package/dist/jsx/extractor/loadTamagui.js +64 -0
  130. package/dist/jsx/extractor/logLines.js +21 -0
  131. package/dist/jsx/extractor/normalizeTernaries.js +52 -0
  132. package/dist/jsx/extractor/removeUnusedHooks.js +79 -0
  133. package/dist/jsx/extractor/validHTMLAttributes.js +51 -0
  134. package/dist/jsx/index.js +13 -0
  135. package/{src/patchReactNativeWeb.ts → dist/jsx/patchReactNativeWeb.js} +65 -59
  136. package/dist/jsx/types.js +0 -0
  137. package/package.json +26 -23
  138. package/types/constants.d.ts +6 -0
  139. package/types/constants.d.ts.map +1 -0
  140. package/types/extractor/accessSafe.d.ts +3 -0
  141. package/types/extractor/accessSafe.d.ts.map +1 -0
  142. package/types/extractor/babelParse.d.ts +5 -0
  143. package/types/extractor/babelParse.d.ts.map +1 -0
  144. package/types/extractor/buildClassName.d.ts +4 -0
  145. package/types/extractor/buildClassName.d.ts.map +1 -0
  146. package/types/extractor/createEvaluator.d.ts +12 -0
  147. package/types/extractor/createEvaluator.d.ts.map +1 -0
  148. package/types/extractor/createExtractor.d.ts +27 -0
  149. package/types/extractor/createExtractor.d.ts.map +1 -0
  150. package/types/extractor/ensureImportingConcat.d.ts +4 -0
  151. package/types/extractor/ensureImportingConcat.d.ts.map +1 -0
  152. package/types/extractor/evaluateAstNode.d.ts +3 -0
  153. package/types/extractor/evaluateAstNode.d.ts.map +1 -0
  154. package/types/extractor/extractHelpers.d.ts +12 -0
  155. package/types/extractor/extractHelpers.d.ts.map +1 -0
  156. package/types/extractor/extractMediaStyle.d.ts +10 -0
  157. package/types/extractor/extractMediaStyle.d.ts.map +1 -0
  158. package/types/extractor/extractToClassNames.d.ts +23 -0
  159. package/types/extractor/extractToClassNames.d.ts.map +1 -0
  160. package/types/extractor/findTopmostFunction.d.ts +4 -0
  161. package/types/extractor/findTopmostFunction.d.ts.map +1 -0
  162. package/types/extractor/generatedUid.d.ts +5 -0
  163. package/types/extractor/generatedUid.d.ts.map +1 -0
  164. package/types/extractor/getPrefixLogs.d.ts +3 -0
  165. package/types/extractor/getPrefixLogs.d.ts.map +1 -0
  166. package/types/extractor/getPropValueFromAttributes.d.ts +3 -0
  167. package/types/extractor/getPropValueFromAttributes.d.ts.map +1 -0
  168. package/types/extractor/getSourceModule.d.ts +16 -0
  169. package/types/extractor/getSourceModule.d.ts.map +1 -0
  170. package/types/extractor/getStaticBindingsForScope.d.ts +4 -0
  171. package/types/extractor/getStaticBindingsForScope.d.ts.map +1 -0
  172. package/types/extractor/hoistClassNames.d.ts +6 -0
  173. package/types/extractor/hoistClassNames.d.ts.map +1 -0
  174. package/types/extractor/literalToAst.d.ts +4 -0
  175. package/types/extractor/literalToAst.d.ts.map +1 -0
  176. package/types/extractor/loadTamagui.d.ts +9 -0
  177. package/types/extractor/loadTamagui.d.ts.map +1 -0
  178. package/types/extractor/logLines.d.ts +2 -0
  179. package/types/extractor/logLines.d.ts.map +1 -0
  180. package/types/extractor/normalizeTernaries.d.ts +3 -0
  181. package/types/extractor/normalizeTernaries.d.ts.map +1 -0
  182. package/types/extractor/removeUnusedHooks.d.ts +3 -0
  183. package/types/extractor/removeUnusedHooks.d.ts.map +1 -0
  184. package/types/extractor/validHTMLAttributes.d.ts +49 -0
  185. package/types/extractor/validHTMLAttributes.d.ts.map +1 -0
  186. package/types/index.d.ts +8 -0
  187. package/types/index.d.ts.map +1 -0
  188. package/types/patchReactNativeWeb.d.ts +2 -0
  189. package/types/patchReactNativeWeb.d.ts.map +1 -0
  190. package/types/types.d.ts +85 -0
  191. package/types/types.d.ts.map +1 -0
  192. package/dist/extractor/createEvaluator.js.map +0 -7
  193. package/dist/extractor/createExtractor.js.map +0 -7
  194. package/dist/extractor/ensureImportingConcat.js.map +0 -7
  195. package/dist/extractor/evaluateAstNode.js.map +0 -7
  196. package/dist/extractor/extractHelpers.js.map +0 -7
  197. package/dist/extractor/extractMediaStyle.js.map +0 -7
  198. package/dist/extractor/extractToClassNames.js.map +0 -7
  199. package/dist/extractor/getStaticBindingsForScope.js.map +0 -7
  200. package/dist/extractor/literalToAst.js +0 -34
  201. package/dist/extractor/literalToAst.js.map +0 -7
  202. package/dist/extractor/loadTamagui.js.map +0 -7
  203. package/dist/extractor/normalizeTernaries.js.map +0 -7
  204. package/dist/extractor/removeUnusedHooks.js.map +0 -7
  205. package/dist/index.cjs +0 -2116
  206. package/dist/index.cjs.map +0 -7
  207. package/dist/patchReactNativeWeb.js.map +0 -7
  208. package/src/constants.ts +0 -10
  209. package/src/extractor/accessSafe.ts +0 -18
  210. package/src/extractor/babelParse.ts +0 -27
  211. package/src/extractor/buildClassName.ts +0 -61
  212. package/src/extractor/createEvaluator.ts +0 -68
  213. package/src/extractor/createExtractor.ts +0 -1139
  214. package/src/extractor/ensureImportingConcat.ts +0 -33
  215. package/src/extractor/evaluateAstNode.ts +0 -121
  216. package/src/extractor/extractHelpers.ts +0 -102
  217. package/src/extractor/extractMediaStyle.ts +0 -191
  218. package/src/extractor/extractToClassNames.ts +0 -326
  219. package/src/extractor/findTopmostFunction.ts +0 -22
  220. package/src/extractor/generatedUid.ts +0 -43
  221. package/src/extractor/getPropValueFromAttributes.ts +0 -92
  222. package/src/extractor/getSourceModule.ts +0 -101
  223. package/src/extractor/getStaticBindingsForScope.ts +0 -173
  224. package/src/extractor/hoistClassNames.ts +0 -45
  225. package/src/extractor/literalToAst.ts +0 -32
  226. package/src/extractor/loadTamagui.ts +0 -61
  227. package/src/extractor/normalizeTernaries.ts +0 -60
  228. package/src/extractor/removeUnusedHooks.ts +0 -76
  229. package/src/index.ts +0 -9
  230. package/src/types.ts +0 -89
  231. package/types.d.ts +0 -219
@@ -1,33 +0,0 @@
1
- import { NodePath } from '@babel/traverse'
2
- import * as t from '@babel/types'
3
-
4
- import { CONCAT_CLASSNAME_IMPORT } from './extractToClassNames'
5
-
6
- const importConcatPkg = '@tamagui/helpers'
7
-
8
- export function ensureImportingConcat(path: NodePath<t.Program>) {
9
- const bodyPath = path.get('body')
10
- const imported: NodePath<t.ImportDeclaration> | undefined = bodyPath.find(
11
- (x) => x.isImportDeclaration() && x.node.source.value === importConcatPkg
12
- ) as any
13
- const importSpecifier = t.importSpecifier(
14
- t.identifier(CONCAT_CLASSNAME_IMPORT),
15
- t.identifier(CONCAT_CLASSNAME_IMPORT)
16
- )
17
-
18
- if (!imported) {
19
- path.node.body.push(t.importDeclaration([importSpecifier], t.stringLiteral(importConcatPkg)))
20
- return
21
- }
22
-
23
- const specifiers = imported.node.specifiers
24
- const alreadyImported = specifiers.some(
25
- (x) => t.isImportSpecifier(x) && t.isIdentifier(x.imported) && x.imported.name === CONCAT_CLASSNAME_IMPORT
26
- )
27
-
28
- if (!alreadyImported) {
29
- specifiers.push(
30
- t.importSpecifier(t.identifier(CONCAT_CLASSNAME_IMPORT), t.identifier(CONCAT_CLASSNAME_IMPORT))
31
- )
32
- }
33
- }
@@ -1,121 +0,0 @@
1
- import * as t from '@babel/types'
2
-
3
- export function evaluateAstNode(
4
- exprNode: t.Node | undefined | null,
5
- evalFn?: (node: t.Node) => any,
6
- shouldPrintDebug?: boolean
7
- ): any {
8
- if (exprNode === undefined) {
9
- return undefined
10
- }
11
-
12
- // null === boolean true (at least in our use cases for jsx eval)
13
- if (exprNode === null) {
14
- return true
15
- }
16
-
17
- if (t.isJSXExpressionContainer(exprNode)) {
18
- return evaluateAstNode(exprNode.expression)
19
- }
20
-
21
- // loop through ObjectExpression keys
22
- if (t.isObjectExpression(exprNode)) {
23
- const ret: Record<string, any> = {}
24
- for (let idx = -1, len = exprNode.properties.length; ++idx < len; ) {
25
- const value = exprNode.properties[idx]
26
-
27
- if (!t.isObjectProperty(value)) {
28
- throw new Error('evaluateAstNode can only evaluate object properties')
29
- }
30
-
31
- let key: string | number | null | undefined | boolean
32
- if (value.computed) {
33
- if (typeof evalFn !== 'function') {
34
- throw new Error(
35
- 'evaluateAstNode does not support computed keys unless an eval function is provided'
36
- )
37
- }
38
- key = evaluateAstNode(value.key, evalFn)
39
- } else if (t.isIdentifier(value.key)) {
40
- key = value.key.name
41
- } else if (t.isStringLiteral(value.key) || t.isNumericLiteral(value.key)) {
42
- key = value.key.value
43
- } else {
44
- throw new Error('Unsupported key type: ' + value.key.type)
45
- }
46
-
47
- if (typeof key !== 'string' && typeof key !== 'number') {
48
- throw new Error('key must be either a string or a number')
49
- }
50
-
51
- ret[key] = evaluateAstNode(value.value, evalFn)
52
- }
53
- return ret
54
- }
55
-
56
- if (t.isArrayExpression(exprNode)) {
57
- return exprNode.elements.map((x) => {
58
- return evaluateAstNode(x as any, evalFn)
59
- })
60
- }
61
-
62
- if (t.isUnaryExpression(exprNode) && exprNode.operator === '-') {
63
- const ret = evaluateAstNode(exprNode.argument, evalFn)
64
- if (ret == null) {
65
- return null
66
- }
67
- return -ret
68
- }
69
-
70
- if (t.isTemplateLiteral(exprNode)) {
71
- if (typeof evalFn !== 'function') {
72
- throw new Error(
73
- 'evaluateAstNode does not support template literals unless an eval function is provided'
74
- )
75
- }
76
-
77
- let ret: string = ''
78
- for (let idx = -1, len = exprNode.quasis.length; ++idx < len; ) {
79
- const quasi = exprNode.quasis[idx]
80
- const expr = exprNode.expressions[idx]
81
- ret += quasi.value.raw
82
- if (expr) {
83
- ret += evaluateAstNode(expr, evalFn)
84
- }
85
- }
86
- return ret
87
- }
88
-
89
- // In the interest of representing the "evaluated" prop
90
- // as the user intended, we support negative null. Why not.
91
- if (t.isNullLiteral(exprNode)) {
92
- return null
93
- }
94
-
95
- if (t.isNumericLiteral(exprNode) || t.isStringLiteral(exprNode) || t.isBooleanLiteral(exprNode)) {
96
- // In the interest of representing the "evaluated" prop
97
- // as the user intended, we support negative null. Why not.
98
- return exprNode.value
99
- }
100
-
101
- if (t.isBinaryExpression(exprNode)) {
102
- if (exprNode.operator === '+') {
103
- return evaluateAstNode(exprNode.left, evalFn) + evaluateAstNode(exprNode.right, evalFn)
104
- } else if (exprNode.operator === '-') {
105
- return evaluateAstNode(exprNode.left, evalFn) - evaluateAstNode(exprNode.right, evalFn)
106
- } else if (exprNode.operator === '*') {
107
- return evaluateAstNode(exprNode.left, evalFn) * evaluateAstNode(exprNode.right, evalFn)
108
- } else if (exprNode.operator === '/') {
109
- return evaluateAstNode(exprNode.left, evalFn) / evaluateAstNode(exprNode.right, evalFn)
110
- }
111
- }
112
-
113
- // if we've made it this far, the value has to be evaluated
114
- if (typeof evalFn !== 'function') {
115
- throw new Error(
116
- 'evaluateAstNode does not support non-literal values unless an eval function is provided'
117
- )
118
- }
119
-
120
- return evalFn(exprNode)
121
- }
@@ -1,102 +0,0 @@
1
- import type { NodePath } from '@babel/traverse'
2
- import * as t from '@babel/types'
3
-
4
- import { ExtractedAttr, Ternary } from '../types'
5
-
6
- export function isPresent<T extends Object>(input: null | void | undefined | T): input is T {
7
- return input != null
8
- }
9
-
10
- export function isSimpleSpread(node: t.JSXSpreadAttribute) {
11
- return t.isIdentifier(node.argument) || t.isMemberExpression(node.argument)
12
- }
13
-
14
- export const attrStr = (attr: ExtractedAttr) => {
15
- return attr.type === 'attr'
16
- ? getNameAttr(attr.value)
17
- : attr.type === 'ternary'
18
- ? `...${ternaryStr(attr.value)}`
19
- : `${attr.type}(${objToStr(attr.value)})`
20
- }
21
-
22
- export const objToStr = (obj: any) => {
23
- return Object.entries(obj)
24
- .map(
25
- ([k, v]) =>
26
- `${k}:${Array.isArray(v) ? `[...]` : v && typeof v === 'object' ? `{${objToStr(v)}}` : v}`
27
- )
28
- .join(', ')
29
- }
30
-
31
- const getNameAttr = (attr: t.JSXAttribute | t.JSXSpreadAttribute) => {
32
- if (t.isJSXSpreadAttribute(attr)) {
33
- return `...${attr.argument['name']}`
34
- }
35
- return 'name' in attr ? attr.name.name : `unknown-${attr['type']}`
36
- }
37
-
38
- export const ternaryStr = (x: Ternary) => {
39
- return [
40
- 'ternary:',
41
- t.isIdentifier(x.test)
42
- ? x.test.name
43
- : t.isMemberExpression(x.test)
44
- ? [x.test.object['name'], x.test.property['name']]
45
- : x.test,
46
- x.consequent ? ` ? ${objToStr(x.consequent)}` : ' ? ⚫️',
47
- x.alternate ? ` : ${objToStr(x.alternate)}` : ' : ⚫️',
48
- ]
49
- .flat()
50
- .join('')
51
- }
52
-
53
- export function findComponentName(scope) {
54
- let componentName = ''
55
- let cur = scope.path
56
- while (cur.parentPath && !t.isProgram(cur.parentPath.parent)) {
57
- cur = cur.parentPath
58
- }
59
- let node = cur.parent
60
- if (t.isExportNamedDeclaration(node)) {
61
- node = node.declaration
62
- }
63
- if (t.isVariableDeclaration(node)) {
64
- const [dec] = node.declarations
65
- if (t.isVariableDeclarator(dec) && t.isIdentifier(dec.id)) {
66
- return dec.id.name
67
- }
68
- }
69
- if (t.isFunctionDeclaration(node)) {
70
- return node.id?.name
71
- }
72
- return componentName
73
- }
74
-
75
- export function isValidThemeHook(
76
- jsxPath: NodePath<t.JSXElement>,
77
- n: t.MemberExpression,
78
- sourcePath: string
79
- ) {
80
- if (!t.isIdentifier(n.object) || !t.isIdentifier(n.property)) return false
81
- const bindings = jsxPath.scope.getAllBindings()
82
- const binding = bindings[n.object.name]
83
- if (!binding?.path) return false
84
- if (!binding.path.isVariableDeclarator()) return false
85
- const init = binding.path.node.init
86
- if (!t.isCallExpression(init)) return false
87
- if (!t.isIdentifier(init.callee)) return false
88
- // TODO could support renaming useTheme by looking up import first
89
- if (init.callee.name !== 'useTheme') return false
90
- const importNode = binding.scope.getBinding('useTheme')?.path.parent
91
- if (!t.isImportDeclaration(importNode)) return false
92
- if (importNode.source.value !== 'tamagui') {
93
- if (!isInsideTamagui(sourcePath)) {
94
- return false
95
- }
96
- }
97
- return true
98
- }
99
-
100
- export const isInsideTamagui = (srcName: string) => {
101
- return srcName.includes('/tamagui/_jsx') || srcName.includes('/core/src')
102
- }
@@ -1,191 +0,0 @@
1
- import { NodePath } from '@babel/traverse'
2
- import * as t from '@babel/types'
3
- import type { TamaguiInternalConfig } from '@tamagui/core'
4
- import { getStylesAtomic, mediaObjectToString } from '@tamagui/core-node'
5
- import { ViewStyle } from 'react-native'
6
-
7
- import { MEDIA_SEP } from '../constants'
8
- import { StyleObject, Ternary } from '../types'
9
- import { isInsideTamagui, isPresent } from './extractHelpers'
10
-
11
- export function extractMediaStyle(
12
- ternary: Ternary,
13
- jsxPath: NodePath<t.JSXElement>,
14
- tamaguiConfig: TamaguiInternalConfig,
15
- sourcePath: string,
16
- importance = 0,
17
- shouldPrintDebug = false
18
- ) {
19
- const mt = getMediaQueryTernary(ternary, jsxPath, sourcePath)
20
- if (!mt) {
21
- return null
22
- }
23
- const { key } = mt
24
- const mq = tamaguiConfig.media[key]
25
- if (!mq) {
26
- console.error(`Media query "${key}" not found: ${Object.keys(tamaguiConfig.media)}`)
27
- return null
28
- }
29
- const getStyleObj = (styleObj: ViewStyle | null, negate = false) => {
30
- return styleObj ? { styleObj, negate } : null
31
- }
32
- const styleOpts = [
33
- getStyleObj(ternary.consequent, false),
34
- getStyleObj(ternary.alternate, true),
35
- ].filter(isPresent)
36
- if (shouldPrintDebug && !styleOpts.length) {
37
- console.log(' media query, no styles?')
38
- return null
39
- }
40
- // for now order first strongest
41
- const mediaKeys = Object.keys(tamaguiConfig.media)
42
- const mediaKeyPrecendence = mediaKeys.reduce((acc, cur, i) => {
43
- acc[cur] = new Array(importance + 1).fill(':root').join('')
44
- return acc
45
- }, {})
46
- let mediaStyles: StyleObject[] = []
47
- for (const { styleObj, negate } of styleOpts) {
48
- const styles = getStylesAtomic(styleObj)
49
- const singleMediaStyles = styles.map((style) => {
50
- const negKey = negate ? '0' : ''
51
- const ogPrefix = style.identifier.slice(0, style.identifier.indexOf('-') + 1)
52
- // adds an extra separator before and after to detect later in concatClassName
53
- // so it goes from: "_f-[hash]"
54
- // to: "_f-_sm0_[hash]" or "_f-_sm_[hash]"
55
- const identifier = `${style.identifier.replace(
56
- ogPrefix,
57
- `${ogPrefix}${MEDIA_SEP}${key}${negKey}${MEDIA_SEP}`
58
- )}`
59
- const className = `.${identifier}`
60
- const mediaSelector = mediaObjectToString(tamaguiConfig.media[key])
61
- const screenStr = negate ? 'not all' : 'screen'
62
- const mediaQuery = `${screenStr} and ${mediaSelector}`
63
- const precendencePrefix = mediaKeyPrecendence[key]
64
- const styleInner = style.rules[0].replace(style.identifier, identifier)
65
- // combines media queries if they already exist
66
- let styleRule = ''
67
- if (styleInner.includes('@media')) {
68
- // combine
69
- styleRule = styleInner.replace('{', ` and ${mediaQuery} {`)
70
- } else {
71
- styleRule = `@media ${mediaQuery} { ${precendencePrefix} ${styleInner} }`
72
- }
73
- return {
74
- ...style,
75
- identifier,
76
- className,
77
- rules: [styleRule],
78
- }
79
- })
80
- if (shouldPrintDebug) {
81
- // prettier-ignore
82
- console.log(' media styles:', importance, singleMediaStyles.map(x => x.identifier).join(', '))
83
- }
84
- // add to output
85
- mediaStyles = [...mediaStyles, ...singleMediaStyles]
86
- }
87
- // filter out
88
- ternary.remove()
89
- return { mediaStyles, ternaryWithoutMedia: mt.ternaryWithoutMedia }
90
- }
91
-
92
- function getMediaQueryTernary(
93
- ternary: Ternary,
94
- jsxPath: NodePath<t.JSXElement>,
95
- sourcePath: string
96
- ): null | {
97
- key: string
98
- bindingName: string
99
- ternaryWithoutMedia: Ternary | null
100
- } {
101
- // this handles unwrapping logical && media query ternarys
102
- // first, unwrap if it has media logicalExpression
103
- if (t.isLogicalExpression(ternary.test) && ternary.test.operator === '&&') {
104
- // *should* be normalized to always be on left side, TODO verify
105
- const mediaLeft = getMediaInfoFromExpression(
106
- ternary.test.left,
107
- jsxPath,
108
- sourcePath,
109
- ternary.inlineMediaQuery
110
- )
111
- if (mediaLeft) {
112
- return {
113
- ...mediaLeft,
114
- ternaryWithoutMedia: {
115
- ...ternary,
116
- test: ternary.test.right,
117
- },
118
- }
119
- }
120
- }
121
- // const media = useMedia()
122
- // ... media.sm
123
- const result = getMediaInfoFromExpression(
124
- ternary.test,
125
- jsxPath,
126
- sourcePath,
127
- ternary.inlineMediaQuery
128
- )
129
- if (result) {
130
- return {
131
- ...result,
132
- ternaryWithoutMedia: null,
133
- }
134
- }
135
- return null
136
- }
137
-
138
- function getMediaInfoFromExpression(
139
- test: t.Expression,
140
- jsxPath: NodePath<t.JSXElement>,
141
- sourcePath: string,
142
- inlineMediaQuery?: string
143
- ) {
144
- if (inlineMediaQuery) {
145
- return {
146
- key: inlineMediaQuery,
147
- bindingName: inlineMediaQuery,
148
- }
149
- }
150
- if (t.isMemberExpression(test) && t.isIdentifier(test.object) && t.isIdentifier(test.property)) {
151
- const name = test.object['name']
152
- const key = test.property['name']
153
- const bindings = jsxPath.scope.getAllBindings()
154
- const binding = bindings[name]
155
- if (!binding) return false
156
- const bindingNode = binding.path?.node
157
- if (!t.isVariableDeclarator(bindingNode) || !bindingNode.init) return false
158
- if (!isValidMediaCall(jsxPath, bindingNode.init, sourcePath)) return false
159
- return { key, bindingName: name }
160
- }
161
- if (t.isIdentifier(test)) {
162
- const key = test.name
163
- const node = jsxPath.scope.getBinding(test.name)?.path?.node
164
- if (!t.isVariableDeclarator(node)) return false
165
- if (!node.init || !isValidMediaCall(jsxPath, node.init, sourcePath)) return false
166
- return { key, bindingName: key }
167
- }
168
- return null
169
- }
170
-
171
- export function isValidMediaCall(
172
- jsxPath: NodePath<t.JSXElement>,
173
- init: t.Expression,
174
- sourcePath: string
175
- ) {
176
- if (!t.isCallExpression(init)) return false
177
- if (!t.isIdentifier(init.callee)) return false
178
- // TODO could support renaming useMedia by looking up import first
179
- if (init.callee.name !== 'useMedia') return false
180
- const bindings = jsxPath.scope.getAllBindings()
181
- const mediaBinding = bindings['useMedia']
182
- if (!mediaBinding) return false
183
- const useMediaImport = mediaBinding.path.parent
184
- if (!t.isImportDeclaration(useMediaImport)) return false
185
- if (useMediaImport.source.value !== 'tamagui') {
186
- if (!isInsideTamagui(sourcePath)) {
187
- return false
188
- }
189
- }
190
- return true
191
- }