zyzz 0.0.28 → 0.0.30

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 (302) hide show
  1. package/binding/wasi/wasi-worker.mjs +186 -0
  2. package/binding/wasi/zyzz.wasi.cjs +2302 -0
  3. package/binding/wasi/zyzz.wasm32-wasi.wasm +0 -0
  4. package/binding/zyzz.linux-x64-gnu.node +0 -0
  5. package/dist/babel/index.d.ts.map +1 -1
  6. package/dist/babel/index.js +2 -4
  7. package/dist/babel/index.js.map +1 -1
  8. package/dist/babel/internal/Compilation.d.ts +0 -1
  9. package/dist/babel/internal/Compilation.d.ts.map +1 -1
  10. package/dist/compiler/Graph.d.ts +14 -11
  11. package/dist/compiler/Graph.d.ts.map +1 -1
  12. package/dist/compiler/Graph.js +57 -1442
  13. package/dist/compiler/Graph.js.map +1 -1
  14. package/dist/compiler/Native.d.ts +7 -9
  15. package/dist/compiler/Native.d.ts.map +1 -1
  16. package/dist/compiler/Native.js +12 -716
  17. package/dist/compiler/Native.js.map +1 -1
  18. package/dist/compiler/Source.d.ts +122 -24
  19. package/dist/compiler/Source.d.ts.map +1 -1
  20. package/dist/compiler/Source.js +10 -1267
  21. package/dist/compiler/Source.js.map +1 -1
  22. package/dist/compiler/Transform.d.ts +4 -3
  23. package/dist/compiler/Transform.d.ts.map +1 -1
  24. package/dist/compiler/Transform.js +13 -961
  25. package/dist/compiler/Transform.js.map +1 -1
  26. package/dist/compiler/internal/AtRules.d.ts +5 -1
  27. package/dist/compiler/internal/AtRules.d.ts.map +1 -1
  28. package/dist/compiler/internal/AtRules.js +12 -106
  29. package/dist/compiler/internal/AtRules.js.map +1 -1
  30. package/dist/compiler/internal/Context.d.ts +11 -0
  31. package/dist/compiler/internal/Context.d.ts.map +1 -0
  32. package/dist/compiler/internal/Context.js +11 -0
  33. package/dist/compiler/internal/Context.js.map +1 -0
  34. package/dist/compiler/internal/Results.d.ts +148 -0
  35. package/dist/compiler/internal/Results.d.ts.map +1 -0
  36. package/dist/compiler/internal/Results.js +259 -0
  37. package/dist/compiler/internal/Results.js.map +1 -0
  38. package/dist/compiler/internal/Syntax.d.ts +0 -2
  39. package/dist/compiler/internal/Syntax.d.ts.map +1 -1
  40. package/dist/compiler/internal/Syntax.js +0 -2
  41. package/dist/compiler/internal/Syntax.js.map +1 -1
  42. package/dist/compiler/internal/Wire.d.ts +17 -0
  43. package/dist/compiler/internal/Wire.d.ts.map +1 -0
  44. package/dist/compiler/internal/Wire.js +795 -0
  45. package/dist/compiler/internal/Wire.js.map +1 -0
  46. package/dist/internal/Addon.d.ts +28 -0
  47. package/dist/internal/Addon.d.ts.map +1 -0
  48. package/dist/internal/Addon.js +87 -0
  49. package/dist/internal/Addon.js.map +1 -0
  50. package/dist/internal/Literal.d.ts +4 -1
  51. package/dist/internal/Literal.d.ts.map +1 -1
  52. package/dist/internal/Literal.js +4 -2
  53. package/dist/internal/Literal.js.map +1 -1
  54. package/dist/internal/Token.d.ts +2 -1
  55. package/dist/internal/Token.d.ts.map +1 -1
  56. package/dist/internal/Token.js +2 -2
  57. package/dist/internal/Token.js.map +1 -1
  58. package/dist/internal/Vlq.d.ts +14 -0
  59. package/dist/internal/Vlq.d.ts.map +1 -0
  60. package/dist/internal/Vlq.js +47 -0
  61. package/dist/internal/Vlq.js.map +1 -0
  62. package/dist/internal/Wasm.d.ts +22 -0
  63. package/dist/internal/Wasm.d.ts.map +1 -0
  64. package/dist/internal/Wasm.js +83 -0
  65. package/dist/internal/Wasm.js.map +1 -0
  66. package/dist/metro/Graph.d.ts +0 -1
  67. package/dist/metro/Graph.d.ts.map +1 -1
  68. package/dist/metro/transformer.d.ts.map +1 -1
  69. package/dist/metro/transformer.js +0 -1
  70. package/dist/metro/transformer.js.map +1 -1
  71. package/dist/next/internal/Project.d.ts.map +1 -1
  72. package/dist/next/internal/Project.js +2 -5
  73. package/dist/next/internal/Project.js.map +1 -1
  74. package/dist/node/Host.d.ts.map +1 -1
  75. package/dist/node/Host.js +0 -2
  76. package/dist/node/Host.js.map +1 -1
  77. package/dist/node/internal/Contracts.d.ts.map +1 -1
  78. package/dist/node/internal/Contracts.js +3 -7
  79. package/dist/node/internal/Contracts.js.map +1 -1
  80. package/dist/node/internal/Snapshot.d.ts +0 -1
  81. package/dist/node/internal/Snapshot.d.ts.map +1 -1
  82. package/dist/node/internal/Snapshot.js +0 -6
  83. package/dist/node/internal/Snapshot.js.map +1 -1
  84. package/dist/runtime/Composition.d.ts +2 -3
  85. package/dist/runtime/Composition.d.ts.map +1 -1
  86. package/dist/runtime/Composition.js +51 -30
  87. package/dist/runtime/Composition.js.map +1 -1
  88. package/dist/runtime/Recipe.d.ts.map +1 -1
  89. package/dist/runtime/Recipe.js +16 -12
  90. package/dist/runtime/Recipe.js.map +1 -1
  91. package/dist/unplugin/index.d.ts.map +1 -1
  92. package/dist/unplugin/index.js +3 -6
  93. package/dist/unplugin/index.js.map +1 -1
  94. package/dist/vite/index.d.ts.map +1 -1
  95. package/dist/vite/index.js +696 -201
  96. package/dist/vite/index.js.map +1 -1
  97. package/dist/web/Css.d.ts +8 -3
  98. package/dist/web/Css.d.ts.map +1 -1
  99. package/dist/web/Css.js +5 -721
  100. package/dist/web/Css.js.map +1 -1
  101. package/dist/web/internal/Block.d.ts +0 -2
  102. package/dist/web/internal/Block.d.ts.map +1 -1
  103. package/dist/web/internal/Block.js +1 -12
  104. package/dist/web/internal/Block.js.map +1 -1
  105. package/dist/web/internal/ClassName.d.ts +23 -18
  106. package/dist/web/internal/ClassName.d.ts.map +1 -1
  107. package/dist/web/internal/ClassName.js +26 -55
  108. package/dist/web/internal/ClassName.js.map +1 -1
  109. package/dist/web/internal/Contributions.d.ts +3 -5
  110. package/dist/web/internal/Contributions.d.ts.map +1 -1
  111. package/dist/web/internal/Contributions.js +0 -45
  112. package/dist/web/internal/Contributions.js.map +1 -1
  113. package/dist/web/internal/Engine.browser.d.ts +8 -0
  114. package/dist/web/internal/Engine.browser.d.ts.map +1 -0
  115. package/dist/web/internal/Engine.browser.js +42 -0
  116. package/dist/web/internal/Engine.browser.js.map +1 -0
  117. package/dist/web/internal/Engine.d.ts +9 -0
  118. package/dist/web/internal/Engine.d.ts.map +1 -0
  119. package/dist/web/internal/Engine.js +14 -0
  120. package/dist/web/internal/Engine.js.map +1 -0
  121. package/dist/web/internal/Themes.d.ts +1 -9
  122. package/dist/web/internal/Themes.d.ts.map +1 -1
  123. package/dist/web/internal/Themes.js +3 -221
  124. package/dist/web/internal/Themes.js.map +1 -1
  125. package/dist/web/internal/Wasm.generated.d.ts +4 -0
  126. package/dist/web/internal/Wasm.generated.d.ts.map +1 -0
  127. package/dist/web/internal/Wasm.generated.js +4 -0
  128. package/dist/web/internal/Wasm.generated.js.map +1 -0
  129. package/dist/web/internal/Wire.d.ts +19 -0
  130. package/dist/web/internal/Wire.d.ts.map +1 -0
  131. package/dist/web/internal/Wire.js +387 -0
  132. package/dist/web/internal/Wire.js.map +1 -0
  133. package/package.json +20 -1
  134. package/src/babel/index.ts +2 -5
  135. package/src/babel/internal/Compilation.ts +0 -1
  136. package/src/compiler/Graph.ts +89 -1930
  137. package/src/compiler/Native.ts +18 -871
  138. package/src/compiler/Source.ts +144 -1803
  139. package/src/compiler/Transform.ts +16 -1315
  140. package/src/compiler/internal/AtRules.ts +27 -115
  141. package/src/compiler/internal/Context.ts +11 -0
  142. package/src/compiler/internal/Results.ts +406 -0
  143. package/src/compiler/internal/Syntax.ts +0 -3
  144. package/src/compiler/internal/Wire.ts +1045 -0
  145. package/src/internal/Addon.ts +118 -0
  146. package/src/internal/Literal.ts +4 -2
  147. package/src/internal/Token.ts +2 -2
  148. package/src/internal/Vlq.ts +59 -0
  149. package/src/internal/Wasm.ts +111 -0
  150. package/src/metro/transformer.ts +0 -1
  151. package/src/next/internal/Project.ts +2 -9
  152. package/src/node/Host.ts +0 -2
  153. package/src/node/internal/Contracts.ts +3 -7
  154. package/src/node/internal/Snapshot.ts +0 -8
  155. package/src/runtime/Composition.ts +48 -25
  156. package/src/runtime/Recipe.ts +21 -14
  157. package/src/unplugin/index.ts +6 -6
  158. package/src/vite/index.ts +922 -221
  159. package/src/web/Css.ts +12 -908
  160. package/src/web/internal/Block.ts +0 -14
  161. package/src/web/internal/ClassName.ts +52 -85
  162. package/src/web/internal/Contributions.ts +3 -59
  163. package/src/web/internal/Engine.browser.ts +51 -0
  164. package/src/web/internal/Engine.ts +17 -0
  165. package/src/web/internal/Themes.ts +3 -279
  166. package/src/web/internal/Wasm.generated.ts +3 -0
  167. package/src/web/internal/Wire.ts +466 -0
  168. package/src/web/internal/wasm.d.ts +9 -0
  169. package/dist/compiler/internal/Applications.d.ts +0 -55
  170. package/dist/compiler/internal/Applications.d.ts.map +0 -1
  171. package/dist/compiler/internal/Applications.js +0 -393
  172. package/dist/compiler/internal/Applications.js.map +0 -1
  173. package/dist/compiler/internal/ColorProfiles.d.ts +0 -3
  174. package/dist/compiler/internal/ColorProfiles.d.ts.map +0 -1
  175. package/dist/compiler/internal/ColorProfiles.js +0 -84
  176. package/dist/compiler/internal/ColorProfiles.js.map +0 -1
  177. package/dist/compiler/internal/CompositionBindings.d.ts +0 -16
  178. package/dist/compiler/internal/CompositionBindings.d.ts.map +0 -1
  179. package/dist/compiler/internal/CompositionBindings.js +0 -89
  180. package/dist/compiler/internal/CompositionBindings.js.map +0 -1
  181. package/dist/compiler/internal/Compositions.d.ts +0 -37
  182. package/dist/compiler/internal/Compositions.d.ts.map +0 -1
  183. package/dist/compiler/internal/Compositions.js +0 -494
  184. package/dist/compiler/internal/Compositions.js.map +0 -1
  185. package/dist/compiler/internal/Configurations.d.ts +0 -26
  186. package/dist/compiler/internal/Configurations.d.ts.map +0 -1
  187. package/dist/compiler/internal/Configurations.js +0 -259
  188. package/dist/compiler/internal/Configurations.js.map +0 -1
  189. package/dist/compiler/internal/Contract.d.ts +0 -30
  190. package/dist/compiler/internal/Contract.d.ts.map +0 -1
  191. package/dist/compiler/internal/Contract.js +0 -753
  192. package/dist/compiler/internal/Contract.js.map +0 -1
  193. package/dist/compiler/internal/Contributions.d.ts +0 -54
  194. package/dist/compiler/internal/Contributions.d.ts.map +0 -1
  195. package/dist/compiler/internal/Contributions.js +0 -1151
  196. package/dist/compiler/internal/Contributions.js.map +0 -1
  197. package/dist/compiler/internal/Descriptors.d.ts +0 -15
  198. package/dist/compiler/internal/Descriptors.d.ts.map +0 -1
  199. package/dist/compiler/internal/Descriptors.js +0 -192
  200. package/dist/compiler/internal/Descriptors.js.map +0 -1
  201. package/dist/compiler/internal/Dynamic.d.ts +0 -14
  202. package/dist/compiler/internal/Dynamic.d.ts.map +0 -1
  203. package/dist/compiler/internal/Dynamic.js +0 -175
  204. package/dist/compiler/internal/Dynamic.js.map +0 -1
  205. package/dist/compiler/internal/Expression.d.ts +0 -19
  206. package/dist/compiler/internal/Expression.d.ts.map +0 -1
  207. package/dist/compiler/internal/Expression.js +0 -164
  208. package/dist/compiler/internal/Expression.js.map +0 -1
  209. package/dist/compiler/internal/Functions.d.ts +0 -5
  210. package/dist/compiler/internal/Functions.d.ts.map +0 -1
  211. package/dist/compiler/internal/Functions.js +0 -191
  212. package/dist/compiler/internal/Functions.js.map +0 -1
  213. package/dist/compiler/internal/Keyframes.d.ts +0 -5
  214. package/dist/compiler/internal/Keyframes.d.ts.map +0 -1
  215. package/dist/compiler/internal/Keyframes.js +0 -51
  216. package/dist/compiler/internal/Keyframes.js.map +0 -1
  217. package/dist/compiler/internal/Names.d.ts +0 -5
  218. package/dist/compiler/internal/Names.d.ts.map +0 -1
  219. package/dist/compiler/internal/Names.js +0 -37
  220. package/dist/compiler/internal/Names.js.map +0 -1
  221. package/dist/compiler/internal/NativeBindings.d.ts +0 -72
  222. package/dist/compiler/internal/NativeBindings.d.ts.map +0 -1
  223. package/dist/compiler/internal/NativeBindings.js +0 -171
  224. package/dist/compiler/internal/NativeBindings.js.map +0 -1
  225. package/dist/compiler/internal/NativeMedia.d.ts +0 -14
  226. package/dist/compiler/internal/NativeMedia.d.ts.map +0 -1
  227. package/dist/compiler/internal/NativeMedia.js +0 -287
  228. package/dist/compiler/internal/NativeMedia.js.map +0 -1
  229. package/dist/compiler/internal/NativeVars.d.ts +0 -28
  230. package/dist/compiler/internal/NativeVars.d.ts.map +0 -1
  231. package/dist/compiler/internal/NativeVars.js +0 -160
  232. package/dist/compiler/internal/NativeVars.js.map +0 -1
  233. package/dist/compiler/internal/PackedStyles.d.ts +0 -37
  234. package/dist/compiler/internal/PackedStyles.d.ts.map +0 -1
  235. package/dist/compiler/internal/PackedStyles.js +0 -344
  236. package/dist/compiler/internal/PackedStyles.js.map +0 -1
  237. package/dist/compiler/internal/Properties.d.ts +0 -5
  238. package/dist/compiler/internal/Properties.d.ts.map +0 -1
  239. package/dist/compiler/internal/Properties.js +0 -82
  240. package/dist/compiler/internal/Properties.js.map +0 -1
  241. package/dist/compiler/internal/RecipeConditions.d.ts +0 -41
  242. package/dist/compiler/internal/RecipeConditions.d.ts.map +0 -1
  243. package/dist/compiler/internal/RecipeConditions.js +0 -82
  244. package/dist/compiler/internal/RecipeConditions.js.map +0 -1
  245. package/dist/compiler/internal/RecipePayloads.d.ts +0 -31
  246. package/dist/compiler/internal/RecipePayloads.d.ts.map +0 -1
  247. package/dist/compiler/internal/RecipePayloads.js +0 -99
  248. package/dist/compiler/internal/RecipePayloads.js.map +0 -1
  249. package/dist/compiler/internal/Recipes.d.ts +0 -32
  250. package/dist/compiler/internal/Recipes.d.ts.map +0 -1
  251. package/dist/compiler/internal/Recipes.js +0 -339
  252. package/dist/compiler/internal/Recipes.js.map +0 -1
  253. package/dist/compiler/internal/Selectors.d.ts +0 -13
  254. package/dist/compiler/internal/Selectors.d.ts.map +0 -1
  255. package/dist/compiler/internal/Selectors.js +0 -280
  256. package/dist/compiler/internal/Selectors.js.map +0 -1
  257. package/dist/compiler/internal/Static.d.ts +0 -39
  258. package/dist/compiler/internal/Static.d.ts.map +0 -1
  259. package/dist/compiler/internal/Static.js +0 -534
  260. package/dist/compiler/internal/Static.js.map +0 -1
  261. package/dist/compiler/internal/Themes.d.ts +0 -190
  262. package/dist/compiler/internal/Themes.d.ts.map +0 -1
  263. package/dist/compiler/internal/Themes.js +0 -1577
  264. package/dist/compiler/internal/Themes.js.map +0 -1
  265. package/dist/compiler/internal/Vars.d.ts +0 -33
  266. package/dist/compiler/internal/Vars.d.ts.map +0 -1
  267. package/dist/compiler/internal/Vars.js +0 -387
  268. package/dist/compiler/internal/Vars.js.map +0 -1
  269. package/dist/compiler/internal/ViewTransitions.d.ts +0 -3
  270. package/dist/compiler/internal/ViewTransitions.d.ts.map +0 -1
  271. package/dist/compiler/internal/ViewTransitions.js +0 -68
  272. package/dist/compiler/internal/ViewTransitions.js.map +0 -1
  273. package/dist/internal/Cascade.d.ts +0 -74
  274. package/dist/internal/Cascade.d.ts.map +0 -1
  275. package/dist/internal/Cascade.js +0 -210
  276. package/dist/internal/Cascade.js.map +0 -1
  277. package/src/compiler/internal/Applications.ts +0 -610
  278. package/src/compiler/internal/ColorProfiles.ts +0 -93
  279. package/src/compiler/internal/CompositionBindings.ts +0 -120
  280. package/src/compiler/internal/Compositions.ts +0 -678
  281. package/src/compiler/internal/Configurations.ts +0 -349
  282. package/src/compiler/internal/Contract.ts +0 -1028
  283. package/src/compiler/internal/Contributions.ts +0 -1561
  284. package/src/compiler/internal/Descriptors.ts +0 -242
  285. package/src/compiler/internal/Dynamic.ts +0 -275
  286. package/src/compiler/internal/Expression.ts +0 -218
  287. package/src/compiler/internal/Functions.ts +0 -206
  288. package/src/compiler/internal/Keyframes.ts +0 -62
  289. package/src/compiler/internal/Names.ts +0 -48
  290. package/src/compiler/internal/NativeBindings.ts +0 -235
  291. package/src/compiler/internal/NativeMedia.ts +0 -342
  292. package/src/compiler/internal/NativeVars.ts +0 -231
  293. package/src/compiler/internal/PackedStyles.ts +0 -473
  294. package/src/compiler/internal/Properties.ts +0 -121
  295. package/src/compiler/internal/RecipeConditions.ts +0 -139
  296. package/src/compiler/internal/RecipePayloads.ts +0 -132
  297. package/src/compiler/internal/Recipes.ts +0 -531
  298. package/src/compiler/internal/Selectors.ts +0 -353
  299. package/src/compiler/internal/Static.ts +0 -784
  300. package/src/compiler/internal/Themes.ts +0 -2398
  301. package/src/compiler/internal/Vars.ts +0 -516
  302. package/src/compiler/internal/ViewTransitions.ts +0 -82
