@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,139 @@
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.isEmptyDeclarations = exports.stringifyCssValue = exports.computeValueDeps = exports.buildDeclarations = void 0;
10
+ const css_scan_1 = require("../css_scan");
11
+ const local_vars_1 = require("../local_vars");
12
+ const nesting_1 = require("../nesting");
13
+ const tokens_1 = require("../tokens");
14
+ /** Builds a declaration block: interpolations stringify; local-var markers stay until render. */
15
+ const buildDeclarations = (strings, values) => {
16
+ const deps = {
17
+ theme: new Set(),
18
+ vars: new Set(),
19
+ refs: new Set(),
20
+ defaults: [],
21
+ };
22
+ const segments = [];
23
+ let pending = '';
24
+ const flushPending = () => {
25
+ if (pending.length > 0) {
26
+ segments.push(pending);
27
+ pending = '';
28
+ }
29
+ };
30
+ strings.forEach((part, index) => {
31
+ pending += part;
32
+ if (index < values.length) {
33
+ const value = values[index];
34
+ if ((0, local_vars_1.isLocalVarMarker)(value)) {
35
+ flushPending();
36
+ // Both default-emission and override-emission markers may carry
37
+ // theme tokens or shared contextual var refs as values. Walk those
38
+ // values and record any nested deps onto the host declaration so
39
+ // tree-shaking and registry registration include them.
40
+ recordMarkerDeps(value, deps);
41
+ segments.push(value);
42
+ }
43
+ else {
44
+ pending += (0, exports.stringifyCssValue)(value, deps);
45
+ }
46
+ }
47
+ });
48
+ flushPending();
49
+ assertDeclarationBlock(segments);
50
+ return {
51
+ css: segments,
52
+ deps,
53
+ };
54
+ };
55
+ exports.buildDeclarations = buildDeclarations;
56
+ const recordMarkerDeps = (marker, deps) => {
57
+ if (marker.__kind === 'local-var-default-marker') {
58
+ // Default markers contribute their var paths and per-value deps only
59
+ // through the collector's reachability pass at resolver creation. We
60
+ // capture per-key value deps here so the collector can fold them in
61
+ // verbatim when the key survives reachability — and skip them entirely
62
+ // when it doesn't.
63
+ deps.defaults.push({
64
+ groupPath: marker.groupPath,
65
+ keys: marker.defaults.map((item) => ({
66
+ key: item.key,
67
+ path: item.path,
68
+ valueDeps: (0, exports.computeValueDeps)(item.value),
69
+ })),
70
+ });
71
+ return;
72
+ }
73
+ for (const item of marker.overrides) {
74
+ deps.vars.add(item.path);
75
+ // Stringify each value once to capture nested theme/var deps. The
76
+ // string return is discarded — the runtime re-stringifies at render
77
+ // time so compaction sees the same readable refs we record here.
78
+ (0, exports.stringifyCssValue)(item.value, deps);
79
+ }
80
+ };
81
+ /** Theme/var deps recorded while stringifying one declaration value. */
82
+ const computeValueDeps = (value) => {
83
+ const local = {
84
+ theme: new Set(),
85
+ vars: new Set(),
86
+ refs: new Set(),
87
+ defaults: [],
88
+ };
89
+ (0, exports.stringifyCssValue)(value, local);
90
+ return { theme: local.theme, vars: local.vars };
91
+ };
92
+ exports.computeValueDeps = computeValueDeps;
93
+ /** Stringifies one interpolable CSS value and records theme/var deps onto `deps`. */
94
+ const stringifyCssValue = (value, deps) => {
95
+ if ((0, nesting_1.isHandleLike)(value)) {
96
+ throw new Error('A style handle cannot be interpolated into a declaration value; compose with the emotion compat css instead.');
97
+ }
98
+ if ((0, tokens_1.isCssToken)(value)) {
99
+ deps.theme.add(value.path);
100
+ return value.ref;
101
+ }
102
+ if ((0, tokens_1.isContextualCssVar)(value)) {
103
+ deps.vars.add(value.path);
104
+ deps.refs.add(value.path);
105
+ return value.ref;
106
+ }
107
+ if ((0, tokens_1.isContextualCssVarName)(value)) {
108
+ // `.name` interpolations are left-hand-side custom-property
109
+ // identifiers, not `var(...)` references — they belong in `vars` for
110
+ // registry coverage but not in `refs` (which feeds reachability).
111
+ deps.vars.add(value.path);
112
+ return value.name;
113
+ }
114
+ if ((0, local_vars_1.isLocalVarRef)(value)) {
115
+ deps.vars.add(value.path);
116
+ deps.refs.add(value.path);
117
+ return value.ref;
118
+ }
119
+ if ((0, tokens_1.isScaleToken)(value)) {
120
+ return value.value;
121
+ }
122
+ return String(value);
123
+ };
124
+ exports.stringifyCssValue = stringifyCssValue;
125
+ /** True when every segment is comments, whitespace, or bare `;`. A local-var marker counts as content. */
126
+ const isEmptyDeclarations = ({ css }) => css.every((segment) => typeof segment === 'string' && (0, css_scan_1.isBlankCss)(segment));
127
+ exports.isEmptyDeclarations = isEmptyDeclarations;
128
+ const assertDeclarationBlock = (segments) => {
129
+ for (const segment of segments) {
130
+ if (typeof segment !== 'string') {
131
+ continue;
132
+ }
133
+ if (/[{}]/.test(segment) ||
134
+ /(^|[\s;])@(?:media|supports|container)\b/i.test(segment)) {
135
+ throw new Error('css and decls accept declaration blocks only.');
136
+ }
137
+ }
138
+ };
139
+ //# sourceMappingURL=declarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declarations.js","sourceRoot":"","sources":["../../../src/styles/declarations.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 { isBlankCss } from '../css_scan';\nimport { isLocalVarMarker, isLocalVarRef } from '../local_vars';\nimport { isHandleLike } from '../nesting';\nimport {\n isContextualCssVar,\n isContextualCssVarName,\n isCssToken,\n isScaleToken,\n} from '../tokens';\n\nimport type {\n Declarations,\n DeclarationSegment,\n DefaultKeyDeps,\n LocalVarMarker,\n MutableStyleDeps,\n} from './types';\n\n/** Builds a declaration block: interpolations stringify; local-var markers stay until render. */\nexport const buildDeclarations = (\n strings: readonly string[],\n values: readonly unknown[]\n): Declarations => {\n const deps: MutableStyleDeps = {\n theme: new Set(),\n vars: new Set(),\n refs: new Set(),\n defaults: [],\n };\n const segments: DeclarationSegment[] = [];\n let pending = '';\n\n const flushPending = (): void => {\n if (pending.length > 0) {\n segments.push(pending);\n pending = '';\n }\n };\n\n strings.forEach((part, index) => {\n pending += part;\n if (index < values.length) {\n const value = values[index];\n if (isLocalVarMarker(value)) {\n flushPending();\n // Both default-emission and override-emission markers may carry\n // theme tokens or shared contextual var refs as values. Walk those\n // values and record any nested deps onto the host declaration so\n // tree-shaking and registry registration include them.\n recordMarkerDeps(value, deps);\n segments.push(value);\n } else {\n pending += stringifyCssValue(value, deps);\n }\n }\n });\n flushPending();\n\n assertDeclarationBlock(segments);\n\n return {\n css: segments,\n deps,\n };\n};\n\nconst recordMarkerDeps = (\n marker: LocalVarMarker,\n deps: MutableStyleDeps\n): void => {\n if (marker.__kind === 'local-var-default-marker') {\n // Default markers contribute their var paths and per-value deps only\n // through the collector's reachability pass at resolver creation. We\n // capture per-key value deps here so the collector can fold them in\n // verbatim when the key survives reachability — and skip them entirely\n // when it doesn't.\n deps.defaults.push({\n groupPath: marker.groupPath,\n keys: marker.defaults.map((item) => ({\n key: item.key,\n path: item.path,\n valueDeps: computeValueDeps(item.value),\n })),\n });\n return;\n }\n for (const item of marker.overrides) {\n deps.vars.add(item.path);\n // Stringify each value once to capture nested theme/var deps. The\n // string return is discarded — the runtime re-stringifies at render\n // time so compaction sees the same readable refs we record here.\n stringifyCssValue(item.value, deps);\n }\n};\n\n/** Theme/var deps recorded while stringifying one declaration value. */\nexport const computeValueDeps = (\n value: unknown\n): DefaultKeyDeps['valueDeps'] => {\n const local: MutableStyleDeps = {\n theme: new Set(),\n vars: new Set(),\n refs: new Set(),\n defaults: [],\n };\n stringifyCssValue(value, local);\n return { theme: local.theme, vars: local.vars };\n};\n\n/** Stringifies one interpolable CSS value and records theme/var deps onto `deps`. */\nexport const stringifyCssValue = (\n value: unknown,\n deps: MutableStyleDeps\n): string => {\n if (isHandleLike(value)) {\n throw new Error(\n 'A style handle cannot be interpolated into a declaration value; compose with the emotion compat css instead.'\n );\n }\n if (isCssToken(value)) {\n deps.theme.add(value.path);\n return value.ref;\n }\n if (isContextualCssVar(value)) {\n deps.vars.add(value.path);\n deps.refs.add(value.path);\n return value.ref;\n }\n if (isContextualCssVarName(value)) {\n // `.name` interpolations are left-hand-side custom-property\n // identifiers, not `var(...)` references — they belong in `vars` for\n // registry coverage but not in `refs` (which feeds reachability).\n deps.vars.add(value.path);\n return value.name;\n }\n if (isLocalVarRef(value)) {\n deps.vars.add(value.path);\n deps.refs.add(value.path);\n return value.ref;\n }\n if (isScaleToken(value)) {\n return value.value;\n }\n return String(value);\n};\n\n/** True when every segment is comments, whitespace, or bare `;`. A local-var marker counts as content. */\nexport const isEmptyDeclarations = ({ css }: Declarations): boolean =>\n css.every((segment) => typeof segment === 'string' && isBlankCss(segment));\n\nconst assertDeclarationBlock = (\n segments: readonly DeclarationSegment[]\n): void => {\n for (const segment of segments) {\n if (typeof segment !== 'string') {\n continue;\n }\n if (\n /[{}]/.test(segment) ||\n /(^|[\\s;])@(?:media|supports|container)\\b/i.test(segment)\n ) {\n throw new Error('css and decls accept declaration blocks only.');\n }\n }\n};\n"]}
@@ -0,0 +1,32 @@
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.StyleRegistry = exports.readableVarOwnersFromEnvironment = exports.createStyleModuleWithEnvironment = exports.stringifyCssValue = exports.isEmptyDeclarations = exports.computeValueDeps = exports.variants = exports.rule = exports.pendingHandleFromFlattened = exports.media = exports.mapDomain = exports.isVariantMarked = exports.globalStylesFromFlattened = exports.decls = exports.css = exports.container = exports.combineClassNames = void 0;
10
+ require("../instance");
11
+ var authoring_1 = require("./authoring");
12
+ Object.defineProperty(exports, "combineClassNames", { enumerable: true, get: function () { return authoring_1.combineClassNames; } });
13
+ Object.defineProperty(exports, "container", { enumerable: true, get: function () { return authoring_1.container; } });
14
+ Object.defineProperty(exports, "css", { enumerable: true, get: function () { return authoring_1.css; } });
15
+ Object.defineProperty(exports, "decls", { enumerable: true, get: function () { return authoring_1.decls; } });
16
+ Object.defineProperty(exports, "globalStylesFromFlattened", { enumerable: true, get: function () { return authoring_1.globalStylesFromFlattened; } });
17
+ Object.defineProperty(exports, "isVariantMarked", { enumerable: true, get: function () { return authoring_1.isVariantMarked; } });
18
+ Object.defineProperty(exports, "mapDomain", { enumerable: true, get: function () { return authoring_1.mapDomain; } });
19
+ Object.defineProperty(exports, "media", { enumerable: true, get: function () { return authoring_1.media; } });
20
+ Object.defineProperty(exports, "pendingHandleFromFlattened", { enumerable: true, get: function () { return authoring_1.pendingHandleFromFlattened; } });
21
+ Object.defineProperty(exports, "rule", { enumerable: true, get: function () { return authoring_1.rule; } });
22
+ Object.defineProperty(exports, "variants", { enumerable: true, get: function () { return authoring_1.variants; } });
23
+ var declarations_1 = require("./declarations");
24
+ Object.defineProperty(exports, "computeValueDeps", { enumerable: true, get: function () { return declarations_1.computeValueDeps; } });
25
+ Object.defineProperty(exports, "isEmptyDeclarations", { enumerable: true, get: function () { return declarations_1.isEmptyDeclarations; } });
26
+ Object.defineProperty(exports, "stringifyCssValue", { enumerable: true, get: function () { return declarations_1.stringifyCssValue; } });
27
+ var module_1 = require("./module");
28
+ Object.defineProperty(exports, "createStyleModuleWithEnvironment", { enumerable: true, get: function () { return module_1.createStyleModuleWithEnvironment; } });
29
+ var registry_1 = require("./registry");
30
+ Object.defineProperty(exports, "readableVarOwnersFromEnvironment", { enumerable: true, get: function () { return registry_1.readableVarOwnersFromEnvironment; } });
31
+ Object.defineProperty(exports, "StyleRegistry", { enumerable: true, get: function () { return registry_1.StyleRegistry; } });
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/styles/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,uBAAqB;AAErB,yCAYqB;AAXnB,8GAAA,iBAAiB,OAAA;AACjB,sGAAA,SAAS,OAAA;AACT,gGAAA,GAAG,OAAA;AACH,kGAAA,KAAK,OAAA;AACL,sHAAA,yBAAyB,OAAA;AACzB,4GAAA,eAAe,OAAA;AACf,sGAAA,SAAS,OAAA;AACT,kGAAA,KAAK,OAAA;AACL,uHAAA,0BAA0B,OAAA;AAC1B,iGAAA,IAAI,OAAA;AACJ,qGAAA,QAAQ,OAAA;AAEV,+CAIwB;AAHtB,gHAAA,gBAAgB,OAAA;AAChB,mHAAA,mBAAmB,OAAA;AACnB,iHAAA,iBAAiB,OAAA;AAEnB,mCAA4D;AAAnD,0HAAA,gCAAgC,OAAA;AACzC,uCAA6E;AAApE,4HAAA,gCAAgC,OAAA;AAAE,yGAAA,aAAa,OAAA","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 '../instance';\n\nexport {\n combineClassNames,\n container,\n css,\n decls,\n globalStylesFromFlattened,\n isVariantMarked,\n mapDomain,\n media,\n pendingHandleFromFlattened,\n rule,\n variants,\n} from './authoring';\nexport {\n computeValueDeps,\n isEmptyDeclarations,\n stringifyCssValue,\n} from './declarations';\nexport { createStyleModuleWithEnvironment } from './module';\nexport { readableVarOwnersFromEnvironment, StyleRegistry } from './registry';\nexport type {\n ContextualVarPath,\n CssValue,\n CssVarPath,\n DeclarationSegment,\n Declarations,\n DefaultGroupDeps,\n DefaultKeyDeps,\n LocalVarDefaultMarker,\n LocalVarGroup,\n LocalVarMarker,\n LocalVarOverrideMarker,\n LocalVarRef,\n MutableStyleDeps,\n PendingStyleHandle,\n PrimitiveStyleAuthoringApi,\n ResolvedStyles,\n RuleOptions,\n StyleAuthoringApi,\n StyleDeps,\n StyleEntry,\n StyleHandle,\n StyleMedia,\n StyleRegistrySnapshot,\n StyleRule,\n StylesModule,\n StylesObject,\n StyleSelectorResolver,\n} from './types';\n"]}
@@ -0,0 +1,233 @@
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.createStyleModuleWithEnvironment = void 0;
10
+ const idents_1 = require("../idents");
11
+ const local_vars_1 = require("../local_vars");
12
+ const authoring_1 = require("./authoring");
13
+ const createStyleModuleWithEnvironment = (environment, registry, name, factory) => {
14
+ (0, idents_1.assertCssIdentSegment)(name, 'Style module name');
15
+ const t = createAuthoringApi(environment, name);
16
+ const authored = factory(t);
17
+ const entries = [];
18
+ const handleList = [];
19
+ const themeDeps = new Set();
20
+ const varDeps = new Set();
21
+ assignEntries(name, authored, [], entries, handleList, themeDeps, varDeps);
22
+ recordRuleDeps(entries, handleList);
23
+ const module = {
24
+ name,
25
+ handles: authored,
26
+ entries,
27
+ handleList,
28
+ themeDeps,
29
+ varDeps,
30
+ };
31
+ registry.registerModule(module);
32
+ return module;
33
+ };
34
+ exports.createStyleModuleWithEnvironment = createStyleModuleWithEnvironment;
35
+ const createAuthoringApi = (environment, moduleName) => ({
36
+ css: authoring_1.css,
37
+ decls: authoring_1.decls,
38
+ vars: (group, defaults) => (0, local_vars_1.createLocalVarGroup)(environment.prefix, moduleName, group, defaults),
39
+ tokens: environment.tokens,
40
+ });
41
+ const assignEntries = (moduleName, value, path, entries, handles, themeDeps, varDeps, inheritedVariant = false) => {
42
+ // A value is considered "variant" when either the immediate node was
43
+ // produced inside a `variants(...)` factory, or it sits beneath a parent
44
+ // `variants(...)` record (covers nested handles inside a per-variant
45
+ // object literal). The flag is sticky once set during the walk.
46
+ const variantHere = inheritedVariant || (0, authoring_1.isVariantMarked)(value);
47
+ if (isPendingHandle(value)) {
48
+ const localName = path.join('/');
49
+ const handle = {
50
+ kind: 'handle',
51
+ moduleName,
52
+ localName,
53
+ key: `${moduleName}/${localName}`,
54
+ readableName: `${moduleName}-${path.join('-')}`,
55
+ declarations: value.declarations,
56
+ variant: variantHere,
57
+ resolveClassName: (context) => context.resolveClassName(handle),
58
+ };
59
+ entries.push(handle);
60
+ handles.push(handle);
61
+ copyDeps(value.declarations.deps, themeDeps, varDeps);
62
+ if (value.nested && value.nested.length > 0) {
63
+ expandNestedEntries(moduleName, handle, value.nested, variantHere, entries, themeDeps, varDeps);
64
+ }
65
+ return handle;
66
+ }
67
+ if (isRule(value)) {
68
+ const keyedRule = {
69
+ ...value,
70
+ moduleName,
71
+ key: `${moduleName}/${path.join('/')}`,
72
+ variant: variantHere,
73
+ };
74
+ entries.push(keyedRule);
75
+ copyDeps(value.declarations.deps, themeDeps, varDeps);
76
+ return keyedRule;
77
+ }
78
+ if (isMedia(value)) {
79
+ const mediaKey = `${moduleName}/${path.join('/')}`;
80
+ const keyedMedia = {
81
+ ...value,
82
+ key: mediaKey,
83
+ moduleName,
84
+ variant: variantHere,
85
+ rules: value.rules.map((child, index) => ({
86
+ ...child,
87
+ moduleName,
88
+ key: `${mediaKey}/${index}`,
89
+ variant: variantHere,
90
+ })),
91
+ };
92
+ entries.push(keyedMedia);
93
+ for (const child of keyedMedia.rules) {
94
+ copyDeps(child.declarations.deps, themeDeps, varDeps);
95
+ }
96
+ return keyedMedia;
97
+ }
98
+ if (value && typeof value === 'object') {
99
+ for (const [key, child] of Object.entries(value)) {
100
+ (0, idents_1.assertCssIdentSegment)(key, `Style module "${moduleName}" key`);
101
+ const assigned = assignEntries(moduleName, child, [...path, key], entries, handles, themeDeps, varDeps, variantHere);
102
+ if (assigned) {
103
+ value[key] = assigned;
104
+ }
105
+ }
106
+ }
107
+ return value;
108
+ };
109
+ const MAX_NESTED_SIBLINGS = 1000;
110
+ // Zero-padded so `collectedEntries` (lexicographic sort) preserves source order past 9 siblings.
111
+ const paddedIndex = (index) => {
112
+ if (index >= MAX_NESTED_SIBLINGS) {
113
+ throw new Error(`A single css template cannot have more than ${MAX_NESTED_SIBLINGS} nested blocks.`);
114
+ }
115
+ return String(index).padStart(3, '0');
116
+ };
117
+ const composeNestedSelector = (self, alternatives) => (h) => alternatives
118
+ .map((parts) => parts
119
+ .map((part) => typeof part === 'string'
120
+ ? part.replaceAll('&', `.${h(self)}`)
121
+ : `.${h(part)}`)
122
+ .join(''))
123
+ .join(',');
124
+ const expandNestedEntries = (moduleName, self, nested, variant, entries, themeDeps, varDeps) => {
125
+ nested.forEach((entry, index) => {
126
+ const key = `${self.key}/&/${paddedIndex(index)}`;
127
+ if (entry.kind === 'nested-rule') {
128
+ entries.push(makeNestedRule(moduleName, key, self, entry, variant, themeDeps, varDeps));
129
+ return;
130
+ }
131
+ const rules = [];
132
+ if (entry.self) {
133
+ rules.push(makeNestedRule(moduleName, `${key}/${paddedIndex(0)}`, self, {
134
+ kind: 'nested-rule',
135
+ alternatives: [['&']],
136
+ declarations: entry.self,
137
+ }, variant, themeDeps, varDeps));
138
+ }
139
+ entry.rules.forEach((rule, ruleIndex) => {
140
+ rules.push(makeNestedRule(moduleName, `${key}/${paddedIndex(ruleIndex + (entry.self ? 1 : 0))}`, self, rule, variant, themeDeps, varDeps));
141
+ });
142
+ entries.push({
143
+ kind: 'media',
144
+ key,
145
+ moduleName,
146
+ query: entry.query,
147
+ rules,
148
+ variant,
149
+ });
150
+ });
151
+ };
152
+ const makeNestedRule = (moduleName, key, self, rule, variant, themeDeps, varDeps) => {
153
+ copyDeps(rule.declarations.deps, themeDeps, varDeps);
154
+ return {
155
+ kind: 'rule',
156
+ moduleName,
157
+ key,
158
+ selector: composeNestedSelector(self, rule.alternatives),
159
+ declarations: rule.declarations,
160
+ dependsOn: authoring_1.EMPTY_DEPS,
161
+ auto: true,
162
+ variant,
163
+ };
164
+ };
165
+ const recordRuleDeps = (entries, handles) => {
166
+ if (entries.length === 0) {
167
+ return;
168
+ }
169
+ for (const entry of entries) {
170
+ if (entry.kind === 'rule') {
171
+ assignDependsOn(entry, computeRuleDeps(entry, handles));
172
+ continue;
173
+ }
174
+ if (entry.kind === 'media') {
175
+ for (const nested of entry.rules) {
176
+ assignDependsOn(nested, computeRuleDeps(nested, handles));
177
+ }
178
+ }
179
+ }
180
+ };
181
+ const assignDependsOn = (rule, dependsOn) => {
182
+ rule.dependsOn = dependsOn;
183
+ };
184
+ const computeRuleDeps = (rule, handles) => {
185
+ const accessed = new Set();
186
+ const trackingResolver = ((handle) => {
187
+ accessed.add(handle.key);
188
+ return `.${handle.readableName}`;
189
+ });
190
+ for (const handle of handles) {
191
+ defineTrackingAlias(trackingResolver, handle.localName, handle, accessed);
192
+ const leafName = handle.localName.split('/').at(-1);
193
+ if (leafName && leafName !== handle.localName) {
194
+ defineTrackingAlias(trackingResolver, leafName, handle, accessed);
195
+ }
196
+ }
197
+ try {
198
+ rule.selector(trackingResolver);
199
+ }
200
+ catch {
201
+ // Selector factories are expected to be pure string-builders, but a
202
+ // factory that throws on dummy input shouldn't break module construction.
203
+ // The dep set stays whatever was recorded before the throw.
204
+ }
205
+ return accessed;
206
+ };
207
+ const defineTrackingAlias = (resolver, name, handle, accessed) => {
208
+ if (!/^[A-Za-z_$][\w$]*$/.test(name) || name in resolver) {
209
+ return;
210
+ }
211
+ Object.defineProperty(resolver, name, {
212
+ configurable: true,
213
+ enumerable: true,
214
+ get: () => {
215
+ accessed.add(handle.key);
216
+ return `.${handle.readableName}`;
217
+ },
218
+ });
219
+ };
220
+ const copyDeps = (deps, themeDeps, varDeps) => {
221
+ deps.theme.forEach((path) => themeDeps.add(path));
222
+ deps.vars.forEach((path) => varDeps.add(path));
223
+ };
224
+ const isPendingHandle = (value) => Boolean(value &&
225
+ typeof value === 'object' &&
226
+ value.kind === 'pending-handle');
227
+ const isRule = (value) => Boolean(value &&
228
+ typeof value === 'object' &&
229
+ value.kind === 'rule');
230
+ const isMedia = (value) => Boolean(value &&
231
+ typeof value === 'object' &&
232
+ value.kind === 'media');
233
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/styles/module.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 type { DistilleryEnvironment } from '../environment';\nimport { assertCssIdentSegment } from '../idents';\nimport { createLocalVarGroup, type LocalVarGroup } from '../local_vars';\nimport type { SelectorAlternative } from '../nesting';\n\nimport { css, decls, EMPTY_DEPS, isVariantMarked } from './authoring';\nimport type { StyleRegistry } from './registry';\nimport type {\n ContextualVarPath,\n CssValue,\n PendingEntry,\n PendingNested,\n PendingNestedRule,\n PendingStyleHandle,\n ResolvedStyles,\n StyleAuthoringApi,\n StyleDeps,\n StyleEntry,\n StyleHandle,\n StyleMedia,\n StyleRule,\n StyleSelectorResolver,\n StylesModule,\n StylesObject,\n} from './types';\n\nexport const createStyleModuleWithEnvironment = <\n TTokens,\n TStyles extends StylesObject,\n>(\n environment: DistilleryEnvironment<TTokens>,\n registry: StyleRegistry,\n name: string,\n factory: (t: StyleAuthoringApi<TTokens>) => TStyles\n): StylesModule<ResolvedStyles<TStyles>> => {\n assertCssIdentSegment(name, 'Style module name');\n const t = createAuthoringApi(environment, name);\n const authored = factory(t);\n const entries: StyleEntry[] = [];\n const handleList: StyleHandle[] = [];\n const themeDeps = new Set<string>();\n const varDeps = new Set<ContextualVarPath>();\n\n assignEntries(name, authored, [], entries, handleList, themeDeps, varDeps);\n recordRuleDeps(entries, handleList);\n\n const module: StylesModule<ResolvedStyles<TStyles>> = {\n name,\n handles: authored as ResolvedStyles<TStyles>,\n entries,\n handleList,\n themeDeps,\n varDeps,\n };\n registry.registerModule(module);\n return module;\n};\n\nconst createAuthoringApi = <TTokens>(\n environment: DistilleryEnvironment<TTokens>,\n moduleName: string\n): StyleAuthoringApi<TTokens> => ({\n css,\n decls,\n vars: <TKey extends string>(\n group: string,\n defaults: Record<TKey, CssValue>\n ): LocalVarGroup<TKey> =>\n createLocalVarGroup(environment.prefix, moduleName, group, defaults),\n tokens: environment.tokens,\n});\n\nconst assignEntries = (\n moduleName: string,\n value: unknown,\n path: readonly string[],\n entries: StyleEntry[],\n handles: StyleHandle[],\n themeDeps: Set<string>,\n varDeps: Set<ContextualVarPath>,\n inheritedVariant = false\n): unknown => {\n // A value is considered \"variant\" when either the immediate node was\n // produced inside a `variants(...)` factory, or it sits beneath a parent\n // `variants(...)` record (covers nested handles inside a per-variant\n // object literal). The flag is sticky once set during the walk.\n const variantHere = inheritedVariant || isVariantMarked(value);\n\n if (isPendingHandle(value)) {\n const localName = path.join('/');\n const handle: StyleHandle = {\n kind: 'handle',\n moduleName,\n localName,\n key: `${moduleName}/${localName}`,\n readableName: `${moduleName}-${path.join('-')}`,\n declarations: value.declarations,\n variant: variantHere,\n resolveClassName: (context) => context.resolveClassName(handle),\n };\n entries.push(handle);\n handles.push(handle);\n copyDeps(value.declarations.deps, themeDeps, varDeps);\n if (value.nested && value.nested.length > 0) {\n expandNestedEntries(\n moduleName,\n handle,\n value.nested,\n variantHere,\n entries,\n themeDeps,\n varDeps\n );\n }\n return handle;\n }\n\n if (isRule(value)) {\n const keyedRule: StyleRule = {\n ...value,\n moduleName,\n key: `${moduleName}/${path.join('/')}`,\n variant: variantHere,\n };\n entries.push(keyedRule);\n copyDeps(value.declarations.deps, themeDeps, varDeps);\n return keyedRule;\n }\n\n if (isMedia(value)) {\n const mediaKey = `${moduleName}/${path.join('/')}`;\n const keyedMedia: StyleMedia = {\n ...value,\n key: mediaKey,\n moduleName,\n variant: variantHere,\n rules: value.rules.map((child, index) => ({\n ...child,\n moduleName,\n key: `${mediaKey}/${index}`,\n variant: variantHere,\n })),\n };\n entries.push(keyedMedia);\n for (const child of keyedMedia.rules) {\n copyDeps(child.declarations.deps, themeDeps, varDeps);\n }\n return keyedMedia;\n }\n\n if (value && typeof value === 'object') {\n for (const [key, child] of Object.entries(value)) {\n assertCssIdentSegment(key, `Style module \"${moduleName}\" key`);\n const assigned = assignEntries(\n moduleName,\n child,\n [...path, key],\n entries,\n handles,\n themeDeps,\n varDeps,\n variantHere\n );\n if (assigned) {\n (value as Record<string, unknown>)[key] = assigned;\n }\n }\n }\n\n return value;\n};\n\nconst MAX_NESTED_SIBLINGS = 1000;\n\n// Zero-padded so `collectedEntries` (lexicographic sort) preserves source order past 9 siblings.\nconst paddedIndex = (index: number): string => {\n if (index >= MAX_NESTED_SIBLINGS) {\n throw new Error(\n `A single css template cannot have more than ${MAX_NESTED_SIBLINGS} nested blocks.`\n );\n }\n return String(index).padStart(3, '0');\n};\n\nconst composeNestedSelector =\n (self: StyleHandle, alternatives: readonly SelectorAlternative[]) =>\n (h: StyleSelectorResolver): string =>\n alternatives\n .map((parts) =>\n parts\n .map((part) =>\n typeof part === 'string'\n ? part.replaceAll('&', `.${h(self)}`)\n : `.${h(part)}`\n )\n .join('')\n )\n .join(',');\n\nconst expandNestedEntries = (\n moduleName: string,\n self: StyleHandle,\n nested: readonly PendingNested[],\n variant: boolean,\n entries: StyleEntry[],\n themeDeps: Set<string>,\n varDeps: Set<ContextualVarPath>\n): void => {\n nested.forEach((entry, index) => {\n const key = `${self.key}/&/${paddedIndex(index)}`;\n if (entry.kind === 'nested-rule') {\n entries.push(\n makeNestedRule(\n moduleName,\n key,\n self,\n entry,\n variant,\n themeDeps,\n varDeps\n )\n );\n return;\n }\n const rules: StyleRule[] = [];\n if (entry.self) {\n rules.push(\n makeNestedRule(\n moduleName,\n `${key}/${paddedIndex(0)}`,\n self,\n {\n kind: 'nested-rule',\n alternatives: [['&']],\n declarations: entry.self,\n },\n variant,\n themeDeps,\n varDeps\n )\n );\n }\n entry.rules.forEach((rule, ruleIndex) => {\n rules.push(\n makeNestedRule(\n moduleName,\n `${key}/${paddedIndex(ruleIndex + (entry.self ? 1 : 0))}`,\n self,\n rule,\n variant,\n themeDeps,\n varDeps\n )\n );\n });\n entries.push({\n kind: 'media',\n key,\n moduleName,\n query: entry.query,\n rules,\n variant,\n });\n });\n};\n\nconst makeNestedRule = (\n moduleName: string,\n key: string,\n self: StyleHandle,\n rule: PendingNestedRule,\n variant: boolean,\n themeDeps: Set<string>,\n varDeps: Set<ContextualVarPath>\n): StyleRule => {\n copyDeps(rule.declarations.deps, themeDeps, varDeps);\n return {\n kind: 'rule',\n moduleName,\n key,\n selector: composeNestedSelector(self, rule.alternatives),\n declarations: rule.declarations,\n dependsOn: EMPTY_DEPS,\n auto: true,\n variant,\n };\n};\n\nconst recordRuleDeps = (\n entries: readonly StyleEntry[],\n handles: readonly StyleHandle[]\n): void => {\n if (entries.length === 0) {\n return;\n }\n for (const entry of entries) {\n if (entry.kind === 'rule') {\n assignDependsOn(entry, computeRuleDeps(entry, handles));\n continue;\n }\n if (entry.kind === 'media') {\n for (const nested of entry.rules) {\n assignDependsOn(nested, computeRuleDeps(nested, handles));\n }\n }\n }\n};\n\nconst assignDependsOn = (\n rule: StyleRule,\n dependsOn: ReadonlySet<string>\n): void => {\n (rule as { dependsOn: ReadonlySet<string> }).dependsOn = dependsOn;\n};\n\nconst computeRuleDeps = (\n rule: StyleRule,\n handles: readonly StyleHandle[]\n): ReadonlySet<string> => {\n const accessed = new Set<string>();\n const trackingResolver = ((handle: StyleHandle) => {\n accessed.add(handle.key);\n return `.${handle.readableName}`;\n }) as StyleSelectorResolver;\n for (const handle of handles) {\n defineTrackingAlias(trackingResolver, handle.localName, handle, accessed);\n const leafName = handle.localName.split('/').at(-1);\n if (leafName && leafName !== handle.localName) {\n defineTrackingAlias(trackingResolver, leafName, handle, accessed);\n }\n }\n try {\n rule.selector(trackingResolver);\n } catch {\n // Selector factories are expected to be pure string-builders, but a\n // factory that throws on dummy input shouldn't break module construction.\n // The dep set stays whatever was recorded before the throw.\n }\n return accessed;\n};\n\nconst defineTrackingAlias = (\n resolver: StyleSelectorResolver,\n name: string,\n handle: StyleHandle,\n accessed: Set<string>\n): void => {\n if (!/^[A-Za-z_$][\\w$]*$/.test(name) || name in resolver) {\n return;\n }\n Object.defineProperty(resolver, name, {\n configurable: true,\n enumerable: true,\n get: () => {\n accessed.add(handle.key);\n return `.${handle.readableName}`;\n },\n });\n};\n\nconst copyDeps = (\n deps: StyleDeps,\n themeDeps: Set<string>,\n varDeps: Set<ContextualVarPath>\n): void => {\n deps.theme.forEach((path) => themeDeps.add(path));\n deps.vars.forEach((path) => varDeps.add(path));\n};\n\nconst isPendingHandle = (value: unknown): value is PendingStyleHandle =>\n Boolean(\n value &&\n typeof value === 'object' &&\n (value as PendingEntry).kind === 'pending-handle'\n );\n\nconst isRule = (value: unknown): value is StyleRule =>\n Boolean(\n value &&\n typeof value === 'object' &&\n (value as PendingEntry).kind === 'rule'\n );\n\nconst isMedia = (value: unknown): value is StyleMedia =>\n Boolean(\n value &&\n typeof value === 'object' &&\n (value as PendingEntry).kind === 'media'\n );\n"]}
@@ -0,0 +1,187 @@
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.readableVarOwnersFromEnvironment = exports.StyleRegistry = void 0;
10
+ const names_1 = require("../names");
11
+ /**
12
+ * Registered style modules for one distillery. Throws on duplicate module names or colliding readable class/var names.
13
+ */
14
+ class StyleRegistry {
15
+ prefix;
16
+ reservedVarOwners;
17
+ sharedVarPaths;
18
+ modulesByName = new Map();
19
+ targetedKeys;
20
+ constructor(prefix, reservedVarOwners = new Map(), sharedVarPaths = new Set()) {
21
+ this.prefix = prefix;
22
+ this.reservedVarOwners = reservedVarOwners;
23
+ this.sharedVarPaths = sharedVarPaths;
24
+ }
25
+ /**
26
+ * Adds `module` to this registry.
27
+ *
28
+ * @throws If another module already uses this name, or if a readable class or CSS-variable name collides (including `themeVars` and `sharedVars`).
29
+ */
30
+ registerModule(module) {
31
+ const existing = this.modulesByName.get(module.name);
32
+ if (existing === module) {
33
+ return;
34
+ }
35
+ if (existing) {
36
+ throw new Error(`Style module "${module.name}" is already registered.`);
37
+ }
38
+ assertReadableNameCollisions(this.prefix, this.reservedVarOwners, this.sharedVarPaths, this.modulesByName.values(), module);
39
+ this.modulesByName.set(module.name, module);
40
+ this.targetedKeys = undefined;
41
+ }
42
+ /**
43
+ * True when some rule, or some inner rule of an `@media` / `@container` block, reads `key` in its selector.
44
+ *
45
+ * A nested `&` rule records its owning handle through `recordRuleDeps`, so a handle with an empty self block but real nested rules is targeted. A rule-less nested block targets nothing.
46
+ */
47
+ targetsHandle(key) {
48
+ return this.targetedHandleKeys().has(key);
49
+ }
50
+ targetedHandleKeys() {
51
+ if (this.targetedKeys) {
52
+ return this.targetedKeys;
53
+ }
54
+ const keys = new Set();
55
+ for (const module of this.modulesByName.values()) {
56
+ for (const entry of module.entries) {
57
+ if (entry.kind === 'rule') {
58
+ entry.dependsOn.forEach((dep) => keys.add(dep));
59
+ }
60
+ else if (entry.kind === 'media') {
61
+ for (const inner of entry.rules) {
62
+ inner.dependsOn.forEach((dep) => keys.add(dep));
63
+ }
64
+ }
65
+ }
66
+ }
67
+ this.targetedKeys = keys;
68
+ return keys;
69
+ }
70
+ /** Registered modules, sorted by name. */
71
+ get modules() {
72
+ return [...this.modulesByName.values()].sort((a, b) => a.name.localeCompare(b.name));
73
+ }
74
+ /** Looks up a module by the name passed to `createStyleModule`. */
75
+ module(name) {
76
+ return this.modulesByName.get(name);
77
+ }
78
+ /** Handle keys across all modules. Compact-name domain for a full stylesheet. */
79
+ get classKeys() {
80
+ return this.modules.flatMap((module) => module.handleList.map((handle) => handle.key));
81
+ }
82
+ /** Theme and contextual-var keys across all modules. */
83
+ get cssVarKeys() {
84
+ const keys = new Set();
85
+ for (const module of this.modules) {
86
+ module.themeDeps.forEach((path) => keys.add(path));
87
+ module.varDeps.forEach((path) => keys.add(path));
88
+ }
89
+ return [...keys].sort();
90
+ }
91
+ /**
92
+ * Frozen class and CSS-var keys for a {@link StyleNameResolver}.
93
+ *
94
+ * @param options Overrides the registry-wide key sets when compact-naming a subset.
95
+ */
96
+ freeze(options = {}) {
97
+ return Object.freeze({
98
+ classKeys: Object.freeze(sortedUnique(options.classKeys ?? this.classKeys)),
99
+ cssVarKeys: Object.freeze(sortedUnique(options.cssVarKeys ?? this.cssVarKeys)),
100
+ });
101
+ }
102
+ }
103
+ exports.StyleRegistry = StyleRegistry;
104
+ const sortedUnique = (values) => [...new Set(values)].sort();
105
+ const claimReadableVar = (owners, name, owner) => {
106
+ const prior = owners.get(name);
107
+ if (prior) {
108
+ throw new Error(`Readable CSS variable "${name}" collides between ${prior} and ${owner}.`);
109
+ }
110
+ owners.set(name, owner);
111
+ };
112
+ /** Readable custom-property names already claimed by `themeVars` / `sharedVars`. */
113
+ const readableVarOwnersFromEnvironment = (environment) => {
114
+ const owners = new Map();
115
+ const { prefix } = environment;
116
+ for (const path of Object.keys(environment.themeVars)) {
117
+ claimReadableVar(owners, (0, names_1.cssVarName)(prefix, path), `theme var "${path}"`);
118
+ }
119
+ for (const path of environment.sharedVars ?? []) {
120
+ claimReadableVar(owners, (0, names_1.cssVarName)(prefix, path), `shared var "${path}"`);
121
+ }
122
+ return owners;
123
+ };
124
+ exports.readableVarOwnersFromEnvironment = readableVarOwnersFromEnvironment;
125
+ const assertReadableNameCollisions = (prefix, reservedVarOwners, sharedVarPaths, existing, incoming) => {
126
+ const classOwners = new Map();
127
+ const reservedOwners = new Map(reservedVarOwners);
128
+ const localVarOwners = new Map();
129
+ const index = (module) => {
130
+ for (const handle of module.handleList) {
131
+ const prior = classOwners.get(handle.readableName);
132
+ if (prior) {
133
+ throw new Error(`Readable class name "${handle.readableName}" collides between ${prior} and module "${module.name}" handle "${handle.localName}".`);
134
+ }
135
+ classOwners.set(handle.readableName, `module "${module.name}" handle "${handle.localName}"`);
136
+ }
137
+ for (const path of localVarPathsOf(module, sharedVarPaths)) {
138
+ const name = (0, names_1.cssVarName)(prefix, path);
139
+ const owner = `module "${module.name}" var "${path}"`;
140
+ const reserved = reservedOwners.get(name);
141
+ if (reserved) {
142
+ throw new Error(`Readable CSS variable "${name}" collides between ${reserved} and ${owner}.`);
143
+ }
144
+ const prior = localVarOwners.get(name);
145
+ if (prior && prior.path !== path) {
146
+ throw new Error(`Readable CSS variable "${name}" collides between ${prior.owner} and ${owner}.`);
147
+ }
148
+ localVarOwners.set(name, { path, owner });
149
+ }
150
+ };
151
+ for (const module of existing) {
152
+ index(module);
153
+ }
154
+ index(incoming);
155
+ };
156
+ // `deps.vars` records every contextual var a module *references*, which includes
157
+ // shared ones the module does not own. A shared path synthesizes the same
158
+ // readable name as a local var would, so leaving them in makes two modules that
159
+ // merely reference one shared var collide on it. The same exclusion is applied
160
+ // when compaction maps readable names to compact ones.
161
+ const localVarPathsOf = (module, sharedVarPaths) => {
162
+ const paths = new Set();
163
+ const addFrom = (declarations) => {
164
+ declarations.deps.vars.forEach((path) => {
165
+ if (!sharedVarPaths.has(path)) {
166
+ paths.add(path);
167
+ }
168
+ });
169
+ for (const group of declarations.deps.defaults) {
170
+ for (const item of group.keys) {
171
+ paths.add(item.path);
172
+ }
173
+ }
174
+ };
175
+ for (const entry of module.entries) {
176
+ if (entry.kind === 'handle' || entry.kind === 'rule') {
177
+ addFrom(entry.declarations);
178
+ }
179
+ else {
180
+ for (const nested of entry.rules) {
181
+ addFrom(nested.declarations);
182
+ }
183
+ }
184
+ }
185
+ return [...paths];
186
+ };
187
+ //# sourceMappingURL=registry.js.map