@elastic/distillate 0.0.0 → 0.2.0

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 (292) hide show
  1. package/LICENSE.txt +93 -0
  2. package/NOTICE.txt +30 -0
  3. package/README.md +142 -0
  4. package/THIRD_PARTY_LICENSES.md +768 -0
  5. package/dist/cjs/collector.js +491 -0
  6. package/dist/cjs/collector.js.map +1 -0
  7. package/dist/cjs/css_scan.js +186 -0
  8. package/dist/cjs/css_scan.js.map +1 -0
  9. package/dist/cjs/dom_sink.js +40 -0
  10. package/dist/cjs/dom_sink.js.map +1 -0
  11. package/dist/cjs/emotion.js +189 -0
  12. package/dist/cjs/emotion.js.map +1 -0
  13. package/dist/cjs/engine.js +95 -0
  14. package/dist/cjs/engine.js.map +1 -0
  15. package/dist/cjs/environment.js +9 -0
  16. package/dist/cjs/environment.js.map +1 -0
  17. package/dist/cjs/hash.js +86 -0
  18. package/dist/cjs/hash.js.map +1 -0
  19. package/dist/cjs/idents.js +23 -0
  20. package/dist/cjs/idents.js.map +1 -0
  21. package/dist/cjs/index.js +44 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/instance.js +34 -0
  24. package/dist/cjs/instance.js.map +1 -0
  25. package/dist/cjs/local_vars.js +100 -0
  26. package/dist/cjs/local_vars.js.map +1 -0
  27. package/dist/cjs/minify.js +77 -0
  28. package/dist/cjs/minify.js.map +1 -0
  29. package/dist/cjs/names.js +77 -0
  30. package/dist/cjs/names.js.map +1 -0
  31. package/dist/cjs/nesting.js +406 -0
  32. package/dist/cjs/nesting.js.map +1 -0
  33. package/dist/cjs/package.json +3 -0
  34. package/dist/cjs/runtime.js +257 -0
  35. package/dist/cjs/runtime.js.map +1 -0
  36. package/dist/cjs/sink.js +9 -0
  37. package/dist/cjs/sink.js.map +1 -0
  38. package/dist/cjs/styles/authoring.js +169 -0
  39. package/dist/cjs/styles/authoring.js.map +1 -0
  40. package/dist/cjs/styles/declarations.js +139 -0
  41. package/dist/cjs/styles/declarations.js.map +1 -0
  42. package/dist/cjs/styles/index.js +32 -0
  43. package/dist/cjs/styles/index.js.map +1 -0
  44. package/dist/cjs/styles/module.js +233 -0
  45. package/dist/cjs/styles/module.js.map +1 -0
  46. package/dist/cjs/styles/registry.js +187 -0
  47. package/dist/cjs/styles/registry.js.map +1 -0
  48. package/dist/cjs/styles/types.js +9 -0
  49. package/dist/cjs/styles/types.js.map +1 -0
  50. package/dist/cjs/testing.js +37 -0
  51. package/dist/cjs/testing.js.map +1 -0
  52. package/dist/cjs/theme.js +249 -0
  53. package/dist/cjs/theme.js.map +1 -0
  54. package/dist/cjs/tokens/contextual_var.js +39 -0
  55. package/dist/cjs/tokens/contextual_var.js.map +1 -0
  56. package/dist/cjs/tokens/index.js +24 -0
  57. package/dist/cjs/tokens/index.js.map +1 -0
  58. package/dist/cjs/tokens/kind.js +14 -0
  59. package/dist/cjs/tokens/kind.js.map +1 -0
  60. package/dist/cjs/tokens/light_dark.js +42 -0
  61. package/dist/cjs/tokens/light_dark.js.map +1 -0
  62. package/dist/cjs/tokens/scale_token.js +28 -0
  63. package/dist/cjs/tokens/scale_token.js.map +1 -0
  64. package/dist/cjs/tokens/theme_token.js +28 -0
  65. package/dist/cjs/tokens/theme_token.js.map +1 -0
  66. package/dist/cjs/var_invariant.js +115 -0
  67. package/dist/cjs/var_invariant.js.map +1 -0
  68. package/dist/collector.d.ts +101 -0
  69. package/dist/collector.d.ts.map +1 -0
  70. package/dist/collector.js +487 -0
  71. package/dist/collector.js.map +1 -0
  72. package/dist/css_scan.d.ts +57 -0
  73. package/dist/css_scan.d.ts.map +1 -0
  74. package/dist/css_scan.js +180 -0
  75. package/dist/css_scan.js.map +1 -0
  76. package/dist/dom_sink.d.ts +23 -0
  77. package/dist/dom_sink.d.ts.map +1 -0
  78. package/dist/dom_sink.js +36 -0
  79. package/dist/dom_sink.js.map +1 -0
  80. package/dist/emotion.d.ts +44 -0
  81. package/dist/emotion.d.ts.map +1 -0
  82. package/dist/emotion.js +184 -0
  83. package/dist/emotion.js.map +1 -0
  84. package/dist/engine.d.ts +66 -0
  85. package/dist/engine.d.ts.map +1 -0
  86. package/dist/engine.js +91 -0
  87. package/dist/engine.js.map +1 -0
  88. package/dist/environment.d.ts +43 -0
  89. package/dist/environment.d.ts.map +1 -0
  90. package/dist/environment.js +8 -0
  91. package/dist/environment.js.map +1 -0
  92. package/dist/hash.d.ts +2 -0
  93. package/dist/hash.d.ts.map +1 -0
  94. package/dist/hash.js +82 -0
  95. package/dist/hash.js.map +1 -0
  96. package/dist/idents.d.ts +9 -0
  97. package/dist/idents.d.ts.map +1 -0
  98. package/dist/idents.js +19 -0
  99. package/dist/idents.js.map +1 -0
  100. package/dist/index.d.ts +11 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +15 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/instance.d.ts +16 -0
  105. package/dist/instance.d.ts.map +1 -0
  106. package/dist/instance.js +30 -0
  107. package/dist/instance.js.map +1 -0
  108. package/dist/local_vars.d.ts +75 -0
  109. package/dist/local_vars.d.ts.map +1 -0
  110. package/dist/local_vars.js +92 -0
  111. package/dist/local_vars.js.map +1 -0
  112. package/dist/minify.d.ts +11 -0
  113. package/dist/minify.d.ts.map +1 -0
  114. package/dist/minify.js +73 -0
  115. package/dist/minify.js.map +1 -0
  116. package/dist/names.d.ts +39 -0
  117. package/dist/names.d.ts.map +1 -0
  118. package/dist/names.js +70 -0
  119. package/dist/names.js.map +1 -0
  120. package/dist/nesting.d.ts +59 -0
  121. package/dist/nesting.d.ts.map +1 -0
  122. package/dist/nesting.js +400 -0
  123. package/dist/nesting.js.map +1 -0
  124. package/dist/runtime.d.ts +36 -0
  125. package/dist/runtime.d.ts.map +1 -0
  126. package/dist/runtime.js +252 -0
  127. package/dist/runtime.js.map +1 -0
  128. package/dist/sink.d.ts +16 -0
  129. package/dist/sink.d.ts.map +1 -0
  130. package/dist/sink.js +8 -0
  131. package/dist/sink.js.map +1 -0
  132. package/dist/styles/authoring.d.ts +59 -0
  133. package/dist/styles/authoring.d.ts.map +1 -0
  134. package/dist/styles/authoring.js +155 -0
  135. package/dist/styles/authoring.js.map +1 -0
  136. package/dist/styles/declarations.d.ts +10 -0
  137. package/dist/styles/declarations.d.ts.map +1 -0
  138. package/dist/styles/declarations.js +132 -0
  139. package/dist/styles/declarations.js.map +1 -0
  140. package/dist/styles/index.d.ts +7 -0
  141. package/dist/styles/index.d.ts.map +1 -0
  142. package/dist/styles/index.js +12 -0
  143. package/dist/styles/index.js.map +1 -0
  144. package/dist/styles/module.d.ts +5 -0
  145. package/dist/styles/module.d.ts.map +1 -0
  146. package/dist/styles/module.js +229 -0
  147. package/dist/styles/module.js.map +1 -0
  148. package/dist/styles/registry.d.ts +48 -0
  149. package/dist/styles/registry.d.ts.map +1 -0
  150. package/dist/styles/registry.js +182 -0
  151. package/dist/styles/registry.js.map +1 -0
  152. package/dist/styles/types.d.ts +211 -0
  153. package/dist/styles/types.d.ts.map +1 -0
  154. package/dist/styles/types.js +8 -0
  155. package/dist/styles/types.js.map +1 -0
  156. package/dist/testing.d.ts +10 -0
  157. package/dist/testing.d.ts.map +1 -0
  158. package/dist/testing.js +31 -0
  159. package/dist/testing.js.map +1 -0
  160. package/dist/theme.d.ts +85 -0
  161. package/dist/theme.d.ts.map +1 -0
  162. package/dist/theme.js +240 -0
  163. package/dist/theme.js.map +1 -0
  164. package/dist/tokens/contextual_var.d.ts +35 -0
  165. package/dist/tokens/contextual_var.d.ts.map +1 -0
  166. package/dist/tokens/contextual_var.js +33 -0
  167. package/dist/tokens/contextual_var.js.map +1 -0
  168. package/dist/tokens/index.d.ts +5 -0
  169. package/dist/tokens/index.d.ts.map +1 -0
  170. package/dist/tokens/index.js +11 -0
  171. package/dist/tokens/index.js.map +1 -0
  172. package/dist/tokens/kind.d.ts +2 -0
  173. package/dist/tokens/kind.d.ts.map +1 -0
  174. package/dist/tokens/kind.js +10 -0
  175. package/dist/tokens/kind.js.map +1 -0
  176. package/dist/tokens/light_dark.d.ts +20 -0
  177. package/dist/tokens/light_dark.d.ts.map +1 -0
  178. package/dist/tokens/light_dark.js +37 -0
  179. package/dist/tokens/light_dark.js.map +1 -0
  180. package/dist/tokens/scale_token.d.ts +20 -0
  181. package/dist/tokens/scale_token.d.ts.map +1 -0
  182. package/dist/tokens/scale_token.js +23 -0
  183. package/dist/tokens/scale_token.js.map +1 -0
  184. package/dist/tokens/theme_token.d.ts +20 -0
  185. package/dist/tokens/theme_token.d.ts.map +1 -0
  186. package/dist/tokens/theme_token.js +23 -0
  187. package/dist/tokens/theme_token.js.map +1 -0
  188. package/dist/var_invariant.d.ts +25 -0
  189. package/dist/var_invariant.d.ts.map +1 -0
  190. package/dist/var_invariant.js +108 -0
  191. package/dist/var_invariant.js.map +1 -0
  192. package/docs/concepts/authoring.md +115 -0
  193. package/docs/concepts/collection.md +66 -0
  194. package/docs/concepts/distillery.md +47 -0
  195. package/docs/concepts/index.md +18 -0
  196. package/docs/concepts/naming-and-output.md +123 -0
  197. package/docs/concepts/ordering.md +61 -0
  198. package/docs/concepts/single-copy.md +103 -0
  199. package/docs/concepts/tokens.md +99 -0
  200. package/docs/docset.yml +53 -0
  201. package/docs/examples/01-stylesheet.ts +20 -0
  202. package/docs/examples/02-artifact.ts +26 -0
  203. package/docs/examples/03-variants.ts +40 -0
  204. package/docs/examples/04-emotion.ts +33 -0
  205. package/docs/examples/05-var-invariant.ts +31 -0
  206. package/docs/examples/06-payload.ts +85 -0
  207. package/docs/examples/fixture.ts +22 -0
  208. package/docs/getting-started/index.md +14 -0
  209. package/docs/getting-started/installation.md +30 -0
  210. package/docs/getting-started/quick-start.md +61 -0
  211. package/docs/getting-started/your-first-stylesheet.md +57 -0
  212. package/docs/guides/compact-artifacts.md +87 -0
  213. package/docs/guides/emotion-migration.md +60 -0
  214. package/docs/guides/index.md +17 -0
  215. package/docs/guides/name-collisions.md +37 -0
  216. package/docs/guides/non-css-surfaces.md +73 -0
  217. package/docs/guides/react-renderer.md +202 -0
  218. package/docs/guides/theming.md +107 -0
  219. package/docs/guides/var-invariant.md +24 -0
  220. package/docs/guides/vs-emotion.md +61 -0
  221. package/docs/index.md +73 -0
  222. package/docs/logo.svg +7 -0
  223. package/docs/playground/index.html +12 -0
  224. package/docs/playground/package.json +23 -0
  225. package/docs/playground/src/app/app.tsx +109 -0
  226. package/docs/playground/src/app/css_panel.tsx +119 -0
  227. package/docs/playground/src/app/editor_panel.tsx +87 -0
  228. package/docs/playground/src/app/index.ts +8 -0
  229. package/docs/playground/src/app/monaco_css_editor.tsx +84 -0
  230. package/docs/playground/src/app/monaco_source_editor.tsx +132 -0
  231. package/docs/playground/src/app/preview_panel.tsx +99 -0
  232. package/docs/playground/src/app/tokens_panel.tsx +117 -0
  233. package/docs/playground/src/app/types.ts +10 -0
  234. package/docs/playground/src/examples/snippets.test.ts +28 -0
  235. package/docs/playground/src/examples/snippets.ts +418 -0
  236. package/docs/playground/src/lib/compile.test.ts +157 -0
  237. package/docs/playground/src/lib/compile.ts +242 -0
  238. package/docs/playground/src/lib/demo_environment.test.ts +123 -0
  239. package/docs/playground/src/lib/demo_environment.ts +140 -0
  240. package/docs/playground/src/lib/editor_lib.test.ts +39 -0
  241. package/docs/playground/src/lib/editor_lib.ts +142 -0
  242. package/docs/playground/src/lib/format_css.test.ts +41 -0
  243. package/docs/playground/src/lib/format_css.ts +71 -0
  244. package/docs/playground/src/main.tsx +25 -0
  245. package/docs/playground/src/setup/chrome.test.ts +47 -0
  246. package/docs/playground/src/setup/chrome.ts +365 -0
  247. package/docs/playground/src/setup/monaco_env.ts +64 -0
  248. package/docs/playground/tsconfig.json +22 -0
  249. package/docs/playground/vite.config.ts +37 -0
  250. package/docs/playground/vitest.config.ts +35 -0
  251. package/docs/playground.md +28 -0
  252. package/docs/reference/api/emotion.md +290 -0
  253. package/docs/reference/api/index-1.md +2387 -0
  254. package/docs/reference/api/index.md +9 -0
  255. package/docs/reference/api/testing.md +92 -0
  256. package/docs/reference/api.md +12 -0
  257. package/docs/reference/entry-points.md +139 -0
  258. package/docs/reference/environment.md +60 -0
  259. package/docs/reference/index.md +11 -0
  260. package/docs/reference/okf-map.md +93 -0
  261. package/package.json +127 -4
  262. package/src/collector.ts +612 -0
  263. package/src/css_scan.ts +263 -0
  264. package/src/dom_sink.ts +64 -0
  265. package/src/emotion.ts +308 -0
  266. package/src/engine.ts +241 -0
  267. package/src/environment.ts +56 -0
  268. package/src/hash.ts +111 -0
  269. package/src/idents.ts +21 -0
  270. package/src/index.ts +106 -0
  271. package/src/instance.ts +49 -0
  272. package/src/local_vars.ts +220 -0
  273. package/src/minify.ts +87 -0
  274. package/src/names.ts +129 -0
  275. package/src/nesting.ts +596 -0
  276. package/src/runtime.ts +428 -0
  277. package/src/sink.ts +25 -0
  278. package/src/styles/authoring.ts +244 -0
  279. package/src/styles/declarations.ts +172 -0
  280. package/src/styles/index.ts +58 -0
  281. package/src/styles/module.ts +396 -0
  282. package/src/styles/registry.ts +261 -0
  283. package/src/styles/types.ts +283 -0
  284. package/src/testing.ts +48 -0
  285. package/src/theme.ts +454 -0
  286. package/src/tokens/contextual_var.ts +72 -0
  287. package/src/tokens/index.ts +17 -0
  288. package/src/tokens/kind.ts +13 -0
  289. package/src/tokens/light_dark.ts +58 -0
  290. package/src/tokens/scale_token.ts +41 -0
  291. package/src/tokens/theme_token.ts +42 -0
  292. package/src/var_invariant.ts +147 -0
