@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,28 @@
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.isCssToken = exports.themeToken = void 0;
10
+ const kind_1 = require("./kind");
11
+ /** Theme token that stringifies to `var(<cssVar>)`. */
12
+ const themeToken = (path, cssVar) => {
13
+ const ref = `var(${cssVar})`;
14
+ const refToString = () => ref;
15
+ return {
16
+ __kind: 'theme-token',
17
+ path,
18
+ cssVar,
19
+ ref,
20
+ toString: refToString,
21
+ [Symbol.toPrimitive]: refToString,
22
+ };
23
+ };
24
+ exports.themeToken = themeToken;
25
+ /** `true` when `value` is a {@link CssToken}. @param value Value to test. */
26
+ const isCssToken = (value) => (0, kind_1.hasKind)(value, 'theme-token');
27
+ exports.isCssToken = isCssToken;
28
+ //# sourceMappingURL=theme_token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme_token.js","sourceRoot":"","sources":["../../../src/tokens/theme_token.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,iCAAiC;AAkBjC,uDAAuD;AAChD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAqB,EAAY,EAAE;IAC1E,MAAM,GAAG,GAAuB,OAAO,MAAM,GAAG,CAAC;IACjD,MAAM,WAAW,GAAG,GAAW,EAAE,CAAC,GAAG,CAAC;IACtC,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,IAAI;QACJ,MAAM;QACN,GAAG;QACH,QAAQ,EAAE,WAAW;QACrB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,WAAW;KAClC,CAAC;AACJ,CAAC,CAAC;AAXW,QAAA,UAAU,cAWrB;AAEF,6EAA6E;AACtE,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAC9D,IAAA,cAAO,EAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AADnB,QAAA,UAAU,cACS","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 { hasKind } from './kind';\n\n/** Represents a CSS theme token. Stringifies to `var(--...)`. */\nexport interface CssToken {\n /** Brand for {@link isCssToken}. */\n readonly __kind: 'theme-token';\n /** Path string mapping to this token in the environment. */\n readonly path: string;\n /** Actual emitted CSS custom property name. */\n readonly cssVar: `--${string}`;\n /** Usable CSS `var(...)` reference string. */\n readonly ref: `var(--${string})`;\n /** Stringifies to {@link CssToken.ref}. */\n toString(): string;\n /** Template interpolation; same as {@link CssToken.toString}. */\n [Symbol.toPrimitive](hint: string): string;\n}\n\n/** Theme token that stringifies to `var(<cssVar>)`. */\nexport const themeToken = (path: string, cssVar: `--${string}`): CssToken => {\n const ref: `var(--${string})` = `var(${cssVar})`;\n const refToString = (): string => ref;\n return {\n __kind: 'theme-token',\n path,\n cssVar,\n ref,\n toString: refToString,\n [Symbol.toPrimitive]: refToString,\n };\n};\n\n/** `true` when `value` is a {@link CssToken}. @param value Value to test. */\nexport const isCssToken = (value: unknown): value is CssToken =>\n hasKind(value, 'theme-token');\n"]}
@@ -0,0 +1,115 @@
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.assertVarRefsHaveDeclarations = exports.findVarRefViolations = exports.collectReferencedCustomProperties = exports.collectDeclaredCustomProperties = void 0;
10
+ const css_scan_1 = require("./css_scan");
11
+ const DECLARATION_RE = /(--[A-Za-z_][\w-]*)\s*:/g;
12
+ const REFERENCE_RE = /var\(\s*(--[A-Za-z_][\w-]*)/g;
13
+ const scan = (css) => {
14
+ const masked = [];
15
+ const blockAt = [];
16
+ for (const span of (0, css_scan_1.scanCss)(css)) {
17
+ const blank = (0, css_scan_1.isOpaque)(span);
18
+ for (let offset = 0; offset < span.text.length; offset += 1) {
19
+ masked.push(blank ? ' ' : (span.text[offset] ?? ''));
20
+ blockAt.push(span.block);
21
+ }
22
+ }
23
+ return { masked: masked.join(''), blockAt };
24
+ };
25
+ /**
26
+ * A custom property is declared where a declaration can start: inside a
27
+ * declarations block, as the first thing after `{` or `;`. A selector carrying
28
+ * a BEM-style modifier and a pseudo-class (`.button--active:hover`) matches the
29
+ * same characters and declares nothing.
30
+ */
31
+ const isDeclarationStart = ({ masked, blockAt }, index) => {
32
+ if (blockAt[index] !== 'declarations') {
33
+ return false;
34
+ }
35
+ for (let cursor = index - 1; cursor >= 0; cursor -= 1) {
36
+ const char = masked[cursor];
37
+ if (char === undefined || !/\s/.test(char)) {
38
+ return char === '{' || char === ';';
39
+ }
40
+ }
41
+ return false;
42
+ };
43
+ /**
44
+ * `var` has to open a function token rather than end a longer identifier:
45
+ * `--expr:myvar(--x)` names some other function.
46
+ */
47
+ const isFunctionTokenStart = (masked, index) => {
48
+ const before = masked[index - 1];
49
+ return before === undefined || !/[\w\\-]/.test(before);
50
+ };
51
+ /** Collects every custom property declared in a declaration position in `css`. */
52
+ const collectDeclaredCustomProperties = (css) => {
53
+ const scanned = scan(css);
54
+ const declared = new Set();
55
+ for (const match of scanned.masked.matchAll(DECLARATION_RE)) {
56
+ const name = match[1];
57
+ if (name && isDeclarationStart(scanned, match.index ?? 0)) {
58
+ declared.add(name);
59
+ }
60
+ }
61
+ return declared;
62
+ };
63
+ exports.collectDeclaredCustomProperties = collectDeclaredCustomProperties;
64
+ /** Collects all custom property names referenced inside `var(...)` calls in `css`. */
65
+ const collectReferencedCustomProperties = (css) => {
66
+ const { masked } = scan(css);
67
+ const names = [];
68
+ for (const match of masked.matchAll(REFERENCE_RE)) {
69
+ const name = match[1];
70
+ if (name && isFunctionTokenStart(masked, match.index ?? 0)) {
71
+ names.push(name);
72
+ }
73
+ }
74
+ return names;
75
+ };
76
+ exports.collectReferencedCustomProperties = collectReferencedCustomProperties;
77
+ /**
78
+ * Returns all `var(...)` references whose custom property is never declared in `css`.
79
+ *
80
+ * @param css Full CSS text to scan.
81
+ */
82
+ const findVarRefViolations = (css) => {
83
+ const { masked } = scan(css);
84
+ const declared = (0, exports.collectDeclaredCustomProperties)(css);
85
+ const violations = [];
86
+ for (const match of masked.matchAll(REFERENCE_RE)) {
87
+ const ref = match[1];
88
+ const index = match.index ?? 0;
89
+ if (!ref || declared.has(ref) || !isFunctionTokenStart(masked, index)) {
90
+ continue;
91
+ }
92
+ violations.push({
93
+ reference: ref,
94
+ context: css.slice(Math.max(0, index - 40), index + ref.length + 8),
95
+ });
96
+ }
97
+ return violations;
98
+ };
99
+ exports.findVarRefViolations = findVarRefViolations;
100
+ /**
101
+ * Throws if any `var(...)` in `css` has no matching custom-property declaration.
102
+ *
103
+ * @param css Full CSS text to scan.
104
+ * @throws If any reference has no declaration in the same text.
105
+ */
106
+ const assertVarRefsHaveDeclarations = (css) => {
107
+ const violations = (0, exports.findVarRefViolations)(css);
108
+ if (violations.length === 0) {
109
+ return;
110
+ }
111
+ const lines = violations.map(({ reference, context }) => `- ${reference} referenced near "${context.replace(/\s+/g, ' ')}"`);
112
+ throw new Error(`${violations.length} var(...) reference(s) without a matching declaration:\n${lines.join('\n')}`);
113
+ };
114
+ exports.assertVarRefsHaveDeclarations = assertVarRefsHaveDeclarations;
115
+ //# sourceMappingURL=var_invariant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"var_invariant.js","sourceRoot":"","sources":["../../src/var_invariant.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 CssBlockKind, isOpaque, scanCss } from './css_scan';\n\nconst DECLARATION_RE = /(--[A-Za-z_][\\w-]*)\\s*:/g;\nconst REFERENCE_RE = /var\\(\\s*(--[A-Za-z_][\\w-]*)/g;\n\n/** A `var(...)` whose custom property is never declared in the same CSS text. */\nexport interface VarInvariantViolation {\n /** The undeclared custom property name (e.g. `--aui-color-bg`). */\n readonly reference: string;\n /** Surrounding CSS text for error reporting. */\n readonly context: string;\n}\n\ninterface ScannedCss {\n /**\n * `css` with comments, strings, `url(...)` tokens, and escapes blanked to\n * spaces, positions preserved. A `var(` inside a string is text, a `;`\n * inside an escape is part of a value, and neither should match here.\n */\n readonly masked: string;\n /** The enclosing block kind at each character offset. */\n readonly blockAt: readonly CssBlockKind[];\n}\n\nconst scan = (css: string): ScannedCss => {\n const masked: string[] = [];\n const blockAt: CssBlockKind[] = [];\n for (const span of scanCss(css)) {\n const blank = isOpaque(span);\n for (let offset = 0; offset < span.text.length; offset += 1) {\n masked.push(blank ? ' ' : (span.text[offset] ?? ''));\n blockAt.push(span.block);\n }\n }\n return { masked: masked.join(''), blockAt };\n};\n\n/**\n * A custom property is declared where a declaration can start: inside a\n * declarations block, as the first thing after `{` or `;`. A selector carrying\n * a BEM-style modifier and a pseudo-class (`.button--active:hover`) matches the\n * same characters and declares nothing.\n */\nconst isDeclarationStart = (\n { masked, blockAt }: ScannedCss,\n index: number\n): boolean => {\n if (blockAt[index] !== 'declarations') {\n return false;\n }\n for (let cursor = index - 1; cursor >= 0; cursor -= 1) {\n const char = masked[cursor];\n if (char === undefined || !/\\s/.test(char)) {\n return char === '{' || char === ';';\n }\n }\n return false;\n};\n\n/**\n * `var` has to open a function token rather than end a longer identifier:\n * `--expr:myvar(--x)` names some other function.\n */\nconst isFunctionTokenStart = (masked: string, index: number): boolean => {\n const before = masked[index - 1];\n return before === undefined || !/[\\w\\\\-]/.test(before);\n};\n\n/** Collects every custom property declared in a declaration position in `css`. */\nexport const collectDeclaredCustomProperties = (css: string): Set<string> => {\n const scanned = scan(css);\n const declared = new Set<string>();\n for (const match of scanned.masked.matchAll(DECLARATION_RE)) {\n const name = match[1];\n if (name && isDeclarationStart(scanned, match.index ?? 0)) {\n declared.add(name);\n }\n }\n return declared;\n};\n\n/** Collects all custom property names referenced inside `var(...)` calls in `css`. */\nexport const collectReferencedCustomProperties = (\n css: string\n): readonly string[] => {\n const { masked } = scan(css);\n const names: string[] = [];\n for (const match of masked.matchAll(REFERENCE_RE)) {\n const name = match[1];\n if (name && isFunctionTokenStart(masked, match.index ?? 0)) {\n names.push(name);\n }\n }\n return names;\n};\n\n/**\n * Returns all `var(...)` references whose custom property is never declared in `css`.\n *\n * @param css Full CSS text to scan.\n */\nexport const findVarRefViolations = (\n css: string\n): readonly VarInvariantViolation[] => {\n const { masked } = scan(css);\n const declared = collectDeclaredCustomProperties(css);\n const violations: VarInvariantViolation[] = [];\n for (const match of masked.matchAll(REFERENCE_RE)) {\n const ref = match[1];\n const index = match.index ?? 0;\n if (!ref || declared.has(ref) || !isFunctionTokenStart(masked, index)) {\n continue;\n }\n violations.push({\n reference: ref,\n context: css.slice(Math.max(0, index - 40), index + ref.length + 8),\n });\n }\n return violations;\n};\n\n/**\n * Throws if any `var(...)` in `css` has no matching custom-property declaration.\n *\n * @param css Full CSS text to scan.\n * @throws If any reference has no declaration in the same text.\n */\nexport const assertVarRefsHaveDeclarations = (css: string): void => {\n const violations = findVarRefViolations(css);\n if (violations.length === 0) {\n return;\n }\n const lines = violations.map(\n ({ reference, context }) =>\n `- ${reference} referenced near \"${context.replace(/\\s+/g, ' ')}\"`\n );\n throw new Error(\n `${violations.length} var(...) reference(s) without a matching declaration:\\n${lines.join('\\n')}`\n );\n};\n"]}
@@ -0,0 +1,101 @@
1
+ import { type StyleNameMode, type StyleNameResolver, type StyleTarget } from './names.js';
2
+ import type { ContextualVarPath, StyleEntry, StyleHandle, StyleRegistry, StylesModule } from './styles/index.js';
3
+ /** Target, naming mode, registry, and prefix for one {@link StylesCollector}. */
4
+ export interface StylesCollectorOptions {
5
+ /** Target context (e.g. `artifact` or `stylesheet`). */
6
+ target: StyleTarget;
7
+ /** Desired name mode (`compact` or `readable`). */
8
+ names: StyleNameMode;
9
+ /** Registry modules were authored against; used for auto-collection and compact-name snapshots. */
10
+ registry: StyleRegistry;
11
+ /** Brand prefix forwarded to the name resolver. */
12
+ prefix: string;
13
+ /** When `true`, emit no-op-handle warnings through `warn`. Inherited from `createDistillery({ dev })`. */
14
+ dev?: boolean;
15
+ /** Warning sink for no-op handles. Used only when `dev` is `true`. Defaults to `console.warn`. */
16
+ warn?: (message: string) => void;
17
+ }
18
+ /** Reachable entries for one render or one stylesheet. */
19
+ export declare class StylesCollector {
20
+ /** The target collection mode. */
21
+ readonly target: StyleTarget;
22
+ /** The naming mode (compact vs readable). */
23
+ readonly names: StyleNameMode;
24
+ /** Associated registry. */
25
+ readonly registry: StyleRegistry;
26
+ /** Emitted class name prefix. */
27
+ readonly prefix: string;
28
+ private readonly dev;
29
+ private readonly warn;
30
+ private readonly entries;
31
+ private readonly handles;
32
+ private readonly themeDeps;
33
+ private readonly varDeps;
34
+ private readonly listeners;
35
+ private depth;
36
+ private dirty;
37
+ constructor({ target, names, registry, prefix, dev, warn, }: StylesCollectorOptions);
38
+ /**
39
+ * Collects a module's non-variant entries, or one explicit entry.
40
+ *
41
+ * Variant entries stay off this path; collect them via `useHandles`.
42
+ *
43
+ * @param value Module (all non-variant entries), a single entry, or an array of entries.
44
+ */
45
+ use(value: StylesModule | StyleEntry | readonly StyleEntry[]): void;
46
+ private useValue;
47
+ /**
48
+ * Collects every entry on `module`, including variants. Used by the stylesheet target.
49
+ *
50
+ * @param module Module whose entries should all be collected.
51
+ */
52
+ useAllEntries(module: StylesModule): void;
53
+ /**
54
+ * Collects handles and auto-includes rules whose selector deps are all present.
55
+ *
56
+ * Media blocks gain inner rules whose deps are met and keep rules already collected.
57
+ *
58
+ * @param handles Handles resolved during this render pass (e.g. from `resolveClassName`).
59
+ * @returns Handles that were retained. Empty untargeted handles are omitted in compact mode.
60
+ */
61
+ useHandles(handles: readonly StyleHandle[]): readonly StyleHandle[];
62
+ /** Collects `auto` rules on `module` whose every selector dependency is already collected. */
63
+ useRulesWhenDepsMet(module: StylesModule): void;
64
+ /**
65
+ * Calls `listener` after a public mutation adds an entry, handle, theme var, or contextual var.
66
+ *
67
+ * Fires at most once per outermost call; nested calls such as `use([a, b])` batch into it.
68
+ *
69
+ * @param listener Called with no arguments after the collection grows.
70
+ * @returns Unsubscribes `listener`.
71
+ */
72
+ subscribe(listener: () => void): () => void;
73
+ private tryActivateDependent;
74
+ private allDepsMet;
75
+ /** Marks a theme token path as reachable so it appears in the emitted theme block, even if no collected declaration reads it. */
76
+ useThemeVar(path: string): void;
77
+ /** Creates a {@link StyleNameResolver} scoped to this collector's current dep set. */
78
+ createResolver(): StyleNameResolver;
79
+ /** Collected style entries sorted for emission (base rules before all `@media`/`@container` blocks). */
80
+ get collectedEntries(): readonly StyleEntry[];
81
+ /** Theme token paths that survive reachability; emitted in the theme scope block. */
82
+ get collectedThemeDeps(): ReadonlySet<string>;
83
+ /** Contextual var paths that survive reachability; used by the runtime for compact-name substitution. */
84
+ get collectedVarDeps(): ReadonlySet<ContextualVarPath>;
85
+ /**
86
+ * Returns the variable keys within `groupPath` that are reachable from `handle` or from any collected rule targeting it.
87
+ *
88
+ * @param handle Handle whose declaration refs and dependent rules are consulted.
89
+ * @param groupPath Group prefix path (e.g. `vars/chip/look`).
90
+ */
91
+ reachableDefaults(handle: StyleHandle, groupPath: `vars/${string}`): ReadonlySet<string>;
92
+ private finalizeDeps;
93
+ private retainHandle;
94
+ private addEntry;
95
+ private addDeclarationDeps;
96
+ private addDeps;
97
+ private setEntry;
98
+ private setHandle;
99
+ private batch;
100
+ }
101
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"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"}