@@ -1,353 +0,0 @@
1
- /** Resolves selector objects and portable style definition identities. @module */
2
- import type * as Ast from '@oxc-project/types'
3
- import * as Walker from 'oxc-walker'
4
- import * as Condition from '../../internal/Condition.js'
5
- import * as Theme from '../../internal/Theme.js'
6
- import * as AtRules from './AtRules.js'
7
- import * as Identity from '../../internal/Identity.js'
8
- import * as Identifiers from './Identifiers.js'
9
- import * as Names from './Names.js'
10
- import * as Expression from './Expression.js'
11
- import type * as Scope from './Scope.js'
12
- import * as Themes from './Themes.js'
13
-
14
- /** Collects scoped selectors, local identities, exported style references, and composed definitions. */
15
- export function scan(
16
- program: Ast.Program,
17
- scope: Scope.Tracker,
18
- namespace: string,
19
- calls: readonly Ast.CallExpression[],
20
- links: Readonly<Record<string, Themes.Link>> = {},
21
- selectorKeys: ReadonlySet<number> = new Set(),
22
- cssNamespaces: ReadonlyMap<number, string> = new Map(),
23
- moduleId = namespace,
24
- composed: readonly Ast.Node[] = [],
25
- ) {
26
- const authoredNames = Names.collect(program)
27
- const conditions = new Map<number, string>()
28
- const localConditions = new Set<string>()
29
- const identities = new Map<number, string>()
30
- const exports: Record<string, Themes.Link> = Object.create(null)
31
- const definitions = new Map(calls.map((call) => [call.start, call]))
32
- const declarations = new Map<number, number>()
33
- const bindings = new Map<number, Ast.Expression>()
34
- const namespaces = new Map<number, Map<string, Ast.Expression>>()
35
- const importedNames = new Map<string, Themes.Link>()
36
- const imported = new Map<number, Themes.Link>()
37
- const compositions = new Map<number, Ast.CallExpression | Themes.Link>()
38
-
39
- const names = new Map<string, Ast.Expression>()
40
- const publicNames = new Map<string, string>()
41
- const namespaceNames = new Map<string, Map<string, Ast.Expression>>()
42
- const publicNamespaces = new Map<string, Map<string, Ast.Expression>>()
43
-
44
- function members(node: Ast.TSModuleDeclaration | Ast.TSGlobalDeclaration) {
45
- const result = new Map<string, Ast.Expression>()
46
- if (node.body?.type !== 'TSModuleBlock') return result
47
-
48
- for (const statement of node.body.body) {
49
- if (statement.type !== 'ExportNamedDeclaration') continue
50
- const declaration = statement.declaration
51
- if (
52
- declaration?.type !== 'VariableDeclaration' ||
53
- declaration.kind !== 'const'
54
- )
55
- continue
56
-
57
- for (const variable of declaration.declarations)
58
- if (variable.id.type === 'Identifier' && variable.init)
59
- result.set(variable.id.name, variable.init)
60
- }
61
-
62
- return result
63
- }
64
-
65
- for (const statement of program.body) {
66
- if (
67
- statement.type === 'ImportDeclaration' &&
68
- statement.importKind !== 'type'
69
- )
70
- for (const specifier of statement.specifiers) {
71
- if (
72
- specifier.type === 'ImportSpecifier' &&
73
- specifier.importKind === 'type'
74
- )
75
- continue
76
- const link = links[specifier.local.name]
77
- if (link?.kind === 'style-reference') {
78
- imported.set(specifier.start, link)
79
- importedNames.set(specifier.local.name, link)
80
- }
81
- }
82
-
83
- const declaration =
84
- statement.type === 'ExportNamedDeclaration'
85
- ? statement.declaration
86
- : statement
87
- if (
88
- declaration?.type === 'VariableDeclaration' &&
89
- declaration.kind === 'const'
90
- )
91
- for (const variable of declaration.declarations)
92
- if (variable.id.type === 'Identifier' && variable.init) {
93
- names.set(variable.id.name, variable.init)
94
- if (statement.type === 'ExportNamedDeclaration')
95
- publicNames.set(variable.id.name, variable.id.name)
96
- }
97
-
98
- if (
99
- declaration?.type === 'TSModuleDeclaration' &&
100
- declaration.id.type === 'Identifier' &&
101
- declaration.kind !== 'global'
102
- ) {
103
- namespaceNames.set(declaration.id.name, members(declaration))
104
- if (statement.type === 'ExportNamedDeclaration')
105
- publicNamespaces.set(declaration.id.name, members(declaration))
106
- }
107
-
108
- if (
109
- statement.type === 'ExportNamedDeclaration' &&
110
- !statement.source &&
111
- statement.exportKind !== 'type'
112
- )
113
- for (const specifier of statement.specifiers) {
114
- if (specifier.exportKind === 'type') continue
115
- publicNames.set(
116
- specifier.exported.type === 'Identifier'
117
- ? specifier.exported.name
118
- : specifier.exported.value,
119
- specifier.local.type === 'Identifier'
120
- ? specifier.local.name
121
- : specifier.local.value,
122
- )
123
- }
124
- }
125
-
126
- if (!calls.length && !imported.size)
127
- return { compositions, conditions, exports, identities, localConditions }
128
-
129
- const exposed = new Map<Ast.Expression, readonly (readonly string[])[]>()
130
- for (const [name, local] of publicNames) {
131
- const imported = importedNames.get(local)
132
- if (imported) exports[name] = imported
133
-
134
- const value = names.get(local)
135
- if (value) exposed.set(value, [...(exposed.get(value) ?? []), [name]])
136
- const namespace = namespaceNames.get(local)
137
- if (namespace) publicNamespaces.set(name, namespace)
138
- }
139
- for (const [name, values] of publicNamespaces)
140
- for (const [member, value] of values)
141
- exposed.set(value, [...(exposed.get(value) ?? []), [name, member]])
142
-
143
- if (!selectorKeys.size && !exposed.size && !composed.length)
144
- return { compositions, conditions, exports, identities, localConditions }
145
-
146
- type Entry = { node: Ast.Node; parent: Ast.Node | null | undefined }
147
- const nodes: Entry[] = []
148
- Walker.walk(program, {
149
- scopeTracker: scope,
150
- enter(node, parent) {
151
- if (node.type === 'Property' && selectorKeys.has(node.key.start))
152
- nodes.push({ node, parent })
153
- if (node.type === 'VariableDeclarator') nodes.push({ node, parent })
154
-
155
- if (node.type === 'Identifier') {
156
- const declaration = scope.getDeclaration(node.name)
157
- if (declaration) declarations.set(node.start, declaration.node.start)
158
- }
159
-
160
- if (node.type === 'VariableDeclaration' && node.kind === 'const')
161
- for (const variable of node.declarations)
162
- if (variable.id.type === 'Identifier' && variable.init)
163
- bindings.set(variable.id.start, variable.init)
164
-
165
- if (node.type === 'TSModuleDeclaration' && node.id.type === 'Identifier')
166
- namespaces.set(node.id.start, members(node))
167
- },
168
- })
169
-
170
- function link(call: Ast.CallExpression): Themes.Link {
171
- const id = Identifiers.explicit(call)
172
- const prefix = cssNamespaces.get(call.start)
173
- const name = `z-style-${id === undefined ? `${prefix ? `${prefix}-` : ''}${Identity.compact(moduleId).slice(-6)}-${authoredNames.get(call.start)!}` : `id-${prefix ? `${prefix}-` : ''}${Identity.requireId(id, 'style').slice(3)}`}`
174
- identities.set(call.start, name)
175
-
176
- return {
177
- binding: name,
178
- call: { start: call.start, end: call.end, name, tokenType: '{}' },
179
- definition: Theme.define({}),
180
- kind: 'style-reference',
181
- }
182
- }
183
-
184
- // Composition reads the definition itself, so only selector references claim an identity.
185
- function target(
186
- node: Ast.Node,
187
- seen = new Set<Ast.Node>(),
188
- ): Ast.CallExpression | Themes.Link | undefined {
189
- node = Expression.unwrap(node)
190
- if (seen.has(node)) return undefined
191
- seen.add(node)
192
-
193
- if (
194
- node.type === 'CallExpression' &&
195
- definitions.get(node.start)?.end === node.end
196
- )
197
- return node
198
-
199
- if (node.type === 'Identifier') {
200
- const declaration = declarations.get(node.start)
201
- if (declaration === undefined) return undefined
202
- const external = imported.get(declaration)
203
- if (external) return external
204
- const value = bindings.get(declaration)
205
- return value ? target(value, seen) : undefined
206
- }
207
-
208
- if (node.type === 'MemberExpression' && !node.optional) {
209
- const name = (() => {
210
- if (!node.computed && node.property.type === 'Identifier')
211
- return node.property.name
212
- if (
213
- node.property.type === 'Literal' &&
214
- typeof node.property.value === 'string'
215
- )
216
- return node.property.value
217
- return undefined
218
- })()
219
- if (name === undefined) return undefined
220
-
221
- if (node.object.type === 'Identifier') {
222
- const declaration = declarations.get(node.object.start)
223
- const value =
224
- declaration === undefined
225
- ? undefined
226
- : namespaces.get(declaration)?.get(name)
227
- if (value) return target(value, seen)
228
- }
229
- const object = target(node.object, seen)
230
- return object && !('type' in object) ? object.members?.[name] : undefined
231
- }
232
-
233
- return undefined
234
- }
235
-
236
- function resolve(node: Ast.Node): Themes.Link | undefined {
237
- const value = target(node)
238
- return value && 'type' in value ? link(value) : value
239
- }
240
-
241
- for (const node of composed) {
242
- const value = target(node)
243
- if (value) compositions.set(node.start, value)
244
- }
245
-
246
- for (const { node } of nodes) {
247
- if (node.type === 'VariableDeclarator' && node.init)
248
- for (const [key, member] of exposed.get(node.init) ?? []) {
249
- const resolved = resolve(node.init)
250
- if (!resolved || key === undefined) continue
251
-
252
- if (member === undefined) exports[key] = resolved
253
- else {
254
- const previous = exports[key]
255
- const name = Array.from(key, (char) =>
256
- char.codePointAt(0)!.toString(16),
257
- ).join('-')
258
- exports[key] = {
259
- binding: `z-style-${namespace}-namespace-${name}`,
260
- call: { start: -1, end: -1, name: '', tokenType: '{}' },
261
- definition: Theme.define({}),
262
- kind: 'style-reference',
263
- members: { ...previous?.members, [member]: resolved },
264
- }
265
- }
266
- }
267
-
268
- if (node.type !== 'Property') continue
269
- if (node.method || node.kind !== 'init' || node.shorthand)
270
- throw new Themes.InvalidError(
271
- 'Selectors require explicit string keys and style objects.',
272
- node,
273
- )
274
- const key = Expression.unwrap(node.key)
275
- let selector = ''
276
- if (key.type === 'Literal' && typeof key.value === 'string')
277
- selector = key.value
278
- else if (key.type === 'TemplateLiteral' && node.computed) {
279
- selector = key.quasis[0]!.value.cooked ?? ''
280
- for (const [index, expression] of key.expressions.entries()) {
281
- const value = Expression.unwrap(expression)
282
- if (value.type !== 'Identifier' && value.type !== 'MemberExpression')
283
- throw new Themes.InvalidError(
284
- 'Selector interpolations require style definitions without calling them.',
285
- expression,
286
- )
287
- const reference = resolve(value)
288
- if (
289
- !reference ||
290
- reference.members ||
291
- (reference.call.start >= 0 &&
292
- reference.call.end > node.start &&
293
- !importedHas(reference))
294
- )
295
- throw new Themes.InvalidError(
296
- 'Selector interpolations require previously declared style definitions.',
297
- expression,
298
- )
299
- selector += `.${reference.call.name}${key.quasis[index + 1]!.value.cooked ?? ''}`
300
- }
301
- } else
302
- throw new Themes.InvalidError(
303
- 'Selectors require literal strings or templates referencing style definitions.',
304
- key,
305
- )
306
- try {
307
- if (!Condition.nested(selector) || selector.trimStart().startsWith('@'))
308
- throw new Error('Selectors require an explicit & target.')
309
- selector = Condition.normalize(selector)
310
- let local = false
311
- AtRules.transform({
312
- filename: 'selectors.css',
313
- code: new TextEncoder().encode(`.z{${selector}{color:red}}`),
314
- errorRecovery: false,
315
- visitor: {
316
- Rule(rule) {
317
- if (rule.type !== 'style') return
318
- const selectors = rule.value.selectors
319
- if (
320
- !selectors.some((parts) =>
321
- parts.some((part) => part.type === 'nesting'),
322
- )
323
- )
324
- return
325
- local = selectors.every((parts) => {
326
- const last = parts.findLastIndex(
327
- (part) => part.type === 'combinator',
328
- )
329
- return parts
330
- .slice(last + 1)
331
- .some((part) => part.type === 'nesting')
332
- })
333
- },
334
- },
335
- })
336
- conditions.set(node.key.start, selector)
337
- if (local) localConditions.add(selector)
338
- } catch (error) {
339
- throw new Themes.InvalidError((error as Error).message, node)
340
- }
341
- }
342
-
343
- function importedHas(reference: Themes.Link): boolean {
344
- function contains(value: Themes.Link): boolean {
345
- return (
346
- value === reference || Object.values(value.members ?? {}).some(contains)
347
- )
348
- }
349
- return [...imported.values()].some(contains)
350
- }
351
-
352
- return { compositions, conditions, exports, identities, localConditions }
353
- }