@tamagui/static 2.7.7 → 3.0.0-beta.1093.1

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 (335) hide show
  1. package/dist/cjs/check-dep-versions.cjs +354 -0
  2. package/dist/cjs/checkDeps.cjs +301 -0
  3. package/dist/cjs/compiler.cjs +349 -0
  4. package/dist/cjs/compilerHost.cjs +2285 -0
  5. package/dist/cjs/componentDiscovery.cjs +94 -0
  6. package/dist/cjs/constants.cjs +32 -0
  7. package/dist/cjs/domStructuralPass.cjs +121 -0
  8. package/dist/cjs/exports.cjs +44 -0
  9. package/dist/cjs/extractor/addLocalExports.cjs +63 -0
  10. package/dist/cjs/extractor/bundle.cjs +229 -0
  11. package/dist/cjs/extractor/bundleConfig.cjs +769 -0
  12. package/dist/cjs/extractor/concatClassName.cjs +120 -0
  13. package/dist/cjs/extractor/detectModuleFormat.cjs +53 -0
  14. package/dist/cjs/extractor/esbuildAliasPlugin.cjs +46 -0
  15. package/dist/cjs/extractor/esbuildTsconfigPaths.cjs +91 -0
  16. package/dist/cjs/extractor/getTamaguiConfigPathFromOptionsConfig.cjs +42 -0
  17. package/dist/cjs/extractor/loadTamagui.cjs +394 -0
  18. package/dist/cjs/extractor/regenerateConfig.cjs +160 -0
  19. package/dist/cjs/extractor/watchTamaguiConfig.cjs +63 -0
  20. package/dist/cjs/getPragmaOptions.cjs +66 -0
  21. package/dist/cjs/helpers/memoize.cjs +41 -0
  22. package/dist/cjs/helpers/requireTamaguiCore.cjs +39 -0
  23. package/dist/cjs/index.cjs +33 -0
  24. package/dist/cjs/registerRequire.cjs +219 -0
  25. package/dist/cjs/server.cjs +65 -0
  26. package/dist/cjs/staticEvaluationIgnoredModules.cjs +85 -0
  27. package/dist/cjs/types.cjs +16 -0
  28. package/dist/cjs/zero/artifact.cjs +144 -0
  29. package/dist/cjs/zero/graph.cjs +208 -0
  30. package/dist/cjs/zero/identity.cjs +60 -0
  31. package/dist/cjs/zero/index.cjs +33 -0
  32. package/dist/cjs/zero/islands.cjs +234 -0
  33. package/dist/cjs/zero/options.cjs +162 -0
  34. package/dist/cjs/zero/ownership.cjs +78 -0
  35. package/dist/cjs/zero/theme.cjs +337 -0
  36. package/dist/cjs/zero/transform.cjs +207 -0
  37. package/dist/esm/check-dep-versions.mjs +329 -0
  38. package/dist/esm/check-dep-versions.mjs.map +1 -0
  39. package/dist/esm/checkDeps.mjs +279 -0
  40. package/dist/esm/checkDeps.mjs.map +1 -0
  41. package/dist/esm/compiler.mjs +319 -0
  42. package/dist/esm/compiler.mjs.map +1 -0
  43. package/dist/esm/compilerHost.mjs +2263 -0
  44. package/dist/esm/compilerHost.mjs.map +1 -0
  45. package/dist/esm/componentDiscovery.mjs +69 -0
  46. package/dist/esm/componentDiscovery.mjs.map +1 -0
  47. package/dist/esm/constants.mjs +7 -0
  48. package/dist/esm/constants.mjs.map +1 -0
  49. package/dist/esm/domStructuralPass.mjs +102 -0
  50. package/dist/esm/domStructuralPass.mjs.map +1 -0
  51. package/dist/esm/exports.mjs +29 -0
  52. package/dist/esm/extractor/addLocalExports.mjs +44 -0
  53. package/dist/esm/extractor/addLocalExports.mjs.map +1 -0
  54. package/dist/esm/extractor/bundle.mjs +199 -0
  55. package/dist/esm/extractor/bundle.mjs.map +1 -0
  56. package/dist/esm/extractor/bundleConfig.mjs +728 -0
  57. package/dist/esm/extractor/bundleConfig.mjs.map +1 -0
  58. package/dist/esm/extractor/concatClassName.mjs +100 -0
  59. package/dist/esm/extractor/concatClassName.mjs.map +1 -0
  60. package/dist/esm/extractor/detectModuleFormat.mjs +31 -0
  61. package/dist/esm/extractor/detectModuleFormat.mjs.map +1 -0
  62. package/dist/esm/extractor/esbuildAliasPlugin.mjs +26 -0
  63. package/dist/esm/extractor/esbuildAliasPlugin.mjs.map +1 -0
  64. package/dist/esm/extractor/esbuildTsconfigPaths.mjs +63 -0
  65. package/dist/esm/extractor/esbuildTsconfigPaths.mjs.map +1 -0
  66. package/dist/esm/extractor/getTamaguiConfigPathFromOptionsConfig.mjs +23 -0
  67. package/dist/esm/extractor/getTamaguiConfigPathFromOptionsConfig.mjs.map +1 -0
  68. package/dist/esm/extractor/loadTamagui.mjs +357 -0
  69. package/dist/esm/extractor/loadTamagui.mjs.map +1 -0
  70. package/dist/esm/extractor/regenerateConfig.mjs +131 -0
  71. package/dist/esm/extractor/regenerateConfig.mjs.map +1 -0
  72. package/dist/esm/extractor/watchTamaguiConfig.mjs +43 -0
  73. package/dist/esm/extractor/watchTamaguiConfig.mjs.map +1 -0
  74. package/dist/esm/getPragmaOptions.mjs +46 -0
  75. package/dist/esm/getPragmaOptions.mjs.map +1 -0
  76. package/dist/esm/helpers/memoize.mjs +21 -0
  77. package/dist/esm/helpers/memoize.mjs.map +1 -0
  78. package/dist/esm/helpers/requireTamaguiCore.mjs +19 -0
  79. package/dist/esm/helpers/requireTamaguiCore.mjs.map +1 -0
  80. package/dist/esm/index.mjs +8 -0
  81. package/dist/esm/index.mjs.map +1 -0
  82. package/dist/esm/registerRequire.mjs +195 -0
  83. package/dist/esm/registerRequire.mjs.map +1 -0
  84. package/dist/esm/server.mjs +40 -0
  85. package/dist/esm/server.mjs.map +1 -0
  86. package/dist/esm/setup.mjs +0 -0
  87. package/dist/esm/staticEvaluationIgnoredModules.mjs +61 -0
  88. package/dist/esm/staticEvaluationIgnoredModules.mjs.map +1 -0
  89. package/dist/esm/types.mjs +0 -0
  90. package/dist/esm/zero/artifact.mjs +119 -0
  91. package/dist/esm/zero/artifact.mjs.map +1 -0
  92. package/dist/esm/zero/graph.mjs +170 -0
  93. package/dist/esm/zero/graph.mjs.map +1 -0
  94. package/dist/esm/zero/identity.mjs +36 -0
  95. package/dist/esm/zero/identity.mjs.map +1 -0
  96. package/dist/esm/zero/index.mjs +19 -0
  97. package/dist/esm/zero/islands.mjs +200 -0
  98. package/dist/esm/zero/islands.mjs.map +1 -0
  99. package/dist/esm/zero/options.mjs +129 -0
  100. package/dist/esm/zero/options.mjs.map +1 -0
  101. package/dist/esm/zero/ownership.mjs +48 -0
  102. package/dist/esm/zero/ownership.mjs.map +1 -0
  103. package/dist/esm/zero/theme.mjs +313 -0
  104. package/dist/esm/zero/theme.mjs.map +1 -0
  105. package/dist/esm/zero/transform.mjs +182 -0
  106. package/dist/esm/zero/transform.mjs.map +1 -0
  107. package/package.json +38 -47
  108. package/src/check-dep-versions.ts +2 -2
  109. package/src/checkDeps.ts +3 -2
  110. package/src/compiler.ts +506 -0
  111. package/src/compilerHost.ts +3752 -0
  112. package/src/componentDiscovery.ts +105 -0
  113. package/src/constants.ts +0 -5
  114. package/src/domStructuralPass.ts +190 -0
  115. package/src/exports.ts +5 -6
  116. package/src/extractor/addLocalExports.ts +49 -0
  117. package/src/extractor/bundle.ts +38 -40
  118. package/src/extractor/bundleConfig.ts +368 -187
  119. package/src/extractor/concatClassName.ts +21 -24
  120. package/src/extractor/getTamaguiConfigPathFromOptionsConfig.ts +13 -5
  121. package/src/extractor/loadTamagui.ts +196 -143
  122. package/src/extractor/regenerateConfig.ts +65 -13
  123. package/src/extractor/watchTamaguiConfig.ts +6 -1
  124. package/src/helpers/requireTamaguiCore.ts +6 -1
  125. package/src/registerRequire.ts +94 -132
  126. package/src/staticEvaluationIgnoredModules.ts +74 -0
  127. package/src/types.ts +2 -107
  128. package/src/zero/artifact.ts +142 -0
  129. package/src/zero/graph.ts +359 -0
  130. package/src/zero/identity.ts +73 -0
  131. package/src/zero/index.ts +9 -0
  132. package/src/zero/islands.ts +265 -0
  133. package/src/zero/options.ts +239 -0
  134. package/src/zero/ownership.ts +113 -0
  135. package/src/zero/theme.ts +526 -0
  136. package/src/zero/transform.ts +329 -0
  137. package/types/check-dep-versions.d.ts.map +1 -1
  138. package/types/checkDeps.d.ts.map +1 -1
  139. package/types/compiler.d.ts +134 -0
  140. package/types/compiler.d.ts.map +1 -0
  141. package/types/compilerHost.d.ts +38 -0
  142. package/types/compilerHost.d.ts.map +1 -0
  143. package/types/componentDiscovery.d.ts +27 -0
  144. package/types/componentDiscovery.d.ts.map +1 -0
  145. package/types/constants.d.ts +0 -1
  146. package/types/constants.d.ts.map +1 -1
  147. package/types/domStructuralPass.d.ts +3 -0
  148. package/types/domStructuralPass.d.ts.map +1 -0
  149. package/types/exports.d.ts +5 -6
  150. package/types/exports.d.ts.map +1 -1
  151. package/types/extractor/addLocalExports.d.ts +3 -0
  152. package/types/extractor/addLocalExports.d.ts.map +1 -0
  153. package/types/extractor/bundle.d.ts +66 -65
  154. package/types/extractor/bundle.d.ts.map +1 -1
  155. package/types/extractor/bundleConfig.d.ts +26 -4
  156. package/types/extractor/bundleConfig.d.ts.map +1 -1
  157. package/types/extractor/esbuildAliasPlugin.d.ts.map +1 -1
  158. package/types/extractor/getTamaguiConfigPathFromOptionsConfig.d.ts +1 -1
  159. package/types/extractor/getTamaguiConfigPathFromOptionsConfig.d.ts.map +1 -1
  160. package/types/extractor/loadTamagui.d.ts +26 -3
  161. package/types/extractor/loadTamagui.d.ts.map +1 -1
  162. package/types/extractor/regenerateConfig.d.ts +1 -1
  163. package/types/extractor/regenerateConfig.d.ts.map +1 -1
  164. package/types/extractor/watchTamaguiConfig.d.ts.map +1 -1
  165. package/types/getPragmaOptions.d.ts +1 -1
  166. package/types/helpers/memoize.d.ts +1 -1
  167. package/types/helpers/memoize.d.ts.map +1 -1
  168. package/types/helpers/requireTamaguiCore.d.ts.map +1 -1
  169. package/types/index.d.ts.map +1 -1
  170. package/types/registerRequire.d.ts +2 -2
  171. package/types/registerRequire.d.ts.map +1 -1
  172. package/types/staticEvaluationIgnoredModules.d.ts +9 -0
  173. package/types/staticEvaluationIgnoredModules.d.ts.map +1 -0
  174. package/types/types.d.ts +2 -90
  175. package/types/types.d.ts.map +1 -1
  176. package/types/zero/artifact.d.ts +44 -0
  177. package/types/zero/artifact.d.ts.map +1 -0
  178. package/types/zero/graph.d.ts +139 -0
  179. package/types/zero/graph.d.ts.map +1 -0
  180. package/types/zero/identity.d.ts +33 -0
  181. package/types/zero/identity.d.ts.map +1 -0
  182. package/types/zero/index.d.ts +10 -0
  183. package/types/zero/index.d.ts.map +1 -0
  184. package/types/zero/islands.d.ts +56 -0
  185. package/types/zero/islands.d.ts.map +1 -0
  186. package/types/zero/options.d.ts +58 -0
  187. package/types/zero/options.d.ts.map +1 -0
  188. package/types/zero/ownership.d.ts +51 -0
  189. package/types/zero/ownership.d.ts.map +1 -0
  190. package/types/zero/theme.d.ts +85 -0
  191. package/types/zero/theme.d.ts.map +1 -0
  192. package/types/zero/transform.d.ts +53 -0
  193. package/types/zero/transform.d.ts.map +1 -0
  194. package/dist/check-dep-versions.cjs +0 -372
  195. package/dist/checkDeps.cjs +0 -271
  196. package/dist/constants.cjs +0 -51
  197. package/dist/exports.cjs +0 -48
  198. package/dist/extractor/accessSafe.cjs +0 -48
  199. package/dist/extractor/babelParse.cjs +0 -56
  200. package/dist/extractor/buildClassName.cjs +0 -86
  201. package/dist/extractor/bundle.cjs +0 -234
  202. package/dist/extractor/bundleConfig.cjs +0 -729
  203. package/dist/extractor/concatClassName.cjs +0 -129
  204. package/dist/extractor/createEvaluator.cjs +0 -88
  205. package/dist/extractor/createExtractor.cjs +0 -1968
  206. package/dist/extractor/createLogger.cjs +0 -50
  207. package/dist/extractor/detectModuleFormat.cjs +0 -55
  208. package/dist/extractor/ensureImportingConcat.cjs +0 -54
  209. package/dist/extractor/errors.cjs +0 -28
  210. package/dist/extractor/esbuildAliasPlugin.cjs +0 -56
  211. package/dist/extractor/esbuildTsconfigPaths.cjs +0 -108
  212. package/dist/extractor/evaluateAstNode.cjs +0 -128
  213. package/dist/extractor/extractHelpers.cjs +0 -182
  214. package/dist/extractor/extractMediaStyle.cjs +0 -169
  215. package/dist/extractor/extractToClassNames.cjs +0 -475
  216. package/dist/extractor/extractToNative.cjs +0 -369
  217. package/dist/extractor/findTopmostFunction.cjs +0 -43
  218. package/dist/extractor/generatedUid.cjs +0 -58
  219. package/dist/extractor/getPrefixLogs.cjs +0 -31
  220. package/dist/extractor/getPropValueFromAttributes.cjs +0 -85
  221. package/dist/extractor/getSourceModule.cjs +0 -100
  222. package/dist/extractor/getStaticBindingsForScope.cjs +0 -213
  223. package/dist/extractor/getTamaguiConfigPathFromOptionsConfig.cjs +0 -41
  224. package/dist/extractor/hasTopLevelAwait.cjs +0 -62
  225. package/dist/extractor/hoistClassNames.cjs +0 -76
  226. package/dist/extractor/literalToAst.cjs +0 -109
  227. package/dist/extractor/loadFile.cjs +0 -17
  228. package/dist/extractor/loadTamagui.cjs +0 -373
  229. package/dist/extractor/logLines.cjs +0 -43
  230. package/dist/extractor/normalizeTernaries.cjs +0 -100
  231. package/dist/extractor/propsToFontFamilyCache.cjs +0 -42
  232. package/dist/extractor/regenerateConfig.cjs +0 -178
  233. package/dist/extractor/removeUnusedHooks.cjs +0 -108
  234. package/dist/extractor/timer.cjs +0 -52
  235. package/dist/extractor/validHTMLAttributes.cjs +0 -79
  236. package/dist/extractor/watchTamaguiConfig.cjs +0 -70
  237. package/dist/getPragmaOptions.cjs +0 -73
  238. package/dist/helpers/memoize.cjs +0 -45
  239. package/dist/helpers/requireTamaguiCore.cjs +0 -40
  240. package/dist/index.cjs +0 -42
  241. package/dist/registerRequire.cjs +0 -209
  242. package/dist/server.cjs +0 -82
  243. package/dist/types.cjs +0 -18
  244. package/dist/worker.cjs +0 -111
  245. package/src/extractor/accessSafe.ts +0 -22
  246. package/src/extractor/babelParse.ts +0 -38
  247. package/src/extractor/buildClassName.ts +0 -76
  248. package/src/extractor/createEvaluator.ts +0 -82
  249. package/src/extractor/createExtractor.ts +0 -2970
  250. package/src/extractor/createLogger.ts +0 -41
  251. package/src/extractor/ensureImportingConcat.ts +0 -36
  252. package/src/extractor/errors.ts +0 -1
  253. package/src/extractor/evaluateAstNode.ts +0 -136
  254. package/src/extractor/extractHelpers.ts +0 -211
  255. package/src/extractor/extractMediaStyle.ts +0 -194
  256. package/src/extractor/extractToClassNames.ts +0 -733
  257. package/src/extractor/extractToNative.ts +0 -506
  258. package/src/extractor/findTopmostFunction.ts +0 -24
  259. package/src/extractor/generatedUid.ts +0 -41
  260. package/src/extractor/getPrefixLogs.ts +0 -9
  261. package/src/extractor/getPropValueFromAttributes.ts +0 -95
  262. package/src/extractor/getSourceModule.ts +0 -96
  263. package/src/extractor/getStaticBindingsForScope.ts +0 -237
  264. package/src/extractor/hasTopLevelAwait.ts +0 -28
  265. package/src/extractor/hoistClassNames.ts +0 -52
  266. package/src/extractor/literalToAst.ts +0 -85
  267. package/src/extractor/loadFile.ts +0 -17
  268. package/src/extractor/logLines.ts +0 -16
  269. package/src/extractor/normalizeTernaries.ts +0 -89
  270. package/src/extractor/propsToFontFamilyCache.ts +0 -18
  271. package/src/extractor/removeUnusedHooks.ts +0 -83
  272. package/src/extractor/timer.ts +0 -25
  273. package/src/extractor/validHTMLAttributes.ts +0 -52
  274. package/src/worker.ts +0 -142
  275. package/types/extractor/accessSafe.d.ts +0 -3
  276. package/types/extractor/accessSafe.d.ts.map +0 -1
  277. package/types/extractor/babelParse.d.ts +0 -5
  278. package/types/extractor/babelParse.d.ts.map +0 -1
  279. package/types/extractor/buildClassName.d.ts +0 -7
  280. package/types/extractor/buildClassName.d.ts.map +0 -1
  281. package/types/extractor/createEvaluator.d.ts +0 -12
  282. package/types/extractor/createEvaluator.d.ts.map +0 -1
  283. package/types/extractor/createExtractor.d.ts +0 -32
  284. package/types/extractor/createExtractor.d.ts.map +0 -1
  285. package/types/extractor/createLogger.d.ts +0 -3
  286. package/types/extractor/createLogger.d.ts.map +0 -1
  287. package/types/extractor/ensureImportingConcat.d.ts +0 -4
  288. package/types/extractor/ensureImportingConcat.d.ts.map +0 -1
  289. package/types/extractor/errors.d.ts +0 -3
  290. package/types/extractor/errors.d.ts.map +0 -1
  291. package/types/extractor/evaluateAstNode.d.ts +0 -3
  292. package/types/extractor/evaluateAstNode.d.ts.map +0 -1
  293. package/types/extractor/extractHelpers.d.ts +0 -28
  294. package/types/extractor/extractHelpers.d.ts.map +0 -1
  295. package/types/extractor/extractMediaStyle.d.ts +0 -11
  296. package/types/extractor/extractMediaStyle.d.ts.map +0 -1
  297. package/types/extractor/extractToClassNames.d.ts +0 -25
  298. package/types/extractor/extractToClassNames.d.ts.map +0 -1
  299. package/types/extractor/extractToNative.d.ts +0 -13
  300. package/types/extractor/extractToNative.d.ts.map +0 -1
  301. package/types/extractor/findTopmostFunction.d.ts +0 -4
  302. package/types/extractor/findTopmostFunction.d.ts.map +0 -1
  303. package/types/extractor/generatedUid.d.ts +0 -5
  304. package/types/extractor/generatedUid.d.ts.map +0 -1
  305. package/types/extractor/getPrefixLogs.d.ts +0 -3
  306. package/types/extractor/getPrefixLogs.d.ts.map +0 -1
  307. package/types/extractor/getPropValueFromAttributes.d.ts +0 -19
  308. package/types/extractor/getPropValueFromAttributes.d.ts.map +0 -1
  309. package/types/extractor/getSourceModule.d.ts +0 -16
  310. package/types/extractor/getSourceModule.d.ts.map +0 -1
  311. package/types/extractor/getStaticBindingsForScope.d.ts +0 -5
  312. package/types/extractor/getStaticBindingsForScope.d.ts.map +0 -1
  313. package/types/extractor/hasTopLevelAwait.d.ts +0 -2
  314. package/types/extractor/hasTopLevelAwait.d.ts.map +0 -1
  315. package/types/extractor/hoistClassNames.d.ts +0 -6
  316. package/types/extractor/hoistClassNames.d.ts.map +0 -1
  317. package/types/extractor/literalToAst.d.ts +0 -4
  318. package/types/extractor/literalToAst.d.ts.map +0 -1
  319. package/types/extractor/loadFile.d.ts +0 -1
  320. package/types/extractor/loadFile.d.ts.map +0 -1
  321. package/types/extractor/logLines.d.ts +0 -2
  322. package/types/extractor/logLines.d.ts.map +0 -1
  323. package/types/extractor/normalizeTernaries.d.ts +0 -5
  324. package/types/extractor/normalizeTernaries.d.ts.map +0 -1
  325. package/types/extractor/propsToFontFamilyCache.d.ts +0 -4
  326. package/types/extractor/propsToFontFamilyCache.d.ts.map +0 -1
  327. package/types/extractor/removeUnusedHooks.d.ts +0 -3
  328. package/types/extractor/removeUnusedHooks.d.ts.map +0 -1
  329. package/types/extractor/timer.d.ts +0 -5
  330. package/types/extractor/timer.d.ts.map +0 -1
  331. package/types/extractor/validHTMLAttributes.d.ts +0 -52
  332. package/types/extractor/validHTMLAttributes.d.ts.map +0 -1
  333. package/types/worker.d.ts +0 -46
  334. package/types/worker.d.ts.map +0 -1
  335. /package/dist/{setup.cjs → cjs/setup.cjs} +0 -0
