@tamagui/static 1.0.1-beta.18 → 1.0.1-beta.181

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 (250) hide show
  1. package/dist/{cjs/constants.js → constants.js} +9 -1
  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 +20 -6
  8. package/dist/extractor/buildClassName.js.map +7 -0
  9. package/dist/{cjs/extractor → extractor}/createEvaluator.js +17 -12
  10. package/dist/extractor/createEvaluator.js.map +7 -0
  11. package/dist/extractor/createExtractor.js +1560 -0
  12. package/dist/extractor/createExtractor.js.map +7 -0
  13. package/dist/{cjs/extractor → extractor}/ensureImportingConcat.js +22 -8
  14. package/dist/extractor/ensureImportingConcat.js.map +7 -0
  15. package/dist/{cjs/extractor → extractor}/evaluateAstNode.js +14 -6
  16. package/dist/{esm/extractor → extractor}/evaluateAstNode.js.map +2 -2
  17. package/dist/{cjs/extractor → extractor}/extractHelpers.js +20 -19
  18. package/dist/extractor/extractHelpers.js.map +7 -0
  19. package/dist/{cjs/extractor → extractor}/extractMediaStyle.js +38 -39
  20. package/dist/extractor/extractMediaStyle.js.map +7 -0
  21. package/dist/{cjs/extractor → extractor}/extractToClassNames.js +164 -101
  22. package/dist/extractor/extractToClassNames.js.map +7 -0
  23. package/dist/{cjs/extractor → extractor}/findTopmostFunction.js +2 -3
  24. package/dist/{esm/extractor → extractor}/findTopmostFunction.js.map +2 -2
  25. package/dist/{cjs/extractor → extractor}/generatedUid.js +9 -4
  26. package/dist/{cjs/extractor → extractor}/generatedUid.js.map +3 -3
  27. package/dist/{cjs/extractor → extractor}/getPrefixLogs.js +1 -2
  28. package/dist/extractor/getPrefixLogs.js.map +7 -0
  29. package/dist/{cjs/extractor → extractor}/getPropValueFromAttributes.js +24 -15
  30. package/dist/extractor/getPropValueFromAttributes.js.map +7 -0
  31. package/dist/{cjs/extractor → extractor}/getSourceModule.js +5 -3
  32. package/dist/{esm/extractor → extractor}/getSourceModule.js.map +2 -2
  33. package/dist/{cjs/extractor → extractor}/getStaticBindingsForScope.js +88 -38
  34. package/dist/extractor/getStaticBindingsForScope.js.map +7 -0
  35. package/dist/{cjs/extractor → extractor}/hoistClassNames.js +5 -4
  36. package/dist/{esm/extractor → extractor}/hoistClassNames.js.map +3 -3
  37. package/dist/{cjs/extractor → extractor}/literalToAst.js +26 -34
  38. package/dist/{cjs/extractor → extractor}/literalToAst.js.map +2 -2
  39. package/dist/extractor/loadFile.js +21 -0
  40. package/dist/extractor/loadFile.js.map +7 -0
  41. package/dist/extractor/loadTamagui.js +327 -0
  42. package/dist/extractor/loadTamagui.js.map +7 -0
  43. package/dist/{cjs/extractor → extractor}/logLines.js +3 -3
  44. package/dist/{cjs/extractor → extractor}/logLines.js.map +2 -2
  45. package/dist/{cjs/extractor → extractor}/normalizeTernaries.js +13 -36
  46. package/dist/extractor/normalizeTernaries.js.map +7 -0
  47. package/dist/{cjs/extractor → extractor}/removeUnusedHooks.js +7 -5
  48. package/dist/{cjs/extractor → extractor}/removeUnusedHooks.js.map +2 -2
  49. package/dist/{cjs/extractor → extractor}/timer.js +11 -4
  50. package/dist/extractor/timer.js.map +7 -0
  51. package/dist/{cjs/extractor → extractor}/validHTMLAttributes.js +52 -0
  52. package/dist/extractor/validHTMLAttributes.js.map +7 -0
  53. package/dist/getPragmaOptions.js +68 -0
  54. package/dist/getPragmaOptions.js.map +7 -0
  55. package/dist/{cjs/index.js → index.js} +11 -7
  56. package/dist/index.js.map +7 -0
  57. package/dist/require.js +95 -0
  58. package/dist/require.js.map +7 -0
  59. package/dist/{cjs/types.js → types.js} +1 -0
  60. package/dist/types.js.map +7 -0
  61. package/dist/webpackPlugin.js +35 -0
  62. package/dist/webpackPlugin.js.map +7 -0
  63. package/package.json +44 -35
  64. package/src/constants.ts +15 -0
  65. package/src/extractor/accessSafe.ts +18 -0
  66. package/src/extractor/babelParse.ts +27 -0
  67. package/src/extractor/buildClassName.ts +61 -0
  68. package/src/extractor/createEvaluator.ts +73 -0
  69. package/src/extractor/createExtractor.ts +2032 -0
  70. package/src/extractor/ensureImportingConcat.ts +39 -0
  71. package/src/extractor/evaluateAstNode.ts +121 -0
  72. package/src/extractor/extractHelpers.ts +120 -0
  73. package/src/extractor/extractMediaStyle.ts +192 -0
  74. package/src/extractor/extractToClassNames.ts +456 -0
  75. package/src/extractor/findTopmostFunction.ts +22 -0
  76. package/src/extractor/generatedUid.ts +43 -0
  77. package/src/extractor/getPrefixLogs.ts +6 -0
  78. package/src/extractor/getPropValueFromAttributes.ts +92 -0
  79. package/src/extractor/getSourceModule.ts +101 -0
  80. package/src/extractor/getStaticBindingsForScope.ts +227 -0
  81. package/src/extractor/hoistClassNames.ts +45 -0
  82. package/src/extractor/literalToAst.ts +84 -0
  83. package/src/extractor/loadFile.ts +17 -0
  84. package/src/extractor/loadTamagui.ts +377 -0
  85. package/src/extractor/logLines.ts +16 -0
  86. package/src/extractor/normalizeTernaries.ts +63 -0
  87. package/src/extractor/removeUnusedHooks.ts +76 -0
  88. package/src/extractor/timer.ts +29 -0
  89. package/src/extractor/validHTMLAttributes.ts +99 -0
  90. package/src/getPragmaOptions.ts +52 -0
  91. package/src/index.ts +12 -0
  92. package/src/require.ts +112 -0
  93. package/src/types.ts +91 -0
  94. package/src/webpackPlugin.ts +9 -0
  95. package/tamagui.tsconfig.json +5 -0
  96. package/types/constants.d.ts +1 -0
  97. package/types/extractor/buildClassName.d.ts +1 -1
  98. package/types/extractor/createEvaluator.d.ts +2 -2
  99. package/types/extractor/createExtractor.d.ts +25 -10
  100. package/types/extractor/extractHelpers.d.ts +2 -2
  101. package/types/extractor/extractMediaStyle.d.ts +1 -1
  102. package/types/extractor/extractToClassNames.d.ts +4 -9
  103. package/types/extractor/findTopmostFunction.d.ts +1 -1
  104. package/types/extractor/getPrefixLogs.d.ts +1 -1
  105. package/types/extractor/getPropValueFromAttributes.d.ts +16 -0
  106. package/types/extractor/getStaticBindingsForScope.d.ts +2 -1
  107. package/types/extractor/loadFile.d.ts +1 -0
  108. package/types/extractor/loadTamagui.d.ts +15 -5
  109. package/types/extractor/normalizeTernaries.d.ts +1 -1
  110. package/types/extractor/validHTMLAttributes.d.ts +49 -0
  111. package/types/getPragmaOptions.d.ts +9 -0
  112. package/types/index.d.ts +10 -7
  113. package/types/require.d.ts +4 -0
  114. package/types/types.d.ts +25 -30
  115. package/types/webpackPlugin.d.ts +4 -0
  116. package/dist/cjs/constants.js.map +0 -7
  117. package/dist/cjs/extractor/accessSafe.js.map +0 -7
  118. package/dist/cjs/extractor/babelParse.js.map +0 -7
  119. package/dist/cjs/extractor/buildClassName.js.map +0 -7
  120. package/dist/cjs/extractor/createEvaluator.js.map +0 -7
  121. package/dist/cjs/extractor/createExtractor.js +0 -1221
  122. package/dist/cjs/extractor/createExtractor.js.map +0 -7
  123. package/dist/cjs/extractor/ensureImportingConcat.js.map +0 -7
  124. package/dist/cjs/extractor/evaluateAstNode.js.map +0 -7
  125. package/dist/cjs/extractor/extractHelpers.js.map +0 -7
  126. package/dist/cjs/extractor/extractMediaStyle.js.map +0 -7
  127. package/dist/cjs/extractor/extractToClassNames.js.map +0 -7
  128. package/dist/cjs/extractor/findTopmostFunction.js.map +0 -7
  129. package/dist/cjs/extractor/getPrefixLogs.js.map +0 -7
  130. package/dist/cjs/extractor/getPropValueFromAttributes.js.map +0 -7
  131. package/dist/cjs/extractor/getSourceModule.js.map +0 -7
  132. package/dist/cjs/extractor/getStaticBindingsForScope.js.map +0 -7
  133. package/dist/cjs/extractor/hoistClassNames.js.map +0 -7
  134. package/dist/cjs/extractor/loadTamagui.js +0 -106
  135. package/dist/cjs/extractor/loadTamagui.js.map +0 -7
  136. package/dist/cjs/extractor/normalizeTernaries.js.map +0 -7
  137. package/dist/cjs/extractor/timer.js.map +0 -7
  138. package/dist/cjs/extractor/validHTMLAttributes.js.map +0 -7
  139. package/dist/cjs/index.js.map +0 -7
  140. package/dist/cjs/patchReactNativeWeb.js +0 -167
  141. package/dist/cjs/patchReactNativeWeb.js.map +0 -7
  142. package/dist/cjs/types.js.map +0 -7
  143. package/dist/esm/constants.js +0 -14
  144. package/dist/esm/constants.js.map +0 -7
  145. package/dist/esm/extractor/accessSafe.js +0 -11
  146. package/dist/esm/extractor/babelParse.js +0 -30
  147. package/dist/esm/extractor/babelParse.js.map +0 -7
  148. package/dist/esm/extractor/buildClassName.js +0 -40
  149. package/dist/esm/extractor/buildClassName.js.map +0 -7
  150. package/dist/esm/extractor/createEvaluator.js +0 -52
  151. package/dist/esm/extractor/createEvaluator.js.map +0 -7
  152. package/dist/esm/extractor/createExtractor.js +0 -1169
  153. package/dist/esm/extractor/createExtractor.js.map +0 -7
  154. package/dist/esm/extractor/ensureImportingConcat.js +0 -24
  155. package/dist/esm/extractor/ensureImportingConcat.js.map +0 -7
  156. package/dist/esm/extractor/evaluateAstNode.js +0 -94
  157. package/dist/esm/extractor/extractHelpers.js +0 -103
  158. package/dist/esm/extractor/extractHelpers.js.map +0 -7
  159. package/dist/esm/extractor/extractMediaStyle.js +0 -152
  160. package/dist/esm/extractor/extractMediaStyle.js.map +0 -7
  161. package/dist/esm/extractor/extractToClassNames.js +0 -293
  162. package/dist/esm/extractor/extractToClassNames.js.map +0 -7
  163. package/dist/esm/extractor/findTopmostFunction.js +0 -23
  164. package/dist/esm/extractor/generatedUid.js +0 -28
  165. package/dist/esm/extractor/generatedUid.js.map +0 -7
  166. package/dist/esm/extractor/getPrefixLogs.js +0 -12
  167. package/dist/esm/extractor/getPrefixLogs.js.map +0 -7
  168. package/dist/esm/extractor/getPropValueFromAttributes.js +0 -49
  169. package/dist/esm/extractor/getPropValueFromAttributes.js.map +0 -7
  170. package/dist/esm/extractor/getSourceModule.js +0 -69
  171. package/dist/esm/extractor/getStaticBindingsForScope.js +0 -137
  172. package/dist/esm/extractor/getStaticBindingsForScope.js.map +0 -7
  173. package/dist/esm/extractor/hoistClassNames.js +0 -44
  174. package/dist/esm/extractor/literalToAst.js +0 -80
  175. package/dist/esm/extractor/literalToAst.js.map +0 -7
  176. package/dist/esm/extractor/loadTamagui.js +0 -84
  177. package/dist/esm/extractor/loadTamagui.js.map +0 -7
  178. package/dist/esm/extractor/logLines.js +0 -22
  179. package/dist/esm/extractor/logLines.js.map +0 -7
  180. package/dist/esm/extractor/normalizeTernaries.js +0 -53
  181. package/dist/esm/extractor/normalizeTernaries.js.map +0 -7
  182. package/dist/esm/extractor/removeUnusedHooks.js +0 -80
  183. package/dist/esm/extractor/removeUnusedHooks.js.map +0 -7
  184. package/dist/esm/extractor/timer.js +0 -24
  185. package/dist/esm/extractor/timer.js.map +0 -7
  186. package/dist/esm/extractor/validHTMLAttributes.js +0 -52
  187. package/dist/esm/extractor/validHTMLAttributes.js.map +0 -7
  188. package/dist/esm/index.js +0 -14
  189. package/dist/esm/index.js.map +0 -7
  190. package/dist/esm/patchReactNativeWeb.js +0 -142
  191. package/dist/esm/patchReactNativeWeb.js.map +0 -7
  192. package/dist/esm/types.js +0 -1
  193. package/dist/esm/types.js.map +0 -7
  194. package/dist/jsx/constants.js +0 -13
  195. package/dist/jsx/extractor/accessSafe.js +0 -10
  196. package/dist/jsx/extractor/babelParse.js +0 -29
  197. package/dist/jsx/extractor/buildClassName.js +0 -39
  198. package/dist/jsx/extractor/createEvaluator.js +0 -51
  199. package/dist/jsx/extractor/createExtractor.js +0 -1168
  200. package/dist/jsx/extractor/ensureImportingConcat.js +0 -23
  201. package/dist/jsx/extractor/evaluateAstNode.js +0 -93
  202. package/dist/jsx/extractor/extractHelpers.js +0 -102
  203. package/dist/jsx/extractor/extractMediaStyle.js +0 -151
  204. package/dist/jsx/extractor/extractToClassNames.js +0 -292
  205. package/dist/jsx/extractor/findTopmostFunction.js +0 -22
  206. package/dist/jsx/extractor/generatedUid.js +0 -27
  207. package/dist/jsx/extractor/getPrefixLogs.js +0 -11
  208. package/dist/jsx/extractor/getPropValueFromAttributes.js +0 -48
  209. package/dist/jsx/extractor/getSourceModule.js +0 -68
  210. package/dist/jsx/extractor/getStaticBindingsForScope.js +0 -136
  211. package/dist/jsx/extractor/hoistClassNames.js +0 -43
  212. package/dist/jsx/extractor/literalToAst.js +0 -79
  213. package/dist/jsx/extractor/loadTamagui.js +0 -83
  214. package/dist/jsx/extractor/logLines.js +0 -21
  215. package/dist/jsx/extractor/normalizeTernaries.js +0 -52
  216. package/dist/jsx/extractor/removeUnusedHooks.js +0 -79
  217. package/dist/jsx/extractor/timer.js +0 -23
  218. package/dist/jsx/extractor/validHTMLAttributes.js +0 -51
  219. package/dist/jsx/index.js +0 -13
  220. package/dist/jsx/patchReactNativeWeb.js +0 -141
  221. package/dist/jsx/types.js +0 -0
  222. package/types/constants.d.ts.map +0 -1
  223. package/types/extractor/accessSafe.d.ts.map +0 -1
  224. package/types/extractor/babelParse.d.ts.map +0 -1
  225. package/types/extractor/buildClassName.d.ts.map +0 -1
  226. package/types/extractor/createEvaluator.d.ts.map +0 -1
  227. package/types/extractor/createExtractor.d.ts.map +0 -1
  228. package/types/extractor/ensureImportingConcat.d.ts.map +0 -1
  229. package/types/extractor/evaluateAstNode.d.ts.map +0 -1
  230. package/types/extractor/extractHelpers.d.ts.map +0 -1
  231. package/types/extractor/extractMediaStyle.d.ts.map +0 -1
  232. package/types/extractor/extractToClassNames.d.ts.map +0 -1
  233. package/types/extractor/findTopmostFunction.d.ts.map +0 -1
  234. package/types/extractor/generatedUid.d.ts.map +0 -1
  235. package/types/extractor/getPrefixLogs.d.ts.map +0 -1
  236. package/types/extractor/getPropValueFromAttributes.d.ts.map +0 -1
  237. package/types/extractor/getSourceModule.d.ts.map +0 -1
  238. package/types/extractor/getStaticBindingsForScope.d.ts.map +0 -1
  239. package/types/extractor/hoistClassNames.d.ts.map +0 -1
  240. package/types/extractor/literalToAst.d.ts.map +0 -1
  241. package/types/extractor/loadTamagui.d.ts.map +0 -1
  242. package/types/extractor/logLines.d.ts.map +0 -1
  243. package/types/extractor/normalizeTernaries.d.ts.map +0 -1
  244. package/types/extractor/removeUnusedHooks.d.ts.map +0 -1
  245. package/types/extractor/timer.d.ts.map +0 -1
  246. package/types/extractor/validHTMLAttributes.d.ts.map +0 -1
  247. package/types/index.d.ts.map +0 -1
  248. package/types/patchReactNativeWeb.d.ts +0 -2
  249. package/types/patchReactNativeWeb.d.ts.map +0 -1
  250. package/types/types.d.ts.map +0 -1
