zyzz 0.0.27 → 0.0.29

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 (320) 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 -1113
  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 -958
  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/Authoring.d.ts.map +1 -1
  51. package/dist/internal/Authoring.js +37 -7
  52. package/dist/internal/Authoring.js.map +1 -1
  53. package/dist/internal/Configuration.d.ts +6 -1
  54. package/dist/internal/Configuration.d.ts.map +1 -1
  55. package/dist/internal/Configuration.js.map +1 -1
  56. package/dist/internal/Literal.d.ts +5 -2
  57. package/dist/internal/Literal.d.ts.map +1 -1
  58. package/dist/internal/Literal.js +7 -2
  59. package/dist/internal/Literal.js.map +1 -1
  60. package/dist/internal/Theme.d.ts +4 -0
  61. package/dist/internal/Theme.d.ts.map +1 -1
  62. package/dist/internal/Theme.js.map +1 -1
  63. package/dist/internal/Token.d.ts +2 -1
  64. package/dist/internal/Token.d.ts.map +1 -1
  65. package/dist/internal/Token.js +2 -2
  66. package/dist/internal/Token.js.map +1 -1
  67. package/dist/internal/Vlq.d.ts +14 -0
  68. package/dist/internal/Vlq.d.ts.map +1 -0
  69. package/dist/internal/Vlq.js +47 -0
  70. package/dist/internal/Vlq.js.map +1 -0
  71. package/dist/internal/Wasm.d.ts +22 -0
  72. package/dist/internal/Wasm.d.ts.map +1 -0
  73. package/dist/internal/Wasm.js +83 -0
  74. package/dist/internal/Wasm.js.map +1 -0
  75. package/dist/metro/Graph.d.ts +0 -1
  76. package/dist/metro/Graph.d.ts.map +1 -1
  77. package/dist/metro/transformer.d.ts.map +1 -1
  78. package/dist/metro/transformer.js +0 -1
  79. package/dist/metro/transformer.js.map +1 -1
  80. package/dist/next/internal/Project.d.ts.map +1 -1
  81. package/dist/next/internal/Project.js +2 -5
  82. package/dist/next/internal/Project.js.map +1 -1
  83. package/dist/node/Host.d.ts.map +1 -1
  84. package/dist/node/Host.js +0 -2
  85. package/dist/node/Host.js.map +1 -1
  86. package/dist/node/internal/Contracts.d.ts.map +1 -1
  87. package/dist/node/internal/Contracts.js +3 -7
  88. package/dist/node/internal/Contracts.js.map +1 -1
  89. package/dist/node/internal/Snapshot.d.ts +0 -1
  90. package/dist/node/internal/Snapshot.d.ts.map +1 -1
  91. package/dist/node/internal/Snapshot.js +0 -6
  92. package/dist/node/internal/Snapshot.js.map +1 -1
  93. package/dist/runtime/Composition.d.ts +2 -3
  94. package/dist/runtime/Composition.d.ts.map +1 -1
  95. package/dist/runtime/Composition.js +51 -30
  96. package/dist/runtime/Composition.js.map +1 -1
  97. package/dist/runtime/Recipe.d.ts.map +1 -1
  98. package/dist/runtime/Recipe.js +16 -12
  99. package/dist/runtime/Recipe.js.map +1 -1
  100. package/dist/styleFunction.d.ts +11 -2
  101. package/dist/styleFunction.d.ts.map +1 -1
  102. package/dist/styleFunction.js +3 -1
  103. package/dist/styleFunction.js.map +1 -1
  104. package/dist/unplugin/index.d.ts.map +1 -1
  105. package/dist/unplugin/index.js +3 -6
  106. package/dist/unplugin/index.js.map +1 -1
  107. package/dist/vite/index.d.ts +7 -0
  108. package/dist/vite/index.d.ts.map +1 -1
  109. package/dist/vite/index.js +862 -216
  110. package/dist/vite/index.js.map +1 -1
  111. package/dist/web/Css.d.ts +8 -3
  112. package/dist/web/Css.d.ts.map +1 -1
  113. package/dist/web/Css.js +5 -721
  114. package/dist/web/Css.js.map +1 -1
  115. package/dist/web/internal/Block.d.ts +0 -2
  116. package/dist/web/internal/Block.d.ts.map +1 -1
  117. package/dist/web/internal/Block.js +1 -12
  118. package/dist/web/internal/Block.js.map +1 -1
  119. package/dist/web/internal/ClassName.d.ts +23 -18
  120. package/dist/web/internal/ClassName.d.ts.map +1 -1
  121. package/dist/web/internal/ClassName.js +26 -55
  122. package/dist/web/internal/ClassName.js.map +1 -1
  123. package/dist/web/internal/Contributions.d.ts +3 -5
  124. package/dist/web/internal/Contributions.d.ts.map +1 -1
  125. package/dist/web/internal/Contributions.js +0 -45
  126. package/dist/web/internal/Contributions.js.map +1 -1
  127. package/dist/web/internal/Engine.browser.d.ts +8 -0
  128. package/dist/web/internal/Engine.browser.d.ts.map +1 -0
  129. package/dist/web/internal/Engine.browser.js +42 -0
  130. package/dist/web/internal/Engine.browser.js.map +1 -0
  131. package/dist/web/internal/Engine.d.ts +9 -0
  132. package/dist/web/internal/Engine.d.ts.map +1 -0
  133. package/dist/web/internal/Engine.js +14 -0
  134. package/dist/web/internal/Engine.js.map +1 -0
  135. package/dist/web/internal/Themes.d.ts +1 -9
  136. package/dist/web/internal/Themes.d.ts.map +1 -1
  137. package/dist/web/internal/Themes.js +3 -221
  138. package/dist/web/internal/Themes.js.map +1 -1
  139. package/dist/web/internal/Wasm.generated.d.ts +4 -0
  140. package/dist/web/internal/Wasm.generated.d.ts.map +1 -0
  141. package/dist/web/internal/Wasm.generated.js +4 -0
  142. package/dist/web/internal/Wasm.generated.js.map +1 -0
  143. package/dist/web/internal/Wire.d.ts +19 -0
  144. package/dist/web/internal/Wire.d.ts.map +1 -0
  145. package/dist/web/internal/Wire.js +387 -0
  146. package/dist/web/internal/Wire.js.map +1 -0
  147. package/package.json +20 -1
  148. package/src/babel/index.ts +2 -5
  149. package/src/babel/internal/Compilation.ts +0 -1
  150. package/src/compiler/Graph.ts +89 -1930
  151. package/src/compiler/Native.ts +18 -871
  152. package/src/compiler/Source.ts +144 -1579
  153. package/src/compiler/Transform.ts +16 -1312
  154. package/src/compiler/internal/AtRules.ts +27 -115
  155. package/src/compiler/internal/Context.ts +11 -0
  156. package/src/compiler/internal/Results.ts +406 -0
  157. package/src/compiler/internal/Syntax.ts +0 -3
  158. package/src/compiler/internal/Wire.ts +1045 -0
  159. package/src/internal/Addon.ts +118 -0
  160. package/src/internal/Authoring.ts +53 -18
  161. package/src/internal/Configuration.ts +38 -1
  162. package/src/internal/Literal.ts +7 -2
  163. package/src/internal/Theme.ts +15 -0
  164. package/src/internal/Token.ts +2 -2
  165. package/src/internal/Vlq.ts +59 -0
  166. package/src/internal/Wasm.ts +111 -0
  167. package/src/metro/transformer.ts +0 -1
  168. package/src/next/internal/Project.ts +2 -9
  169. package/src/node/Host.ts +0 -2
  170. package/src/node/internal/Contracts.ts +3 -7
  171. package/src/node/internal/Snapshot.ts +0 -8
  172. package/src/runtime/Composition.ts +48 -25
  173. package/src/runtime/Recipe.ts +21 -14
  174. package/src/styleFunction.ts +31 -2
  175. package/src/unplugin/index.ts +6 -6
  176. package/src/vite/index.ts +1157 -241
  177. package/src/web/Css.ts +12 -908
  178. package/src/web/internal/Block.ts +0 -14
  179. package/src/web/internal/ClassName.ts +52 -85
  180. package/src/web/internal/Contributions.ts +3 -59
  181. package/src/web/internal/Engine.browser.ts +51 -0
  182. package/src/web/internal/Engine.ts +17 -0
  183. package/src/web/internal/Themes.ts +3 -279
  184. package/src/web/internal/Wasm.generated.ts +3 -0
  185. package/src/web/internal/Wire.ts +466 -0
  186. package/src/web/internal/wasm.d.ts +9 -0
  187. package/dist/compiler/internal/Applications.d.ts +0 -55
  188. package/dist/compiler/internal/Applications.d.ts.map +0 -1
  189. package/dist/compiler/internal/Applications.js +0 -352
  190. package/dist/compiler/internal/Applications.js.map +0 -1
  191. package/dist/compiler/internal/ColorProfiles.d.ts +0 -3
  192. package/dist/compiler/internal/ColorProfiles.d.ts.map +0 -1
  193. package/dist/compiler/internal/ColorProfiles.js +0 -84
  194. package/dist/compiler/internal/ColorProfiles.js.map +0 -1
  195. package/dist/compiler/internal/CompositionBindings.d.ts +0 -16
  196. package/dist/compiler/internal/CompositionBindings.d.ts.map +0 -1
  197. package/dist/compiler/internal/CompositionBindings.js +0 -89
  198. package/dist/compiler/internal/CompositionBindings.js.map +0 -1
  199. package/dist/compiler/internal/Compositions.d.ts +0 -37
  200. package/dist/compiler/internal/Compositions.d.ts.map +0 -1
  201. package/dist/compiler/internal/Compositions.js +0 -494
  202. package/dist/compiler/internal/Compositions.js.map +0 -1
  203. package/dist/compiler/internal/Configurations.d.ts +0 -26
  204. package/dist/compiler/internal/Configurations.d.ts.map +0 -1
  205. package/dist/compiler/internal/Configurations.js +0 -259
  206. package/dist/compiler/internal/Configurations.js.map +0 -1
  207. package/dist/compiler/internal/Contract.d.ts +0 -30
  208. package/dist/compiler/internal/Contract.d.ts.map +0 -1
  209. package/dist/compiler/internal/Contract.js +0 -753
  210. package/dist/compiler/internal/Contract.js.map +0 -1
  211. package/dist/compiler/internal/Contributions.d.ts +0 -54
  212. package/dist/compiler/internal/Contributions.d.ts.map +0 -1
  213. package/dist/compiler/internal/Contributions.js +0 -1151
  214. package/dist/compiler/internal/Contributions.js.map +0 -1
  215. package/dist/compiler/internal/Descriptors.d.ts +0 -15
  216. package/dist/compiler/internal/Descriptors.d.ts.map +0 -1
  217. package/dist/compiler/internal/Descriptors.js +0 -192
  218. package/dist/compiler/internal/Descriptors.js.map +0 -1
  219. package/dist/compiler/internal/Dynamic.d.ts +0 -14
  220. package/dist/compiler/internal/Dynamic.d.ts.map +0 -1
  221. package/dist/compiler/internal/Dynamic.js +0 -175
  222. package/dist/compiler/internal/Dynamic.js.map +0 -1
  223. package/dist/compiler/internal/Expression.d.ts +0 -19
  224. package/dist/compiler/internal/Expression.d.ts.map +0 -1
  225. package/dist/compiler/internal/Expression.js +0 -164
  226. package/dist/compiler/internal/Expression.js.map +0 -1
  227. package/dist/compiler/internal/Functions.d.ts +0 -5
  228. package/dist/compiler/internal/Functions.d.ts.map +0 -1
  229. package/dist/compiler/internal/Functions.js +0 -191
  230. package/dist/compiler/internal/Functions.js.map +0 -1
  231. package/dist/compiler/internal/Keyframes.d.ts +0 -5
  232. package/dist/compiler/internal/Keyframes.d.ts.map +0 -1
  233. package/dist/compiler/internal/Keyframes.js +0 -51
  234. package/dist/compiler/internal/Keyframes.js.map +0 -1
  235. package/dist/compiler/internal/Names.d.ts +0 -5
  236. package/dist/compiler/internal/Names.d.ts.map +0 -1
  237. package/dist/compiler/internal/Names.js +0 -37
  238. package/dist/compiler/internal/Names.js.map +0 -1
  239. package/dist/compiler/internal/NativeBindings.d.ts +0 -72
  240. package/dist/compiler/internal/NativeBindings.d.ts.map +0 -1
  241. package/dist/compiler/internal/NativeBindings.js +0 -171
  242. package/dist/compiler/internal/NativeBindings.js.map +0 -1
  243. package/dist/compiler/internal/NativeMedia.d.ts +0 -14
  244. package/dist/compiler/internal/NativeMedia.d.ts.map +0 -1
  245. package/dist/compiler/internal/NativeMedia.js +0 -287
  246. package/dist/compiler/internal/NativeMedia.js.map +0 -1
  247. package/dist/compiler/internal/NativeVars.d.ts +0 -28
  248. package/dist/compiler/internal/NativeVars.d.ts.map +0 -1
  249. package/dist/compiler/internal/NativeVars.js +0 -160
  250. package/dist/compiler/internal/NativeVars.js.map +0 -1
  251. package/dist/compiler/internal/PackedStyles.d.ts +0 -37
  252. package/dist/compiler/internal/PackedStyles.d.ts.map +0 -1
  253. package/dist/compiler/internal/PackedStyles.js +0 -344
  254. package/dist/compiler/internal/PackedStyles.js.map +0 -1
  255. package/dist/compiler/internal/Properties.d.ts +0 -5
  256. package/dist/compiler/internal/Properties.d.ts.map +0 -1
  257. package/dist/compiler/internal/Properties.js +0 -82
  258. package/dist/compiler/internal/Properties.js.map +0 -1
  259. package/dist/compiler/internal/RecipeConditions.d.ts +0 -41
  260. package/dist/compiler/internal/RecipeConditions.d.ts.map +0 -1
  261. package/dist/compiler/internal/RecipeConditions.js +0 -82
  262. package/dist/compiler/internal/RecipeConditions.js.map +0 -1
  263. package/dist/compiler/internal/RecipePayloads.d.ts +0 -31
  264. package/dist/compiler/internal/RecipePayloads.d.ts.map +0 -1
  265. package/dist/compiler/internal/RecipePayloads.js +0 -99
  266. package/dist/compiler/internal/RecipePayloads.js.map +0 -1
  267. package/dist/compiler/internal/Recipes.d.ts +0 -32
  268. package/dist/compiler/internal/Recipes.d.ts.map +0 -1
  269. package/dist/compiler/internal/Recipes.js +0 -339
  270. package/dist/compiler/internal/Recipes.js.map +0 -1
  271. package/dist/compiler/internal/Selectors.d.ts +0 -12
  272. package/dist/compiler/internal/Selectors.d.ts.map +0 -1
  273. package/dist/compiler/internal/Selectors.js +0 -268
  274. package/dist/compiler/internal/Selectors.js.map +0 -1
  275. package/dist/compiler/internal/Static.d.ts +0 -39
  276. package/dist/compiler/internal/Static.d.ts.map +0 -1
  277. package/dist/compiler/internal/Static.js +0 -534
  278. package/dist/compiler/internal/Static.js.map +0 -1
  279. package/dist/compiler/internal/Themes.d.ts +0 -190
  280. package/dist/compiler/internal/Themes.d.ts.map +0 -1
  281. package/dist/compiler/internal/Themes.js +0 -1577
  282. package/dist/compiler/internal/Themes.js.map +0 -1
  283. package/dist/compiler/internal/Vars.d.ts +0 -33
  284. package/dist/compiler/internal/Vars.d.ts.map +0 -1
  285. package/dist/compiler/internal/Vars.js +0 -387
  286. package/dist/compiler/internal/Vars.js.map +0 -1
  287. package/dist/compiler/internal/ViewTransitions.d.ts +0 -3
  288. package/dist/compiler/internal/ViewTransitions.d.ts.map +0 -1
  289. package/dist/compiler/internal/ViewTransitions.js +0 -68
  290. package/dist/compiler/internal/ViewTransitions.js.map +0 -1
  291. package/dist/internal/Cascade.d.ts +0 -74
  292. package/dist/internal/Cascade.d.ts.map +0 -1
  293. package/dist/internal/Cascade.js +0 -210
  294. package/dist/internal/Cascade.js.map +0 -1
  295. package/src/compiler/internal/Applications.ts +0 -554
  296. package/src/compiler/internal/ColorProfiles.ts +0 -93
  297. package/src/compiler/internal/CompositionBindings.ts +0 -120
  298. package/src/compiler/internal/Compositions.ts +0 -678
  299. package/src/compiler/internal/Configurations.ts +0 -349
  300. package/src/compiler/internal/Contract.ts +0 -1028
  301. package/src/compiler/internal/Contributions.ts +0 -1561
  302. package/src/compiler/internal/Descriptors.ts +0 -242
  303. package/src/compiler/internal/Dynamic.ts +0 -275
  304. package/src/compiler/internal/Expression.ts +0 -218
  305. package/src/compiler/internal/Functions.ts +0 -206
  306. package/src/compiler/internal/Keyframes.ts +0 -62
  307. package/src/compiler/internal/Names.ts +0 -48
  308. package/src/compiler/internal/NativeBindings.ts +0 -235
  309. package/src/compiler/internal/NativeMedia.ts +0 -342
  310. package/src/compiler/internal/NativeVars.ts +0 -231
  311. package/src/compiler/internal/PackedStyles.ts +0 -473
  312. package/src/compiler/internal/Properties.ts +0 -121
  313. package/src/compiler/internal/RecipeConditions.ts +0 -139
  314. package/src/compiler/internal/RecipePayloads.ts +0 -132
  315. package/src/compiler/internal/Recipes.ts +0 -531
  316. package/src/compiler/internal/Selectors.ts +0 -339
  317. package/src/compiler/internal/Static.ts +0 -784
  318. package/src/compiler/internal/Themes.ts +0 -2398
  319. package/src/compiler/internal/Vars.ts +0 -516
  320. package/src/compiler/internal/ViewTransitions.ts +0 -82
