@tamagui/static 1.0.1-beta.21 → 1.0.1-beta.210

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 (260) hide show
  1. package/dist/{cjs/constants.js → constants.js} +9 -4
  2. package/dist/constants.js.map +7 -0
  3. package/dist/{cjs/extractor → extractor}/accessSafe.js +14 -4
  4. package/dist/{esm/extractor → extractor}/accessSafe.js.map +2 -2
  5. package/dist/{cjs/extractor → extractor}/babelParse.js +20 -17
  6. package/dist/extractor/babelParse.js.map +7 -0
  7. package/dist/{cjs/extractor → extractor}/buildClassName.js +40 -11
  8. package/dist/extractor/buildClassName.js.map +7 -0
  9. package/dist/extractor/bundle.js +117 -0
  10. package/dist/extractor/bundle.js.map +7 -0
  11. package/dist/{cjs/extractor → extractor}/createEvaluator.js +19 -14
  12. package/dist/extractor/createEvaluator.js.map +7 -0
  13. package/dist/extractor/createExtractor.js +1645 -0
  14. package/dist/extractor/createExtractor.js.map +7 -0
  15. package/dist/{cjs/extractor → extractor}/ensureImportingConcat.js +18 -8
  16. package/dist/extractor/ensureImportingConcat.js.map +7 -0
  17. package/dist/{cjs/extractor → extractor}/evaluateAstNode.js +14 -6
  18. package/dist/{esm/extractor → extractor}/evaluateAstNode.js.map +2 -2
  19. package/dist/{cjs/extractor → extractor}/extractHelpers.js +91 -27
  20. package/dist/extractor/extractHelpers.js.map +7 -0
  21. package/dist/{cjs/extractor → extractor}/extractMediaStyle.js +49 -50
  22. package/dist/extractor/extractMediaStyle.js.map +7 -0
  23. package/dist/{cjs/extractor → extractor}/extractToClassNames.js +165 -109
  24. package/dist/extractor/extractToClassNames.js.map +7 -0
  25. package/dist/{cjs/extractor → extractor}/findTopmostFunction.js +2 -3
  26. package/dist/{esm/extractor → extractor}/findTopmostFunction.js.map +2 -2
  27. package/dist/{cjs/extractor → extractor}/generatedUid.js +9 -4
  28. package/dist/{cjs/extractor → extractor}/generatedUid.js.map +3 -3
  29. package/dist/{cjs/extractor → extractor}/getPrefixLogs.js +1 -2
  30. package/dist/extractor/getPrefixLogs.js.map +7 -0
  31. package/dist/{cjs/extractor → extractor}/getPropValueFromAttributes.js +24 -15
  32. package/dist/extractor/getPropValueFromAttributes.js.map +7 -0
  33. package/dist/{cjs/extractor → extractor}/getSourceModule.js +5 -3
  34. package/dist/{esm/extractor → extractor}/getSourceModule.js.map +2 -2
  35. package/dist/{cjs/extractor → extractor}/getStaticBindingsForScope.js +88 -38
  36. package/dist/extractor/getStaticBindingsForScope.js.map +7 -0
  37. package/dist/{cjs/extractor → extractor}/hoistClassNames.js +5 -4
  38. package/dist/{esm/extractor → extractor}/hoistClassNames.js.map +3 -3
  39. package/dist/{cjs/extractor → extractor}/literalToAst.js +26 -34
  40. package/dist/{cjs/extractor → extractor}/literalToAst.js.map +2 -2
  41. package/dist/extractor/loadFile.js +21 -0
  42. package/dist/extractor/loadFile.js.map +7 -0
  43. package/dist/extractor/loadTamagui.js +421 -0
  44. package/dist/extractor/loadTamagui.js.map +7 -0
  45. package/dist/{cjs/extractor → extractor}/logLines.js +3 -3
  46. package/dist/{cjs/extractor → extractor}/logLines.js.map +2 -2
  47. package/dist/{cjs/extractor → extractor}/normalizeTernaries.js +13 -36
  48. package/dist/extractor/normalizeTernaries.js.map +7 -0
  49. package/dist/{cjs/extractor → extractor}/removeUnusedHooks.js +7 -5
  50. package/dist/{cjs/extractor → extractor}/removeUnusedHooks.js.map +2 -2
  51. package/dist/{cjs/extractor → extractor}/timer.js +11 -4
  52. package/dist/extractor/timer.js.map +7 -0
  53. package/dist/{cjs/extractor → extractor}/validHTMLAttributes.js +52 -0
  54. package/dist/extractor/validHTMLAttributes.js.map +7 -0
  55. package/dist/getPragmaOptions.js +68 -0
  56. package/dist/getPragmaOptions.js.map +7 -0
  57. package/dist/helpers/memoize.js +46 -0
  58. package/dist/helpers/memoize.js.map +7 -0
  59. package/dist/{cjs/index.js → index.js} +10 -7
  60. package/dist/index.js.map +7 -0
  61. package/dist/require.js +90 -0
  62. package/dist/require.js.map +7 -0
  63. package/dist/tamagui-node/tamagui.config.js +6781 -0
  64. package/dist/{jsx/types.js → tamagui-node/tamaguicore-components.config.js} +0 -0
  65. package/dist/tamagui-node/tamaguitestdesignsystem-components.config.js +31 -0
  66. package/dist/{cjs/types.js → types.js} +1 -0
  67. package/dist/types.js.map +7 -0
  68. package/dist/webpackPlugin.js +35 -0
  69. package/dist/webpackPlugin.js.map +7 -0
  70. package/package.json +47 -35
  71. package/src/constants.ts +14 -0
  72. package/src/extractor/accessSafe.ts +18 -0
  73. package/src/extractor/babelParse.ts +28 -0
  74. package/src/extractor/buildClassName.ts +77 -0
  75. package/src/extractor/bundle.ts +110 -0
  76. package/src/extractor/createEvaluator.ts +73 -0
  77. package/src/extractor/createExtractor.ts +2133 -0
  78. package/src/extractor/ensureImportingConcat.ts +32 -0
  79. package/src/extractor/evaluateAstNode.ts +121 -0
  80. package/src/extractor/extractHelpers.ts +201 -0
  81. package/src/extractor/extractMediaStyle.ts +199 -0
  82. package/src/extractor/extractToClassNames.ts +450 -0
  83. package/src/extractor/findTopmostFunction.ts +22 -0
  84. package/src/extractor/generatedUid.ts +43 -0
  85. package/src/extractor/getPrefixLogs.ts +6 -0
  86. package/src/extractor/getPropValueFromAttributes.ts +92 -0
  87. package/src/extractor/getSourceModule.ts +101 -0
  88. package/src/extractor/getStaticBindingsForScope.ts +227 -0
  89. package/src/extractor/hoistClassNames.ts +45 -0
  90. package/src/extractor/literalToAst.ts +84 -0
  91. package/src/extractor/loadFile.ts +17 -0
  92. package/src/extractor/loadTamagui.ts +478 -0
  93. package/src/extractor/logLines.ts +16 -0
  94. package/src/extractor/normalizeTernaries.ts +63 -0
  95. package/src/extractor/removeUnusedHooks.ts +76 -0
  96. package/src/extractor/timer.ts +29 -0
  97. package/src/extractor/validHTMLAttributes.ts +99 -0
  98. package/src/getPragmaOptions.ts +53 -0
  99. package/src/helpers/memoize.ts +21 -0
  100. package/src/index.ts +11 -0
  101. package/src/require.ts +107 -0
  102. package/src/types.ts +98 -0
  103. package/src/webpackPlugin.ts +9 -0
  104. package/tamagui.tsconfig.json +5 -0
  105. package/types/constants.d.ts +1 -1
  106. package/types/extractor/babelParse.d.ts +2 -1
  107. package/types/extractor/buildClassName.d.ts +5 -2
  108. package/types/extractor/bundle.d.ts +13 -0
  109. package/types/extractor/createEvaluator.d.ts +4 -4
  110. package/types/extractor/createExtractor.d.ts +26 -11
  111. package/types/extractor/extractHelpers.d.ts +16 -4
  112. package/types/extractor/extractMediaStyle.d.ts +3 -3
  113. package/types/extractor/extractToClassNames.d.ts +5 -9
  114. package/types/extractor/getPrefixLogs.d.ts +1 -1
  115. package/types/extractor/getPropValueFromAttributes.d.ts +16 -0
  116. package/types/extractor/getStaticBindingsForScope.d.ts +2 -1
  117. package/types/extractor/loadFile.d.ts +1 -0
  118. package/types/extractor/loadTamagui.d.ts +22 -6
  119. package/types/extractor/normalizeTernaries.d.ts +1 -1
  120. package/types/extractor/validHTMLAttributes.d.ts +49 -0
  121. package/types/getPragmaOptions.d.ts +9 -0
  122. package/types/helpers/memoize.d.ts +8 -0
  123. package/types/index.d.ts +9 -7
  124. package/types/require.d.ts +4 -0
  125. package/types/types.d.ts +32 -32
  126. package/types/webpackPlugin.d.ts +4 -0
  127. package/dist/cjs/constants.js.map +0 -7
  128. package/dist/cjs/extractor/accessSafe.js.map +0 -7
  129. package/dist/cjs/extractor/babelParse.js.map +0 -7
  130. package/dist/cjs/extractor/buildClassName.js.map +0 -7
  131. package/dist/cjs/extractor/createEvaluator.js.map +0 -7
  132. package/dist/cjs/extractor/createExtractor.js +0 -1221
  133. package/dist/cjs/extractor/createExtractor.js.map +0 -7
  134. package/dist/cjs/extractor/ensureImportingConcat.js.map +0 -7
  135. package/dist/cjs/extractor/evaluateAstNode.js.map +0 -7
  136. package/dist/cjs/extractor/extractHelpers.js.map +0 -7
  137. package/dist/cjs/extractor/extractMediaStyle.js.map +0 -7
  138. package/dist/cjs/extractor/extractToClassNames.js.map +0 -7
  139. package/dist/cjs/extractor/findTopmostFunction.js.map +0 -7
  140. package/dist/cjs/extractor/getPrefixLogs.js.map +0 -7
  141. package/dist/cjs/extractor/getPropValueFromAttributes.js.map +0 -7
  142. package/dist/cjs/extractor/getSourceModule.js.map +0 -7
  143. package/dist/cjs/extractor/getStaticBindingsForScope.js.map +0 -7
  144. package/dist/cjs/extractor/hoistClassNames.js.map +0 -7
  145. package/dist/cjs/extractor/loadTamagui.js +0 -106
  146. package/dist/cjs/extractor/loadTamagui.js.map +0 -7
  147. package/dist/cjs/extractor/normalizeTernaries.js.map +0 -7
  148. package/dist/cjs/extractor/timer.js.map +0 -7
  149. package/dist/cjs/extractor/validHTMLAttributes.js.map +0 -7
  150. package/dist/cjs/index.js.map +0 -7
  151. package/dist/cjs/patchReactNativeWeb.js +0 -167
  152. package/dist/cjs/patchReactNativeWeb.js.map +0 -7
  153. package/dist/cjs/types.js.map +0 -7
  154. package/dist/esm/constants.js +0 -14
  155. package/dist/esm/constants.js.map +0 -7
  156. package/dist/esm/extractor/accessSafe.js +0 -11
  157. package/dist/esm/extractor/babelParse.js +0 -30
  158. package/dist/esm/extractor/babelParse.js.map +0 -7
  159. package/dist/esm/extractor/buildClassName.js +0 -40
  160. package/dist/esm/extractor/buildClassName.js.map +0 -7
  161. package/dist/esm/extractor/createEvaluator.js +0 -52
  162. package/dist/esm/extractor/createEvaluator.js.map +0 -7
  163. package/dist/esm/extractor/createExtractor.js +0 -1169
  164. package/dist/esm/extractor/createExtractor.js.map +0 -7
  165. package/dist/esm/extractor/ensureImportingConcat.js +0 -24
  166. package/dist/esm/extractor/ensureImportingConcat.js.map +0 -7
  167. package/dist/esm/extractor/evaluateAstNode.js +0 -94
  168. package/dist/esm/extractor/extractHelpers.js +0 -103
  169. package/dist/esm/extractor/extractHelpers.js.map +0 -7
  170. package/dist/esm/extractor/extractMediaStyle.js +0 -152
  171. package/dist/esm/extractor/extractMediaStyle.js.map +0 -7
  172. package/dist/esm/extractor/extractToClassNames.js +0 -293
  173. package/dist/esm/extractor/extractToClassNames.js.map +0 -7
  174. package/dist/esm/extractor/findTopmostFunction.js +0 -23
  175. package/dist/esm/extractor/generatedUid.js +0 -28
  176. package/dist/esm/extractor/generatedUid.js.map +0 -7
  177. package/dist/esm/extractor/getPrefixLogs.js +0 -12
  178. package/dist/esm/extractor/getPrefixLogs.js.map +0 -7
  179. package/dist/esm/extractor/getPropValueFromAttributes.js +0 -49
  180. package/dist/esm/extractor/getPropValueFromAttributes.js.map +0 -7
  181. package/dist/esm/extractor/getSourceModule.js +0 -69
  182. package/dist/esm/extractor/getStaticBindingsForScope.js +0 -137
  183. package/dist/esm/extractor/getStaticBindingsForScope.js.map +0 -7
  184. package/dist/esm/extractor/hoistClassNames.js +0 -44
  185. package/dist/esm/extractor/literalToAst.js +0 -80
  186. package/dist/esm/extractor/literalToAst.js.map +0 -7
  187. package/dist/esm/extractor/loadTamagui.js +0 -84
  188. package/dist/esm/extractor/loadTamagui.js.map +0 -7
  189. package/dist/esm/extractor/logLines.js +0 -22
  190. package/dist/esm/extractor/logLines.js.map +0 -7
  191. package/dist/esm/extractor/normalizeTernaries.js +0 -53
  192. package/dist/esm/extractor/normalizeTernaries.js.map +0 -7
  193. package/dist/esm/extractor/removeUnusedHooks.js +0 -80
  194. package/dist/esm/extractor/removeUnusedHooks.js.map +0 -7
  195. package/dist/esm/extractor/timer.js +0 -24
  196. package/dist/esm/extractor/timer.js.map +0 -7
  197. package/dist/esm/extractor/validHTMLAttributes.js +0 -52
  198. package/dist/esm/extractor/validHTMLAttributes.js.map +0 -7
  199. package/dist/esm/index.js +0 -14
  200. package/dist/esm/index.js.map +0 -7
  201. package/dist/esm/patchReactNativeWeb.js +0 -142
  202. package/dist/esm/patchReactNativeWeb.js.map +0 -7
  203. package/dist/esm/types.js +0 -1
  204. package/dist/esm/types.js.map +0 -7
  205. package/dist/jsx/constants.js +0 -13
  206. package/dist/jsx/extractor/accessSafe.js +0 -10
  207. package/dist/jsx/extractor/babelParse.js +0 -29
  208. package/dist/jsx/extractor/buildClassName.js +0 -39
  209. package/dist/jsx/extractor/createEvaluator.js +0 -51
  210. package/dist/jsx/extractor/createExtractor.js +0 -1168
  211. package/dist/jsx/extractor/ensureImportingConcat.js +0 -23
  212. package/dist/jsx/extractor/evaluateAstNode.js +0 -93
  213. package/dist/jsx/extractor/extractHelpers.js +0 -102
  214. package/dist/jsx/extractor/extractMediaStyle.js +0 -151
  215. package/dist/jsx/extractor/extractToClassNames.js +0 -292
  216. package/dist/jsx/extractor/findTopmostFunction.js +0 -22
  217. package/dist/jsx/extractor/generatedUid.js +0 -27
  218. package/dist/jsx/extractor/getPrefixLogs.js +0 -11
  219. package/dist/jsx/extractor/getPropValueFromAttributes.js +0 -48
  220. package/dist/jsx/extractor/getSourceModule.js +0 -68
  221. package/dist/jsx/extractor/getStaticBindingsForScope.js +0 -136
  222. package/dist/jsx/extractor/hoistClassNames.js +0 -43
  223. package/dist/jsx/extractor/literalToAst.js +0 -79
  224. package/dist/jsx/extractor/loadTamagui.js +0 -83
  225. package/dist/jsx/extractor/logLines.js +0 -21
  226. package/dist/jsx/extractor/normalizeTernaries.js +0 -52
  227. package/dist/jsx/extractor/removeUnusedHooks.js +0 -79
  228. package/dist/jsx/extractor/timer.js +0 -23
  229. package/dist/jsx/extractor/validHTMLAttributes.js +0 -51
  230. package/dist/jsx/index.js +0 -13
  231. package/dist/jsx/patchReactNativeWeb.js +0 -141
  232. package/types/constants.d.ts.map +0 -1
  233. package/types/extractor/accessSafe.d.ts.map +0 -1
  234. package/types/extractor/babelParse.d.ts.map +0 -1
  235. package/types/extractor/buildClassName.d.ts.map +0 -1
  236. package/types/extractor/createEvaluator.d.ts.map +0 -1
  237. package/types/extractor/createExtractor.d.ts.map +0 -1
  238. package/types/extractor/ensureImportingConcat.d.ts.map +0 -1
  239. package/types/extractor/evaluateAstNode.d.ts.map +0 -1
  240. package/types/extractor/extractHelpers.d.ts.map +0 -1
  241. package/types/extractor/extractMediaStyle.d.ts.map +0 -1
  242. package/types/extractor/extractToClassNames.d.ts.map +0 -1
  243. package/types/extractor/findTopmostFunction.d.ts.map +0 -1
  244. package/types/extractor/generatedUid.d.ts.map +0 -1
  245. package/types/extractor/getPrefixLogs.d.ts.map +0 -1
  246. package/types/extractor/getPropValueFromAttributes.d.ts.map +0 -1
  247. package/types/extractor/getSourceModule.d.ts.map +0 -1
  248. package/types/extractor/getStaticBindingsForScope.d.ts.map +0 -1
  249. package/types/extractor/hoistClassNames.d.ts.map +0 -1
  250. package/types/extractor/literalToAst.d.ts.map +0 -1
  251. package/types/extractor/loadTamagui.d.ts.map +0 -1
  252. package/types/extractor/logLines.d.ts.map +0 -1
  253. package/types/extractor/normalizeTernaries.d.ts.map +0 -1
  254. package/types/extractor/removeUnusedHooks.d.ts.map +0 -1
  255. package/types/extractor/timer.d.ts.map +0 -1
  256. package/types/extractor/validHTMLAttributes.d.ts.map +0 -1
  257. package/types/index.d.ts.map +0 -1
  258. package/types/patchReactNativeWeb.d.ts +0 -2
  259. package/types/patchReactNativeWeb.d.ts.map +0 -1
  260. package/types/types.d.ts.map +0 -1