@@ -0,0 +1,377 @@
1
+ /* eslint-disable no-console */
2
+ import { basename, dirname, join, relative, sep } from 'path'
3
+
4
+ import { Color, colorLog } from '@tamagui/cli-color'
5
+ import { getDefaultTamaguiConfig } from '@tamagui/config-default-node'
6
+ import type { StaticConfig, TamaguiComponent, TamaguiInternalConfig } from '@tamagui/core-node'
7
+ import { createTamagui } from '@tamagui/core-node'
8
+ import esbuild from 'esbuild'
9
+ import { ensureDir, pathExists, stat, writeFile } from 'fs-extra'
10
+
11
+ import { SHOULD_DEBUG } from '../constants.js'
12
+ import { getNameToPaths, registerRequire, unregisterRequire } from '../require.js'
13
+
14
+ type NameToPaths = {
15
+ [key: string]: Set<string>
16
+ }
17
+
18
+ export type TamaguiProjectInfo = {
19
+ components: Record<string, TamaguiComponent>
20
+ tamaguiConfig: TamaguiInternalConfig
21
+ nameToPaths: NameToPaths
22
+ }
23
+
24
+ type Props = {
25
+ components: string[]
26
+ config?: string
27
+ forceExports?: boolean
28
+ bubbleErrors?: boolean
29
+ }
30
+
31
+ const cache = {}
32
+
33
+ // TODO needs a plugin for webpack / vite to run this once at startup and not again until changed...
34
+
35
+ export async function loadTamagui(props: Props): Promise<TamaguiProjectInfo> {
36
+ const key = JSON.stringify(props)
37
+ if (cache[key]) {
38
+ if (cache[key] instanceof Promise) {
39
+ return await cache[key]
40
+ }
41
+ return cache[key]
42
+ }
43
+
44
+ let resolver: Function = () => {}
45
+ cache[key] = new Promise((res) => {
46
+ resolver = res
47
+ })
48
+
49
+ const tmpDir = join(process.cwd(), 'dist', 'tamagui-node')
50
+ const configOutPath = join(tmpDir, `tamagui.config.js`)
51
+ const includesCore = props.components.includes('@tamagui/core')
52
+ const baseComponents = props.components.filter((x) => x !== '@tamagui/core')
53
+ const componentOutPaths = baseComponents.map((componentModule) =>
54
+ join(
55
+ tmpDir,
56
+ `${componentModule
57
+ .split(sep)
58
+ .join('-')
59
+ .replace(/[^a-z0-9]+/gi, '')}-components.config.js`
60
+ )
61
+ )
62
+
63
+ const external = ['@tamagui/core', '@tamagui/core-node', 'react', 'react-dom']
64
+ const configEntry = props.config ? join(process.cwd(), props.config) : ''
65
+
66
+ if (process.env.DEBUG?.startsWith('tamagui')) {
67
+ console.log(`Building config entry`, configEntry)
68
+ }
69
+
70
+ // build them to node-compat versions
71
+ try {
72
+ await ensureDir(tmpDir)
73
+ } catch {
74
+ //
75
+ }
76
+
77
+ colorLog(
78
+ Color.FgYellow,
79
+ `
80
+ Tamagui built config and components:`
81
+ )
82
+ colorLog(
83
+ Color.Dim,
84
+ `
85
+ - Config: .${sep}${relative(process.cwd(), configOutPath)}
86
+ - Components: .${sep}${relative(process.cwd(), componentOutPaths.join(', '))}
87
+ `
88
+ )
89
+
90
+ await Promise.all([
91
+ props.config
92
+ ? buildTamaguiConfig(props, {
93
+ entryPoints: [configEntry],
94
+ external,
95
+ outfile: configOutPath,
96
+ })
97
+ : null,
98
+ ...baseComponents.map((componentModule, i) => {
99
+ return buildTamaguiConfig(props, {
100
+ entryPoints: [componentModule],
101
+ external,
102
+ outfile: componentOutPaths[i],
103
+ })
104
+ }),
105
+ ])
106
+
107
+ if (process.env.DEBUG?.startsWith('tamagui')) {
108
+ console.log(`Built configs`)
109
+ }
110
+
111
+ const coreNode = require('@tamagui/core-node')
112
+
113
+ registerRequire(props.bubbleErrors)
114
+ const config = require(configOutPath).default
115
+ unregisterRequire()
116
+
117
+ const components = {
118
+ ...loadComponents({
119
+ ...props,
120
+ components: componentOutPaths,
121
+ }),
122
+ ...(includesCore && gatherTamaguiComponentInfo([coreNode])),
123
+ }
124
+
125
+ cache[key] = {
126
+ components,
127
+ nameToPaths: {},
128
+ tamaguiConfig: config,
129
+ }
130
+
131
+ // init core-node
132
+ createTamagui(cache[key].tamaguiConfig)
133
+
134
+ resolver(cache[key])
135
+
136
+ return cache[key]
137
+ }
138
+
139
+ async function buildTamaguiConfig(
140
+ props: Props,
141
+ options: Partial<esbuild.BuildOptions> & { outfile: string },
142
+ aliases?: Record<string, string>
143
+ ) {
144
+ const alias = require('@tamagui/core-node').aliasPlugin
145
+ // until i do fancier things w plugins:
146
+ const lockFile = join(dirname(options.outfile), basename(options.outfile, '.lock'))
147
+ const lockStat = await stat(lockFile).catch(() => {
148
+ // ok
149
+ })
150
+ const lockedMsAgo = !lockStat
151
+ ? Infinity
152
+ : new Date().getTime() - new Date(lockStat.mtime).getTime()
153
+ if (lockedMsAgo < 500) {
154
+ if (process.env.DEBUG?.startsWith('tamagui')) {
155
+ console.log(`Waiting for existing build`, options.entryPoints)
156
+ }
157
+ let tries = 5
158
+ while (tries--) {
159
+ if (await pathExists(options.outfile)) {
160
+ return
161
+ } else {
162
+ await new Promise((res) => setTimeout(res, 50))
163
+ }
164
+ }
165
+ }
166
+
167
+ void writeFile(lockFile, '')
168
+
169
+ if (process.env.DEBUG?.startsWith('tamagui')) {
170
+ console.log(`Building`, options.entryPoints)
171
+ }
172
+
173
+ const tsconfig = join(__dirname, '..', '..', 'tamagui.tsconfig.json')
174
+
175
+ return esbuild.build({
176
+ bundle: true,
177
+ ...options,
178
+ format: 'cjs',
179
+ target: 'node18',
180
+ jsx: 'transform',
181
+ jsxFactory: 'react',
182
+ allowOverwrite: true,
183
+ keepNames: true,
184
+ platform: 'node',
185
+ tsconfig,
186
+ loader: {
187
+ '.js': 'jsx',
188
+ },
189
+ logLevel: 'warning',
190
+ plugins: [
191
+ {
192
+ name: 'external',
193
+ setup(build) {
194
+ build.onResolve({ filter: /@tamagui\/core/ }, (args) => {
195
+ return {
196
+ path: '@tamagui/core-node',
197
+ external: true,
198
+ }
199
+ })
200
+
201
+ build.onResolve({ filter: /^(react-native|react-native\/.*)$/ }, (args) => {
202
+ return {
203
+ path: 'react-native-web-lite',
204
+ external: true,
205
+ }
206
+ })
207
+ },
208
+ },
209
+ alias({
210
+ 'react-native-svg': require.resolve('@tamagui/react-native-svg'),
211
+ 'react-native-safe-area-context': require.resolve('@tamagui/fake-react-native'),
212
+ 'react-native-gesture-handler': require.resolve('@tamagui/proxy-worm'),
213
+ 'react-native-reanimated': require.resolve('@tamagui/proxy-worm'),
214
+ ...aliases,
215
+ }),
216
+ ],
217
+ })
218
+ }
219
+
220
+ const esbuildOptions: esbuild.BuildOptions = {
221
+ target: 'es2019',
222
+ format: 'cjs',
223
+ jsx: 'transform',
224
+ }
225
+
226
+ // loads in-process using esbuild-register
227
+ export function loadTamaguiSync(props: Props): TamaguiProjectInfo {
228
+ const key = JSON.stringify(props)
229
+ if (cache[key]) {
230
+ return cache[key]
231
+ }
232
+
233
+ const { unregister } = require('esbuild-register/dist/node').register(esbuildOptions)
234
+
235
+ try {
236
+ registerRequire(props.bubbleErrors)
237
+
238
+ // lets shim require and avoid importing react-native + react-native-web
239
+ // we just need to read the config around them
240
+ process.env.IS_STATIC = 'is_static'
241
+ // @ts-ignore
242
+ if (typeof globalThis['__DEV__'] === 'undefined') {
243
+ // @ts-ignore
244
+ globalThis['__DEV__'] = process.env.NODE_ENV === 'development'
245
+ }
246
+
247
+ try {
248
+ // import config
249
+ let tamaguiConfig: TamaguiInternalConfig | null = null
250
+
251
+ if (props.config) {
252
+ const configPath = join(process.cwd(), props.config)
253
+ const exp = require(configPath)
254
+ tamaguiConfig = (exp['default'] || exp) as TamaguiInternalConfig
255
+ if (!tamaguiConfig || !tamaguiConfig.parsed) {
256
+ const confPath = require.resolve(configPath)
257
+ throw new Error(`Can't find valid config in ${confPath}`)
258
+ }
259
+ }
260
+
261
+ const components = loadComponents(props)
262
+
263
+ if (process.env.DEBUG === 'tamagui') {
264
+ console.log(`components`, components)
265
+ }
266
+
267
+ // undo shims
268
+ process.env.IS_STATIC = undefined
269
+
270
+ // set up core-node
271
+ if (tamaguiConfig) {
272
+ createTamagui(tamaguiConfig)
273
+ }
274
+
275
+ cache[key] = {
276
+ components,
277
+ tamaguiConfig,
278
+ nameToPaths: getNameToPaths(),
279
+ }
280
+ } catch (err) {
281
+ if (props.bubbleErrors) {
282
+ throw err
283
+ }
284
+
285
+ if (err instanceof Error) {
286
+ console.warn(
287
+ `Error loading tamagui.config.ts (set DEBUG=tamagui to see full stack), running tamagui without custom config`
288
+ )
289
+ console.log(`\n\n ${err.message}\n\n`)
290
+ if (SHOULD_DEBUG) {
291
+ console.log(err.stack)
292
+ }
293
+ } else {
294
+ console.error(`Error loading tamagui.config.ts`, err)
295
+ }
296
+ return {
297
+ components: {},
298
+ tamaguiConfig: getDefaultTamaguiConfig(),
299
+ nameToPaths: {},
300
+ }
301
+ }
302
+
303
+ return cache[key]
304
+ } catch (err) {
305
+ if (!props.bubbleErrors) {
306
+ console.log('Error loading Tamagui', err)
307
+ }
308
+ throw err
309
+ } finally {
310
+ unregister()
311
+ unregisterRequire()
312
+ }
313
+ }
314
+
315
+ function interopDefaultExport(mod: any) {
316
+ return mod?.default ?? mod
317
+ }
318
+
319
+ const cacheComponents = {}
320
+
321
+ function loadComponents(props: Props) {
322
+ const componentsModules = props.components
323
+ const key = componentsModules.join('')
324
+ if (cacheComponents[key]) {
325
+ return cacheComponents[key]
326
+ }
327
+ try {
328
+ const requiredModules = componentsModules.map((name) => {
329
+ return interopDefaultExport(require(name))
330
+ })
331
+ const res = gatherTamaguiComponentInfo(requiredModules)
332
+ cacheComponents[key] = res
333
+ return res
334
+ } catch (err: any) {
335
+ if (props.bubbleErrors) {
336
+ throw err
337
+ }
338
+ console.log(`Tamagui error bundling components`, err.message, err.stack)
339
+ }
340
+ }
341
+
342
+ function gatherTamaguiComponentInfo(packages: any[]) {
343
+ const components = {}
344
+ for (const exported of packages) {
345
+ try {
346
+ for (const componentName in exported) {
347
+ const found = getTamaguiComponent(componentName, exported[componentName])
348
+ if (found) {
349
+ // remove non-stringifyable
350
+ const { Component, reactNativeWebComponent, ...sc } = found.staticConfig
351
+ Object.assign(components, { [componentName]: { staticConfig: sc } })
352
+ }
353
+ }
354
+ } catch (err) {
355
+ console.error(`Tamagui failed getting components`)
356
+ if (err instanceof Error) {
357
+ console.error(err.message, err.stack)
358
+ } else {
359
+ console.error(err)
360
+ }
361
+ }
362
+ }
363
+ return components
364
+ }
365
+
366
+ function getTamaguiComponent(
367
+ name: string,
368
+ Component: any
369
+ ): undefined | { staticConfig: StaticConfig } {
370
+ if (name[0].toUpperCase() !== name[0]) {
371
+ return
372
+ }
373
+ const staticConfig = Component?.staticConfig as StaticConfig | undefined
374
+ if (staticConfig) {
375
+ return Component
376
+ }
377
+ }
@@ -0,0 +1,16 @@
1
+ const prefix = ' '
2
+
3
+ export const logLines = (str: string, singleLine = false) => {
4
+ if (singleLine) {
5
+ return prefix + str.split(' ').join(`\n${prefix}`)
6
+ }
7
+ let lines: string[] = ['']
8
+ const items = str.split(' ')
9
+ for (const item of items) {
10
+ if (item.length + lines[lines.length - 1].length > 85) {
11
+ lines.push('')
12
+ }
13
+ lines[lines.length - 1] += item + ' '
14
+ }
15
+ return lines.map((line, i) => prefix + (i == 0 ? '' : ' ') + line.trim()).join('\n')
16
+ }
@@ -0,0 +1,63 @@
1
+ import generate from '@babel/generator'
2
+ import * as t from '@babel/types'
3
+ import invariant from 'invariant'
4
+
5
+ import { Ternary } from '../types.js'
6
+
7
+ export function normalizeTernaries(ternaries: Ternary[]) {
8
+ invariant(
9
+ Array.isArray(ternaries),
10
+ 'extractStaticTernaries expects param 1 to be an array of ternaries'
11
+ )
12
+
13
+ if (ternaries.length === 0) {
14
+ return []
15
+ }
16
+
17
+ const ternariesByKey: { [key: string]: Ternary } = {}
18
+
19
+ for (let idx = -1, len = ternaries.length; ++idx < len; ) {
20
+ const { test, consequent, alternate, remove, ...rest } = ternaries[idx]
21
+
22
+ let ternaryTest = test
23
+
24
+ // strip parens
25
+ if (t.isExpressionStatement(test)) {
26
+ ternaryTest = (test as any).expression
27
+ }
28
+
29
+ // convert `!thing` to `thing` with swapped consequent and alternate
30
+ let shouldSwap = false
31
+ if (t.isUnaryExpression(test) && test.operator === '!') {
32
+ ternaryTest = test.argument
33
+ shouldSwap = true
34
+ } else if (t.isBinaryExpression(test)) {
35
+ if (test.operator === '!==' || test.operator === '!=') {
36
+ ternaryTest = t.binaryExpression(test.operator, test.left, test.right)
37
+ shouldSwap = true
38
+ }
39
+ }
40
+
41
+ const key = generate(ternaryTest).code
42
+
43
+ if (!ternariesByKey[key]) {
44
+ ternariesByKey[key] = {
45
+ ...rest,
46
+ alternate: {},
47
+ consequent: {},
48
+ test: ternaryTest,
49
+ remove,
50
+ }
51
+ }
52
+ const altStyle = (shouldSwap ? consequent : alternate) ?? {}
53
+ const consStyle = (shouldSwap ? alternate : consequent) ?? {}
54
+ Object.assign(ternariesByKey[key].alternate!, altStyle)
55
+ Object.assign(ternariesByKey[key].consequent!, consStyle)
56
+ }
57
+
58
+ const ternaryExpression = Object.keys(ternariesByKey).map((key) => {
59
+ return ternariesByKey[key]
60
+ })
61
+
62
+ return ternaryExpression
63
+ }
@@ -0,0 +1,76 @@
1
+ import { NodePath } from '@babel/traverse'
2
+ import * as t from '@babel/types'
3
+
4
+ const hooks = {
5
+ useMedia: true,
6
+ useTheme: true,
7
+ }
8
+
9
+ export function removeUnusedHooks(compFn: NodePath<any>, shouldPrintDebug: boolean | 'verbose') {
10
+ compFn.scope.crawl()
11
+ // check the top level statements
12
+ let bodyStatements = compFn?.get('body')
13
+ if (!bodyStatements) {
14
+ console.log('no body statemnts?', compFn)
15
+ return
16
+ }
17
+ if (!Array.isArray(bodyStatements)) {
18
+ if (bodyStatements.isFunctionExpression()) {
19
+ bodyStatements = bodyStatements.scope.path.get('body')
20
+ } else {
21
+ bodyStatements = bodyStatements.get('body')
22
+ }
23
+ }
24
+ if (!bodyStatements || !Array.isArray(bodyStatements)) {
25
+ return
26
+ }
27
+ const statements = bodyStatements as NodePath<any>[]
28
+ for (const statement of statements) {
29
+ if (!statement.isVariableDeclaration()) {
30
+ continue
31
+ }
32
+ const declarations = statement.get('declarations')
33
+ if (!Array.isArray(declarations)) {
34
+ continue
35
+ }
36
+ const isBindingReferenced = (name: string) => {
37
+ return !!statement.scope.getBinding(name)?.referenced
38
+ }
39
+ for (const declarator of declarations) {
40
+ const id = declarator.get('id')
41
+ const init = declarator.node.init
42
+ if (Array.isArray(id) || Array.isArray(init)) {
43
+ continue
44
+ }
45
+ const shouldRemove = (() => {
46
+ const isHook =
47
+ t.isCallExpression(init) && t.isIdentifier(init.callee) && hooks[init.callee.name]
48
+ if (!isHook) {
49
+ return false
50
+ }
51
+ if (t.isIdentifier(id.node)) {
52
+ // remove "const media = useMedia()"
53
+ const name = id.node.name
54
+ return !isBindingReferenced(name)
55
+ } else if (t.isObjectPattern(id.node)) {
56
+ // remove "const { sm } = useMedia()"
57
+ const propPaths = id.get('properties') as NodePath<any>[]
58
+ return propPaths.every((prop) => {
59
+ if (!prop.isObjectProperty()) return false
60
+ const value = prop.get('value')
61
+ if (Array.isArray(value) || !value.isIdentifier()) return false
62
+ const name = value.node.name
63
+ return !isBindingReferenced(name)
64
+ })
65
+ }
66
+ return false
67
+ })()
68
+ if (shouldRemove) {
69
+ declarator.remove()
70
+ if (shouldPrintDebug) {
71
+ console.log(` [🪝] removed ${id.node['name'] ?? ''}`)
72
+ }
73
+ }
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,29 @@
1
+ export const timer = () => {
2
+ const start = Date.now()
3
+ let last = start
4
+ return {
5
+ mark: (name: string, print = false) => {
6
+ if (print) {
7
+ const took = Date.now() - last
8
+ last = Date.now()
9
+ // eslint-disable-next-line no-console
10
+ console.log(`Time ${name}: ${took}ms`)
11
+ if (took > 10) {
12
+ // eslint-disable-next-line no-console
13
+ console.log(' long timer')
14
+ }
15
+ }
16
+ },
17
+ done: (print = false) => {
18
+ if (print) {
19
+ const total = Date.now() - start
20
+ // eslint-disable-next-line no-console
21
+ console.log(`Total time: ${total}ms`)
22
+ if (total > 50) {
23
+ // eslint-disable-next-line no-console
24
+ console.log(' long timer')
25
+ }
26
+ }
27
+ },
28
+ }
29
+ }
@@ -0,0 +1,99 @@
1
+ export const validHTMLAttributes = {
2
+ autocomplete: true,
3
+ border: true,
4
+ contenteditable: true,
5
+ crossorigin: true,
6
+ dir: true,
7
+ draggable: true,
8
+ enctype: true,
9
+ formenctype: true,
10
+ formmethod: true,
11
+ formtarget: true,
12
+ inputmode: true,
13
+ kind: true,
14
+ link: true,
15
+ method: true,
16
+ preload: true,
17
+ referrerpolicy: true,
18
+ rel: true,
19
+ rev: true,
20
+ role: true,
21
+ sandbox: true,
22
+ shape: true,
23
+ spellcheck: true,
24
+ target: true,
25
+ translate: true,
26
+ type: true,
27
+ wrap: true,
28
+ 'aria-autocomplete': true,
29
+ 'aria-busy': true,
30
+ 'aria-checked': true,
31
+ 'aria-current': true,
32
+ 'aria-disabled': true,
33
+ 'aria-expanded': true,
34
+ 'aria-haspopup': true,
35
+ 'aria-hidden': true,
36
+ 'aria-invalid': true,
37
+ 'aria-polite': true,
38
+ 'aria-modal': true,
39
+ 'aria-multiline': true,
40
+ 'aria-multiselectable': true,
41
+ 'aria-orientation': true,
42
+ 'aria-pressed': true,
43
+ 'aria-readonly': true,
44
+ 'aria-relevant': true,
45
+ 'aria-required': true,
46
+ 'aria-selected': true,
47
+ 'aria-sort': true,
48
+ }
49
+
50
+ // for moving off react-native-web eventually (unused atm)
51
+ export const validAccessibilityAttributes = {
52
+ accessibilityRole: true,
53
+ accessibilityActiveDescendant: true,
54
+ accessibilityAtomic: true,
55
+ accessibilityAutoComplete: true,
56
+ accessibilityBusy: true,
57
+ accessibilityChecked: true,
58
+ accessibilityColumnCount: true,
59
+ accessibilityColumnIndex: true,
60
+ accessibilityColumnSpan: true,
61
+ accessibilityControls: true,
62
+ accessibilityCurrent: true,
63
+ accessibilityDescribedBy: true,
64
+ accessibilityDetails: true,
65
+ disabled: true,
66
+ accessibilityErrorMessage: true,
67
+ accessibilityExpanded: true,
68
+ accessibilityFlowTo: true,
69
+ accessibilityHasPopup: true,
70
+ accessibilityHidden: true,
71
+ accessibilityInvalid: true,
72
+ accessibilityKeyShortcuts: true,
73
+ accessibilityLabel: true,
74
+ accessibilityLabelledBy: true,
75
+ accessibilityLevel: true,
76
+ accessibilityLiveRegion: true,
77
+ accessibilityModal: true,
78
+ accessibilityMultiline: true,
79
+ accessibilityMultiSelectable: true,
80
+ accessibilityOrientation: true,
81
+ accessibilityOwns: true,
82
+ accessibilityPlaceholder: true,
83
+ accessibilityPosInSet: true,
84
+ accessibilityPressed: true,
85
+ accessibilityReadOnly: true,
86
+ accessibilityRequired: true,
87
+ accessibilityRoleDescription: true,
88
+ accessibilityRowCount: true,
89
+ accessibilityRowIndex: true,
90
+ accessibilityRowSpan: true,
91
+ accessibilitySelected: true,
92
+ accessibilitySetSize: true,
93
+ accessibilitySort: true,
94
+ accessibilityValueMax: true,
95
+ accessibilityValueMin: true,
96
+ accessibilityValueNow: true,
97
+ accessibilityValueText: true,
98
+ nativeID: true,
99
+ }
@@ -0,0 +1,52 @@
1
+ export function getPragmaOptions({
2
+ source,
3
+ path,
4
+ disableCommentCheck,
5
+ }: {
6
+ source: string
7
+ path: string
8
+ disableCommentCheck?: boolean
9
+ }) {
10
+ if (!disableCommentCheck && !source.startsWith('//') && !source.startsWith('/*')) {
11
+ return {
12
+ shouldPrintDebug: false,
13
+ shouldDisable: false,
14
+ }
15
+ }
16
+
17
+ let shouldPrintDebug: boolean | 'verbose' = false
18
+ let shouldDisable = false
19
+
20
+ const firstLine = source.split('\n', 1)[0]
21
+
22
+ if (firstLine.includes('tamagui-ignore')) {
23
+ shouldDisable = true
24
+ }
25
+
26
+ if (firstLine.includes('debug')) {
27
+ shouldPrintDebug = true
28
+ }
29
+
30
+ if (firstLine.includes('debug-verbose')) {
31
+ shouldPrintDebug = 'verbose'
32
+ }
33
+
34
+ if (process.env.TAMAGUI_DEBUG_FILE) {
35
+ if (path.includes(process.env.TAMAGUI_DEBUG_FILE)) {
36
+ shouldPrintDebug = 'verbose'
37
+ }
38
+ }
39
+
40
+ if (process.env.DEBUG?.includes('tamagui')) {
41
+ shouldPrintDebug = true
42
+ }
43
+
44
+ if (process.env.DEBUG?.includes('tamagui-verbose')) {
45
+ shouldPrintDebug = 'verbose'
46
+ }
47
+
48
+ return {
49
+ shouldPrintDebug,
50
+ shouldDisable,
51
+ }
52
+ }