@@ -1,23 +1,12 @@
1
1
  /**
2
2
  * Rewrites extracted style calls into executable modules with CSS and source maps.
3
+ * The Rust compiler performs the rewrite through the native addon.
3
4
  * @module
4
5
  */
5
6
  import * as Edits from './internal/Edits.js';
6
- import * as Token from '../internal/Token.js';
7
- import * as Applications from './internal/Applications.js';
8
- import * as Css from '../web/Css.js';
9
7
  import * as ClassName from '../web/internal/ClassName.js';
10
- import * as Expression from './internal/Expression.js';
11
- import * as Identity from '../internal/Identity.js';
12
- import MagicString from 'magic-string';
13
- import * as Mapping from '@jridgewell/gen-mapping';
14
- import * as Namespaces from './internal/Namespaces.js';
15
- import * as Scheme from '../internal/Scheme.js';
16
- import * as Syntax from './internal/Syntax.js';
17
- import * as Source from './Source.js';
8
+ import * as Results from './internal/Results.js';
18
9
  import * as ThemeRules from '../web/internal/Themes.js';
19
- import * as Themes from './internal/Themes.js';
20
- import * as Walker from 'oxc-walker';
21
10
  /**
22
11
  * Rewrites literal web styles and local themes without evaluation or file access.
23
12
  * Direct no-argument applications become props; other definitions become callables.
@@ -28,953 +17,19 @@ import * as Walker from 'oxc-walker';
28
17
  * @throws {Css.CompileError} If literal CSS compilation fails.
29
18
  */