@@ -0,0 +1,491 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.StylesCollector = void 0;
10
+ const local_vars_1 = require("./local_vars");
11
+ const names_1 = require("./names");
12
+ const declarations_1 = require("./styles/declarations");
13
+ const warnedHandles = new WeakSet();
14
+ const dependentEntriesCache = new WeakMap();
15
+ const dependentEntries = (module, handleKey) => {
16
+ let cached = dependentEntriesCache.get(module);
17
+ if (!cached) {
18
+ cached = new Map();
19
+ for (const entry of module.entries) {
20
+ if (entry.kind === 'rule') {
21
+ if (!entry.auto) {
22
+ continue;
23
+ }
24
+ for (const dep of entry.dependsOn) {
25
+ appendDependent(cached, dep, entry);
26
+ }
27
+ continue;
28
+ }
29
+ if (entry.kind === 'media') {
30
+ const deps = new Set();
31
+ for (const nested of entry.rules) {
32
+ if (!nested.auto) {
33
+ continue;
34
+ }
35
+ nested.dependsOn.forEach((key) => deps.add(key));
36
+ }
37
+ for (const dep of deps) {
38
+ appendDependent(cached, dep, entry);
39
+ }
40
+ }
41
+ }
42
+ dependentEntriesCache.set(module, cached);
43
+ }
44
+ return cached.get(handleKey) ?? [];
45
+ };
46
+ const appendDependent = (cache, key, entry) => {
47
+ const list = cache.get(key);
48
+ if (list) {
49
+ list.push(entry);
50
+ return;
51
+ }
52
+ cache.set(key, [entry]);
53
+ };
54
+ /** Reachable entries for one render or one stylesheet. */
55
+ class StylesCollector {
56
+ /** The target collection mode. */
57
+ target;
58
+ /** The naming mode (compact vs readable). */
59
+ names;
60
+ /** Associated registry. */
61
+ registry;
62
+ /** Emitted class name prefix. */
63
+ prefix;
64
+ dev;
65
+ warn;
66
+ entries = new Map();
67
+ handles = new Map();
68
+ themeDeps = new Set();
69
+ varDeps = new Set();
70
+ listeners = new Set();
71
+ depth = 0;
72
+ dirty = false;
73
+ constructor({ target, names, registry, prefix, dev = false, warn = (message) => console.warn(message), }) {
74
+ this.target = target;
75
+ this.names = names;
76
+ this.registry = registry;
77
+ this.prefix = prefix;
78
+ this.dev = dev;
79
+ this.warn = warn;
80
+ }
81
+ /**
82
+ * Collects a module's non-variant entries, or one explicit entry.
83
+ *
84
+ * Variant entries stay off this path; collect them via `useHandles`.
85
+ *
86
+ * @param value Module (all non-variant entries), a single entry, or an array of entries.
87
+ */
88
+ use(value) {
89
+ this.batch(() => this.useValue(value));
90
+ }
91
+ useValue(value) {
92
+ if (isReadonlyArray(value)) {
93
+ value.forEach((entry) => this.use(entry));
94
+ return;
95
+ }
96
+ if (isStylesModule(value)) {
97
+ // Aggregate deps from non-variant entries only. The module-level
98
+ // `themeDeps`/`varDeps` snapshot would also include variant entries'
99
+ // deps, which would push their var paths into the resolver's compact
100
+ // registry and steal short names from actually-rendered handles.
101
+ for (const entry of value.entries) {
102
+ if (entry.variant) {
103
+ continue;
104
+ }
105
+ if (entry.kind === 'handle' && !this.retainHandle(entry)) {
106
+ continue;
107
+ }
108
+ this.setEntry(entry);
109
+ if (entry.kind === 'handle' || entry.kind === 'rule') {
110
+ this.addDeclarationDeps(entry.declarations);
111
+ }
112
+ else {
113
+ for (const inner of entry.rules) {
114
+ this.addDeclarationDeps(inner.declarations);
115
+ }
116
+ }
117
+ }
118
+ for (const handle of value.handleList) {
119
+ if (handle.variant) {
120
+ continue;
121
+ }
122
+ if (!this.retainHandle(handle)) {
123
+ continue;
124
+ }
125
+ this.setHandle(handle);
126
+ }
127
+ return;
128
+ }
129
+ this.addEntry(value);
130
+ }
131
+ /**
132
+ * Collects every entry on `module`, including variants. Used by the stylesheet target.
133
+ *
134
+ * @param module Module whose entries should all be collected.
135
+ */
136
+ useAllEntries(module) {
137
+ this.batch(() => {
138
+ for (const entry of module.entries) {
139
+ if (entry.kind === 'handle' && !this.retainHandle(entry)) {
140
+ continue;
141
+ }
142
+ this.setEntry(entry);
143
+ }
144
+ for (const handle of module.handleList) {
145
+ if (!this.retainHandle(handle)) {
146
+ continue;
147
+ }
148
+ this.setHandle(handle);
149
+ }
150
+ this.addDeps(module.themeDeps, module.varDeps);
151
+ });
152
+ }
153
+ /**
154
+ * Collects handles and auto-includes rules whose selector deps are all present.
155
+ *
156
+ * Media blocks gain inner rules whose deps are met and keep rules already collected.
157
+ *
158
+ * @param handles Handles resolved during this render pass (e.g. from `resolveClassName`).
159
+ * @returns Handles that were retained. Empty untargeted handles are omitted in compact mode.
160
+ */
161
+ useHandles(handles) {
162
+ return this.batch(() => {
163
+ const retained = [];
164
+ for (const handle of handles) {
165
+ if (!this.retainHandle(handle)) {
166
+ continue;
167
+ }
168
+ retained.push(handle);
169
+ if (this.handles.has(handle.key)) {
170
+ continue;
171
+ }
172
+ this.setEntry(handle);
173
+ this.setHandle(handle);
174
+ this.addDeclarationDeps(handle.declarations);
175
+ }
176
+ for (const handle of retained) {
177
+ const module = this.registry.module(handle.moduleName);
178
+ if (!module) {
179
+ continue;
180
+ }
181
+ for (const dependent of dependentEntries(module, handle.key)) {
182
+ this.tryActivateDependent(dependent);
183
+ }
184
+ }
185
+ return retained;
186
+ });
187
+ }
188
+ /** Collects `auto` rules on `module` whose every selector dependency is already collected. */
189
+ useRulesWhenDepsMet(module) {
190
+ this.batch(() => {
191
+ for (const entry of module.entries) {
192
+ if (entry.kind !== 'rule') {
193
+ continue;
194
+ }
195
+ if (this.entries.has(entryKey(entry))) {
196
+ continue;
197
+ }
198
+ if (this.allDepsMet(entry.dependsOn)) {
199
+ this.addEntry(entry);
200
+ }
201
+ }
202
+ });
203
+ }
204
+ /**
205
+ * Calls `listener` after a public mutation adds an entry, handle, theme var, or contextual var.
206
+ *
207
+ * Fires at most once per outermost call; nested calls such as `use([a, b])` batch into it.
208
+ *
209
+ * @param listener Called with no arguments after the collection grows.
210
+ * @returns Unsubscribes `listener`.
211
+ */
212
+ subscribe(listener) {
213
+ this.listeners.add(listener);
214
+ return () => {
215
+ this.listeners.delete(listener);
216
+ };
217
+ }
218
+ tryActivateDependent(entry) {
219
+ if (entry.kind === 'rule') {
220
+ if (!entry.auto) {
221
+ return;
222
+ }
223
+ if (this.entries.has(entryKey(entry))) {
224
+ return;
225
+ }
226
+ if (!this.allDepsMet(entry.dependsOn)) {
227
+ return;
228
+ }
229
+ this.addEntry(entry);
230
+ return;
231
+ }
232
+ if (entry.kind === 'media') {
233
+ // Add newly live rules; keep rules already collected (e.g. by `use`).
234
+ const existing = this.entries.get(entryKey(entry));
235
+ const collected = new Set(existing?.kind === 'media' ? existing.rules : []);
236
+ const rules = entry.rules.filter((rule) => collected.has(rule) || (rule.auto && this.allDepsMet(rule.dependsOn)));
237
+ if (rules.length === collected.size) {
238
+ return;
239
+ }
240
+ const filtered = rules.length === entry.rules.length ? entry : { ...entry, rules };
241
+ this.setEntry(filtered);
242
+ for (const rule of rules) {
243
+ this.addDeclarationDeps(rule.declarations);
244
+ }
245
+ }
246
+ }
247
+ allDepsMet(dependsOn) {
248
+ for (const dep of dependsOn) {
249
+ if (!this.handles.has(dep)) {
250
+ return false;
251
+ }
252
+ }
253
+ return true;
254
+ }
255
+ /** Marks a theme token path as reachable so it appears in the emitted theme block, even if no collected declaration reads it. */
256
+ useThemeVar(path) {
257
+ this.batch(() => this.addDeps([path], []));
258
+ }
259
+ /** Creates a {@link StyleNameResolver} scoped to this collector's current dep set. */
260
+ createResolver() {
261
+ const finalized = this.finalizeDeps();
262
+ const snapshot = this.registry.freeze({
263
+ classKeys: this.names === 'compact'
264
+ ? [...this.handles.keys()]
265
+ : this.registry.classKeys,
266
+ cssVarKeys: cssVarKeysFrom(finalized),
267
+ });
268
+ return (0, names_1.createStyleNameResolver)({
269
+ names: this.names,
270
+ prefix: this.prefix,
271
+ classKeys: snapshot.classKeys,
272
+ cssVarKeys: snapshot.cssVarKeys,
273
+ });
274
+ }
275
+ /** Collected style entries sorted for emission (base rules before all `@media`/`@container` blocks). */
276
+ get collectedEntries() {
277
+ return [...this.entries.values()].sort(compareEntriesForEmission);
278
+ }
279
+ /** Theme token paths that survive reachability; emitted in the theme scope block. */
280
+ get collectedThemeDeps() {
281
+ return this.finalizeDeps().theme;
282
+ }
283
+ /** Contextual var paths that survive reachability; used by the runtime for compact-name substitution. */
284
+ get collectedVarDeps() {
285
+ return this.finalizeDeps().vars;
286
+ }
287
+ // Reachability-aware default-emission set used by the runtime. For a
288
+ // given handle and `${group}` site, returns the keys whose declarations
289
+ // should ship: union of group-keys appearing in `handle.declarations.deps.refs`
290
+ // and in `deps.refs` of every collected rule/media-inner-rule whose
291
+ // selector targets `handle`.
292
+ /**
293
+ * Returns the variable keys within `groupPath` that are reachable from `handle` or from any collected rule targeting it.
294
+ *
295
+ * @param handle Handle whose declaration refs and dependent rules are consulted.
296
+ * @param groupPath Group prefix path (e.g. `vars/chip/look`).
297
+ */
298
+ reachableDefaults(handle, groupPath) {
299
+ const groupPrefix = `${groupPath}/`;
300
+ const reachable = new Set();
301
+ const harvest = (refs) => {
302
+ for (const path of refs) {
303
+ if (path.startsWith(groupPrefix)) {
304
+ reachable.add(path.slice(groupPrefix.length));
305
+ }
306
+ }
307
+ };
308
+ harvest(handle.declarations.deps.refs);
309
+ for (const entry of this.entries.values()) {
310
+ if (entry.kind === 'rule') {
311
+ if (entry.dependsOn.has(handle.key)) {
312
+ harvest(entry.declarations.deps.refs);
313
+ }
314
+ continue;
315
+ }
316
+ if (entry.kind === 'media') {
317
+ for (const innerRule of entry.rules) {
318
+ if (innerRule.dependsOn.has(handle.key)) {
319
+ harvest(innerRule.declarations.deps.refs);
320
+ }
321
+ }
322
+ }
323
+ }
324
+ return reachable;
325
+ }
326
+ // Computes the final theme/var dep sets, folding in default-marker
327
+ // contributions only for keys that survive reachability. Called once per
328
+ // `createResolver()` and per `collectedThemeDeps`/`collectedVarDeps`
329
+ // access; collection mutations between calls re-derive the result.
330
+ finalizeDeps() {
331
+ const theme = new Set(this.themeDeps);
332
+ const vars = new Set(this.varDeps);
333
+ for (const handle of this.handles.values()) {
334
+ for (const group of handle.declarations.deps.defaults) {
335
+ const reachable = this.reachableDefaults(handle, group.groupPath);
336
+ for (const item of group.keys) {
337
+ if (!reachable.has(item.key)) {
338
+ continue;
339
+ }
340
+ vars.add(item.path);
341
+ item.valueDeps.theme.forEach((path) => theme.add(path));
342
+ item.valueDeps.vars.forEach((path) => vars.add(path));
343
+ }
344
+ }
345
+ }
346
+ // Default markers inside rule / media-inner-rule declarations don't have
347
+ // a host handle to anchor reachability against. The runtime emits every
348
+ // listed key when rendering such a declaration, so we mirror that here
349
+ // and include all of them in the registry.
350
+ for (const entry of this.entries.values()) {
351
+ if (entry.kind === 'rule') {
352
+ includeAllDefaults(entry.declarations.deps.defaults, theme, vars);
353
+ continue;
354
+ }
355
+ if (entry.kind === 'media') {
356
+ for (const inner of entry.rules) {
357
+ includeAllDefaults(inner.declarations.deps.defaults, theme, vars);
358
+ }
359
+ }
360
+ }
361
+ return { theme, vars };
362
+ }
363
+ retainHandle(handle) {
364
+ if (!(0, declarations_1.isEmptyDeclarations)(handle.declarations)) {
365
+ return true;
366
+ }
367
+ if (this.registry.targetsHandle(handle.key)) {
368
+ return true;
369
+ }
370
+ if (this.dev && !warnedHandles.has(handle)) {
371
+ warnedHandles.add(handle);
372
+ this.warn(`Style module "${handle.moduleName}" handle "${handle.localName}" has no declarations and no rule targets it; delete the empty template.`);
373
+ }
374
+ return this.names !== 'compact';
375
+ }
376
+ addEntry(entry) {
377
+ if (entry.kind === 'handle' && !this.retainHandle(entry)) {
378
+ return;
379
+ }
380
+ this.setEntry(entry);
381
+ if (entry.kind === 'handle') {
382
+ this.setHandle(entry);
383
+ this.addDeclarationDeps(entry.declarations);
384
+ return;
385
+ }
386
+ if (entry.kind === 'rule') {
387
+ this.addDeclarationDeps(entry.declarations);
388
+ return;
389
+ }
390
+ for (const rule of entry.rules) {
391
+ this.addDeclarationDeps(rule.declarations);
392
+ }
393
+ }
394
+ addDeclarationDeps(declarations) {
395
+ this.addDeps(declarations.deps.theme, declarations.deps.vars);
396
+ }
397
+ addDeps(theme, vars) {
398
+ const before = this.themeDeps.size + this.varDeps.size;
399
+ for (const path of theme) {
400
+ this.themeDeps.add(path);
401
+ }
402
+ for (const path of vars) {
403
+ this.varDeps.add(path);
404
+ }
405
+ if (this.themeDeps.size + this.varDeps.size !== before) {
406
+ this.dirty = true;
407
+ }
408
+ }
409
+ // A media entry changes when it gains inner rules.
410
+ setEntry(entry) {
411
+ const key = entryKey(entry);
412
+ const existing = this.entries.get(key);
413
+ this.entries.set(key, entry);
414
+ if (!existing ||
415
+ (existing.kind === 'media' &&
416
+ entry.kind === 'media' &&
417
+ existing.rules.length !== entry.rules.length)) {
418
+ this.dirty = true;
419
+ }
420
+ }
421
+ setHandle(handle) {
422
+ if (!this.handles.has(handle.key)) {
423
+ this.dirty = true;
424
+ }
425
+ this.handles.set(handle.key, handle);
426
+ }
427
+ // Listeners run once the outermost public mutation returns.
428
+ batch(mutate) {
429
+ this.depth += 1;
430
+ try {
431
+ return mutate();
432
+ }
433
+ finally {
434
+ this.depth -= 1;
435
+ if (this.depth === 0 && this.dirty) {
436
+ this.dirty = false;
437
+ for (const listener of [...this.listeners]) {
438
+ listener();
439
+ }
440
+ }
441
+ }
442
+ }
443
+ }
444
+ exports.StylesCollector = StylesCollector;
445
+ const includeAllDefaults = (defaults, theme, vars) => {
446
+ for (const group of defaults) {
447
+ for (const item of group.keys) {
448
+ vars.add(item.path);
449
+ item.valueDeps.theme.forEach((path) => theme.add(path));
450
+ item.valueDeps.vars.forEach((path) => vars.add(path));
451
+ }
452
+ }
453
+ };
454
+ const cssVarKeysFrom = (finalized) => {
455
+ const keys = new Set();
456
+ finalized.theme.forEach((path) => keys.add(path));
457
+ finalized.vars.forEach((path) => keys.add(path));
458
+ return [...keys].sort();
459
+ };
460
+ const entryKey = (entry) => {
461
+ if (entry.kind === 'media') {
462
+ return `media/${entry.key}`;
463
+ }
464
+ return entry.key;
465
+ };
466
+ const mediaSortRank = (entry) => entry.kind === 'media' ? 1 : 0;
467
+ const localVarOverrideRank = (entry) => {
468
+ if (entry.kind === 'media') {
469
+ return 0;
470
+ }
471
+ return entry.declarations.css.some(local_vars_1.isLocalVarOverrideMarker) ? 1 : 0;
472
+ };
473
+ // Base entries before every `@media`/`@container` block (no specificity). See finding `media-block-ordering`.
474
+ // `${group.set()}` after `${group}` defaults so a stacked override class wins. See finding `local-var-override-ordering`.
475
+ const compareEntriesForEmission = (a, b) => {
476
+ const rankDelta = mediaSortRank(a) - mediaSortRank(b);
477
+ if (rankDelta !== 0) {
478
+ return rankDelta;
479
+ }
480
+ const varDelta = localVarOverrideRank(a) - localVarOverrideRank(b);
481
+ if (varDelta !== 0) {
482
+ return varDelta;
483
+ }
484
+ if (a.moduleName !== b.moduleName) {
485
+ return a.moduleName.localeCompare(b.moduleName);
486
+ }
487
+ return a.key.localeCompare(b.key);
488
+ };
489
+ const isReadonlyArray = (value) => Array.isArray(value);
490
+ const isStylesModule = (value) => 'handles' in value && 'handleList' in value;
491
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/collector.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport { isLocalVarOverrideMarker } from './local_vars';\nimport {\n createStyleNameResolver,\n type StyleNameMode,\n type StyleNameResolver,\n type StyleTarget,\n} from './names';\nimport type {\n ContextualVarPath,\n CssVarPath,\n Declarations,\n DefaultGroupDeps,\n StyleEntry,\n StyleHandle,\n StyleMedia,\n StyleRegistry,\n StyleRule,\n StylesModule,\n} from './styles';\nimport { isEmptyDeclarations } from './styles/declarations';\n\nconst warnedHandles = new WeakSet<StyleHandle>();\n\nconst dependentEntriesCache = new WeakMap<\n StylesModule,\n Map<string, StyleEntry[]>\n>();\n\nconst dependentEntries = (\n module: StylesModule,\n handleKey: string\n): readonly StyleEntry[] => {\n let cached = dependentEntriesCache.get(module);\n if (!cached) {\n cached = new Map<string, StyleEntry[]>();\n for (const entry of module.entries) {\n if (entry.kind === 'rule') {\n if (!entry.auto) {\n continue;\n }\n for (const dep of entry.dependsOn) {\n appendDependent(cached, dep, entry);\n }\n continue;\n }\n if (entry.kind === 'media') {\n const deps = new Set<string>();\n for (const nested of entry.rules) {\n if (!nested.auto) {\n continue;\n }\n nested.dependsOn.forEach((key) => deps.add(key));\n }\n for (const dep of deps) {\n appendDependent(cached, dep, entry);\n }\n }\n }\n dependentEntriesCache.set(module, cached);\n }\n return cached.get(handleKey) ?? [];\n};\n\nconst appendDependent = (\n cache: Map<string, StyleEntry[]>,\n key: string,\n entry: StyleEntry\n): void => {\n const list = cache.get(key);\n if (list) {\n list.push(entry);\n return;\n }\n cache.set(key, [entry]);\n};\n\n/** Target, naming mode, registry, and prefix for one {@link StylesCollector}. */\nexport interface StylesCollectorOptions {\n /** Target context (e.g. `artifact` or `stylesheet`). */\n target: StyleTarget;\n /** Desired name mode (`compact` or `readable`). */\n names: StyleNameMode;\n /** Registry modules were authored against; used for auto-collection and compact-name snapshots. */\n registry: StyleRegistry;\n /** Brand prefix forwarded to the name resolver. */\n prefix: string;\n /** When `true`, emit no-op-handle warnings through `warn`. Inherited from `createDistillery({ dev })`. */\n dev?: boolean;\n /** Warning sink for no-op handles. Used only when `dev` is `true`. Defaults to `console.warn`. */\n warn?: (message: string) => void;\n}\n\n/** Reachable entries for one render or one stylesheet. */\nexport class StylesCollector {\n /** The target collection mode. */\n readonly target: StyleTarget;\n /** The naming mode (compact vs readable). */\n readonly names: StyleNameMode;\n /** Associated registry. */\n readonly registry: StyleRegistry;\n /** Emitted class name prefix. */\n readonly prefix: string;\n private readonly dev: boolean;\n private readonly warn: (message: string) => void;\n private readonly entries = new Map<string, StyleEntry>();\n private readonly handles = new Map<string, StyleHandle>();\n private readonly themeDeps = new Set<string>();\n private readonly varDeps = new Set<ContextualVarPath>();\n private readonly listeners = new Set<() => void>();\n private depth = 0;\n private dirty = false;\n\n constructor({\n target,\n names,\n registry,\n prefix,\n dev = false,\n warn = (message) => console.warn(message),\n }: StylesCollectorOptions) {\n this.target = target;\n this.names = names;\n this.registry = registry;\n this.prefix = prefix;\n this.dev = dev;\n this.warn = warn;\n }\n\n /**\n * Collects a module's non-variant entries, or one explicit entry.\n *\n * Variant entries stay off this path; collect them via `useHandles`.\n *\n * @param value Module (all non-variant entries), a single entry, or an array of entries.\n */\n use(value: StylesModule | StyleEntry | readonly StyleEntry[]): void {\n this.batch(() => this.useValue(value));\n }\n\n private useValue(\n value: StylesModule | StyleEntry | readonly StyleEntry[]\n ): void {\n if (isReadonlyArray(value)) {\n value.forEach((entry) => this.use(entry));\n return;\n }\n\n if (isStylesModule(value)) {\n // Aggregate deps from non-variant entries only. The module-level\n // `themeDeps`/`varDeps` snapshot would also include variant entries'\n // deps, which would push their var paths into the resolver's compact\n // registry and steal short names from actually-rendered handles.\n for (const entry of value.entries) {\n if (entry.variant) {\n continue;\n }\n if (entry.kind === 'handle' && !this.retainHandle(entry)) {\n continue;\n }\n this.setEntry(entry);\n if (entry.kind === 'handle' || entry.kind === 'rule') {\n this.addDeclarationDeps(entry.declarations);\n } else {\n for (const inner of entry.rules) {\n this.addDeclarationDeps(inner.declarations);\n }\n }\n }\n for (const handle of value.handleList) {\n if (handle.variant) {\n continue;\n }\n if (!this.retainHandle(handle)) {\n continue;\n }\n this.setHandle(handle);\n }\n return;\n }\n\n this.addEntry(value);\n }\n\n /**\n * Collects every entry on `module`, including variants. Used by the stylesheet target.\n *\n * @param module Module whose entries should all be collected.\n */\n useAllEntries(module: StylesModule): void {\n this.batch(() => {\n for (const entry of module.entries) {\n if (entry.kind === 'handle' && !this.retainHandle(entry)) {\n continue;\n }\n this.setEntry(entry);\n }\n for (const handle of module.handleList) {\n if (!this.retainHandle(handle)) {\n continue;\n }\n this.setHandle(handle);\n }\n this.addDeps(module.themeDeps, module.varDeps);\n });\n }\n\n /**\n * Collects handles and auto-includes rules whose selector deps are all present.\n *\n * Media blocks gain inner rules whose deps are met and keep rules already collected.\n *\n * @param handles Handles resolved during this render pass (e.g. from `resolveClassName`).\n * @returns Handles that were retained. Empty untargeted handles are omitted in compact mode.\n */\n useHandles(handles: readonly StyleHandle[]): readonly StyleHandle[] {\n return this.batch(() => {\n const retained: StyleHandle[] = [];\n for (const handle of handles) {\n if (!this.retainHandle(handle)) {\n continue;\n }\n retained.push(handle);\n if (this.handles.has(handle.key)) {\n continue;\n }\n this.setEntry(handle);\n this.setHandle(handle);\n this.addDeclarationDeps(handle.declarations);\n }\n for (const handle of retained) {\n const module = this.registry.module(handle.moduleName);\n if (!module) {\n continue;\n }\n for (const dependent of dependentEntries(module, handle.key)) {\n this.tryActivateDependent(dependent);\n }\n }\n return retained;\n });\n }\n\n /** Collects `auto` rules on `module` whose every selector dependency is already collected. */\n useRulesWhenDepsMet(module: StylesModule): void {\n this.batch(() => {\n for (const entry of module.entries) {\n if (entry.kind !== 'rule') {\n continue;\n }\n if (this.entries.has(entryKey(entry))) {\n continue;\n }\n if (this.allDepsMet(entry.dependsOn)) {\n this.addEntry(entry);\n }\n }\n });\n }\n\n /**\n * Calls `listener` after a public mutation adds an entry, handle, theme var, or contextual var.\n *\n * Fires at most once per outermost call; nested calls such as `use([a, b])` batch into it.\n *\n * @param listener Called with no arguments after the collection grows.\n * @returns Unsubscribes `listener`.\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private tryActivateDependent(entry: StyleEntry): void {\n if (entry.kind === 'rule') {\n if (!entry.auto) {\n return;\n }\n if (this.entries.has(entryKey(entry))) {\n return;\n }\n if (!this.allDepsMet(entry.dependsOn)) {\n return;\n }\n this.addEntry(entry);\n return;\n }\n if (entry.kind === 'media') {\n // Add newly live rules; keep rules already collected (e.g. by `use`).\n const existing = this.entries.get(entryKey(entry));\n const collected = new Set<StyleRule>(\n existing?.kind === 'media' ? existing.rules : []\n );\n const rules = entry.rules.filter(\n (rule) =>\n collected.has(rule) || (rule.auto && this.allDepsMet(rule.dependsOn))\n );\n if (rules.length === collected.size) {\n return;\n }\n const filtered: StyleMedia =\n rules.length === entry.rules.length ? entry : { ...entry, rules };\n this.setEntry(filtered);\n for (const rule of rules) {\n this.addDeclarationDeps(rule.declarations);\n }\n }\n }\n\n private allDepsMet(dependsOn: ReadonlySet<string>): boolean {\n for (const dep of dependsOn) {\n if (!this.handles.has(dep)) {\n return false;\n }\n }\n return true;\n }\n\n /** Marks a theme token path as reachable so it appears in the emitted theme block, even if no collected declaration reads it. */\n useThemeVar(path: string): void {\n this.batch(() => this.addDeps([path], []));\n }\n\n /** Creates a {@link StyleNameResolver} scoped to this collector's current dep set. */\n createResolver(): StyleNameResolver {\n const finalized = this.finalizeDeps();\n const snapshot = this.registry.freeze({\n classKeys:\n this.names === 'compact'\n ? [...this.handles.keys()]\n : this.registry.classKeys,\n cssVarKeys: cssVarKeysFrom(finalized),\n });\n return createStyleNameResolver({\n names: this.names,\n prefix: this.prefix,\n classKeys: snapshot.classKeys,\n cssVarKeys: snapshot.cssVarKeys,\n });\n }\n\n /** Collected style entries sorted for emission (base rules before all `@media`/`@container` blocks). */\n get collectedEntries(): readonly StyleEntry[] {\n return [...this.entries.values()].sort(compareEntriesForEmission);\n }\n\n /** Theme token paths that survive reachability; emitted in the theme scope block. */\n get collectedThemeDeps(): ReadonlySet<string> {\n return this.finalizeDeps().theme;\n }\n\n /** Contextual var paths that survive reachability; used by the runtime for compact-name substitution. */\n get collectedVarDeps(): ReadonlySet<ContextualVarPath> {\n return this.finalizeDeps().vars;\n }\n\n // Reachability-aware default-emission set used by the runtime. For a\n // given handle and `${group}` site, returns the keys whose declarations\n // should ship: union of group-keys appearing in `handle.declarations.deps.refs`\n // and in `deps.refs` of every collected rule/media-inner-rule whose\n // selector targets `handle`.\n /**\n * Returns the variable keys within `groupPath` that are reachable from `handle` or from any collected rule targeting it.\n *\n * @param handle Handle whose declaration refs and dependent rules are consulted.\n * @param groupPath Group prefix path (e.g. `vars/chip/look`).\n */\n reachableDefaults(\n handle: StyleHandle,\n groupPath: `vars/${string}`\n ): ReadonlySet<string> {\n const groupPrefix = `${groupPath}/`;\n const reachable = new Set<string>();\n const harvest = (refs: ReadonlySet<ContextualVarPath>): void => {\n for (const path of refs) {\n if (path.startsWith(groupPrefix)) {\n reachable.add(path.slice(groupPrefix.length));\n }\n }\n };\n\n harvest(handle.declarations.deps.refs);\n\n for (const entry of this.entries.values()) {\n if (entry.kind === 'rule') {\n if (entry.dependsOn.has(handle.key)) {\n harvest(entry.declarations.deps.refs);\n }\n continue;\n }\n if (entry.kind === 'media') {\n for (const innerRule of entry.rules) {\n if (innerRule.dependsOn.has(handle.key)) {\n harvest(innerRule.declarations.deps.refs);\n }\n }\n }\n }\n\n return reachable;\n }\n\n // Computes the final theme/var dep sets, folding in default-marker\n // contributions only for keys that survive reachability. Called once per\n // `createResolver()` and per `collectedThemeDeps`/`collectedVarDeps`\n // access; collection mutations between calls re-derive the result.\n private finalizeDeps(): {\n theme: ReadonlySet<string>;\n vars: ReadonlySet<ContextualVarPath>;\n } {\n const theme = new Set<string>(this.themeDeps);\n const vars = new Set<ContextualVarPath>(this.varDeps);\n\n for (const handle of this.handles.values()) {\n for (const group of handle.declarations.deps.defaults) {\n const reachable = this.reachableDefaults(handle, group.groupPath);\n for (const item of group.keys) {\n if (!reachable.has(item.key)) {\n continue;\n }\n vars.add(item.path);\n item.valueDeps.theme.forEach((path) => theme.add(path));\n item.valueDeps.vars.forEach((path) => vars.add(path));\n }\n }\n }\n\n // Default markers inside rule / media-inner-rule declarations don't have\n // a host handle to anchor reachability against. The runtime emits every\n // listed key when rendering such a declaration, so we mirror that here\n // and include all of them in the registry.\n for (const entry of this.entries.values()) {\n if (entry.kind === 'rule') {\n includeAllDefaults(entry.declarations.deps.defaults, theme, vars);\n continue;\n }\n if (entry.kind === 'media') {\n for (const inner of entry.rules) {\n includeAllDefaults(inner.declarations.deps.defaults, theme, vars);\n }\n }\n }\n\n return { theme, vars };\n }\n\n private retainHandle(handle: StyleHandle): boolean {\n if (!isEmptyDeclarations(handle.declarations)) {\n return true;\n }\n if (this.registry.targetsHandle(handle.key)) {\n return true;\n }\n if (this.dev && !warnedHandles.has(handle)) {\n warnedHandles.add(handle);\n this.warn(\n `Style module \"${handle.moduleName}\" handle \"${handle.localName}\" has no declarations and no rule targets it; delete the empty template.`\n );\n }\n return this.names !== 'compact';\n }\n\n private addEntry(entry: StyleEntry): void {\n if (entry.kind === 'handle' && !this.retainHandle(entry)) {\n return;\n }\n this.setEntry(entry);\n if (entry.kind === 'handle') {\n this.setHandle(entry);\n this.addDeclarationDeps(entry.declarations);\n return;\n }\n if (entry.kind === 'rule') {\n this.addDeclarationDeps(entry.declarations);\n return;\n }\n for (const rule of entry.rules) {\n this.addDeclarationDeps(rule.declarations);\n }\n }\n\n private addDeclarationDeps(declarations: Declarations): void {\n this.addDeps(declarations.deps.theme, declarations.deps.vars);\n }\n\n private addDeps(\n theme: Iterable<string>,\n vars: Iterable<ContextualVarPath>\n ): void {\n const before = this.themeDeps.size + this.varDeps.size;\n for (const path of theme) {\n this.themeDeps.add(path);\n }\n for (const path of vars) {\n this.varDeps.add(path);\n }\n if (this.themeDeps.size + this.varDeps.size !== before) {\n this.dirty = true;\n }\n }\n\n // A media entry changes when it gains inner rules.\n private setEntry(entry: StyleEntry): void {\n const key = entryKey(entry);\n const existing = this.entries.get(key);\n this.entries.set(key, entry);\n if (\n !existing ||\n (existing.kind === 'media' &&\n entry.kind === 'media' &&\n existing.rules.length !== entry.rules.length)\n ) {\n this.dirty = true;\n }\n }\n\n private setHandle(handle: StyleHandle): void {\n if (!this.handles.has(handle.key)) {\n this.dirty = true;\n }\n this.handles.set(handle.key, handle);\n }\n\n // Listeners run once the outermost public mutation returns.\n private batch<T>(mutate: () => T): T {\n this.depth += 1;\n try {\n return mutate();\n } finally {\n this.depth -= 1;\n if (this.depth === 0 && this.dirty) {\n this.dirty = false;\n for (const listener of [...this.listeners]) {\n listener();\n }\n }\n }\n }\n}\n\nconst includeAllDefaults = (\n defaults: ReadonlyArray<DefaultGroupDeps>,\n theme: Set<string>,\n vars: Set<ContextualVarPath>\n): void => {\n for (const group of defaults) {\n for (const item of group.keys) {\n vars.add(item.path);\n item.valueDeps.theme.forEach((path) => theme.add(path));\n item.valueDeps.vars.forEach((path) => vars.add(path));\n }\n }\n};\n\nconst cssVarKeysFrom = (finalized: {\n theme: ReadonlySet<string>;\n vars: ReadonlySet<ContextualVarPath>;\n}): readonly CssVarPath[] => {\n const keys = new Set<CssVarPath>();\n finalized.theme.forEach((path) => keys.add(path));\n finalized.vars.forEach((path) => keys.add(path));\n return [...keys].sort();\n};\n\nconst entryKey = (entry: StyleEntry): string => {\n if (entry.kind === 'media') {\n return `media/${entry.key}`;\n }\n return entry.key;\n};\n\nconst mediaSortRank = (entry: StyleEntry): number =>\n entry.kind === 'media' ? 1 : 0;\n\nconst localVarOverrideRank = (entry: StyleEntry): number => {\n if (entry.kind === 'media') {\n return 0;\n }\n return entry.declarations.css.some(isLocalVarOverrideMarker) ? 1 : 0;\n};\n\n// Base entries before every `@media`/`@container` block (no specificity). See finding `media-block-ordering`.\n// `${group.set()}` after `${group}` defaults so a stacked override class wins. See finding `local-var-override-ordering`.\nconst compareEntriesForEmission = (a: StyleEntry, b: StyleEntry): number => {\n const rankDelta = mediaSortRank(a) - mediaSortRank(b);\n if (rankDelta !== 0) {\n return rankDelta;\n }\n const varDelta = localVarOverrideRank(a) - localVarOverrideRank(b);\n if (varDelta !== 0) {\n return varDelta;\n }\n if (a.moduleName !== b.moduleName) {\n return a.moduleName.localeCompare(b.moduleName);\n }\n return a.key.localeCompare(b.key);\n};\n\nconst isReadonlyArray = <T>(value: unknown): value is readonly T[] =>\n Array.isArray(value);\n\nconst isStylesModule = (\n value: StylesModule | StyleHandle | StyleRule | StyleMedia\n): value is StylesModule => 'handles' in value && 'handleList' in value;\n"]}