@@ -0,0 +1,101 @@
1
+ import * as t from '@babel/types'
2
+
3
+ export interface SourceModule {
4
+ sourceModule?: string
5
+ imported?: string
6
+ local?: string
7
+ destructured?: boolean
8
+ usesImportSyntax: boolean
9
+ }
10
+
11
+ export function getSourceModule(
12
+ itemName: string,
13
+ itemBinding: {
14
+ constant?: boolean
15
+ path: { node: t.Node; parent: any }
16
+ }
17
+ ): SourceModule | null {
18
+ // TODO: deal with reassignment
19
+ if (!itemBinding.constant) {
20
+ return null
21
+ }
22
+
23
+ let sourceModule: string | undefined
24
+ let imported: string | undefined
25
+ let local: string | undefined
26
+ let destructured: boolean | undefined
27
+ let usesImportSyntax = false
28
+
29
+ const itemNode = itemBinding.path.node
30
+
31
+ if (
32
+ // import x from 'y';
33
+ t.isImportDefaultSpecifier(itemNode) ||
34
+ // import {x} from 'y';
35
+ t.isImportSpecifier(itemNode)
36
+ ) {
37
+ if (t.isImportDeclaration(itemBinding.path.parent)) {
38
+ sourceModule = itemBinding.path.parent.source.value
39
+ local = itemNode.local.name
40
+ usesImportSyntax = true
41
+ if (t.isImportSpecifier(itemNode)) {
42
+ imported = itemNode.imported['name']
43
+ destructured = true
44
+ } else {
45
+ imported = itemNode.local.name
46
+ destructured = false
47
+ }
48
+ }
49
+ } else if (
50
+ t.isVariableDeclarator(itemNode) &&
51
+ itemNode.init != null &&
52
+ t.isCallExpression(itemNode.init) &&
53
+ t.isIdentifier(itemNode.init.callee) &&
54
+ itemNode.init.callee.name === 'require' &&
55
+ itemNode.init.arguments.length === 1
56
+ ) {
57
+ const firstArg = itemNode.init.arguments[0]
58
+ if (!t.isStringLiteral(firstArg)) {
59
+ return null
60
+ }
61
+ sourceModule = firstArg.value
62
+
63
+ if (t.isIdentifier(itemNode.id)) {
64
+ local = itemNode.id.name
65
+ imported = itemNode.id.name
66
+ destructured = false
67
+ } else if (t.isObjectPattern(itemNode.id)) {
68
+ for (const objProp of itemNode.id.properties) {
69
+ if (
70
+ t.isObjectProperty(objProp) &&
71
+ t.isIdentifier(objProp.value) &&
72
+ objProp.value.name === itemName
73
+ ) {
74
+ local = objProp.value.name
75
+ // @ts-ignore TODO remove this is only an issue on CI
76
+ imported = objProp.key.name
77
+ destructured = true
78
+ break
79
+ }
80
+ }
81
+
82
+ if (!local || !imported) {
83
+ console.error('could not find prop with value `%s`', itemName)
84
+ return null
85
+ }
86
+ } else {
87
+ console.error('Unhandled id type: %s', itemNode.id.type)
88
+ return null
89
+ }
90
+ } else {
91
+ return null
92
+ }
93
+
94
+ return {
95
+ destructured,
96
+ imported,
97
+ local,
98
+ sourceModule,
99
+ usesImportSyntax,
100
+ }
101
+ }
@@ -0,0 +1,227 @@
1
+ import { fork } from 'child_process'
2
+ import { dirname, extname, join, resolve } from 'path'
3
+
4
+ import { Binding, NodePath } from '@babel/traverse'
5
+ import * as t from '@babel/types'
6
+
7
+ import { evaluateAstNode } from './evaluateAstNode.js'
8
+ import { getSourceModule } from './getSourceModule.js'
9
+
10
+ const isLocalImport = (path: string) => path.startsWith('.') || path.startsWith('/')
11
+
12
+ function resolveImportPath(sourcePath: string, path: string) {
13
+ const sourceDir = dirname(sourcePath)
14
+ if (isLocalImport(path)) {
15
+ if (extname(path) === '') {
16
+ path += '.js'
17
+ }
18
+ return resolve(sourceDir, path)
19
+ }
20
+ return path
21
+ }
22
+
23
+ const cache = new Map()
24
+ const pending = new Map<string, Promise<any>>()
25
+ setInterval(() => {
26
+ if (cache.size) {
27
+ cache.clear()
28
+ }
29
+ }, 10)
30
+
31
+ const loadCmd = `${join(__dirname, 'loadFile.js')}`
32
+
33
+ let exited = false
34
+ const child = fork(loadCmd, [], {
35
+ execArgv: ['-r', 'esbuild-register'],
36
+ detached: true,
37
+ stdio: 'ignore',
38
+ })
39
+
40
+ export function cleanupBeforeExit() {
41
+ if (exited) return
42
+ child.removeAllListeners()
43
+ child.unref()
44
+ child.disconnect()
45
+ child.kill()
46
+ exited = true
47
+ }
48
+
49
+ process.once('SIGTERM', cleanupBeforeExit)
50
+ process.once('SIGINT', cleanupBeforeExit)
51
+ process.once('beforeExit', cleanupBeforeExit)
52
+
53
+ function importModule(path: string) {
54
+ if (pending.has(path)) {
55
+ return pending.get(path)
56
+ }
57
+ const promise = new Promise((res, rej) => {
58
+ if (cache.has(path)) {
59
+ return cache.get(path)
60
+ }
61
+ const listener = (msg: any) => {
62
+ if (!msg) return
63
+ if (typeof msg !== 'string') return
64
+ if (msg[0] === '-') {
65
+ rej(new Error(msg.slice(1)))
66
+ return
67
+ }
68
+ child.removeListener('message', listener)
69
+ const val = JSON.parse(msg)
70
+ cache.set(path, val)
71
+ res(val)
72
+ }
73
+ child.once('message', listener)
74
+ child.send(`${path.replace('.js', '')}`)
75
+ })
76
+ pending.set(path, promise)
77
+ return promise
78
+ }
79
+
80
+ export async function getStaticBindingsForScope(
81
+ scope: NodePath<t.JSXElement>['scope'],
82
+ whitelist: string[] = [],
83
+ sourcePath: string,
84
+ bindingCache: Record<string, string | null>,
85
+ shouldPrintDebug: boolean | 'verbose'
86
+ ): Promise<Record<string, any>> {
87
+ const bindings: Record<string, Binding> = scope.getAllBindings() as any
88
+ const ret: Record<string, any> = {}
89
+
90
+ if (
91
+ shouldPrintDebug
92
+ ) {
93
+ // prettier-ignore
94
+ // console.log(' ', Object.keys(bindings).length, 'variables in scope')
95
+ // .map(x => bindings[x].identifier?.name).join(', ')
96
+ }
97
+
98
+ // on react native at least it doesnt find some bindings? not sure why
99
+ // lets add in whitelisted imports if they exist
100
+ const program = scope.getProgramParent().block as t.Program
101
+ for (const node of program.body) {
102
+ if (t.isImportDeclaration(node)) {
103
+ const importPath = node.source.value
104
+ if (!node.specifiers.length) continue
105
+ if (!isLocalImport(importPath)) {
106
+ continue
107
+ }
108
+ const moduleName = resolveImportPath(sourcePath, importPath)
109
+ const isOnWhitelist = whitelist.some((test) => moduleName.endsWith(test))
110
+ if (!isOnWhitelist) continue
111
+ try {
112
+ const src = await importModule(moduleName)
113
+ if (!src) continue
114
+ for (const specifier of node.specifiers) {
115
+ if (t.isImportSpecifier(specifier) && t.isIdentifier(specifier.imported)) {
116
+ if (typeof src[specifier.imported.name] !== 'undefined') {
117
+ const val = src[specifier.local.name]
118
+ ret[specifier.local.name] = val
119
+ }
120
+ }
121
+ }
122
+ } catch (err: any) {
123
+ if (shouldPrintDebug) {
124
+ // eslint-disable-next-line no-console
125
+ console.warn(
126
+ ` | Skipping partial evaluation of constant file: ${moduleName} (DEBUG=tamagui for more)`
127
+ )
128
+ } else if (process.env.DEBUG?.startsWith('tamagui')) {
129
+ // eslint-disable-next-line no-console
130
+ console.log(`Error in partial evaluation`, err.message, err.stack)
131
+ }
132
+ }
133
+ }
134
+ }
135
+
136
+ if (!bindingCache) {
137
+ throw new Error('BindingCache is a required param')
138
+ }
139
+
140
+ for (const k in bindings) {
141
+ const binding = bindings[k]
142
+
143
+ // check to see if the item is a module
144
+ const sourceModule = getSourceModule(k, binding)
145
+ if (sourceModule) {
146
+ if (!sourceModule.sourceModule) {
147
+ continue
148
+ }
149
+
150
+ const moduleName = resolveImportPath(sourcePath, sourceModule.sourceModule)
151
+ const isOnWhitelist = whitelist.some((test) => moduleName.endsWith(test))
152
+
153
+ // TODO we could cache this at the file level.. and check if its been touched since
154
+
155
+ if (isOnWhitelist) {
156
+ const src = importModule(moduleName)
157
+ if (!src) {
158
+ // eslint-disable-next-line no-console
159
+ console.log(
160
+ ` | ⚠️ Missing file ${moduleName} via ${sourcePath} import ${sourceModule.sourceModule}?`
161
+ )
162
+ return {}
163
+ }
164
+ if (sourceModule.destructured) {
165
+ if (sourceModule.imported) {
166
+ ret[k] = src[sourceModule.imported]
167
+ }
168
+ } else {
169
+ ret[k] = src
170
+ }
171
+ }
172
+ continue
173
+ }
174
+
175
+ const { parent } = binding.path
176
+
177
+ if (!t.isVariableDeclaration(parent) || parent.kind !== 'const') {
178
+ continue
179
+ }
180
+
181
+ // pick out the right variable declarator
182
+ const dec = parent.declarations.find((d) => t.isIdentifier(d.id) && d.id.name === k)
183
+
184
+ // if init is not set, there's nothing to evaluate
185
+ // TODO: handle spread syntax
186
+ if (!dec || !dec.init) {
187
+ continue
188
+ }
189
+
190
+ // missing start/end will break caching
191
+ if (typeof dec.id.start !== 'number' || typeof dec.id.end !== 'number') {
192
+ // eslint-disable-next-line no-console
193
+ console.error('dec.id.start/end is not a number')
194
+ continue
195
+ }
196
+
197
+ if (!t.isIdentifier(dec.id)) {
198
+ // eslint-disable-next-line no-console
199
+ console.error('dec is not an identifier')
200
+ continue
201
+ }
202
+
203
+ const cacheKey = `${dec.id.name}_${dec.id.start}-${dec.id.end}`
204
+
205
+ // retrieve value from cache
206
+ if (bindingCache.hasOwnProperty(cacheKey)) {
207
+ ret[k] = bindingCache[cacheKey]
208
+ continue
209
+ }
210
+ // retrieve value from cache
211
+ if (bindingCache.hasOwnProperty(cacheKey)) {
212
+ ret[k] = bindingCache[cacheKey]
213
+ continue
214
+ }
215
+
216
+ // evaluate
217
+ try {
218
+ ret[k] = evaluateAstNode(dec.init, undefined, shouldPrintDebug)
219
+ bindingCache[cacheKey] = ret[k]
220
+ continue
221
+ } catch {
222
+ // skip
223
+ }
224
+ }
225
+
226
+ return ret
227
+ }
@@ -0,0 +1,45 @@
1
+ import { NodePath } from '@babel/traverse'
2
+ import * as t from '@babel/types'
3
+
4
+ export function hoistClassNames(
5
+ path: NodePath<t.JSXElement>,
6
+ existing: { [key: string]: t.Identifier },
7
+ expr: t.Expression
8
+ ) {
9
+ const hoist = hoistClassNames.bind(null, path, existing)
10
+ if (t.isStringLiteral(expr)) {
11
+ if (expr.value.trim() === '') {
12
+ return expr
13
+ }
14
+ if (existing[expr.value]) {
15
+ return existing[expr.value]
16
+ }
17
+ const identifier = replaceStringWithVariable(expr)
18
+ existing[expr.value] = identifier
19
+ return identifier
20
+ }
21
+ if (t.isBinaryExpression(expr)) {
22
+ return t.binaryExpression(expr.operator, hoist(expr.left), hoist(expr.right))
23
+ }
24
+ if (t.isLogicalExpression(expr)) {
25
+ return t.logicalExpression(expr.operator, hoist(expr.left), hoist(expr.right))
26
+ }
27
+ if (t.isConditionalExpression(expr)) {
28
+ return t.conditionalExpression(expr.test, hoist(expr.consequent), hoist(expr.alternate))
29
+ }
30
+ return expr
31
+
32
+ function replaceStringWithVariable(str: t.StringLiteral): t.Identifier {
33
+ // hoist outside fn!
34
+ const uid = path.scope.generateUidIdentifier('cn')
35
+ const parent = path.findParent((path) => path.isProgram())
36
+ if (!parent) throw new Error(`no program?`)
37
+ const variable = t.variableDeclaration('const', [
38
+ // adding a space for extra safety
39
+ t.variableDeclarator(uid, t.stringLiteral(` ${str.value}`)),
40
+ ])
41
+ // @ts-ignore
42
+ parent.unshiftContainer('body', variable)
43
+ return uid
44
+ }
45
+ }
@@ -0,0 +1,84 @@
1
+ import * as t from '@babel/types'
2
+
3
+ export function literalToAst(literal: any): t.Expression {
4
+ if (literal === null) {
5
+ return t.nullLiteral()
6
+ }
7
+ switch (typeof literal) {
8
+ case 'function':
9
+ throw new Error('Unsupported')
10
+ case 'number':
11
+ return t.numericLiteral(literal)
12
+ case 'string':
13
+ return t.stringLiteral(literal)
14
+ case 'boolean':
15
+ return t.booleanLiteral(literal)
16
+ case 'undefined':
17
+ return t.unaryExpression('void', t.numericLiteral(0), true)
18
+ default:
19
+ if (Array.isArray(literal)) {
20
+ return t.arrayExpression(literal.map(literalToAst))
21
+ }
22
+ return t.objectExpression(
23
+ Object.keys(literal)
24
+ .filter((k) => {
25
+ return typeof literal[k] !== 'undefined'
26
+ })
27
+ .map((k) => {
28
+ return t.objectProperty(t.stringLiteral(k), literalToAst(literal[k]))
29
+ })
30
+ )
31
+ }
32
+ }
33
+
34
+ const easyPeasies = ['BooleanLiteral', 'StringLiteral', 'NumericLiteral']
35
+
36
+ export function astToLiteral(node: any) {
37
+ if (!node) {
38
+ return
39
+ }
40
+ if (easyPeasies.includes(node.type)) {
41
+ return node.value
42
+ }
43
+ if (node.name === 'undefined' && !node.value) {
44
+ return undefined
45
+ }
46
+ if (t.isNullLiteral(node)) {
47
+ return null
48
+ }
49
+ if (t.isObjectExpression(node)) {
50
+ return computeProps(node.properties)
51
+ }
52
+ if (t.isArrayExpression(node)) {
53
+ return node.elements.reduce(
54
+ // @ts-ignore
55
+ (acc, element) => [
56
+ ...acc,
57
+ ...(element?.type === 'SpreadElement'
58
+ ? astToLiteral(element.argument)
59
+ : [astToLiteral(element)]),
60
+ ],
61
+ []
62
+ )
63
+ }
64
+ }
65
+
66
+ function computeProps(props) {
67
+ return props.reduce((acc, prop) => {
68
+ if (prop.type === 'SpreadElement') {
69
+ return {
70
+ ...acc,
71
+ ...astToLiteral(prop.argument),
72
+ }
73
+ } else if (prop.type !== 'ObjectMethod') {
74
+ const val = astToLiteral(prop.value)
75
+ if (val !== undefined) {
76
+ return {
77
+ ...acc,
78
+ [prop.key.name]: val,
79
+ }
80
+ }
81
+ }
82
+ return acc
83
+ }, {})
84
+ }
@@ -0,0 +1,17 @@
1
+ process.on('message', (path) => {
2
+ if (typeof path !== 'string') {
3
+ throw new Error(`Not a string: ${path}`)
4
+ }
5
+ try {
6
+ const out = require(path)
7
+ process.send?.(JSON.stringify(out))
8
+ } catch (err) {
9
+ if (err instanceof Error) {
10
+ process.send?.(`-${err.message}\n${err.stack}`)
11
+ } else {
12
+ process.send?.(`-${err}`)
13
+ }
14
+ }
15
+ })
16
+
17
+ setInterval(() => {}, 1000)