30
19
  export function compile(options) {
31
- if (options.target === 'native')
32
- throw new Error('Use Native.compile for native source output.');
33
- const extracted = options[Themes.context]?.extracted ?? Source.extract(options);
34
- const portable = options.compiler === false;
35
- const portableNames = {};
36
- if (portable) {
37
- for (const call of extracted.calls) {
38
- if (!call.portable)
39
- throw new Error('CSS-only output requires an explicit id for dynamic styles, variants, and compositions.');
40
- portableNames[call.name] = call.portable;
41
- }
42
- for (const [name, theme] of Object.entries(extracted.vars))
43
- if ((Object.keys(theme[Token.definition].values).length ||
44
- extracted.themeCalls.some((call) => (call.name === name ||
45
- Object.values(call.members ?? {}).includes(name)) &&
46
- (!call.options ||
47
- Object.hasOwn(call.options, 'themes') ||
48
- Object.hasOwn(call.options, 'theme')))) &&
49
- !theme[Token.definition].contract[Token.identity]?.startsWith('id-'))
50
- throw new Error('CSS-only themes require an explicit id on Config.create or Vars.define.');
51
- for (const call of extracted.contributionCalls ?? [])
52
- if (call.name &&
53
- !/^(?:--)?z-(?:k|counterstyle|positiontry|colorprofile|fontpalettevalues|custommedia|cssfunction)id-/.test(call.name))
54
- throw new Error('CSS-only named stylesheet declarations require an explicit id.');
55
- for (const call of extracted.variableCalls ?? [])
56
- if (!call.explicit)
57
- throw new Error('CSS-only output requires an explicit variable id.');
58
- }
59
- if (portable) {
60
- function selectors(style) {
61
- for (const rule of style.rules ?? []) {
62
- if (rule.condition &&
63
- !rule.condition.startsWith('@') &&
64
- /\.z-style-(?!id-)/.test(rule.condition))
65
- throw new Error('CSS-only selector references require an explicit style id.');
66
- selectors(rule.style);
67
- }
68
- }
69
- for (const style of extracted.styles.styles)
70
- selectors(style);
71
- }
72
- const module = new MagicString(options.source);
73
- const program = (options[Themes.context]?.parsed ?? Syntax.parse(options))
74
- .program;
75
- for (const call of extracted.contributionCalls ?? [])
76
- module.overwrite(call.start, call.end, (() => {
77
- const typed = /\.[cm]?tsx?$/.test(options.moduleId);
78
- if (call.kind === 'cssFunction')
79
- return `((...args${typed ? ': readonly (string | number)[]' : ''}) => ${JSON.stringify(call.name + '(')} + args.map(value => typeof value === 'string' && value.includes(',') && !value.trimStart().startsWith('{') ? '{' + value + '}' : value).join(',') + ')')${typed ? ` as import('zyzz/web').cssFunction.Reference<${JSON.stringify(call.function?.parameters ?? [])}, ${JSON.stringify(call.function?.returns ?? '*')}>` : ''}`;
80
- if (call.kind === 'customMedia')
81
- return `${JSON.stringify(`@media (${call.name})`)}${typed ? ` as unknown as import('zyzz/web').customMedia.Reference` : ''}`;
82
- if (!call.name)
83
- return 'void 0';
84
- return `${JSON.stringify(call.name)}${call.kind === 'keyframes' || !typed ? '' : ` as import('zyzz/web').${call.kind}.Reference`}`;
85
- })());
86
- const applications = new Map();
87
- const calls = new Map(extracted.calls.map((call) => [call.start, call]));
88
- const definitions = new Map();
89
- const unusedSelections = new Set();
90
- const identifiers = new Map();
91
- const localApplications = Applications.create(program, extracted.calls);
92
- Walker.walk(program, {
93
- enter(node, parent) {
94
- localApplications?.enter(node, parent);
95
- if (node.type === 'VariableDeclarator' &&
96
- node.init &&
97
- node.id.type === 'ObjectPattern' &&
98
- node.id.properties.every((property) => property.type === 'Property' &&
99
- (property.key.type === 'Identifier'
100
- ? property.key.name
101
- : property.key.type === 'Literal'
102
- ? property.key.value
103
- : undefined) !== 'themes' &&
104
- (property.key.type !== 'Identifier' ||
105
- property.key.name !== 'variables')))
106
- unusedSelections.add(Expression.unwrap(node.init).start);
107
- if (node.type === 'Identifier') {
108
- const references = identifiers.get(node.name) ?? [];
109
- references.push(node);
110
- identifiers.set(node.name, references);
111
- }
112
- if (node.type !== 'CallExpression')
113
- return;
114
- const call = calls.get(node.start);
115
- if (!call || node.end !== call.end)
116
- return;
117
- const folded = !!call.composition ||
118
- (!call.recipe &&
119
- !call.slots &&
120
- parent?.type === 'CallExpression' &&
121
- parent.callee === node &&
122
- !parent.optional &&
123
- parent.arguments.length === 0);
124
- applications.set(call.start, {
125
- end: folded && !call.composition ? parent.end : call.end,
126
- folded,
127
- });
128
- let argument = node.arguments[0]
129
- ? Expression.unwrap(node.arguments[0])
130
- : undefined;
131
- if (argument?.type === 'ArrowFunctionExpression')
132
- argument = Expression.unwrap(argument.body);
133
- if (call.body)
134
- definitions.set(call.start, call.body);
135
- else if (argument?.type === 'ObjectExpression')
136
- definitions.set(call.start, argument);
137
- },
138
- });
139
- const found = localApplications?.find() ?? [];
140
- // Compositions supersede their inputs' classes, so those reads stay unfolded.
141
- const composing = (application) => extracted.calls.some((call) => (call.composition || call.runtimeComposition) &&
142
- call.start < application.start &&
143
- application.end <= call.end);
144
- const folded = new Set(found.filter((application) => !composing(application) &&
145
- !extracted.calls.some((call) => call.output === 'html' &&
146
- call.runtimeComposition?.some((input) => input.applicationStart === application.start))));
147
- const local = portable || options.development
148
- ? undefined
149
- : localApplications?.definitions();
150
- // Styles applied only alone to DOM elements, or inside cx, never meet another
151
- // style's classes. Atomic ones share rules like independent styles.
152
- const standalone = new Set([...(local?.values.keys() ?? [])].filter((name) => found.every((application) => application.name !== name ||
153
- application.terminal ||
154
- composing(application))));
155
- // Scheme rules accompany modules whose runtime helpers can apply a scheme class.
156
- const schemes = options.schemes ??
157
- Boolean(extracted.themeAppearances?.length ||
158
- extracted.themeScripts?.length ||
159
- extracted.themeSelections?.length);
160
- const emitted = Css.compile({
161
- [ThemeRules.shared]: options[ThemeRules.shared],
162
- development: options.development,
163
- [ClassName.labels]: extracted.styles[ClassName.labels],
164
- [ClassName.units]: options[ClassName.units] ??
165
- ClassName.registry().scope({
166
- owner: options.moduleId,
167
- qualifier: Identity.compact(options.moduleId).slice(-6),
168
- }),
20
+ const input = {
21
+ compiler: options.compiler,
169
22
  composition: options.composition,
170
23
  cssOutput: options.cssOutput,
171
- names: portable ? portableNames : undefined,
172
- schemes,
173
- // Keep definition positions stable while removing proven unreachable rules.
174
- // CSS-only consumers retain executable authoring, and development keeps slots.
175
- styles: (() => {
176
- if (portable || options.development)
177
- return extracted.styles;
178
- const dead = localApplications?.dead();
179
- if (!dead?.size && !standalone.size)
180
- return extracted.styles;
181
- return {
182
- styles: extracted.styles.styles.map((style) => {
183
- if (dead?.has(style.name))
184
- return {
185
- cssOutput: style.cssOutput,
186
- declarations: [],
187
- name: style.name,
188
- };
189
- // Grouped output keeps one class per style.
190
- return standalone.has(style.name) &&
191
- (style.cssOutput ?? options.cssOutput ?? 'atomic') === 'atomic'
192
- ? { ...style, composition: 'independent' }
193
- : style;
194
- }),
195
- };
196
- })(),
197
- contributions: extracted.contributions,
198
- vars: Object.keys(extracted.vars).length ? extracted.vars : undefined,
199
- });
200
- let runtime = '__zyzzProps';
201
- while (identifiers.has(runtime))
202
- runtime += '_';
203
- let html = '__zyzzHtml';
204
- while (identifiers.has(html))
205
- html += '_';
206
- let usesHtml = false;
207
- let conditionalRecipe = '__zyzzConditionalRecipe';
208
- while (identifiers.has(conditionalRecipe))
209
- conditionalRecipe += '_';
210
- let usesConditionalRecipe = false;
211
- let payloadRecipe = '__zyzzPayloadRecipe';
212
- while (identifiers.has(payloadRecipe))
213
- payloadRecipe += '_';
214
- let usesPayloadRecipe = false;
215
- let recipe = '__zyzzRecipe';
216
- while (identifiers.has(recipe))
217
- recipe += '_';
218
- let usesRecipe = false;
219
- let compositionHtml = '__zyzzCompositionHtml';
220
- while (identifiers.has(compositionHtml))
221
- compositionHtml += '_';
222
- let usesCompositionHtml = false;
223
- const preparedHtml = new Set(extracted.calls.flatMap((call) => call.output === 'html'
224
- ? (call.runtimeComposition ?? []).map((input) => input.name)
225
- : []));
226
- function prepareExport(link) {
227
- if (link.style?.output === 'html') {
228
- const call = extracted.calls.find((call) => call.identity === link.binding);
229
- if (call)
230
- preparedHtml.add(call.name);
231
- }
232
- for (const member of Object.values(link.members ?? {}))
233
- prepareExport(member);
234
- }
235
- for (const link of Object.values(extracted.themeExports ?? {}))
236
- prepareExport(link);
237
- let composition = '__zyzzComposition';
238
- while (identifiers.has(composition))
239
- composition += '_';
240
- let usesComposition = false;
241
- const compositions = [];
242
- const compositionArguments = new Map();
243
- let appearance = '__zyzzAppearance';
244
- while (identifiers.has(appearance))
245
- appearance += '_';
246
- let usesAppearance = false;
247
- let selection = '__zyzzSelection';
248
- while (identifiers.has(selection))
249
- selection += '_';
250
- let usesSelection = false;
251
- let variables = '__zyzzVariable';
252
- while (identifiers.has(variables))
253
- variables += '_';
254
- for (const call of extracted.variableCalls ?? [])
255
- module.overwrite(call.start, call.end, `${variables}.create(${JSON.stringify(call.slots.value)})`);
256
- const identities = new Map(extracted.calls
257
- .filter((call) => call.identity)
258
- .map((call) => [call.name, call.identity]));
259
- const classes = Object.freeze(Object.fromEntries(Object.entries(emitted.classes).map(([name, value]) => [
260
- name,
261
- [
262
- ...new Set([
263
- ...value.split(' ').filter(Boolean),
264
- ...(identities.has(name) &&
265
- (!portable || portableNames[name]?.startsWith('z-compose-'))
266
- ? [
267
- portable
268
- ? identities
269
- .get(name)
270
- .split(' ')
271
- .filter((name) => name.startsWith('z-style-id-'))
272
- .join(' ')
273
- : identities.get(name),
274
- ]
275
- : []),
276
- ]),
277
- ].join(' '),
278
- ])));
279
- // Definitions read only through folded applications need no class list of
280
- // their own. True marks definitions whose every read follows initialization.
281
- const unread = new Map([...(local?.values ?? [])].filter(([name]) => found.every((application) => application.name !== name || folded.has(application))));
282
- const namespaces = (local?.namespaces ?? []).filter((namespace) => [...namespace.ends.keys()].every((name) => unread.get(name)));
283
- const erased = new Map(namespaces.flatMap((namespace) => [...namespace.ends]));
284
- // An ambient namespace keeps member types without runtime initialization.
285
- for (const namespace of namespaces)
286
- module.prependRight(namespace.start, 'declare ');
287
- for (const call of extracted.calls) {
288
- const end = erased.get(call.name);
289
- if (end !== undefined)
290
- module.overwrite(end, call.start, `: import('zyzz').style.ReturnType${call.output === 'html' ? "<'html'>" : ''}`);
291
- }
292
- let callable = false;
293
- const composed = (node) => extracted.calls.some((call) => call.composition && call.start < node.start && node.end <= call.end);
294
- // Rewrite contained expressions before their enclosing composition reads them.
295
- const rewrites = [...extracted.calls].sort((a, b) => a.start < b.start && a.end >= b.end
296
- ? 1
297
- : b.start < a.start && b.end >= a.end
298
- ? -1
299
- : a.start - b.start);
300
- for (const call of rewrites) {
301
- if (call.compositionCase || composed(call))
302
- continue;
303
- const application = applications.get(call.start);
304
- const props = `{${call.output === 'html' ? 'class' : 'className'}:${JSON.stringify(classes[call.name])}}`;
305
- const composeHtml = call.output === 'html' && preparedHtml.has(call.name);
306
- if (composeHtml)
307
- usesCompositionHtml = true;
308
- const replacement = (() => {
309
- if (call.runtimeComposition) {
310
- const helper = call.output === 'html' ? compositionHtml : composition;
311
- if (call.output === 'html')
312
- usesCompositionHtml = true;
313
- else
314
- usesComposition = true;
315
- let factory = `${composition}${call.start}`;
316
- while (identifiers.has(factory))
317
- factory += '_';
318
- const inputs = call.runtimeComposition.map((input) => ({
319
- className: classes[input.name] ??
320
- options[Themes.context]?.styleClasses?.[input.name] ??
321
- '',
322
- condition: input.condition,
323
- owners: input.owners,
324
- }));
325
- compositions.push(`const ${factory}=/*#__PURE__*/${helper}.create(${JSON.stringify({ className: classes[call.name], cases: call.compositionCases?.map((name) => classes[name]), inputs })});`);
326
- return `${factory}(${call.runtimeComposition
327
- .map((input) => {
328
- const key = `${input.start}:${input.end}`;
329
- const value = compositionArguments.get(key) ??
330
- module.slice(input.start, input.end);
331
- compositionArguments.set(key, value);
332
- return value;
333
- })
334
- .join(',')})`;
335
- }
336
- if (call.composition)
337
- return call.composition.reduceRight((result, guard) => `((${guard}${/\.[cm]?tsx?$/.test(options.moduleId) ? ' as unknown' : ''})?${result}:${guard}())`, composeHtml
338
- ? `${compositionHtml}.from({className:${JSON.stringify(classes[call.name])}})`
339
- : `(${props})`);
340
- if (call.recipe) {
341
- const helper = call.recipe.conditions?.length
342
- ? conditionalRecipe
343
- : recipe;
344
- if (call.recipe.conditions?.length)
345
- usesConditionalRecipe = true;
346
- else
347
- usesRecipe = true;
348
- const payload = !!call.recipe.payloads?.length;
349
- if (payload)
350
- usesPayloadRecipe = true;
351
- const selection = `${helper}.create(${JSON.stringify({ axes: call.recipe.axes, defaults: call.recipe.defaults, conditions: call.recipe.conditions, className: classes[call.name], ...(!payload && call.output === 'html' && !composeHtml ? { html: true } : {}) })})`;
352
- const value = payload
353
- ? `${payloadRecipe}.create({...${JSON.stringify({ ...call.recipe, html: call.output === 'html' && !composeHtml })},select:${selection}})`
354
- : selection;
355
- const bound = composeHtml ? `${compositionHtml}.bind(${value})` : value;
356
- const axes = Object.entries(call.recipe.axes)
357
- .map(([axis, choices]) => `${JSON.stringify(axis)}:{${choices.map((choice) => `${JSON.stringify(choice)}:${call.recipeTypes?.[axis]?.[choice] ? `(values:${call.recipeTypes[axis][choice]})=>{}` : '{}'}`).join(';')}}`)
358
- .join(';');
359
- const conditions = call.recipe.conditions
360
- ?.map((name) => `${JSON.stringify(name)}:unknown`)
361
- .join(';');
362
- const type = `import('zyzz').variants.ReturnType<{variants:{${axes}}${conditions ? `;conditions:{${conditions}}` : ''}}${call.output === 'html' ? ',"html"' : ''}>`;
363
- return /\.[cm]?tsx?$/.test(options.moduleId)
364
- ? `(${bound} as ${type})`
365
- : bound;
366
- }
367
- if (call.slots) {
368
- const type = `import('zyzz').style.Dynamic<${call.valuesType}${call.output === 'html' ? ',"html"' : ''}>`;
369
- const typed = /\.[cm]?tsx?$/.test(options.moduleId);
370
- const slots = Object.entries(call.slots);
371
- const reads = slots
372
- .map(([key], index) => `const v${index}=input[${JSON.stringify(key)}]${typed ? ' as string | number' : ''};`)
373
- .join('');
374
- const assignments = slots
375
- .map(([, slot], index) => `${JSON.stringify(slot.name)}:v${index}===''?' ':v${index}`)
376
- .join(',');
377
- const className = JSON.stringify(classes[call.name]);
378
- const value = `(input${typed ? `:Parameters<${type}>[0]` : ''})=>{${reads}const external=input.className;const style=input.style;return {className:external?${className}+" "+external:${className},style:{...input.vars,...style,${assignments}}}}`;
379
- const result = composeHtml
380
- ? `${compositionHtml}.bind(${value})`
381
- : call.output === 'html'
382
- ? `${html}.bind(${value})`
383
- : `(${value})`;
384
- if (call.output === 'html' && !composeHtml)
385
- usesHtml = true;
386
- return typed ? `(${result} as ${type})` : result;
387
- }
388
- const initialized = unread.get(call.name);
389
- if (initialized !== undefined) {
390
- if (erased.has(call.name))
391
- return '';
392
- // Guards read only truthiness, and failures before initialization still call it.
393
- const value = initialized ? 'void 0' : '1';
394
- return /\.[cm]?tsx?$/.test(options.moduleId)
395
- ? `(${value} as unknown as import('zyzz').style.ReturnType${call.output === 'html' ? "<'html'>" : ''})`
396
- : value;
397
- }
398
- if (application.folded)
399
- return composeHtml
400
- ? `${compositionHtml}.from({className:${JSON.stringify(classes[call.name])}})`
401
- : `(${props})`;
402
- if (call.output === 'html') {
403
- if (composeHtml) {
404
- callable = true;
405
- return `(${compositionHtml}.bind(${runtime}.create({className:${JSON.stringify(classes[call.name])}}))${/\.[cm]?tsx?$/.test(options.moduleId) ? " as import('zyzz').style.ReturnType<'html'>" : ''})`;
406
- }
407
- usesHtml = true;
408
- return `${html}.create({className:${JSON.stringify(classes[call.name])}})`;
409
- }
410
- return `${runtime}.create(${props})`;
411
- })();
412
- module.overwrite(call.start, application.end, replacement);
413
- if (!call.recipe &&
414
- !call.slots &&
415
- !call.runtimeComposition &&
416
- !application.folded &&
417
- !unread.has(call.name) &&
418
- call.output !== 'html')
419
- callable = true;
420
- }
421
- for (const application of folded) {
422
- const className = JSON.stringify(classes[application.name]);
423
- const key = extracted.calls.find((call) => call.name === application.name)?.output ===
424
- 'html'
425
- ? 'class'
426
- : 'className';
427
- const callee = options.source.slice(application.start, application.calleeEnd);
428
- module.overwrite(application.start, application.end, application.initialized
429
- ? `({${key}:${className}})`
430
- : // Keep a callable guard so bundlers also retain failures before initialization.
431
- `(${callee}?{${key}:${className}}:${callee}())`);
432
- }
433
- for (const call of extracted.themeCalls) {
434
- const scope = (name) => ({ className: emitted.vars[name] });
435
- const props = (() => {
436
- if (call.variableSet)
437
- return '{}';
438
- if (!call.members)
439
- return `{className:${JSON.stringify(emitted.vars[call.name])}}`;
440
- const script = extracted.themeScripts?.includes(call.name);
441
- const root = extracted.themeAppearances?.includes(call.name);
442
- if (script || root)
443
- usesAppearance = true;
444
- // Helpers are emitted only when referenced; both share the configured storage key.
445
- const storage = call.options?.storageKey;
446
- const helpers = (entries, defaultTheme) => {
447
- const scriptOptions = storage
448
- ? `,${JSON.stringify({ storageKey: storage })}`
449
- : '';
450
- const rootOptions = storage || defaultTheme
451
- ? `,${JSON.stringify({ ...(defaultTheme ? { defaultVars: defaultTheme } : {}), ...(storage ? { storageKey: storage } : {}) })}`
452
- : '';
453
- return `${root ? `appearance:${appearance}.root(${entries}${rootOptions}),` : ''}${script ? `script:${appearance}.create(${entries}${scriptOptions}),` : ''}`;
454
- };
455
- if (call.variableConfig) {
456
- const selected = extracted.themeSelections?.includes(call.name) ||
457
- Object.values(extracted.themeExports ?? {}).some((link) => link.call.name === call.name &&
458
- link.kind === 'config' &&
459
- !link.call.initialization &&
460
- !link.call.root);
461
- const entries = call.options?.themes
462
- ? Object.entries(call.members)
463
- .filter(([key]) => {
464
- const path = JSON.parse(key);
465
- return path[0] === 'themes' && path.length === 2;
466
- })
467
- .map(([key, name]) => [
468
- JSON.parse(key)[1],
469
- emitted.vars[name],
470
- ])
471
- : [['default', emitted.vars[call.name]]];
472
- const fallback = call.options?.defaultTheme ?? 'default';
473
- if (!selected)
474
- return `{${helpers(JSON.stringify(call.options?.themes ? entries : []), call.options?.themes ? String(fallback) : undefined).replace(/,$/, '')}}`;
475
- usesSelection = true;
476
- const selector = `${selection}.create(${JSON.stringify(entries)},${call.options?.output === 'html'},'set',${JSON.stringify(fallback)})`;
477
- // Rollup drops required selectors when a pure call initializes a destructured object property.
478
- return `{${helpers(JSON.stringify(call.options?.themes ? entries : []), call.options?.themes ? String(fallback) : undefined)}vars:${selector}}`;
479
- }
480
- if (call.options?.themes) {
481
- const catalog = Object.fromEntries(Object.entries(call.members)
482
- .filter(([key]) => JSON.parse(key).length === 2)
483
- .map(([key, name]) => [
484
- JSON.parse(key)[1],
485
- emitted.vars[name],
486
- ]));
487
- const entries = JSON.stringify(Object.entries(catalog));
488
- const defaultTheme = typeof call.options.defaultTheme === 'string'
489
- ? call.options.defaultTheme
490
- : undefined;
491
- if (unusedSelections.has(call.start))
492
- return `{${helpers(entries, defaultTheme)}theme:${JSON.stringify(scope(call.members['["theme"]']))}}`;
493
- usesSelection = true;
494
- return `{${helpers(entries, defaultTheme)}theme:${JSON.stringify(scope(call.members['["theme"]']))},themes:/*#__PURE__*/${selection}.create(${entries},${call.options.output === 'html'})}`;
495
- }
496
- if (Object.hasOwn(call.members, '["theme"]'))
497
- return `{${helpers('[]')}theme:${JSON.stringify(scope(call.members['["theme"]']))}}`;
498
- return script || root ? `{${helpers('[]').slice(0, -1)}}` : '{}';
499
- })();
500
- const assertion = /\.[cm]?tsx?$/.test(options.moduleId)
501
- ? ` as ${call.type ?? `import('zyzz').Vars.Definition<${call.tokenType}>`}`
502
- : '';
503
- module.overwrite(call.start, call.end, `(${props}${assertion})`);
504
- }
505
- for (const alias of extracted.themeAliases) {
506
- if (alias.retained) {
507
- if (/\.[cm]?tsx?$/.test(options.moduleId))
508
- module.overwrite(alias.start, alias.end, `(${options.source.slice(alias.start, alias.end)} as ${alias.type ?? `import('zyzz').Vars.Definition<${alias.tokenType}>`})`);
509
- continue;
510
- }
511
- const member = alias.recipe ? 'variants' : 'style';
512
- const members = [...new Set(alias.bindings ?? [member])];
513
- const value = alias.destructured
514
- ? `{${members.map((member) => `${member}:undefined`).join(',')}}`
515
- : 'undefined';
516
- const type = alias.type ?? `import('zyzz').Vars.Definition<${alias.tokenType}>`;
517
- const assertion = /\.[cm]?tsx?$/.test(options.moduleId)
518
- ? ` as unknown as ${alias.destructured ? `{${members.map((member) => `readonly ${member}:${type}['${member}']`).join(';')}}` : `${type}['${member}']`}`
519
- : '';
520
- module.overwrite(alias.start, alias.end, `(${value}${assertion})`);
521
- }
522
- const replacements = [
523
- ...extracted.calls.map((call) => ({
524
- end: applications.get(call.start).end,
525
- start: call.start,
526
- })),
527
- ...(extracted.contributionCalls ?? []),
528
- ...(extracted.variableCalls ?? []),
529
- ...extracted.themeAliases,
530
- ...extracted.themeCalls,
531
- ].sort((a, b) => a.start - b.start);
532
- function replaced(reference) {
533
- let low = 0;
534
- let high = replacements.length;
535
- while (low < high) {
536
- const middle = (low + high) >>> 1;
537
- if (replacements[middle].start <= reference.start)
538
- low = middle + 1;
539
- else
540
- high = middle;
541
- }
542
- const call = replacements[low - 1];
543
- return call !== undefined && reference.end <= call.end;
544
- }
545
- for (const reference of extracted.staticThemeReferences ?? [])
546
- if (!replaced(reference))
547
- module.overwrite(reference.start, reference.end, JSON.stringify(reference.value));
548
- for (const reference of extracted.themeReferences)
549
- if (!replaced(reference))
550
- module.overwrite(reference.start, reference.end, JSON.stringify(emitted.vars[reference.name]));
551
- replacements.push(...extracted.themeReferences, ...(extracted.staticThemeReferences ?? []));
552
- replacements.sort((a, b) => a.start - b.start);
553
- for (const node of program.body) {
554
- if (node.type !== 'ImportDeclaration' ||
555
- !['zyzz', 'zyzz/web'].includes(node.source.value))
556
- continue;
557
- const removed = new Set();
558
- for (const specifier of node.specifiers) {
559
- if (node.importKind === 'type' ||
560
- specifier.type !== 'ImportSpecifier' ||
561
- specifier.importKind === 'type' ||
562
- !(node.source.value === 'zyzz'
563
- ? [
564
- 'Config',
565
- 'cx',
566
- 'defineConfig',
567
- 'defineVars',
568
- 'extendVars',
569
- 'style',
570
- 'Vars',
571
- 'variable',
572
- 'variants',
573
- ]
574
- : [
575
- 'Css',
576
- 'cssFunction',
577
- 'customMedia',
578
- 'importCss',
579
- 'namespace',
580
- 'colorProfile',
581
- 'counterStyle',
582
- 'fontPaletteValues',
583
- 'fontFeatureValues',
584
- 'page',
585
- 'property',
586
- 'viewTransition',
587
- 'global',
588
- 'fontFace',
589
- 'keyframes',
590
- 'layers',
591
- 'positionTry',
592
- ]).includes(specifier.imported.type === 'Identifier'
593
- ? specifier.imported.name
594
- : specifier.imported.value))
595
- continue;
596
- // Conservative retention also protects type queries and shadowed references.
597
- const remaining = identifiers
598
- .get(specifier.local.name)
599
- ?.some((reference) => !(reference.start >= node.start && reference.end <= node.end) &&
600
- !replaced(reference));
601
- if (!remaining)
602
- removed.add(specifier);
603
- }
604
- if (!removed.size)
605
- continue;
606
- const retained = node.specifiers.filter((specifier) => !removed.has(specifier));
607
- if (!retained.length)
608
- module.remove(node.start, node.end);
609
- else if (retained.every((specifier) => specifier.type !== 'ImportSpecifier')) {
610
- module.overwrite(node.start, node.source.start, `import ${retained.map((specifier) => options.source.slice(specifier.start, specifier.end)).join(', ')} from `);
611
- }
612
- else {
613
- // Preserve the import source, attributes, and untouched specifier spelling.
614
- for (let index = 0; index < node.specifiers.length; index++) {
615
- const specifier = node.specifiers[index];
616
- if (!removed.has(specifier))
617
- continue;
618
- const next = node.specifiers[index + 1];
619
- const previous = node.specifiers[index - 1];
620
- if (next)
621
- module.remove(specifier.start, next.start);
622
- else if (previous)
623
- module.remove(previous.end, specifier.end);
624
- }
625
- }
626
- }
627
- if (callable ||
628
- usesRecipe ||
629
- usesComposition ||
630
- usesCompositionHtml ||
631
- usesConditionalRecipe ||
632
- usesPayloadRecipe ||
633
- usesHtml ||
634
- usesSelection ||
635
- usesAppearance ||
636
- extracted.variableCalls?.length) {
637
- // Insertion after a hashbang keeps executable module syntax intact.
638
- let offset = options.source.startsWith('#!')
639
- ? options.source.indexOf('\n') + 1
640
- : 0;
641
- for (const node of program.body) {
642
- if (node.type !== 'ExpressionStatement' || !node.directive)
643
- break;
644
- offset = node.end;
645
- }
646
- if (compositions.length)
647
- module.appendLeft(offset, '\n' + compositions.join('\n') + '\n');
648
- module.appendLeft(offset, `\nimport { ${[usesAppearance ? `Appearance as ${appearance}` : '', usesComposition ? `Composition as ${composition}` : '', usesCompositionHtml ? `CompositionHtml as ${compositionHtml}` : '', usesConditionalRecipe ? `ConditionalRecipe as ${conditionalRecipe}` : '', usesHtml ? `Html as ${html}` : '', usesPayloadRecipe ? `PayloadRecipe as ${payloadRecipe}` : '', callable ? `Props as ${runtime}` : '', usesRecipe ? `Recipe as ${recipe}` : '', usesSelection ? `Selection as ${selection}` : '', extracted.variableCalls?.length ? `Variable as ${variables}` : ''].filter(Boolean).join(', ')} } from 'zyzz/runtime';\n`);
649
- }
650
- const cssMap = new Mapping.GenMapping({ file: `${options.moduleId}.css` });
651
- Mapping.setSourceContent(cssMap, options.moduleId, options.source);
652
- const lines = [0];
653
- for (let index = 0; index < options.source.length; index++)
654
- if (options.source[index] === '\n')
655
- lines.push(index + 1);
656
- function position(offset) {
657
- let low = 0;
658
- let high = lines.length;
659
- while (low + 1 < high) {
660
- const middle = (low + high) >>> 1;
661
- if (lines[middle] <= offset)
662
- low = middle;
663
- else
664
- high = middle;
665
- }
666
- return { column: offset - lines[low], line: low + 1 };
667
- }
668
- const owners = new Map();
669
- for (const call of extracted.calls)
670
- for (const name of emitted.classes[call.name].split(' '))
671
- if (!owners.has(name))
672
- owners.set(name, call);
673
- const styles = new Map(extracted.styles.styles.map((style) => [style.name, style]));
674
- const themeOwners = new Map(extracted.themeCalls.flatMap((call) => [...new Set([call.name, ...Object.values(call.members ?? {})])].map((name) => [emitted.vars[name], { ...call, name }])));
675
- const linkedOwners = new Map(Object.entries(options[Themes.context]?.owners ?? {}).map(([key, owner]) => [emitted.vars[key], owner]));
676
- // Literal and scalar-theme rules each occupy one line at this boundary.
677
- const prefix = emitted.contributionCss ?? '';
678
- const contributions = (extracted.contributions ?? []).map((definition, index) => ({
679
- definition,
680
- start: extracted.contributionStarts?.[index],
681
- }));
682
- const rank = (kind) => kind === 'import' ? 0 : kind === 'namespace' ? 1 : 2;
683
- const layered = contributions.find((value) => value.definition.kind === 'layers' && value.definition.names.length > 0);
684
- let contributionLine = 1;
685
- if (layered) {
686
- if (layered.start !== undefined)
687
- Mapping.addMapping(cssMap, {
688
- generated: { line: contributionLine, column: 0 },
689
- original: position(layered.start),
690
- source: options.moduleId,
691
- });
692
- contributionLine++;
693
- }
694
- for (const contribution of contributions.toSorted((a, b) => rank(a.definition.kind) - rank(b.definition.kind))) {
695
- if (contribution.definition.kind === 'layers')
696
- continue;
697
- const rendered = Css.compile({
698
- styles: { styles: [] },
699
- contributions: [contribution.definition],
700
- vars: Object.keys(extracted.vars).length ? extracted.vars : undefined,
701
- }).contributionCss ?? '';
702
- if (!rendered)
703
- continue;
704
- for (const _ of rendered.split('\n')) {
705
- if (contribution.start !== undefined)
706
- Mapping.addMapping(cssMap, {
707
- generated: { line: contributionLine, column: 0 },
708
- original: position(contribution.start),
709
- source: options.moduleId,
710
- });
711
- contributionLine++;
712
- }
713
- }
714
- const declarationOwners = new Map();
715
- const scoped = emitted.scopedCss ?? emitted.css;
716
- const css = [
717
- prefix,
718
- (scoped ? scoped.split('\n') : [])
719
- .map((rule, index) => {
720
- const line = index + 1 + (prefix ? prefix.split('\n').length : 0);
721
- const openers = new Map();
722
- const conditionStarts = declarationStarts(rule, true, openers);
723
- const selectorStart = conditionStarts.find((start) => rule[start] === '.') ?? 0;
724
- const brace = openers.get(selectorStart) ?? rule.indexOf('{');
725
- const name = rule
726
- .slice(selectorStart + 1, brace)
727
- .replace(/\\([0-9a-f]+) ?/gi, (_, code) => String.fromCodePoint(Number.parseInt(code, 16)));
728
- const linkedOwner = linkedOwners.get(name);
729
- if (linkedOwner) {
730
- const lines = linkedOwner.source
731
- .slice(0, linkedOwner.call.start)
732
- .split('\n');
733
- Mapping.setSourceContent(cssMap, linkedOwner.moduleId, linkedOwner.source);
734
- Mapping.addMapping(cssMap, {
735
- generated: { column: 0, line },
736
- name: linkedOwner.call.name,
737
- original: { line: lines.length, column: lines.at(-1).length },
738
- source: linkedOwner.moduleId,
739
- });
740
- return rule;
741
- }
742
- const themeOwner = themeOwners.get(name);
743
- if (themeOwner) {
744
- Mapping.addMapping(cssMap, {
745
- generated: { column: 0, line },
746
- name: themeOwner.name,
747
- original: position(themeOwner.start),
748
- source: options.moduleId,
749
- });
750
- return rule;
751
- }
752
- if (Object.values(emitted.vars).includes(name)) {
753
- // Packed theme declarations have no authored source in this graph.
754
- Mapping.addMapping(cssMap, { generated: { column: 0, line } });
755
- return rule;
756
- }
757
- if (Object.values(Scheme.classes).includes(name)) {
758
- // Scheme selection rules accompany the scopes and have no authored source.
759
- Mapping.addMapping(cssMap, { generated: { column: 0, line } });
760
- return rule;
761
- }
762
- if (rule.startsWith(':root{') ||
763
- rule.startsWith(':where(*){--z-') ||
764
- (rule.startsWith('@media ') &&
765
- (rule.includes(':root{') ||
766
- rule.includes(':where(*){--z-') ||
767
- Object.values(emitted.vars).some((name) => rule.includes(`.${name}{`))))) {
768
- Mapping.addMapping(cssMap, { generated: { column: 0, line } });
769
- return rule;
770
- }
771
- const selector = `.${ClassName.selector(name)}`;
772
- const call = owners.get(name);
773
- Mapping.addMapping(cssMap, {
774
- generated: { column: selectorStart, line },
775
- name: call.name,
776
- original: position(call.start),
777
- source: options.moduleId,
778
- });
779
- const body = rule.slice(brace);
780
- const style = styles.get(call.name);
781
- function declarations(style) {
782
- return style.rules
783
- ? style.rules.flatMap((rule) => declarations(rule.style))
784
- : style.declarations;
785
- }
786
- const conditionNodes = [];
787
- function locations(node) {
788
- return node.properties.flatMap((property) => {
789
- if (property.type !== 'Property')
790
- return [];
791
- const value = Expression.unwrap(property.value);
792
- if (value.type === 'ObjectExpression') {
793
- const key = property.key.type === 'Identifier'
794
- ? property.key.name
795
- : property.key.type === 'Literal'
796
- ? property.key.value
797
- : undefined;
798
- if (key !== 'selectors')
799
- conditionNodes.push(property);
800
- return locations(value);
801
- }
802
- const key = property.key.type === 'Identifier'
803
- ? property.key.name
804
- : property.key.type === 'Literal'
805
- ? String(property.key.value)
806
- : '';
807
- if (key === 'typography' && call.typography?.has(property.start)) {
808
- conditionNodes.push(...Array.from({ length: call.typographyQueries?.get(property.start) ?? 0 }, () => property));
809
- return Array.from({ length: call.typography.get(property.start) }, () => property);
810
- }
811
- const authoredLocations = value.type === 'ArrayExpression'
812
- ? value.elements.filter((node) => node !== null)
813
- : [property];
814
- return (call.shorthands?.[key] ?? [key]).flatMap(() => authoredLocations);
815
- });
816
- }
817
- const ordered = declarations(style);
818
- const authored = locations(call.body ?? definitions.get(call.start));
819
- const conditions = [];
820
- function collectConditions(style) {
821
- for (const rule of style.rules ?? []) {
822
- if (rule.condition !== undefined)
823
- conditions.push(rule.condition);
824
- collectConditions(rule.style);
825
- }
826
- }
827
- collectConditions(style);
828
- const mappedConditions = new Set();
829
- for (const start of conditionStarts) {
830
- const condition = rule.slice(start, openers.get(start));
831
- const index = conditions.findIndex((value, index) => value === condition && !mappedConditions.has(index));
832
- const node = conditionNodes[index];
833
- if (!node)
834
- continue;
835
- mappedConditions.add(index);
836
- Mapping.addMapping(cssMap, {
837
- generated: {
838
- column: start +
839
- (start > brace ? selector.length - (brace - selectorStart) : 0),
840
- line,
841
- },
842
- name: options.source.slice(node.key.start, node.key.end),
843
- original: position(node.key.start),
844
- source: options.moduleId,
845
- });
846
- }
847
- const starts = declarationStarts(body);
848
- const used = declarationOwners.get(call.name) ?? new Set();
849
- declarationOwners.set(call.name, used);
850
- let cursor = 1;
851
- for (let propertyIndex = 0; propertyIndex < ordered.length; propertyIndex++) {
852
- if (used.has(propertyIndex))
853
- continue;
854
- const declaration = ordered[propertyIndex];
855
- const text = `${declaration.property.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}:`;
856
- const start = starts.find((start) => start >= cursor && body.startsWith(text, start)) ?? -1;
857
- if (start < 0)
858
- continue;
859
- const location = authored[propertyIndex];
860
- used.add(propertyIndex);
861
- Mapping.addMapping(cssMap, {
862
- generated: {
863
- column: selectorStart + selector.length + start,
864
- line,
865
- },
866
- name: declaration.property,
867
- original: position(location.start),
868
- source: options.moduleId,
869
- });
870
- cursor = start + text.length;
871
- }
872
- return rule.slice(0, selectorStart) + selector + body;
873
- })
874
- .join('\n'),
875
- ]
876
- .filter(Boolean)
877
- .join('\n');
878
- const map = (portable ? new MagicString(options.source) : module).generateMap({
879
- hires: true,
880
- includeContent: true,
881
- source: options.moduleId,
882
- });
883
- const namespaced = Namespaces.rewrite(css, extracted.namespaces ?? [], Mapping.toEncodedMap(cssMap), true);
884
- const result = {
885
- ...(emitted[ThemeRules.shared]
886
- ? { [ThemeRules.shared]: emitted[ThemeRules.shared] }
887
- : {}),
888
- [ClassName.rules]: emitted[ClassName.rules],
889
- [ClassName.units]: emitted[ClassName.units],
890
- classes,
891
- code: portable ? options.source : module.toString(),
892
- css: namespaced.css,
893
- cssMap: namespaced.map ?? Mapping.toEncodedMap(cssMap),
894
- map: {
895
- file: options.moduleId,
896
- mappings: map.mappings,
897
- names: map.names,
898
- sources: map.sources,
899
- sourcesContent: map.sourcesContent,
900
- version: 3,
901
- },
902
- vars: emitted.vars,
24
+ development: options.development,
25
+ moduleId: options.moduleId,
26
+ schemes: options.schemes,
27
+ shared: options[ThemeRules.shared],
28
+ target: options.target,
903
29
  };
904
- Object.defineProperty(result, ClassName.rules, { enumerable: false });
905
- Object.defineProperty(result, ClassName.units, { enumerable: false });
906
- return Object.freeze(result);
907
- }
908
- /** Locates emitted declarations while skipping selectors, conditions, and quoted CSS data. */
909
- function declarationStarts(body, conditions = false, openers) {
910
- const starts = [];
911
- let start = 0;
912
- let depth = 0;
913
- let blocks = 0;
914
- let custom = false;
915
- let quote = '';
916
- for (let index = 0; index < body.length; index++) {
917
- const char = body[index];
918
- if (char === '\\') {
919
- index++;
920
- continue;
921
- }
922
- if (quote) {
923
- if (char === quote)
924
- quote = '';
925
- continue;
926
- }
927
- if (char === '"' || char === "'") {
928
- quote = char;
929
- continue;
930
- }
931
- if (char === '/' && body[index + 1] === '*') {
932
- const end = body.indexOf('*/', index + 2);
933
- if (end < 0)
934
- break;
935
- index = end + 1;
936
- continue;
937
- }
938
- if (char === '(' || char === '[') {
939
- depth++;
940
- continue;
941
- }
942
- if (char === ')' || char === ']') {
943
- depth--;
944
- continue;
945
- }
946
- if (depth)
947
- continue;
948
- if (char === ':' && body.slice(start, index).trimStart().startsWith('--'))
949
- custom = true;
950
- if (char === '{') {
951
- if (custom)
952
- blocks++;
953
- else {
954
- if (conditions && index > start) {
955
- starts.push(start);
956
- openers?.set(start, index);
957
- }
958
- start = index + 1;
959
- }
960
- }
961
- else if (char === '}') {
962
- if (blocks)
963
- blocks--;
964
- else {
965
- start = index + 1;
966
- custom = false;
967
- }
968
- }
969
- else if (char === ';' && !blocks) {
970
- while (/\s/.test(body[start] ?? '') && start < index)
971
- start++;
972
- if (!conditions)
973
- starts.push(start);
974
- start = index + 1;
975
- custom = false;
976
- }
977
- }
978
- return starts;
30
+ // Untyped callers can pass other values, which the engine reads from JSON as before.
31
+ if (typeof options.source !== 'string')
32
+ return Results.transform({ ...input, source: options.source });
33
+ return Results.transform(input, options.source);
979
34
  }
980
35
  //# sourceMappingURL=Transform.js.map