@@ -0,0 +1,48 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { resolveZeroRuntimeSync } from "./options.mjs";
5
+
6
+ const hashCSS = (css) => createHash("sha256").update(css).digest("hex").slice(0, 16);
7
+ const normalize = (value) => value.split(/[?#]/, 1)[0].replace(/\\/g, "/");
8
+ const declaresRuntimeThemeMutation = () => process.env.TAMAGUI_DOES_SSR_CSS === "mutates-themes";
9
+ function resolveGlobalCSSOwnership(options, root) {
10
+ if (options.disable) return null;
11
+ if (options.platform === "native") return null;
12
+ if (!options.outputCSS) return null;
13
+ if (declaresRuntimeThemeMutation()) return null;
14
+ if (resolveZeroRuntimeSync(options, root).mode === "enforce") return null;
15
+ return { cssPath: path.isAbsolute(options.outputCSS) ? options.outputCSS : path.resolve(root, options.outputCSS) };
16
+ }
17
+ function checkGlobalCSSArtifact(input) {
18
+ const { cssPath, expectedCSS } = input;
19
+ let onDisk;
20
+ try {
21
+ onDisk = readFileSync(cssPath, "utf8");
22
+ } catch {
23
+ return {
24
+ kind: "missing",
25
+ cssPath,
26
+ message: `[tamagui] the generated CSS artifact ${cssPath} does not exist, so this build cannot claim TAMAGUI_DID_OUTPUT_CSS. The design-system, :root, font and theme rules would be stripped from JavaScript and put nowhere.`
27
+ };
28
+ }
29
+ if (onDisk !== expectedCSS) {
30
+ return {
31
+ kind: "stale",
32
+ cssPath,
33
+ message: `[tamagui] the generated CSS artifact ${cssPath} is stale: it hashes ${hashCSS(onDisk)} but this build's config generates ${hashCSS(expectedCSS)}. Deriving TAMAGUI_DID_OUTPUT_CSS from it would ship rules that do not match the build.`
34
+ };
35
+ }
36
+ const wanted = normalize(cssPath);
37
+ for (const id of input.loadedModuleIds) {
38
+ if (normalize(id) === wanted) return null;
39
+ }
40
+ return {
41
+ kind: "unimported",
42
+ cssPath,
43
+ message: `[tamagui] the generated CSS artifact ${cssPath} exists but the entry graph never loads it. ${input.importHint}`
44
+ };
45
+ }
46
+
47
+ export { checkGlobalCSSArtifact, declaresRuntimeThemeMutation, hashCSS, resolveGlobalCSSOwnership };
48
+ //# sourceMappingURL=ownership.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.js","names":[],"sources":["esm/zero/ownership.js"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { resolveZeroRuntimeSync } from \"./options\";\nconst hashCSS = (css) => createHash(\"sha256\").update(css).digest(\"hex\").slice(0, 16);\nconst normalize = (value) => value.split(/[?#]/, 1)[0].replace(/\\\\/g, \"/\");\nconst declaresRuntimeThemeMutation = () => process.env.TAMAGUI_DOES_SSR_CSS === \"mutates-themes\";\nfunction resolveGlobalCSSOwnership(options, root) {\n if (options.disable) return null;\n if (options.platform === \"native\") return null;\n if (!options.outputCSS) return null;\n if (declaresRuntimeThemeMutation()) return null;\n if (resolveZeroRuntimeSync(options, root).mode === \"enforce\") return null;\n return {\n cssPath: path.isAbsolute(options.outputCSS) ? options.outputCSS : path.resolve(root, options.outputCSS)\n };\n}\nfunction checkGlobalCSSArtifact(input) {\n const { cssPath, expectedCSS } = input;\n let onDisk;\n try {\n onDisk = readFileSync(cssPath, \"utf8\");\n } catch {\n return {\n kind: \"missing\",\n cssPath,\n message: `[tamagui] the generated CSS artifact ${cssPath} does not exist, so this build cannot claim TAMAGUI_DID_OUTPUT_CSS. The design-system, :root, font and theme rules would be stripped from JavaScript and put nowhere.`\n };\n }\n if (onDisk !== expectedCSS) {\n return {\n kind: \"stale\",\n cssPath,\n message: `[tamagui] the generated CSS artifact ${cssPath} is stale: it hashes ${hashCSS(\n onDisk\n )} but this build's config generates ${hashCSS(\n expectedCSS\n )}. Deriving TAMAGUI_DID_OUTPUT_CSS from it would ship rules that do not match the build.`\n };\n }\n const wanted = normalize(cssPath);\n for (const id of input.loadedModuleIds) {\n if (normalize(id) === wanted) return null;\n }\n return {\n kind: \"unimported\",\n cssPath,\n message: `[tamagui] the generated CSS artifact ${cssPath} exists but the entry graph never loads it. ${input.importHint}`\n };\n}\nexport {\n checkGlobalCSSArtifact,\n declaresRuntimeThemeMutation,\n hashCSS,\n resolveGlobalCSSOwnership\n};\n//# sourceMappingURL=ownership.js.map\n"],"mappings":";;;;;;AAIA,MAAM,WAAW,QAAQ,WAAW,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;AACnF,MAAM,aAAa,UAAU,MAAM,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,OAAO,GAAG;AACzE,MAAM,qCAAqC,QAAQ,IAAI,yBAAyB;AAChF,SAAS,0BAA0B,SAAS,MAAM;CAChD,IAAI,QAAQ,SAAS,OAAO;CAC5B,IAAI,QAAQ,aAAa,UAAU,OAAO;CAC1C,IAAI,CAAC,QAAQ,WAAW,OAAO;CAC/B,IAAI,6BAA6B,GAAG,OAAO;CAC3C,IAAI,uBAAuB,SAAS,IAAI,CAAC,CAAC,SAAS,WAAW,OAAO;CACrE,OAAO,EACL,SAAS,KAAK,WAAW,QAAQ,SAAS,IAAI,QAAQ,YAAY,KAAK,QAAQ,MAAM,QAAQ,SAAS,EACxG;AACF;AACA,SAAS,uBAAuB,OAAO;CACrC,MAAM,EAAE,SAAS,gBAAgB;CACjC,IAAI;CACJ,IAAI;EACF,SAAS,aAAa,SAAS,MAAM;CACvC,QAAQ;EACN,OAAO;GACL,MAAM;GACN;GACA,SAAS,wCAAwC,QAAQ;EAC3D;CACF;CACA,IAAI,WAAW,aAAa;EAC1B,OAAO;GACL,MAAM;GACN;GACA,SAAS,wCAAwC,QAAQ,uBAAuB,QAC9E,MACF,EAAE,qCAAqC,QACrC,WACF,EAAE;EACJ;CACF;CACA,MAAM,SAAS,UAAU,OAAO;CAChC,KAAK,MAAM,MAAM,MAAM,iBAAiB;EACtC,IAAI,UAAU,EAAE,MAAM,QAAQ,OAAO;CACvC;CACA,OAAO;EACL,MAAM;EACN;EACA,SAAS,wCAAwC,QAAQ,8CAA8C,MAAM;CAC/G;AACF"}
@@ -0,0 +1,313 @@
1
+ import { childNode, childNodes, resolvedModuleId, walkAst, zeroRuleMessage } from "@tamagui/compiler-core";
2
+ import { getThemeClassNames, getThemeScheme, reservedThemeProps } from "@tamagui/helpers";
3
+ import { resolveThemeName, variableToString } from "@tamagui/web";
4
+ import { getInlineValuesFromProps, getVariablesCSSRules } from "@tamagui/web/theme-update";
5
+
6
+ const MAX_THEME_BRANCHES = 8;
7
+ const LOWERABLE_RESERVED_PROPS = /* @__PURE__ */ new Set(["name", "contain"]);
8
+ function jsxAttributeName(attribute) {
9
+ const name = childNode(attribute, "name");
10
+ return name && typeof name.name === "string" ? name.name : null;
11
+ }
12
+ function literalOf(node) {
13
+ if (!node) return void 0;
14
+ if (node.type === "Literal" && typeof node.value !== "object") {
15
+ return node.value;
16
+ }
17
+ return void 0;
18
+ }
19
+ function hasSideEffects(node) {
20
+ let found = false;
21
+ walkAst(node, (child) => {
22
+ if (child.type === "CallExpression" || child.type === "OptionalCallExpression" || child.type === "NewExpression" || child.type === "AwaitExpression" || child.type === "YieldExpression" || child.type === "AssignmentExpression" || child.type === "UpdateExpression" || child.type === "TaggedTemplateExpression") {
23
+ found = true;
24
+ }
25
+ });
26
+ return found;
27
+ }
28
+ function readNameOptions(value, source, guards) {
29
+ const literal = literalOf(value);
30
+ if (typeof literal === "string") {
31
+ return [{
32
+ test: guards.length ? guards.join(" && ") : null,
33
+ name: literal
34
+ }];
35
+ }
36
+ if (value.type === "ConditionalExpression") {
37
+ const test = childNode(value, "test");
38
+ const consequent = childNode(value, "consequent");
39
+ const alternate = childNode(value, "alternate");
40
+ if (!test || !consequent || !alternate) return null;
41
+ if (hasSideEffects(test)) return null;
42
+ const testText = source.slice(test.start, test.end).replace(/\s+/g, " ").trim();
43
+ const left = readNameOptions(consequent, source, [...guards, `(${testText})`]);
44
+ const right = readNameOptions(alternate, source, [...guards, `!(${testText})`]);
45
+ if (!left || !right) return null;
46
+ return [...left, ...right];
47
+ }
48
+ return null;
49
+ }
50
+ function foldBranches(branches) {
51
+ const last = branches[branches.length - 1];
52
+ if (new Set(branches.map((branch) => branch.value)).size === 1) return last.value;
53
+ let expression = last.value;
54
+ for (let index = branches.length - 2; index >= 0; index--) {
55
+ const branch = branches[index];
56
+ expression = branch.test === null ? branch.value : `${branch.test} ? ${branch.value} : ${expression}`;
57
+ }
58
+ return expression;
59
+ }
60
+ function resolveThemeChain(chain, rootThemeName, config) {
61
+ let branches = [{
62
+ test: null,
63
+ name: rootThemeName,
64
+ isNew: false,
65
+ schemeAuthored: false
66
+ }];
67
+ for (const node of chain) {
68
+ const next = [];
69
+ for (const parent of branches) {
70
+ for (const option of node.options) {
71
+ const resolved = resolveThemeName(parent.name, option.name, config.themes);
72
+ const schemeAuthored = parent.schemeAuthored || Boolean(option.name && getThemeScheme(option.name) && option.name in config.themes);
73
+ const tests = [parent.test, option.test].filter(Boolean);
74
+ next.push({
75
+ test: tests.length ? tests.join(" && ") : null,
76
+ name: resolved ?? parent.name,
77
+ isNew: resolved !== null || schemeAuthored !== parent.schemeAuthored,
78
+ schemeAuthored
79
+ });
80
+ }
81
+ }
82
+ branches = next;
83
+ }
84
+ return branches;
85
+ }
86
+ function readStaticTheme(element, id, source, config, kind = "Theme") {
87
+ const moduleId = resolvedModuleId(id);
88
+ const violations = [];
89
+ const css = /* @__PURE__ */ new Map();
90
+ const opening = childNode(element, "openingElement");
91
+ const closing = childNode(element, "closingElement");
92
+ const span = (node) => ({
93
+ id: moduleId,
94
+ start: node.start,
95
+ end: node.end
96
+ });
97
+ let options = [{
98
+ test: null,
99
+ name: void 0
100
+ }];
101
+ let contain = false;
102
+ const themeKeyProps = {};
103
+ for (const attribute of childNodes(opening, "attributes")) {
104
+ if (attribute.type !== "JSXAttribute") {
105
+ violations.push({
106
+ rule: 1,
107
+ code: "local/unsafe-style-spread",
108
+ span: span(attribute),
109
+ component: kind,
110
+ message: zeroRuleMessage(1, { component: kind })
111
+ });
112
+ continue;
113
+ }
114
+ const key = jsxAttributeName(attribute);
115
+ if (!key) continue;
116
+ const rawValue = childNode(attribute, "value");
117
+ const value = rawValue && rawValue.type === "JSXExpressionContainer" ? childNode(rawValue, "expression") : rawValue;
118
+ if (kind === "ThemeUpdate" && reservedThemeProps[key]) {
119
+ violations.push({
120
+ rule: 4,
121
+ code: "local/unsupported-target",
122
+ span: span(attribute),
123
+ component: kind,
124
+ message: zeroRuleMessage(4, { detail: `the <ThemeUpdate ${key}> prop, which belongs on <Theme>,` })
125
+ });
126
+ continue;
127
+ }
128
+ if (kind === "Theme" && key === "name") {
129
+ const read = value ? readNameOptions(value, source, []) : null;
130
+ if (!read) {
131
+ violations.push({
132
+ rule: 4,
133
+ code: "local/unsupported-target",
134
+ span: span(attribute),
135
+ component: "Theme",
136
+ message: zeroRuleMessage(4, { detail: `the <Theme name> value ${source.slice(attribute.start, attribute.end).replace(/\s+/g, " ").trim()}, which is not a literal theme name or a conditional over literal theme names,` })
137
+ });
138
+ continue;
139
+ }
140
+ options = read;
141
+ continue;
142
+ }
143
+ if (kind === "Theme" && reservedThemeProps[key]) {
144
+ if (!LOWERABLE_RESERVED_PROPS.has(key)) {
145
+ violations.push({
146
+ rule: 4,
147
+ code: "local/unsupported-target",
148
+ span: span(attribute),
149
+ component: "Theme",
150
+ message: zeroRuleMessage(4, { detail: `the <Theme ${key}> prop, which has no compiled form,` })
151
+ });
152
+ continue;
153
+ }
154
+ const literal2 = value ? literalOf(value) : true;
155
+ if (typeof literal2 !== "boolean") {
156
+ violations.push({
157
+ rule: 4,
158
+ code: "local/unsupported-target",
159
+ span: span(attribute),
160
+ component: "Theme",
161
+ message: zeroRuleMessage(4, { detail: `a non-literal <Theme ${key}> value,` })
162
+ });
163
+ continue;
164
+ }
165
+ if (key === "contain") contain = literal2;
166
+ continue;
167
+ }
168
+ if (kind === "Theme") {
169
+ violations.push({
170
+ rule: 4,
171
+ code: "local/unsupported-target",
172
+ span: span(attribute),
173
+ component: "Theme",
174
+ message: zeroRuleMessage(4, { detail: `the removed <Theme ${key}> inline-value spelling. Use <ThemeUpdate ${key}> around the subtree instead,` })
175
+ });
176
+ continue;
177
+ }
178
+ const literal = value ? literalOf(value) : void 0;
179
+ if (typeof literal !== "string" && typeof literal !== "number") {
180
+ violations.push({
181
+ rule: 3,
182
+ code: "local/dynamic-style-value",
183
+ span: span(attribute),
184
+ component: kind,
185
+ message: zeroRuleMessage(3, {
186
+ prop: key,
187
+ component: kind,
188
+ detail: value ? "a theme value must be a string or number literal at build time" : "a theme key needs a value"
189
+ })
190
+ });
191
+ continue;
192
+ }
193
+ themeKeyProps[key] = literal;
194
+ }
195
+ if (!closing) {
196
+ violations.push({
197
+ rule: 4,
198
+ code: "local/unsupported-target",
199
+ span: span(element),
200
+ component: "Theme",
201
+ message: zeroRuleMessage(4, { detail: `a self-closing <${kind}>, which has no subtree to theme,` })
202
+ });
203
+ }
204
+ const issues = [];
205
+ const themeUpdateConfig = config;
206
+ const inlineValues = kind === "ThemeUpdate" && Object.keys(themeKeyProps).length ? getInlineValuesFromProps(themeKeyProps, themeUpdateConfig, (issue) => issues.push(issue)) : null;
207
+ for (const issue of issues) {
208
+ violations.push({
209
+ rule: 3,
210
+ code: "local/dynamic-style-value",
211
+ span: span(opening),
212
+ component: kind,
213
+ message: zeroRuleMessage(3, {
214
+ prop: issue.key,
215
+ component: kind,
216
+ detail: issue.message
217
+ })
218
+ });
219
+ }
220
+ const inlineCSS = inlineValues ? getVariablesCSSRules(inlineValues, themeUpdateConfig) : null;
221
+ if (inlineCSS) css.set(inlineCSS.identifier, inlineCSS.rules.join(""));
222
+ if (violations.length) return {
223
+ node: null,
224
+ violations,
225
+ css
226
+ };
227
+ return {
228
+ node: {
229
+ kind,
230
+ element,
231
+ opening,
232
+ closing,
233
+ options,
234
+ contain,
235
+ layer: inlineValues && inlineCSS ? {
236
+ inlineValues,
237
+ inlineClassName: inlineCSS.identifier
238
+ } : null
239
+ },
240
+ violations,
241
+ css
242
+ };
243
+ }
244
+ function lowerStaticTheme(node, chain, rootThemeName, config, id) {
245
+ const moduleId = resolvedModuleId(id);
246
+ const branches = resolveThemeChain(chain, rootThemeName, config);
247
+ if (branches.length > MAX_THEME_BRANCHES) {
248
+ return {
249
+ edits: [],
250
+ violations: [{
251
+ rule: 4,
252
+ code: "local/unsupported-target",
253
+ span: {
254
+ id: moduleId,
255
+ start: node.element.start,
256
+ end: node.element.end
257
+ },
258
+ component: "Theme",
259
+ message: zeroRuleMessage(4, { detail: `a <Theme> chain that enumerates ${branches.length} theme names, past the ${MAX_THEME_BRANCHES} this lowers,` })
260
+ }]
261
+ };
262
+ }
263
+ const inlineClass = node.layer?.inlineClassName ?? "";
264
+ const classBranches = branches.map((branch) => ({
265
+ test: branch.test,
266
+ value: JSON.stringify([
267
+ branch.isNew ? getThemeClassNames(branch.name, false, branch.schemeAuthored) : "",
268
+ "is_Theme",
269
+ inlineClass
270
+ ].filter(Boolean).join(" ").replace(/\s+/g, " ").trim())
271
+ }));
272
+ const baseStyle = node.contain ? `display:"contents",contain:"strict"` : `display:"contents"`;
273
+ const styleBranches = branches.map((branch) => {
274
+ const theme = config.themes[branch.name];
275
+ const color = branch.isNew && theme ? variableToString(theme.color) : "";
276
+ return {
277
+ test: branch.test,
278
+ value: color ? `{color:${JSON.stringify(color)},${baseStyle}}` : `{${baseStyle}}`
279
+ };
280
+ });
281
+ const className = foldBranches(classBranches);
282
+ const style = foldBranches(styleBranches);
283
+ const classAttribute = className.startsWith("\"") ? `className=${className}` : `className={${className}}`;
284
+ const edits = [{
285
+ start: node.opening.start,
286
+ end: node.opening.end,
287
+ content: `<span ${classAttribute} style={${style}}>`,
288
+ origin: {
289
+ id: moduleId,
290
+ start: node.opening.start,
291
+ end: node.opening.end
292
+ }
293
+ }];
294
+ if (node.closing) {
295
+ edits.push({
296
+ start: node.closing.start,
297
+ end: node.closing.end,
298
+ content: `</span>`,
299
+ origin: {
300
+ id: moduleId,
301
+ start: node.closing.start,
302
+ end: node.closing.end
303
+ }
304
+ });
305
+ }
306
+ return {
307
+ edits,
308
+ violations: []
309
+ };
310
+ }
311
+
312
+ export { foldBranches, lowerStaticTheme, readStaticTheme, resolveThemeChain };
313
+ //# sourceMappingURL=theme.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","names":[],"sources":["esm/zero/theme.js"],"sourcesContent":["import {\n childNode,\n childNodes,\n resolvedModuleId,\n walkAst,\n zeroRuleMessage\n} from \"@tamagui/compiler-core\";\nimport { getThemeClassNames, getThemeScheme, reservedThemeProps } from \"@tamagui/helpers\";\nimport {\n resolveThemeName,\n variableToString\n} from \"@tamagui/web\";\nimport {\n getInlineValuesFromProps,\n getVariablesCSSRules\n} from \"@tamagui/web/theme-update\";\nconst MAX_THEME_BRANCHES = 8;\nconst LOWERABLE_RESERVED_PROPS = /* @__PURE__ */ new Set([\"name\", \"contain\"]);\nfunction jsxAttributeName(attribute) {\n const name = childNode(attribute, \"name\");\n return name && typeof name.name === \"string\" ? name.name : null;\n}\nfunction literalOf(node) {\n if (!node) return void 0;\n if (node.type === \"Literal\" && typeof node.value !== \"object\") {\n return node.value;\n }\n return void 0;\n}\nfunction hasSideEffects(node) {\n let found = false;\n walkAst(node, (child) => {\n if (child.type === \"CallExpression\" || child.type === \"OptionalCallExpression\" || child.type === \"NewExpression\" || child.type === \"AwaitExpression\" || child.type === \"YieldExpression\" || child.type === \"AssignmentExpression\" || child.type === \"UpdateExpression\" || child.type === \"TaggedTemplateExpression\") {\n found = true;\n }\n });\n return found;\n}\nfunction readNameOptions(value, source, guards) {\n const literal = literalOf(value);\n if (typeof literal === \"string\") {\n return [{ test: guards.length ? guards.join(\" && \") : null, name: literal }];\n }\n if (value.type === \"ConditionalExpression\") {\n const test = childNode(value, \"test\");\n const consequent = childNode(value, \"consequent\");\n const alternate = childNode(value, \"alternate\");\n if (!test || !consequent || !alternate) return null;\n if (hasSideEffects(test)) return null;\n const testText = source.slice(test.start, test.end).replace(/\\s+/g, \" \").trim();\n const left = readNameOptions(consequent, source, [...guards, `(${testText})`]);\n const right = readNameOptions(alternate, source, [...guards, `!(${testText})`]);\n if (!left || !right) return null;\n return [...left, ...right];\n }\n return null;\n}\nfunction foldBranches(branches) {\n const last = branches[branches.length - 1];\n if (new Set(branches.map((branch) => branch.value)).size === 1) return last.value;\n let expression = last.value;\n for (let index = branches.length - 2; index >= 0; index--) {\n const branch = branches[index];\n expression = branch.test === null ? branch.value : `${branch.test} ? ${branch.value} : ${expression}`;\n }\n return expression;\n}\nfunction resolveThemeChain(chain, rootThemeName, config) {\n let branches = [\n { test: null, name: rootThemeName, isNew: false, schemeAuthored: false }\n ];\n for (const node of chain) {\n const next = [];\n for (const parent of branches) {\n for (const option of node.options) {\n const resolved = resolveThemeName(\n parent.name,\n option.name,\n config.themes\n );\n const schemeAuthored = parent.schemeAuthored || Boolean(\n option.name && getThemeScheme(option.name) && option.name in config.themes\n );\n const tests = [parent.test, option.test].filter(Boolean);\n next.push({\n test: tests.length ? tests.join(\" && \") : null,\n name: resolved ?? parent.name,\n // a node that pins a scheme its parent had only inherited is its own\n // scope even when the resolved name is unchanged, because it is the\n // node that emits the pinned class\n isNew: resolved !== null || schemeAuthored !== parent.schemeAuthored,\n schemeAuthored\n });\n }\n }\n branches = next;\n }\n return branches;\n}\nfunction readStaticTheme(element, id, source, config, kind = \"Theme\") {\n const moduleId = resolvedModuleId(id);\n const violations = [];\n const css = /* @__PURE__ */ new Map();\n const opening = childNode(element, \"openingElement\");\n const closing = childNode(element, \"closingElement\");\n const span = (node) => ({ id: moduleId, start: node.start, end: node.end });\n let options = [{ test: null, name: void 0 }];\n let contain = false;\n const themeKeyProps = {};\n for (const attribute of childNodes(opening, \"attributes\")) {\n if (attribute.type !== \"JSXAttribute\") {\n violations.push({\n rule: 1,\n code: \"local/unsafe-style-spread\",\n span: span(attribute),\n component: kind,\n message: zeroRuleMessage(1, { component: kind })\n });\n continue;\n }\n const key = jsxAttributeName(attribute);\n if (!key) continue;\n const rawValue = childNode(attribute, \"value\");\n const value = rawValue && rawValue.type === \"JSXExpressionContainer\" ? childNode(rawValue, \"expression\") : rawValue;\n if (kind === \"ThemeUpdate\" && reservedThemeProps[key]) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: kind,\n message: zeroRuleMessage(4, {\n detail: `the <ThemeUpdate ${key}> prop, which belongs on <Theme>,`\n })\n });\n continue;\n }\n if (kind === \"Theme\" && key === \"name\") {\n const read = value ? readNameOptions(value, source, []) : null;\n if (!read) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `the <Theme name> value ${source.slice(attribute.start, attribute.end).replace(/\\s+/g, \" \").trim()}, which is not a literal theme name or a conditional over literal theme names,`\n })\n });\n continue;\n }\n options = read;\n continue;\n }\n if (kind === \"Theme\" && reservedThemeProps[key]) {\n if (!LOWERABLE_RESERVED_PROPS.has(key)) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `the <Theme ${key}> prop, which has no compiled form,`\n })\n });\n continue;\n }\n const literal2 = value ? literalOf(value) : true;\n if (typeof literal2 !== \"boolean\") {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `a non-literal <Theme ${key}> value,`\n })\n });\n continue;\n }\n if (key === \"contain\") contain = literal2;\n continue;\n }\n if (kind === \"Theme\") {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `the removed <Theme ${key}> inline-value spelling. Use <ThemeUpdate ${key}> around the subtree instead,`\n })\n });\n continue;\n }\n const literal = value ? literalOf(value) : void 0;\n if (typeof literal !== \"string\" && typeof literal !== \"number\") {\n violations.push({\n rule: 3,\n code: \"local/dynamic-style-value\",\n span: span(attribute),\n component: kind,\n message: zeroRuleMessage(3, {\n prop: key,\n component: kind,\n detail: value ? \"a theme value must be a string or number literal at build time\" : \"a theme key needs a value\"\n })\n });\n continue;\n }\n themeKeyProps[key] = literal;\n }\n if (!closing) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(element),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `a self-closing <${kind}>, which has no subtree to theme,`\n })\n });\n }\n const issues = [];\n const themeUpdateConfig = config;\n const inlineValues = kind === \"ThemeUpdate\" && Object.keys(themeKeyProps).length ? getInlineValuesFromProps(\n themeKeyProps,\n themeUpdateConfig,\n (issue) => issues.push(issue)\n ) : null;\n for (const issue of issues) {\n violations.push({\n rule: 3,\n code: \"local/dynamic-style-value\",\n span: span(opening),\n component: kind,\n message: zeroRuleMessage(3, {\n prop: issue.key,\n component: kind,\n detail: issue.message\n })\n });\n }\n const inlineCSS = inlineValues ? getVariablesCSSRules(inlineValues, themeUpdateConfig) : null;\n if (inlineCSS) css.set(inlineCSS.identifier, inlineCSS.rules.join(\"\"));\n if (violations.length) return { node: null, violations, css };\n return {\n node: {\n kind,\n element,\n opening,\n closing,\n options,\n contain,\n layer: inlineValues && inlineCSS ? {\n inlineValues,\n inlineClassName: inlineCSS.identifier\n } : null\n },\n violations,\n css\n };\n}\nfunction lowerStaticTheme(node, chain, rootThemeName, config, id) {\n const moduleId = resolvedModuleId(id);\n const branches = resolveThemeChain(chain, rootThemeName, config);\n if (branches.length > MAX_THEME_BRANCHES) {\n return {\n edits: [],\n violations: [\n {\n rule: 4,\n code: \"local/unsupported-target\",\n span: { id: moduleId, start: node.element.start, end: node.element.end },\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `a <Theme> chain that enumerates ${branches.length} theme names, past the ${MAX_THEME_BRANCHES} this lowers,`\n })\n }\n ]\n };\n }\n const inlineClass = node.layer?.inlineClassName ?? \"\";\n const classBranches = branches.map((branch) => ({\n test: branch.test,\n value: JSON.stringify(\n [\n branch.isNew ? getThemeClassNames(branch.name, false, branch.schemeAuthored) : \"\",\n \"is_Theme\",\n inlineClass\n ].filter(Boolean).join(\" \").replace(/\\s+/g, \" \").trim()\n )\n }));\n const baseStyle = node.contain ? `display:\"contents\",contain:\"strict\"` : `display:\"contents\"`;\n const styleBranches = branches.map((branch) => {\n const theme = config.themes[branch.name];\n const color = branch.isNew && theme ? variableToString(theme.color) : \"\";\n return {\n test: branch.test,\n value: color ? `{color:${JSON.stringify(color)},${baseStyle}}` : `{${baseStyle}}`\n };\n });\n const className = foldBranches(classBranches);\n const style = foldBranches(styleBranches);\n const classAttribute = className.startsWith('\"') ? `className=${className}` : `className={${className}}`;\n const edits = [\n {\n start: node.opening.start,\n end: node.opening.end,\n content: `<span ${classAttribute} style={${style}}>`,\n origin: { id: moduleId, start: node.opening.start, end: node.opening.end }\n }\n ];\n if (node.closing) {\n edits.push({\n start: node.closing.start,\n end: node.closing.end,\n content: `</span>`,\n origin: { id: moduleId, start: node.closing.start, end: node.closing.end }\n });\n }\n return { edits, violations: [] };\n}\nexport {\n foldBranches,\n lowerStaticTheme,\n readStaticTheme,\n resolveThemeChain\n};\n//# sourceMappingURL=theme.js.map\n"],"mappings":";;;;;;AAgBA,MAAM,qBAAqB;AAC3B,MAAM,2CAA2C,IAAI,IAAI,CAAC,QAAQ,SAAS,CAAC;AAC5E,SAAS,iBAAiB,WAAW;CACnC,MAAM,OAAO,UAAU,WAAW,MAAM;CACxC,OAAO,QAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAC7D;AACA,SAAS,UAAU,MAAM;CACvB,IAAI,CAAC,MAAM,OAAO,KAAK;CACvB,IAAI,KAAK,SAAS,aAAa,OAAO,KAAK,UAAU,UAAU;EAC7D,OAAO,KAAK;CACd;CACA,OAAO,KAAK;AACd;AACA,SAAS,eAAe,MAAM;CAC5B,IAAI,QAAQ;CACZ,QAAQ,OAAO,UAAU;EACvB,IAAI,MAAM,SAAS,oBAAoB,MAAM,SAAS,4BAA4B,MAAM,SAAS,mBAAmB,MAAM,SAAS,qBAAqB,MAAM,SAAS,qBAAqB,MAAM,SAAS,0BAA0B,MAAM,SAAS,sBAAsB,MAAM,SAAS,4BAA4B;GACnT,QAAQ;EACV;CACF,CAAC;CACD,OAAO;AACT;AACA,SAAS,gBAAgB,OAAO,QAAQ,QAAQ;CAC9C,MAAM,UAAU,UAAU,KAAK;CAC/B,IAAI,OAAO,YAAY,UAAU;EAC/B,OAAO,CAAC;GAAE,MAAM,OAAO,SAAS,OAAO,KAAK,MAAM,IAAI;GAAM,MAAM;EAAQ,CAAC;CAC7E;CACA,IAAI,MAAM,SAAS,yBAAyB;EAC1C,MAAM,OAAO,UAAU,OAAO,MAAM;EACpC,MAAM,aAAa,UAAU,OAAO,YAAY;EAChD,MAAM,YAAY,UAAU,OAAO,WAAW;EAC9C,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,OAAO;EAC/C,IAAI,eAAe,IAAI,GAAG,OAAO;EACjC,MAAM,WAAW,OAAO,MAAM,KAAK,OAAO,KAAK,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;EAC9E,MAAM,OAAO,gBAAgB,YAAY,QAAQ,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC;EAC7E,MAAM,QAAQ,gBAAgB,WAAW,QAAQ,CAAC,GAAG,QAAQ,KAAK,SAAS,EAAE,CAAC;EAC9E,IAAI,CAAC,QAAQ,CAAC,OAAO,OAAO;EAC5B,OAAO,CAAC,GAAG,MAAM,GAAG,KAAK;CAC3B;CACA,OAAO;AACT;AACA,SAAS,aAAa,UAAU;CAC9B,MAAM,OAAO,SAAS,SAAS,SAAS;CACxC,IAAI,IAAI,IAAI,SAAS,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,OAAO,KAAK;CAC5E,IAAI,aAAa,KAAK;CACtB,KAAK,IAAI,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS;EACzD,MAAM,SAAS,SAAS;EACxB,aAAa,OAAO,SAAS,OAAO,OAAO,QAAQ,GAAG,OAAO,KAAK,KAAK,OAAO,MAAM,KAAK;CAC3F;CACA,OAAO;AACT;AACA,SAAS,kBAAkB,OAAO,eAAe,QAAQ;CACvD,IAAI,WAAW,CACb;EAAE,MAAM;EAAM,MAAM;EAAe,OAAO;EAAO,gBAAgB;CAAM,CACzE;CACA,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,CAAC;EACd,KAAK,MAAM,UAAU,UAAU;GAC7B,KAAK,MAAM,UAAU,KAAK,SAAS;IACjC,MAAM,WAAW,iBACf,OAAO,MACP,OAAO,MACP,OAAO,MACT;IACA,MAAM,iBAAiB,OAAO,kBAAkB,QAC9C,OAAO,QAAQ,eAAe,OAAO,IAAI,KAAK,OAAO,QAAQ,OAAO,MACtE;IACA,MAAM,QAAQ,CAAC,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,OAAO,OAAO;IACvD,KAAK,KAAK;KACR,MAAM,MAAM,SAAS,MAAM,KAAK,MAAM,IAAI;KAC1C,MAAM,YAAY,OAAO;KAIzB,OAAO,aAAa,QAAQ,mBAAmB,OAAO;KACtD;IACF,CAAC;GACH;EACF;EACA,WAAW;CACb;CACA,OAAO;AACT;AACA,SAAS,gBAAgB,SAAS,IAAI,QAAQ,QAAQ,OAAO,SAAS;CACpE,MAAM,WAAW,iBAAiB,EAAE;CACpC,MAAM,aAAa,CAAC;CACpB,MAAM,sBAAsB,IAAI,IAAI;CACpC,MAAM,UAAU,UAAU,SAAS,gBAAgB;CACnD,MAAM,UAAU,UAAU,SAAS,gBAAgB;CACnD,MAAM,QAAQ,UAAU;EAAE,IAAI;EAAU,OAAO,KAAK;EAAO,KAAK,KAAK;CAAI;CACzE,IAAI,UAAU,CAAC;EAAE,MAAM;EAAM,MAAM,KAAK;CAAE,CAAC;CAC3C,IAAI,UAAU;CACd,MAAM,gBAAgB,CAAC;CACvB,KAAK,MAAM,aAAa,WAAW,SAAS,YAAY,GAAG;EACzD,IAAI,UAAU,SAAS,gBAAgB;GACrC,WAAW,KAAK;IACd,MAAM;IACN,MAAM;IACN,MAAM,KAAK,SAAS;IACpB,WAAW;IACX,SAAS,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;GACjD,CAAC;GACD;EACF;EACA,MAAM,MAAM,iBAAiB,SAAS;EACtC,IAAI,CAAC,KAAK;EACV,MAAM,WAAW,UAAU,WAAW,OAAO;EAC7C,MAAM,QAAQ,YAAY,SAAS,SAAS,2BAA2B,UAAU,UAAU,YAAY,IAAI;EAC3G,IAAI,SAAS,iBAAiB,mBAAmB,MAAM;GACrD,WAAW,KAAK;IACd,MAAM;IACN,MAAM;IACN,MAAM,KAAK,SAAS;IACpB,WAAW;IACX,SAAS,gBAAgB,GAAG,EAC1B,QAAQ,oBAAoB,IAAI,mCAClC,CAAC;GACH,CAAC;GACD;EACF;EACA,IAAI,SAAS,WAAW,QAAQ,QAAQ;GACtC,MAAM,OAAO,QAAQ,gBAAgB,OAAO,QAAQ,CAAC,CAAC,IAAI;GAC1D,IAAI,CAAC,MAAM;IACT,WAAW,KAAK;KACd,MAAM;KACN,MAAM;KACN,MAAM,KAAK,SAAS;KACpB,WAAW;KACX,SAAS,gBAAgB,GAAG,EAC1B,QAAQ,0BAA0B,OAAO,MAAM,UAAU,OAAO,UAAU,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE,gFAC7G,CAAC;IACH,CAAC;IACD;GACF;GACA,UAAU;GACV;EACF;EACA,IAAI,SAAS,WAAW,mBAAmB,MAAM;GAC/C,IAAI,CAAC,yBAAyB,IAAI,GAAG,GAAG;IACtC,WAAW,KAAK;KACd,MAAM;KACN,MAAM;KACN,MAAM,KAAK,SAAS;KACpB,WAAW;KACX,SAAS,gBAAgB,GAAG,EAC1B,QAAQ,cAAc,IAAI,qCAC5B,CAAC;IACH,CAAC;IACD;GACF;GACA,MAAM,WAAW,QAAQ,UAAU,KAAK,IAAI;GAC5C,IAAI,OAAO,aAAa,WAAW;IACjC,WAAW,KAAK;KACd,MAAM;KACN,MAAM;KACN,MAAM,KAAK,SAAS;KACpB,WAAW;KACX,SAAS,gBAAgB,GAAG,EAC1B,QAAQ,wBAAwB,IAAI,UACtC,CAAC;IACH,CAAC;IACD;GACF;GACA,IAAI,QAAQ,WAAW,UAAU;GACjC;EACF;EACA,IAAI,SAAS,SAAS;GACpB,WAAW,KAAK;IACd,MAAM;IACN,MAAM;IACN,MAAM,KAAK,SAAS;IACpB,WAAW;IACX,SAAS,gBAAgB,GAAG,EAC1B,QAAQ,sBAAsB,IAAI,4CAA4C,IAAI,+BACpF,CAAC;GACH,CAAC;GACD;EACF;EACA,MAAM,UAAU,QAAQ,UAAU,KAAK,IAAI,KAAK;EAChD,IAAI,OAAO,YAAY,YAAY,OAAO,YAAY,UAAU;GAC9D,WAAW,KAAK;IACd,MAAM;IACN,MAAM;IACN,MAAM,KAAK,SAAS;IACpB,WAAW;IACX,SAAS,gBAAgB,GAAG;KAC1B,MAAM;KACN,WAAW;KACX,QAAQ,QAAQ,mEAAmE;IACrF,CAAC;GACH,CAAC;GACD;EACF;EACA,cAAc,OAAO;CACvB;CACA,IAAI,CAAC,SAAS;EACZ,WAAW,KAAK;GACd,MAAM;GACN,MAAM;GACN,MAAM,KAAK,OAAO;GAClB,WAAW;GACX,SAAS,gBAAgB,GAAG,EAC1B,QAAQ,mBAAmB,KAAK,mCAClC,CAAC;EACH,CAAC;CACH;CACA,MAAM,SAAS,CAAC;CAChB,MAAM,oBAAoB;CAC1B,MAAM,eAAe,SAAS,iBAAiB,OAAO,KAAK,aAAa,CAAC,CAAC,SAAS,yBACjF,eACA,oBACC,UAAU,OAAO,KAAK,KAAK,CAC9B,IAAI;CACJ,KAAK,MAAM,SAAS,QAAQ;EAC1B,WAAW,KAAK;GACd,MAAM;GACN,MAAM;GACN,MAAM,KAAK,OAAO;GAClB,WAAW;GACX,SAAS,gBAAgB,GAAG;IAC1B,MAAM,MAAM;IACZ,WAAW;IACX,QAAQ,MAAM;GAChB,CAAC;EACH,CAAC;CACH;CACA,MAAM,YAAY,eAAe,qBAAqB,cAAc,iBAAiB,IAAI;CACzF,IAAI,WAAW,IAAI,IAAI,UAAU,YAAY,UAAU,MAAM,KAAK,EAAE,CAAC;CACrE,IAAI,WAAW,QAAQ,OAAO;EAAE,MAAM;EAAM;EAAY;CAAI;CAC5D,OAAO;EACL,MAAM;GACJ;GACA;GACA;GACA;GACA;GACA;GACA,OAAO,gBAAgB,YAAY;IACjC;IACA,iBAAiB,UAAU;GAC7B,IAAI;EACN;EACA;EACA;CACF;AACF;AACA,SAAS,iBAAiB,MAAM,OAAO,eAAe,QAAQ,IAAI;CAChE,MAAM,WAAW,iBAAiB,EAAE;CACpC,MAAM,WAAW,kBAAkB,OAAO,eAAe,MAAM;CAC/D,IAAI,SAAS,SAAS,oBAAoB;EACxC,OAAO;GACL,OAAO,CAAC;GACR,YAAY,CACV;IACE,MAAM;IACN,MAAM;IACN,MAAM;KAAE,IAAI;KAAU,OAAO,KAAK,QAAQ;KAAO,KAAK,KAAK,QAAQ;IAAI;IACvE,WAAW;IACX,SAAS,gBAAgB,GAAG,EAC1B,QAAQ,mCAAmC,SAAS,OAAO,yBAAyB,mBAAmB,eACzG,CAAC;GACH,CACF;EACF;CACF;CACA,MAAM,cAAc,KAAK,OAAO,mBAAmB;CACnD,MAAM,gBAAgB,SAAS,KAAK,YAAY;EAC9C,MAAM,OAAO;EACb,OAAO,KAAK,UACV;GACE,OAAO,QAAQ,mBAAmB,OAAO,MAAM,OAAO,OAAO,cAAc,IAAI;GAC/E;GACA;EACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK,CACxD;CACF,EAAE;CACF,MAAM,YAAY,KAAK,UAAU,wCAAwC;CACzE,MAAM,gBAAgB,SAAS,KAAK,WAAW;EAC7C,MAAM,QAAQ,OAAO,OAAO,OAAO;EACnC,MAAM,QAAQ,OAAO,SAAS,QAAQ,iBAAiB,MAAM,KAAK,IAAI;EACtE,OAAO;GACL,MAAM,OAAO;GACb,OAAO,QAAQ,UAAU,KAAK,UAAU,KAAK,EAAE,GAAG,UAAU,KAAK,IAAI,UAAU;EACjF;CACF,CAAC;CACD,MAAM,YAAY,aAAa,aAAa;CAC5C,MAAM,QAAQ,aAAa,aAAa;CACxC,MAAM,iBAAiB,UAAU,WAAW,IAAG,IAAI,aAAa,cAAc,cAAc,UAAU;CACtG,MAAM,QAAQ,CACZ;EACE,OAAO,KAAK,QAAQ;EACpB,KAAK,KAAK,QAAQ;EAClB,SAAS,SAAS,eAAe,UAAU,MAAM;EACjD,QAAQ;GAAE,IAAI;GAAU,OAAO,KAAK,QAAQ;GAAO,KAAK,KAAK,QAAQ;EAAI;CAC3E,CACF;CACA,IAAI,KAAK,SAAS;EAChB,MAAM,KAAK;GACT,OAAO,KAAK,QAAQ;GACpB,KAAK,KAAK,QAAQ;GAClB,SAAS;GACT,QAAQ;IAAE,IAAI;IAAU,OAAO,KAAK,QAAQ;IAAO,KAAK,KAAK,QAAQ;GAAI;EAC3E,CAAC;CACH;CACA,OAAO;EAAE;EAAO,YAAY,CAAC;CAAE;AACjC"}
@@ -0,0 +1,182 @@
1
+ import { applyLoweredModule, childNode, childNodes, parseModuleAst, planZeroErasure, resolvedModuleId, walkAst, zeroIslandThemeMessage, zeroViolationsFromPlan } from "@tamagui/compiler-core";
2
+ import { createHash } from "node:crypto";
3
+ import path from "node:path";
4
+ import { foldBranches, lowerStaticTheme, readStaticTheme, resolveThemeChain } from "./theme.mjs";
5
+
6
+ function identifierNameOf(node) {
7
+ return node && node.type === "Identifier" && typeof node.name === "string" ? node.name : null;
8
+ }
9
+ function jsxNameOf(element) {
10
+ const opening = childNode(element, "openingElement");
11
+ if (!opening) return null;
12
+ const name = childNode(opening, "name");
13
+ return name && name.type === "JSXIdentifier" && typeof name.name === "string" ? name.name : null;
14
+ }
15
+ function transformZeroModule(input) {
16
+ const { id, source, config } = input;
17
+ const moduleId = resolvedModuleId(id);
18
+ const program = parseModuleAst(source, id);
19
+ const violations = zeroViolationsFromPlan(input.plan);
20
+ const edits = [];
21
+ const bridges = /* @__PURE__ */ new Map();
22
+ const bridgeCSS = /* @__PURE__ */ new Map();
23
+ let themeLocal = null;
24
+ let themeUpdateLocal = null;
25
+ const islandLocals = /* @__PURE__ */ new Map();
26
+ for (const statement of childNodes(program, "body")) {
27
+ if (statement.type !== "ImportDeclaration") continue;
28
+ const sourceNode = childNode(statement, "source");
29
+ const specifier = sourceNode && typeof sourceNode.value === "string" ? sourceNode.value : null;
30
+ if (!specifier) continue;
31
+ const island = input.resolveIslandLoader(specifier);
32
+ for (const importSpecifier of childNodes(statement, "specifiers")) {
33
+ const local = identifierNameOf(childNode(importSpecifier, "local"));
34
+ if (!local) continue;
35
+ if (island) {
36
+ islandLocals.set(local, island.islandId);
37
+ continue;
38
+ }
39
+ if (!input.isTamaguiSpecifier(specifier)) continue;
40
+ const imported = childNode(importSpecifier, "imported");
41
+ if (imported && imported.name === "Theme") themeLocal = local;
42
+ if (imported && imported.name === "ThemeUpdate") themeUpdateLocal = local;
43
+ }
44
+ }
45
+ const parents = /* @__PURE__ */ new Map();
46
+ const elements = [];
47
+ walkAst(program, (node, parent) => {
48
+ if (parent) parents.set(node, parent);
49
+ if (node.type === "JSXElement") elements.push(node);
50
+ });
51
+ const themeElements = elements.filter((element) => {
52
+ const name = jsxNameOf(element);
53
+ return name === themeLocal || name === themeUpdateLocal;
54
+ });
55
+ const themeNodes = /* @__PURE__ */ new Map();
56
+ for (const element of themeElements) {
57
+ const read = readStaticTheme(element, id, source, config, jsxNameOf(element) === themeUpdateLocal ? "ThemeUpdate" : "Theme");
58
+ for (const [identifier, rules] of read.css) bridgeCSS.set(identifier, rules);
59
+ violations.push(...read.violations);
60
+ if (read.node) themeNodes.set(element, read.node);
61
+ }
62
+ const themeChainOf = (element) => {
63
+ const chain = [];
64
+ let cursor = element;
65
+ while (cursor) {
66
+ const node = themeNodes.get(cursor);
67
+ if (node) chain.unshift(node);
68
+ cursor = parents.get(cursor);
69
+ }
70
+ return chain;
71
+ };
72
+ const rootThemeName = Object.keys(config.themes)[0] ?? "light";
73
+ for (const element of themeElements) {
74
+ const node = themeNodes.get(element);
75
+ if (!node) continue;
76
+ const lowered = lowerStaticTheme(node, themeChainOf(element), rootThemeName, config, id);
77
+ violations.push(...lowered.violations);
78
+ edits.push(...lowered.edits);
79
+ }
80
+ const mounts = elements.filter((element) => {
81
+ const name = jsxNameOf(element);
82
+ return !!name && islandLocals.has(name);
83
+ }).sort((left, right) => left.start - right.start);
84
+ const moduleBridgePrefix = createHash("sha256").update(path.relative(input.root, id).replace(/\\/g, "/")).digest("hex").slice(0, 8);
85
+ const loweredRanges = input.plan.edits.filter((edit) => edit.end > edit.start);
86
+ const isOpaqueAncestor = (element) => {
87
+ if (themeNodes.has(element)) return false;
88
+ const name = jsxNameOf(element);
89
+ if (!name || islandLocals.has(name)) return false;
90
+ if (name[0] !== name[0].toUpperCase()) return false;
91
+ const nameNode = childNode(childNode(element, "openingElement"), "name");
92
+ return !loweredRanges.some((edit) => edit.start <= nameNode.start && edit.end >= nameNode.end);
93
+ };
94
+ mounts.forEach((element, index) => {
95
+ const islandId = islandLocals.get(jsxNameOf(element));
96
+ let opaque = null;
97
+ for (let cursor = parents.get(element); cursor; cursor = parents.get(cursor)) {
98
+ if (cursor.type === "JSXElement" && isOpaqueAncestor(cursor)) opaque = cursor;
99
+ }
100
+ if (opaque) {
101
+ violations.push({
102
+ rule: 4,
103
+ code: "local/unsupported-target",
104
+ span: {
105
+ id: moduleId,
106
+ start: element.start,
107
+ end: element.end
108
+ },
109
+ component: islandId,
110
+ message: zeroIslandThemeMessage(islandId)
111
+ });
112
+ return;
113
+ }
114
+ const chain = themeChainOf(element);
115
+ const layers = chain.map((node) => node.layer).filter((layer) => !!layer);
116
+ const branches = resolveThemeChain(chain, rootThemeName, config);
117
+ const descriptors = branches.map((branch, branchIndex) => ({
118
+ test: branch.test,
119
+ bridge: {
120
+ id: branches.length === 1 ? `b${moduleBridgePrefix}_${index}` : `b${moduleBridgePrefix}_${index}_${branchIndex}`,
121
+ name: branch.name,
122
+ layers
123
+ }
124
+ }));
125
+ const list = bridges.get(islandId) ?? [];
126
+ for (const descriptor of descriptors) list.push(descriptor.bridge);
127
+ bridges.set(islandId, list);
128
+ const fold = (value) => foldBranches(descriptors.map((descriptor) => ({
129
+ test: descriptor.test,
130
+ value: value(descriptor.bridge)
131
+ })));
132
+ const opening = childNode(element, "openingElement");
133
+ const nameNode = childNode(opening, "name");
134
+ edits.push({
135
+ start: nameNode.end,
136
+ end: nameNode.end,
137
+ content: ` data-tamagui-bridge={${fold((bridge) => JSON.stringify(bridge.id))}} __tamaguiBridge={${fold((bridge) => JSON.stringify(bridge))}}`,
138
+ origin: {
139
+ id: moduleId,
140
+ start: nameNode.start,
141
+ end: nameNode.end
142
+ }
143
+ });
144
+ });
145
+ const erasure = violations.length ? null : planZeroErasure({
146
+ id: moduleId,
147
+ source,
148
+ loweredEdits: [...input.plan.edits, ...edits],
149
+ isTamaguiSpecifier: input.isTamaguiSpecifier,
150
+ islandIdFor: input.resolveIslandModule
151
+ });
152
+ if (erasure) {
153
+ edits.push(...erasure.edits);
154
+ violations.push(...erasure.violations);
155
+ }
156
+ const output = input.mode === "report" ? applyLoweredModule(source, moduleId, input.plan) : violations.length ? {
157
+ changed: false,
158
+ code: source,
159
+ map: null
160
+ } : applyLoweredModule(source, moduleId, {
161
+ id: moduleId,
162
+ sourceHash: input.plan.sourceHash,
163
+ edits: [...input.plan.edits, ...edits]
164
+ });
165
+ return {
166
+ output,
167
+ edits: input.mode === "report" ? [] : edits,
168
+ bridges: input.mode === "report" ? /* @__PURE__ */ new Map() : bridges,
169
+ bridgeCSS: input.mode === "report" ? /* @__PURE__ */ new Map() : bridgeCSS,
170
+ violations,
171
+ erased: {
172
+ modules: erasure?.removedModules ?? [],
173
+ bindings: erasure?.removedBindings ?? [],
174
+ styledDefinitions: erasure?.erasedStyledDefinitions ?? [],
175
+ exports: erasure?.erasedExports ?? []
176
+ },
177
+ rewrittenAnimatedNumberHooks: erasure?.rewrittenAnimatedNumberHooks ?? []
178
+ };
179
+ }
180
+
181
+ export { transformZeroModule };
182
+ //# sourceMappingURL=transform.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","names":[],"sources":["esm/zero/transform.js"],"sourcesContent":["import {\n applyLoweredModule,\n childNode,\n childNodes,\n parseModuleAst,\n planZeroErasure,\n resolvedModuleId,\n walkAst,\n zeroIslandThemeMessage,\n zeroViolationsFromPlan\n} from \"@tamagui/compiler-core\";\nimport { createHash } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n foldBranches,\n lowerStaticTheme,\n readStaticTheme,\n resolveThemeChain\n} from \"./theme\";\nfunction identifierNameOf(node) {\n return node && node.type === \"Identifier\" && typeof node.name === \"string\" ? node.name : null;\n}\nfunction jsxNameOf(element) {\n const opening = childNode(element, \"openingElement\");\n if (!opening) return null;\n const name = childNode(opening, \"name\");\n return name && name.type === \"JSXIdentifier\" && typeof name.name === \"string\" ? name.name : null;\n}\nfunction transformZeroModule(input) {\n const { id, source, config } = input;\n const moduleId = resolvedModuleId(id);\n const program = parseModuleAst(source, id);\n const violations = zeroViolationsFromPlan(input.plan);\n const edits = [];\n const bridges = /* @__PURE__ */ new Map();\n const bridgeCSS = /* @__PURE__ */ new Map();\n let themeLocal = null;\n let themeUpdateLocal = null;\n const islandLocals = /* @__PURE__ */ new Map();\n for (const statement of childNodes(program, \"body\")) {\n if (statement.type !== \"ImportDeclaration\") continue;\n const sourceNode = childNode(statement, \"source\");\n const specifier = sourceNode && typeof sourceNode.value === \"string\" ? sourceNode.value : null;\n if (!specifier) continue;\n const island = input.resolveIslandLoader(specifier);\n for (const importSpecifier of childNodes(statement, \"specifiers\")) {\n const local = identifierNameOf(childNode(importSpecifier, \"local\"));\n if (!local) continue;\n if (island) {\n islandLocals.set(local, island.islandId);\n continue;\n }\n if (!input.isTamaguiSpecifier(specifier)) continue;\n const imported = childNode(importSpecifier, \"imported\");\n if (imported && imported.name === \"Theme\") themeLocal = local;\n if (imported && imported.name === \"ThemeUpdate\") themeUpdateLocal = local;\n }\n }\n const parents = /* @__PURE__ */ new Map();\n const elements = [];\n walkAst(program, (node, parent) => {\n if (parent) parents.set(node, parent);\n if (node.type === \"JSXElement\") elements.push(node);\n });\n const themeElements = elements.filter((element) => {\n const name = jsxNameOf(element);\n return name === themeLocal || name === themeUpdateLocal;\n });\n const themeNodes = /* @__PURE__ */ new Map();\n for (const element of themeElements) {\n const read = readStaticTheme(\n element,\n id,\n source,\n config,\n jsxNameOf(element) === themeUpdateLocal ? \"ThemeUpdate\" : \"Theme\"\n );\n for (const [identifier, rules] of read.css) bridgeCSS.set(identifier, rules);\n violations.push(...read.violations);\n if (read.node) themeNodes.set(element, read.node);\n }\n const themeChainOf = (element) => {\n const chain = [];\n let cursor = element;\n while (cursor) {\n const node = themeNodes.get(cursor);\n if (node) chain.unshift(node);\n cursor = parents.get(cursor);\n }\n return chain;\n };\n const rootThemeName = Object.keys(config.themes)[0] ?? \"light\";\n for (const element of themeElements) {\n const node = themeNodes.get(element);\n if (!node) continue;\n const lowered = lowerStaticTheme(\n node,\n themeChainOf(element),\n rootThemeName,\n config,\n id\n );\n violations.push(...lowered.violations);\n edits.push(...lowered.edits);\n }\n const mounts = elements.filter((element) => {\n const name = jsxNameOf(element);\n return !!name && islandLocals.has(name);\n }).sort((left, right) => left.start - right.start);\n const moduleBridgePrefix = createHash(\"sha256\").update(path.relative(input.root, id).replace(/\\\\/g, \"/\")).digest(\"hex\").slice(0, 8);\n const loweredRanges = input.plan.edits.filter((edit) => edit.end > edit.start);\n const isOpaqueAncestor = (element) => {\n if (themeNodes.has(element)) return false;\n const name = jsxNameOf(element);\n if (!name || islandLocals.has(name)) return false;\n if (name[0] !== name[0].toUpperCase()) return false;\n const nameNode = childNode(childNode(element, \"openingElement\"), \"name\");\n return !loweredRanges.some(\n (edit) => edit.start <= nameNode.start && edit.end >= nameNode.end\n );\n };\n mounts.forEach((element, index) => {\n const islandId = islandLocals.get(jsxNameOf(element));\n let opaque = null;\n for (let cursor = parents.get(element); cursor; cursor = parents.get(cursor)) {\n if (cursor.type === \"JSXElement\" && isOpaqueAncestor(cursor)) opaque = cursor;\n }\n if (opaque) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: { id: moduleId, start: element.start, end: element.end },\n component: islandId,\n message: zeroIslandThemeMessage(islandId)\n });\n return;\n }\n const chain = themeChainOf(element);\n const layers = chain.map((node) => node.layer).filter((layer) => !!layer);\n const branches = resolveThemeChain(chain, rootThemeName, config);\n const descriptors = branches.map((branch, branchIndex) => ({\n test: branch.test,\n bridge: {\n // unique across modules and stable across the server and client\n // compilations of the same entry, because both see the same module path\n id: branches.length === 1 ? `b${moduleBridgePrefix}_${index}` : `b${moduleBridgePrefix}_${index}_${branchIndex}`,\n name: branch.name,\n layers\n }\n }));\n const list = bridges.get(islandId) ?? [];\n for (const descriptor of descriptors) list.push(descriptor.bridge);\n bridges.set(islandId, list);\n const fold = (value) => foldBranches(\n descriptors.map((descriptor) => ({\n test: descriptor.test,\n value: value(descriptor.bridge)\n }))\n );\n const opening = childNode(element, \"openingElement\");\n const nameNode = childNode(opening, \"name\");\n edits.push({\n start: nameNode.end,\n end: nameNode.end,\n content: ` data-tamagui-bridge={${fold(\n (bridge) => JSON.stringify(bridge.id)\n )}} __tamaguiBridge={${fold((bridge) => JSON.stringify(bridge))}}`,\n origin: { id: moduleId, start: nameNode.start, end: nameNode.end }\n });\n });\n const erasure = violations.length ? null : planZeroErasure({\n id: moduleId,\n source,\n loweredEdits: [...input.plan.edits, ...edits],\n isTamaguiSpecifier: input.isTamaguiSpecifier,\n islandIdFor: input.resolveIslandModule\n });\n if (erasure) {\n edits.push(...erasure.edits);\n violations.push(...erasure.violations);\n }\n const output = input.mode === \"report\" ? applyLoweredModule(source, moduleId, input.plan) : violations.length ? { changed: false, code: source, map: null } : applyLoweredModule(source, moduleId, {\n id: moduleId,\n sourceHash: input.plan.sourceHash,\n edits: [...input.plan.edits, ...edits]\n });\n return {\n output,\n edits: input.mode === \"report\" ? [] : edits,\n bridges: input.mode === \"report\" ? /* @__PURE__ */ new Map() : bridges,\n bridgeCSS: input.mode === \"report\" ? /* @__PURE__ */ new Map() : bridgeCSS,\n violations,\n erased: {\n modules: erasure?.removedModules ?? [],\n bindings: erasure?.removedBindings ?? [],\n styledDefinitions: erasure?.erasedStyledDefinitions ?? [],\n exports: erasure?.erasedExports ?? []\n },\n rewrittenAnimatedNumberHooks: erasure?.rewrittenAnimatedNumberHooks ?? []\n };\n}\nexport {\n transformZeroModule\n};\n//# sourceMappingURL=transform.js.map\n"],"mappings":"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"}