@elastic/distillate 0.2.0 → 0.2.1-main.20261030215817.gcd04b63
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.
- package/README.md +2 -0
- package/dist/cjs/collector.js +41 -20
- package/dist/cjs/collector.js.map +1 -1
- package/dist/cjs/css_scan.js +2 -6
- package/dist/cjs/css_scan.js.map +1 -1
- package/dist/cjs/emotion.js +2 -9
- package/dist/cjs/emotion.js.map +1 -1
- package/dist/cjs/minify.js +3 -8
- package/dist/cjs/minify.js.map +1 -1
- package/dist/cjs/nesting.js +5 -13
- package/dist/cjs/nesting.js.map +1 -1
- package/dist/cjs/runtime.js +88 -32
- package/dist/cjs/runtime.js.map +1 -1
- package/dist/cjs/styles/authoring.js +0 -3
- package/dist/cjs/styles/authoring.js.map +1 -1
- package/dist/cjs/styles/declarations.js +12 -16
- package/dist/cjs/styles/declarations.js.map +1 -1
- package/dist/cjs/styles/module.js +2 -7
- package/dist/cjs/styles/module.js.map +1 -1
- package/dist/cjs/styles/registry.js +1 -5
- package/dist/cjs/styles/registry.js.map +1 -1
- package/dist/cjs/styles/types.js.map +1 -1
- package/dist/collector.d.ts +5 -0
- package/dist/collector.d.ts.map +1 -1
- package/dist/collector.js +41 -20
- package/dist/collector.js.map +1 -1
- package/dist/css_scan.d.ts.map +1 -1
- package/dist/css_scan.js +2 -6
- package/dist/css_scan.js.map +1 -1
- package/dist/emotion.d.ts.map +1 -1
- package/dist/emotion.js +2 -9
- package/dist/emotion.js.map +1 -1
- package/dist/minify.d.ts.map +1 -1
- package/dist/minify.js +3 -8
- package/dist/minify.js.map +1 -1
- package/dist/nesting.d.ts.map +1 -1
- package/dist/nesting.js +5 -13
- package/dist/nesting.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +93 -37
- package/dist/runtime.js.map +1 -1
- package/dist/styles/authoring.d.ts.map +1 -1
- package/dist/styles/authoring.js +0 -3
- package/dist/styles/authoring.js.map +1 -1
- package/dist/styles/declarations.d.ts +1 -1
- package/dist/styles/declarations.d.ts.map +1 -1
- package/dist/styles/declarations.js +12 -16
- package/dist/styles/declarations.js.map +1 -1
- package/dist/styles/module.js +2 -7
- package/dist/styles/module.js.map +1 -1
- package/dist/styles/registry.js +1 -5
- package/dist/styles/registry.js.map +1 -1
- package/dist/styles/types.d.ts +1 -3
- package/dist/styles/types.d.ts.map +1 -1
- package/dist/styles/types.js.map +1 -1
- package/docs/getting-started/installation.md +2 -0
- package/docs/reference/api/emotion.md +21 -21
- package/docs/reference/api/index-1.md +266 -266
- package/docs/reference/api/testing.md +6 -6
- package/package.json +1 -1
- package/src/collector.ts +49 -24
- package/src/css_scan.ts +8 -16
- package/src/emotion.ts +2 -9
- package/src/minify.ts +3 -8
- package/src/nesting.ts +5 -13
- package/src/runtime.ts +110 -51
- package/src/styles/authoring.ts +0 -3
- package/src/styles/declarations.ts +15 -17
- package/src/styles/module.ts +2 -7
- package/src/styles/registry.ts +1 -5
- package/src/styles/types.ts +1 -3
package/README.md
CHANGED
|
@@ -29,6 +29,8 @@ npm install @elastic/distillate
|
|
|
29
29
|
|
|
30
30
|
Requires Node.js 20 or later. The package ships as ESM (`import`) with a parallel CommonJS build (`require`) for consumers that cannot load ESM directly — see [Installation](https://elastic.github.io/distillate/getting-started/installation.html).
|
|
31
31
|
|
|
32
|
+
The latest `main` is published as `@next` (`npm install @elastic/distillate@next`), a prerelease that `latest` and caret ranges never select.
|
|
33
|
+
|
|
32
34
|
## Quick start
|
|
33
35
|
|
|
34
36
|
Bind the engine to your library with `createDistillery`. The snippets use an EUI-flavored environment to show that the engine carries no brand of its own.
|
package/dist/cjs/collector.js
CHANGED
|
@@ -65,11 +65,16 @@ class StylesCollector {
|
|
|
65
65
|
warn;
|
|
66
66
|
entries = new Map();
|
|
67
67
|
handles = new Map();
|
|
68
|
+
// Handles `useHandles` has fully processed since the last entry or handle change.
|
|
69
|
+
settledHandles = new Set();
|
|
70
|
+
// Bumped whenever `settledHandles` is invalidated.
|
|
71
|
+
revision = 0;
|
|
68
72
|
themeDeps = new Set();
|
|
69
73
|
varDeps = new Set();
|
|
70
74
|
listeners = new Set();
|
|
71
75
|
depth = 0;
|
|
72
76
|
dirty = false;
|
|
77
|
+
finalized;
|
|
73
78
|
constructor({ target, names, registry, prefix, dev = false, warn = (message) => console.warn(message), }) {
|
|
74
79
|
this.target = target;
|
|
75
80
|
this.names = names;
|
|
@@ -94,10 +99,7 @@ class StylesCollector {
|
|
|
94
99
|
return;
|
|
95
100
|
}
|
|
96
101
|
if (isStylesModule(value)) {
|
|
97
|
-
//
|
|
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.
|
|
102
|
+
// Variant entries' deps would claim compact names for handles never rendered.
|
|
101
103
|
for (const entry of value.entries) {
|
|
102
104
|
if (entry.variant) {
|
|
103
105
|
continue;
|
|
@@ -160,12 +162,19 @@ class StylesCollector {
|
|
|
160
162
|
*/
|
|
161
163
|
useHandles(handles) {
|
|
162
164
|
return this.batch(() => {
|
|
165
|
+
const revision = this.revision;
|
|
163
166
|
const retained = [];
|
|
167
|
+
let pending = [];
|
|
164
168
|
for (const handle of handles) {
|
|
169
|
+
if (this.settledHandles.has(handle)) {
|
|
170
|
+
retained.push(handle);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
165
173
|
if (!this.retainHandle(handle)) {
|
|
166
174
|
continue;
|
|
167
175
|
}
|
|
168
176
|
retained.push(handle);
|
|
177
|
+
pending.push(handle);
|
|
169
178
|
if (this.handles.has(handle.key)) {
|
|
170
179
|
continue;
|
|
171
180
|
}
|
|
@@ -173,7 +182,11 @@ class StylesCollector {
|
|
|
173
182
|
this.setHandle(handle);
|
|
174
183
|
this.addDeclarationDeps(handle.declarations);
|
|
175
184
|
}
|
|
176
|
-
|
|
185
|
+
// A later handle may complete deps for a skipped one, so rescan them all.
|
|
186
|
+
if (this.revision !== revision) {
|
|
187
|
+
pending = retained;
|
|
188
|
+
}
|
|
189
|
+
for (const handle of pending) {
|
|
177
190
|
const module = this.registry.module(handle.moduleName);
|
|
178
191
|
if (!module) {
|
|
179
192
|
continue;
|
|
@@ -182,6 +195,9 @@ class StylesCollector {
|
|
|
182
195
|
this.tryActivateDependent(dependent);
|
|
183
196
|
}
|
|
184
197
|
}
|
|
198
|
+
for (const handle of pending) {
|
|
199
|
+
this.settledHandles.add(handle);
|
|
200
|
+
}
|
|
185
201
|
return retained;
|
|
186
202
|
});
|
|
187
203
|
}
|
|
@@ -284,11 +300,6 @@ class StylesCollector {
|
|
|
284
300
|
get collectedVarDeps() {
|
|
285
301
|
return this.finalizeDeps().vars;
|
|
286
302
|
}
|
|
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
303
|
/**
|
|
293
304
|
* Returns the variable keys within `groupPath` that are reachable from `handle` or from any collected rule targeting it.
|
|
294
305
|
*
|
|
@@ -323,11 +334,12 @@ class StylesCollector {
|
|
|
323
334
|
}
|
|
324
335
|
return reachable;
|
|
325
336
|
}
|
|
326
|
-
//
|
|
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.
|
|
337
|
+
// Cached until entries, handles, or deps change.
|
|
330
338
|
finalizeDeps() {
|
|
339
|
+
this.finalized ??= this.computeFinalizedDeps();
|
|
340
|
+
return this.finalized;
|
|
341
|
+
}
|
|
342
|
+
computeFinalizedDeps() {
|
|
331
343
|
const theme = new Set(this.themeDeps);
|
|
332
344
|
const vars = new Set(this.varDeps);
|
|
333
345
|
for (const handle of this.handles.values()) {
|
|
@@ -343,10 +355,7 @@ class StylesCollector {
|
|
|
343
355
|
}
|
|
344
356
|
}
|
|
345
357
|
}
|
|
346
|
-
//
|
|
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.
|
|
358
|
+
// Rules have no host handle for reachability, so every default key counts, as at render.
|
|
350
359
|
for (const entry of this.entries.values()) {
|
|
351
360
|
if (entry.kind === 'rule') {
|
|
352
361
|
includeAllDefaults(entry.declarations.deps.defaults, theme, vars);
|
|
@@ -404,12 +413,17 @@ class StylesCollector {
|
|
|
404
413
|
}
|
|
405
414
|
if (this.themeDeps.size + this.varDeps.size !== before) {
|
|
406
415
|
this.dirty = true;
|
|
416
|
+
this.finalized = undefined;
|
|
407
417
|
}
|
|
408
418
|
}
|
|
409
419
|
// A media entry changes when it gains inner rules.
|
|
410
420
|
setEntry(entry) {
|
|
411
421
|
const key = entryKey(entry);
|
|
412
422
|
const existing = this.entries.get(key);
|
|
423
|
+
if (existing !== entry) {
|
|
424
|
+
this.invalidateSettled();
|
|
425
|
+
this.finalized = undefined;
|
|
426
|
+
}
|
|
413
427
|
this.entries.set(key, entry);
|
|
414
428
|
if (!existing ||
|
|
415
429
|
(existing.kind === 'media' &&
|
|
@@ -419,11 +433,19 @@ class StylesCollector {
|
|
|
419
433
|
}
|
|
420
434
|
}
|
|
421
435
|
setHandle(handle) {
|
|
436
|
+
if (this.handles.get(handle.key) !== handle) {
|
|
437
|
+
this.invalidateSettled();
|
|
438
|
+
this.finalized = undefined;
|
|
439
|
+
}
|
|
422
440
|
if (!this.handles.has(handle.key)) {
|
|
423
441
|
this.dirty = true;
|
|
424
442
|
}
|
|
425
443
|
this.handles.set(handle.key, handle);
|
|
426
444
|
}
|
|
445
|
+
invalidateSettled() {
|
|
446
|
+
this.settledHandles.clear();
|
|
447
|
+
this.revision += 1;
|
|
448
|
+
}
|
|
427
449
|
// Listeners run once the outermost public mutation returns.
|
|
428
450
|
batch(mutate) {
|
|
429
451
|
this.depth += 1;
|
|
@@ -470,8 +492,7 @@ const localVarOverrideRank = (entry) => {
|
|
|
470
492
|
}
|
|
471
493
|
return entry.declarations.css.some(local_vars_1.isLocalVarOverrideMarker) ? 1 : 0;
|
|
472
494
|
};
|
|
473
|
-
// Base entries
|
|
474
|
-
// `${group.set()}` after `${group}` defaults so a stacked override class wins. See finding `local-var-override-ordering`.
|
|
495
|
+
// Base entries precede every at-rule block, which adds no specificity. Override markers follow default markers so a stacked override class wins.
|
|
475
496
|
const compareEntriesForEmission = (a, b) => {
|
|
476
497
|
const rankDelta = mediaSortRank(a) - mediaSortRank(b);
|
|
477
498
|
if (rankDelta !== 0) {
|
|
@@ -1 +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"]}
|
|
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 // Handles `useHandles` has fully processed since the last entry or handle change.\n private readonly settledHandles = new Set<StyleHandle>();\n // Bumped whenever `settledHandles` is invalidated.\n private revision = 0;\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 private finalized: FinalizedDeps | undefined;\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 // Variant entries' deps would claim compact names for handles never rendered.\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 revision = this.revision;\n const retained: StyleHandle[] = [];\n let pending: StyleHandle[] = [];\n for (const handle of handles) {\n if (this.settledHandles.has(handle)) {\n retained.push(handle);\n continue;\n }\n if (!this.retainHandle(handle)) {\n continue;\n }\n retained.push(handle);\n pending.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 // A later handle may complete deps for a skipped one, so rescan them all.\n if (this.revision !== revision) {\n pending = retained;\n }\n for (const handle of pending) {\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 for (const handle of pending) {\n this.settledHandles.add(handle);\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 /**\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 // Cached until entries, handles, or deps change.\n private finalizeDeps(): FinalizedDeps {\n this.finalized ??= this.computeFinalizedDeps();\n return this.finalized;\n }\n\n private computeFinalizedDeps(): FinalizedDeps {\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 // Rules have no host handle for reachability, so every default key counts, as at render.\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 this.finalized = undefined;\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 if (existing !== entry) {\n this.invalidateSettled();\n this.finalized = undefined;\n }\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.get(handle.key) !== handle) {\n this.invalidateSettled();\n this.finalized = undefined;\n }\n if (!this.handles.has(handle.key)) {\n this.dirty = true;\n }\n this.handles.set(handle.key, handle);\n }\n\n private invalidateSettled(): void {\n this.settledHandles.clear();\n this.revision += 1;\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\ninterface FinalizedDeps {\n readonly theme: ReadonlySet<string>;\n readonly vars: ReadonlySet<ContextualVarPath>;\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 precede every at-rule block, which adds no specificity. Override markers follow default markers so a stacked override class wins.\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"]}
|
package/dist/cjs/css_scan.js
CHANGED
|
@@ -11,16 +11,12 @@ const STRUCTURAL = new Set(['{', '}', ':', ';', ',', '>']);
|
|
|
11
11
|
const URL_PREFIX = 'url(';
|
|
12
12
|
/** `true` when an unquoted `url(` function token starts at `index`. */
|
|
13
13
|
const isUnquotedUrlStart = (value, index) => {
|
|
14
|
-
//
|
|
15
|
-
// all but one character in a few hundred fails here rather than in a
|
|
16
|
-
// `slice().toLowerCase()`.
|
|
14
|
+
// Runs at every index of every text span, so reject on the first character.
|
|
17
15
|
const head = value[index];
|
|
18
16
|
if (head !== 'u' && head !== 'U') {
|
|
19
17
|
return false;
|
|
20
18
|
}
|
|
21
|
-
// `url(`
|
|
22
|
-
// `myurl(/a/*b*/c)` is some other function, and reading it as a url would
|
|
23
|
-
// make its contents opaque — hiding a real comment from every pass.
|
|
19
|
+
// `url(` must open a function token: `myurl(...)` is some other function.
|
|
24
20
|
const before = value[index - 1];
|
|
25
21
|
if (before !== undefined && /[\w\\-]/.test(before)) {
|
|
26
22
|
return false;
|
package/dist/cjs/css_scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css_scan.js","sourceRoot":"","sources":["../../src/css_scan.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\n// One scanner for the three passes that need to read CSS text: minification,\n// the `@media` canonicalization in `nesting.ts`, and the var invariant in\n// `./testing`. Each of those grew its own character loop, and each learned the\n// same lessons separately and late — comments inside `url(...)`, backslash\n// escapes, at-rules inside `url(...)`, selector-versus-declaration position.\n// A span is the unit all three actually need: a stretch of text with a kind\n// that says whether its contents are code or opaque, plus where it sits.\n//\n// This is deliberately not a CSS Syntax Level 3 tokenizer. It models the six\n// things those passes get wrong and nothing else, because a promise of full\n// conformance is one this module would not keep.\n\n/** What a span's text is, which decides whether a pass may look inside it. */\nexport type CssSpanKind =\n /** `/* … *\\/`, including the delimiters. Opaque. */\n | 'comment'\n /** A quoted string, including the quotes and any escapes. Opaque. */\n | 'string'\n /** An unquoted `url(…)` function token, including the parentheses. Opaque. */\n | 'url'\n /** A backslash and the character it escapes, outside a string. Opaque. */\n | 'escape'\n /** A run of whitespace. */\n | 'whitespace'\n /** One of `{ } : ; , >`. */\n | 'structural'\n /** Anything else, run together: identifiers, values, selectors, `var(`. */\n | 'text';\n\n/** Whether the enclosing block holds declarations or further rules. */\nexport type CssBlockKind = 'rules' | 'declarations';\n\n/** One scanner span: kind, source slice, and block context. */\nexport interface CssSpan {\n /** What this span's text is; opaque kinds are skipped by later passes. */\n readonly kind: CssSpanKind;\n /** Source slice for this span, including delimiters. */\n readonly text: string;\n /** Index of the first character in the source. */\n readonly start: number;\n /** Index one past the last character in the source. */\n readonly end: number;\n /**\n * What the enclosing block holds. An at-rule prelude (`@media …`) opens a\n * block of rules; anything else opens declarations; top level is rules.\n *\n * This is what separates `color : red` — where the space before `:` is\n * noise — from `.menu :hover`, where it is a descendant combinator.\n */\n readonly block: CssBlockKind;\n /** Block nesting depth; `0` at top level. */\n readonly depth: number;\n}\n\nconst STRUCTURAL = new Set(['{', '}', ':', ';', ',', '>']);\nconst URL_PREFIX = 'url(';\n\n/** `true` when an unquoted `url(` function token starts at `index`. */\nconst isUnquotedUrlStart = (value: string, index: number): boolean => {\n // Cheap rejection first: this runs at every index of every text span, and\n // all but one character in a few hundred fails here rather than in a\n // `slice().toLowerCase()`.\n const head = value[index];\n if (head !== 'u' && head !== 'U') {\n return false;\n }\n // `url(` has to open a function token rather than end a longer identifier.\n // `myurl(/a/*b*/c)` is some other function, and reading it as a url would\n // make its contents opaque — hiding a real comment from every pass.\n const before = value[index - 1];\n if (before !== undefined && /[\\w\\\\-]/.test(before)) {\n return false;\n }\n if (\n value.slice(index, index + URL_PREFIX.length).toLowerCase() !== URL_PREFIX\n ) {\n return false;\n }\n let cursor = index + URL_PREFIX.length;\n while (cursor < value.length && /\\s/.test(value[cursor] ?? '')) {\n cursor += 1;\n }\n const first = value[cursor];\n return first !== '\"' && first !== \"'\";\n};\n\n/** Index one past an unquoted `url(…)` token that starts at `start`. */\nconst endOfUrl = (value: string, start: number): number => {\n for (\n let index = start + URL_PREFIX.length;\n index < value.length;\n index += 1\n ) {\n const char = value[index];\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n continue;\n }\n if (char === ')') {\n return index + 1;\n }\n }\n return value.length;\n};\n\n/** Index one past a quoted string that starts at `start`. Unterminated runs to the end. */\nconst endOfString = (value: string, start: number): number => {\n const quote = value[start];\n for (let index = start + 1; index < value.length; index += 1) {\n const char = value[index];\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n continue;\n }\n if (char === quote) {\n return index + 1;\n }\n }\n return value.length;\n};\n\n/** Index one past a `/* … *\\/` comment that starts at `start`. Unterminated runs to the end. */\nconst endOfComment = (value: string, start: number): number => {\n const closing = value.indexOf('*/', start + 2);\n return closing === -1 ? value.length : closing + 2;\n};\n\n/**\n * Splits `value` into spans.\n *\n * Concatenating every span's `text` reproduces `value` exactly, which is what\n * lets a pass rewrite the spans it understands and copy the rest through.\n *\n * @param value CSS text.\n */\nexport const scanCss = (value: string): readonly CssSpan[] => {\n const spans: CssSpan[] = [];\n const blocks: CssBlockKind[] = ['rules'];\n // Null until the first significant character of a prelude is seen, so that\n // `@media …{` opens rules and `.a …{` opens declarations.\n let preludeIsAtRule: boolean | null = null;\n let index = 0;\n\n const push = (kind: CssSpanKind, start: number, end: number): void => {\n spans.push({\n kind,\n text: value.slice(start, end),\n start,\n end,\n block: blocks.at(-1) ?? 'rules',\n depth: blocks.length - 1,\n });\n };\n\n while (index < value.length) {\n const char = value[index] ?? '';\n const next = value[index + 1];\n\n if (char === '/' && next === '*') {\n const end = endOfComment(value, index);\n push('comment', index, end);\n index = end;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n const end = endOfString(value, index);\n push('string', index, end);\n index = end;\n continue;\n }\n\n if (char === '\\\\' && next !== undefined) {\n push('escape', index, index + 2);\n index += 2;\n continue;\n }\n\n if (isUnquotedUrlStart(value, index)) {\n const end = endOfUrl(value, index);\n push('url', index, end);\n index = end;\n continue;\n }\n\n if (/\\s/.test(char)) {\n let end = index + 1;\n while (end < value.length && /\\s/.test(value[end] ?? '')) {\n end += 1;\n }\n push('whitespace', index, end);\n index = end;\n continue;\n }\n\n if (STRUCTURAL.has(char)) {\n // Depth changes after the span is recorded, so `{` reads as belonging to\n // the block it closes over rather than the one it opens.\n push('structural', index, index + 1);\n if (char === '{') {\n blocks.push(preludeIsAtRule ? 'rules' : 'declarations');\n } else if (char === '}' && blocks.length > 1) {\n blocks.pop();\n }\n if (char === '{' || char === '}' || char === ';') {\n preludeIsAtRule = null;\n }\n index += 1;\n continue;\n }\n\n if (preludeIsAtRule === null) {\n preludeIsAtRule = char === '@';\n }\n let end = index + 1;\n while (end < value.length) {\n const ahead = value[end] ?? '';\n if (\n STRUCTURAL.has(ahead) ||\n /\\s/.test(ahead) ||\n ahead === '\"' ||\n ahead === \"'\" ||\n ahead === '\\\\' ||\n (ahead === '/' && value[end + 1] === '*') ||\n isUnquotedUrlStart(value, end)\n ) {\n break;\n }\n end += 1;\n }\n push('text', index, end);\n index = end;\n }\n\n return spans;\n};\n\n/**\n * `true` for spans whose text is a literal rather than code — a comment, a\n * quoted string, an unquoted `url(...)`, or an escape pair. A pass may rewrite\n * what is inside a code span and must copy an opaque one through untouched.\n */\nexport const isOpaque = (span: CssSpan): boolean =>\n span.kind === 'comment' ||\n span.kind === 'string' ||\n span.kind === 'url' ||\n span.kind === 'escape';\n\n/** True when `value` has no declarations left after comments, whitespace, and bare `;` are ignored. */\nexport const isBlankCss = (value: string): boolean =>\n scanCss(value).every(\n (span) =>\n span.kind === 'comment' ||\n span.kind === 'whitespace' ||\n (span.kind === 'structural' && span.text === ';')\n );\n"]}
|
|
1
|
+
{"version":3,"file":"css_scan.js","sourceRoot":"","sources":["../../src/css_scan.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\n// One scanner for the passes that read CSS text: minification, `@media`\n// canonicalization in `nesting.ts`, and the var invariant in `./testing`.\n// A span is a stretch of text with a kind that says whether its contents are\n// code or opaque, plus where it sits.\n//\n// Not a CSS Syntax Level 3 tokenizer. It models comments, strings, unquoted\n// `url(...)`, escapes, structural characters, and block position, and nothing else.\n\n/** What a span's text is, which decides whether a pass may look inside it. */\nexport type CssSpanKind =\n /** `/* … *\\/`, including the delimiters. Opaque. */\n | 'comment'\n /** A quoted string, including the quotes and any escapes. Opaque. */\n | 'string'\n /** An unquoted `url(…)` function token, including the parentheses. Opaque. */\n | 'url'\n /** A backslash and the character it escapes, outside a string. Opaque. */\n | 'escape'\n /** A run of whitespace. */\n | 'whitespace'\n /** One of `{ } : ; , >`. */\n | 'structural'\n /** Anything else, run together: identifiers, values, selectors, `var(`. */\n | 'text';\n\n/** Whether the enclosing block holds declarations or further rules. */\nexport type CssBlockKind = 'rules' | 'declarations';\n\n/** One scanner span: kind, source slice, and block context. */\nexport interface CssSpan {\n /** What this span's text is; opaque kinds are skipped by later passes. */\n readonly kind: CssSpanKind;\n /** Source slice for this span, including delimiters. */\n readonly text: string;\n /** Index of the first character in the source. */\n readonly start: number;\n /** Index one past the last character in the source. */\n readonly end: number;\n /**\n * What the enclosing block holds. An at-rule prelude (`@media …`) opens a\n * block of rules; anything else opens declarations; top level is rules.\n *\n * This is what separates `color : red` — where the space before `:` is\n * noise — from `.menu :hover`, where it is a descendant combinator.\n */\n readonly block: CssBlockKind;\n /** Block nesting depth; `0` at top level. */\n readonly depth: number;\n}\n\nconst STRUCTURAL = new Set(['{', '}', ':', ';', ',', '>']);\nconst URL_PREFIX = 'url(';\n\n/** `true` when an unquoted `url(` function token starts at `index`. */\nconst isUnquotedUrlStart = (value: string, index: number): boolean => {\n // Runs at every index of every text span, so reject on the first character.\n const head = value[index];\n if (head !== 'u' && head !== 'U') {\n return false;\n }\n // `url(` must open a function token: `myurl(...)` is some other function.\n const before = value[index - 1];\n if (before !== undefined && /[\\w\\\\-]/.test(before)) {\n return false;\n }\n if (\n value.slice(index, index + URL_PREFIX.length).toLowerCase() !== URL_PREFIX\n ) {\n return false;\n }\n let cursor = index + URL_PREFIX.length;\n while (cursor < value.length && /\\s/.test(value[cursor] ?? '')) {\n cursor += 1;\n }\n const first = value[cursor];\n return first !== '\"' && first !== \"'\";\n};\n\n/** Index one past an unquoted `url(…)` token that starts at `start`. */\nconst endOfUrl = (value: string, start: number): number => {\n for (\n let index = start + URL_PREFIX.length;\n index < value.length;\n index += 1\n ) {\n const char = value[index];\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n continue;\n }\n if (char === ')') {\n return index + 1;\n }\n }\n return value.length;\n};\n\n/** Index one past a quoted string that starts at `start`. Unterminated runs to the end. */\nconst endOfString = (value: string, start: number): number => {\n const quote = value[start];\n for (let index = start + 1; index < value.length; index += 1) {\n const char = value[index];\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n continue;\n }\n if (char === quote) {\n return index + 1;\n }\n }\n return value.length;\n};\n\n/** Index one past a `/* … *\\/` comment that starts at `start`. Unterminated runs to the end. */\nconst endOfComment = (value: string, start: number): number => {\n const closing = value.indexOf('*/', start + 2);\n return closing === -1 ? value.length : closing + 2;\n};\n\n/**\n * Splits `value` into spans.\n *\n * Concatenating every span's `text` reproduces `value` exactly, which is what\n * lets a pass rewrite the spans it understands and copy the rest through.\n *\n * @param value CSS text.\n */\nexport const scanCss = (value: string): readonly CssSpan[] => {\n const spans: CssSpan[] = [];\n const blocks: CssBlockKind[] = ['rules'];\n // Null until the first significant character of a prelude is seen, so that\n // `@media …{` opens rules and `.a …{` opens declarations.\n let preludeIsAtRule: boolean | null = null;\n let index = 0;\n\n const push = (kind: CssSpanKind, start: number, end: number): void => {\n spans.push({\n kind,\n text: value.slice(start, end),\n start,\n end,\n block: blocks.at(-1) ?? 'rules',\n depth: blocks.length - 1,\n });\n };\n\n while (index < value.length) {\n const char = value[index] ?? '';\n const next = value[index + 1];\n\n if (char === '/' && next === '*') {\n const end = endOfComment(value, index);\n push('comment', index, end);\n index = end;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n const end = endOfString(value, index);\n push('string', index, end);\n index = end;\n continue;\n }\n\n if (char === '\\\\' && next !== undefined) {\n push('escape', index, index + 2);\n index += 2;\n continue;\n }\n\n if (isUnquotedUrlStart(value, index)) {\n const end = endOfUrl(value, index);\n push('url', index, end);\n index = end;\n continue;\n }\n\n if (/\\s/.test(char)) {\n let end = index + 1;\n while (end < value.length && /\\s/.test(value[end] ?? '')) {\n end += 1;\n }\n push('whitespace', index, end);\n index = end;\n continue;\n }\n\n if (STRUCTURAL.has(char)) {\n // Depth changes after the span is recorded, so `{` reads as belonging to\n // the block it closes over rather than the one it opens.\n push('structural', index, index + 1);\n if (char === '{') {\n blocks.push(preludeIsAtRule ? 'rules' : 'declarations');\n } else if (char === '}' && blocks.length > 1) {\n blocks.pop();\n }\n if (char === '{' || char === '}' || char === ';') {\n preludeIsAtRule = null;\n }\n index += 1;\n continue;\n }\n\n if (preludeIsAtRule === null) {\n preludeIsAtRule = char === '@';\n }\n let end = index + 1;\n while (end < value.length) {\n const ahead = value[end] ?? '';\n if (\n STRUCTURAL.has(ahead) ||\n /\\s/.test(ahead) ||\n ahead === '\"' ||\n ahead === \"'\" ||\n ahead === '\\\\' ||\n (ahead === '/' && value[end + 1] === '*') ||\n isUnquotedUrlStart(value, end)\n ) {\n break;\n }\n end += 1;\n }\n push('text', index, end);\n index = end;\n }\n\n return spans;\n};\n\n/**\n * `true` for spans whose text is a literal rather than code — a comment, a\n * quoted string, an unquoted `url(...)`, or an escape pair. A pass may rewrite\n * what is inside a code span and must copy an opaque one through untouched.\n */\nexport const isOpaque = (span: CssSpan): boolean =>\n span.kind === 'comment' ||\n span.kind === 'string' ||\n span.kind === 'url' ||\n span.kind === 'escape';\n\n/** True when `value` has no declarations left after comments, whitespace, and bare `;` are ignored. */\nexport const isBlankCss = (value: string): boolean =>\n scanCss(value).every(\n (span) =>\n span.kind === 'comment' ||\n span.kind === 'whitespace' ||\n (span.kind === 'structural' && span.text === ';')\n );\n"]}
|
package/dist/cjs/emotion.js
CHANGED
|
@@ -47,10 +47,7 @@ const createEmotion = (distillery, options = {}) => {
|
|
|
47
47
|
};
|
|
48
48
|
if (options.sink) {
|
|
49
49
|
state.sinks.add(options.sink);
|
|
50
|
-
//
|
|
51
|
-
// registry: cached `css`/`injectGlobal` calls return early without
|
|
52
|
-
// invalidating, so without this the managed `<style>` would miss every
|
|
53
|
-
// style registered before the sink was attached.
|
|
50
|
+
// A sink attached after styles registered needs one flush to catch up.
|
|
54
51
|
options.sink.invalidate(stylesheet);
|
|
55
52
|
}
|
|
56
53
|
const inlineValue = (value, position) => {
|
|
@@ -154,8 +151,6 @@ exports.createEmotion = createEmotion;
|
|
|
154
151
|
const makeWrapper = (handle) => {
|
|
155
152
|
const readable = handle.readableName;
|
|
156
153
|
const asString = () => readable;
|
|
157
|
-
// Spread copy keeps `resolveClassName` (closed over the original handle) and
|
|
158
|
-
// `key` intact so collector dedupe and compaction work unchanged.
|
|
159
154
|
const wrapper = { ...handle };
|
|
160
155
|
wrapper.toString = asString;
|
|
161
156
|
wrapper[Symbol.toPrimitive] = asString;
|
|
@@ -173,9 +168,7 @@ const detectCollision = (state, moduleName, canonical) => {
|
|
|
173
168
|
throw new Error(`Content-hash collision for "${moduleName}"; two distinct templates hashed to the same name.`);
|
|
174
169
|
}
|
|
175
170
|
};
|
|
176
|
-
//
|
|
177
|
-
// strings and String()s values — good enough because it is only ever compared
|
|
178
|
-
// against another canonical string for the same module name.
|
|
171
|
+
// Exact tripwire for hash collisions, compared only against another canonical string for the same module name.
|
|
179
172
|
const canonicalKey = (strings, values) => {
|
|
180
173
|
const segments = [];
|
|
181
174
|
strings.forEach((part, index) => {
|
package/dist/cjs/emotion.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emotion.js","sourceRoot":"","sources":["../../src/emotion.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 { Distillery } from './engine';\nimport { contentHash64 } from './hash';\nimport { flattenTemplate, isHandleLike, type TemplateSlice } from './nesting';\nimport type { StyleSink } from './sink';\nimport {\n globalStylesFromFlattened,\n pendingHandleFromFlattened,\n type StyleHandle,\n type StyleRegistry,\n type StylesModule,\n} from './styles';\n\nexport {\n createDomSink,\n type CreateDomSinkOptions,\n type DocumentLike,\n type StyleElementLike,\n type StyleParentLike,\n} from './dom_sink';\nexport type { StyleSink } from './sink';\n\n/** Shared sink for Emotion compat modules on one registry. */\nexport interface CreateEmotionOptions {\n /** Notified when a compat module registers. Shared across `createEmotion` calls on the same registry. */\n sink?: StyleSink;\n}\n\n/** Style handle that stringifies to its readable class name. */\nexport interface EmotionCss extends StyleHandle {\n /** Stringifies to the readable class name. */\n toString(): string;\n /** Template interpolation; same as {@link EmotionCss.toString}. */\n [Symbol.toPrimitive](hint: string): string;\n}\n\n/** One `cx(...)` argument: a class, handle, list, or truthy map. */\nexport type ClassNameArg =\n | string\n | number\n | false\n | null\n | undefined\n | EmotionCss\n | StyleHandle\n | ClassNameArg[]\n | { readonly [className: string]: boolean };\n\n/** Emotion-shaped authoring API bound to one Distillery registry. */\nexport interface Emotion {\n /** Authors styles and returns a handle that can be used directly or passed to `cx`. */\n css(strings: TemplateStringsArray, ...values: readonly unknown[]): EmotionCss;\n /** Combines handles, conditional classes, and plain strings into a space-separated string. */\n cx(...args: readonly ClassNameArg[]): string;\n /** Defines styles that apply globally (e.g. `body`, `html`). */\n injectGlobal(\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ): void;\n /** Emits the full CSS for all generated emotion styles. */\n stylesheet(): string;\n /** Returns the underlying modules backing `injectGlobal` calls. */\n globalModules(): readonly StylesModule[];\n}\n\n/** Per-registry Emotion compat cache. */\ninterface EmotionState {\n /** `css` handles keyed by source hash. */\n readonly wrappers: Map<string, EmotionCss>;\n /** Original templates for inlining nested compat handles. */\n readonly rawSources: Map<string, TemplateSlice>;\n /** Module name → canonical source hash. */\n readonly canonicalByModule: Map<string, string>;\n /** Modules produced by `injectGlobal`. */\n readonly globals: StylesModule[];\n /** Handles created by this registry's Emotion instance. */\n readonly brand: WeakSet<object>;\n /** Sinks notified when a compat module registers. */\n readonly sinks: Set<StyleSink>;\n}\n\nconst stateByRegistry = new WeakMap<StyleRegistry, EmotionState>();\n\nconst stateFor = (registry: StyleRegistry): EmotionState => {\n let state = stateByRegistry.get(registry);\n if (!state) {\n state = {\n wrappers: new Map(),\n rawSources: new Map(),\n canonicalByModule: new Map(),\n globals: [],\n brand: new WeakSet(),\n sinks: new Set(),\n };\n stateByRegistry.set(registry, state);\n }\n return state;\n};\n\n/**\n * `@emotion/css`-shaped API over a distillery.\n *\n * `String(css\\`...\\`)` is the readable class name and does not collect. Passing the wrapper through `resolveClassName` collects and compacts like a native handle.\n *\n * @param distillery Bound distillery that owns the underlying registry.\n * @param options Optional sink for DOM injection.\n */\nexport const createEmotion = <TTokens>(\n distillery: Distillery<TTokens>,\n options: CreateEmotionOptions = {}\n): Emotion => {\n const { registry } = distillery;\n const state = stateFor(registry);\n\n const stylesheet = (): string =>\n distillery.renderStyles(distillery.stylesheetCollector('readable'));\n\n const invalidateSinks = (): void => {\n for (const sink of state.sinks) {\n sink.invalidate(stylesheet);\n }\n };\n\n if (options.sink) {\n state.sinks.add(options.sink);\n // Catch a late-attached sink up to styles already registered on this\n // registry: cached `css`/`injectGlobal` calls return early without\n // invalidating, so without this the managed `<style>` would miss every\n // style registered before the sink was attached.\n options.sink.invalidate(stylesheet);\n }\n\n const inlineValue = (\n value: unknown,\n position: 'selector' | 'statement'\n ): TemplateSlice | null => {\n if (position !== 'statement' || !isBranded(state, value)) {\n return null;\n }\n return state.rawSources.get((value as StyleHandle).key) ?? null;\n };\n\n const css = (\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ): EmotionCss => {\n assertTemplate(strings, 'css');\n const hash = contentHash64(strings, values);\n const cached = state.wrappers.get(hash);\n if (cached) {\n return cached;\n }\n const moduleName = `css-${hash}`;\n const canonical = canonicalKey(strings, values);\n detectCollision(state, moduleName, canonical);\n\n const flat = flattenTemplate(strings, values, {\n mode: 'self',\n inlineValue,\n });\n const pending = pendingHandleFromFlattened(flat);\n const module = distillery.createStyleModule(moduleName, () => ({\n root: pending,\n }));\n const handle = module.handles.root;\n\n state.rawSources.set(handle.key, {\n strings: [...strings],\n values: [...values],\n });\n const wrapper = makeWrapper(handle);\n state.brand.add(wrapper);\n state.wrappers.set(hash, wrapper);\n state.canonicalByModule.set(moduleName, canonical);\n invalidateSinks();\n return wrapper;\n };\n\n const injectGlobal = (\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ): void => {\n assertTemplate(strings, 'injectGlobal');\n const hash = contentHash64(strings, values);\n const moduleName = `global-${hash}`;\n if (registry.module(moduleName)) {\n return;\n }\n const canonical = canonicalKey(strings, values);\n detectCollision(state, moduleName, canonical);\n\n const flat = flattenTemplate(strings, values, {\n mode: 'global',\n inlineValue,\n });\n const module = distillery.createStyleModule(moduleName, () =>\n globalStylesFromFlattened(flat)\n );\n state.canonicalByModule.set(moduleName, canonical);\n state.globals.push(module);\n invalidateSinks();\n };\n\n const cx = (...args: readonly ClassNameArg[]): string => {\n const classes: string[] = [];\n const walk = (arg: ClassNameArg): void => {\n if (!arg) {\n return;\n }\n if (typeof arg === 'string') {\n classes.push(arg);\n return;\n }\n if (typeof arg === 'number') {\n classes.push(String(arg));\n return;\n }\n if (Array.isArray(arg)) {\n arg.forEach(walk);\n return;\n }\n if (isBranded(state, arg)) {\n classes.push(String(arg));\n return;\n }\n if (isHandleLike(arg)) {\n classes.push(arg.readableName);\n return;\n }\n for (const [className, enabled] of Object.entries(arg)) {\n if (enabled) {\n classes.push(className);\n }\n }\n };\n args.forEach(walk);\n return classes.join(' ');\n };\n\n return {\n css,\n cx,\n injectGlobal,\n stylesheet,\n globalModules: () => [...state.globals],\n };\n};\n\nconst makeWrapper = (handle: StyleHandle): EmotionCss => {\n const readable = handle.readableName;\n const asString = (): string => readable;\n // Spread copy keeps `resolveClassName` (closed over the original handle) and\n // `key` intact so collector dedupe and compaction work unchanged.\n const wrapper = { ...handle } as EmotionCss & {\n toString: () => string;\n [Symbol.toPrimitive]: () => string;\n };\n wrapper.toString = asString;\n wrapper[Symbol.toPrimitive] = asString;\n return wrapper;\n};\n\nconst isBranded = (state: EmotionState, value: unknown): value is EmotionCss =>\n Boolean(value && typeof value === 'object' && state.brand.has(value));\n\nconst assertTemplate = (strings: unknown, fn: string): void => {\n if (!Array.isArray(strings) || !('raw' in (strings as object))) {\n throw new Error(\n `${fn} is a template tag; object styles (${fn}({...})) are not supported.`\n );\n }\n};\n\nconst detectCollision = (\n state: EmotionState,\n moduleName: string,\n canonical: string\n): void => {\n const prior = state.canonicalByModule.get(moduleName);\n if (prior !== undefined && prior !== canonical) {\n throw new Error(\n `Content-hash collision for \"${moduleName}\"; two distinct templates hashed to the same name.`\n );\n }\n};\n\n// A cheap, exact collision tripwire independent of the (lossy) hash. NUL-joins\n// strings and String()s values — good enough because it is only ever compared\n// against another canonical string for the same module name.\nconst canonicalKey = (\n strings: readonly string[],\n values: readonly unknown[]\n): string => {\n const segments: string[] = [];\n strings.forEach((part, index) => {\n segments.push(part);\n if (index < values.length) {\n segments.push(String(values[index]));\n }\n });\n return segments.join('\\u0000');\n};\n"]}
|
|
1
|
+
{"version":3,"file":"emotion.js","sourceRoot":"","sources":["../../src/emotion.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 { Distillery } from './engine';\nimport { contentHash64 } from './hash';\nimport { flattenTemplate, isHandleLike, type TemplateSlice } from './nesting';\nimport type { StyleSink } from './sink';\nimport {\n globalStylesFromFlattened,\n pendingHandleFromFlattened,\n type StyleHandle,\n type StyleRegistry,\n type StylesModule,\n} from './styles';\n\nexport {\n createDomSink,\n type CreateDomSinkOptions,\n type DocumentLike,\n type StyleElementLike,\n type StyleParentLike,\n} from './dom_sink';\nexport type { StyleSink } from './sink';\n\n/** Shared sink for Emotion compat modules on one registry. */\nexport interface CreateEmotionOptions {\n /** Notified when a compat module registers. Shared across `createEmotion` calls on the same registry. */\n sink?: StyleSink;\n}\n\n/** Style handle that stringifies to its readable class name. */\nexport interface EmotionCss extends StyleHandle {\n /** Stringifies to the readable class name. */\n toString(): string;\n /** Template interpolation; same as {@link EmotionCss.toString}. */\n [Symbol.toPrimitive](hint: string): string;\n}\n\n/** One `cx(...)` argument: a class, handle, list, or truthy map. */\nexport type ClassNameArg =\n | string\n | number\n | false\n | null\n | undefined\n | EmotionCss\n | StyleHandle\n | ClassNameArg[]\n | { readonly [className: string]: boolean };\n\n/** Emotion-shaped authoring API bound to one Distillery registry. */\nexport interface Emotion {\n /** Authors styles and returns a handle that can be used directly or passed to `cx`. */\n css(strings: TemplateStringsArray, ...values: readonly unknown[]): EmotionCss;\n /** Combines handles, conditional classes, and plain strings into a space-separated string. */\n cx(...args: readonly ClassNameArg[]): string;\n /** Defines styles that apply globally (e.g. `body`, `html`). */\n injectGlobal(\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ): void;\n /** Emits the full CSS for all generated emotion styles. */\n stylesheet(): string;\n /** Returns the underlying modules backing `injectGlobal` calls. */\n globalModules(): readonly StylesModule[];\n}\n\n/** Per-registry Emotion compat cache. */\ninterface EmotionState {\n /** `css` handles keyed by source hash. */\n readonly wrappers: Map<string, EmotionCss>;\n /** Original templates for inlining nested compat handles. */\n readonly rawSources: Map<string, TemplateSlice>;\n /** Module name → canonical source hash. */\n readonly canonicalByModule: Map<string, string>;\n /** Modules produced by `injectGlobal`. */\n readonly globals: StylesModule[];\n /** Handles created by this registry's Emotion instance. */\n readonly brand: WeakSet<object>;\n /** Sinks notified when a compat module registers. */\n readonly sinks: Set<StyleSink>;\n}\n\nconst stateByRegistry = new WeakMap<StyleRegistry, EmotionState>();\n\nconst stateFor = (registry: StyleRegistry): EmotionState => {\n let state = stateByRegistry.get(registry);\n if (!state) {\n state = {\n wrappers: new Map(),\n rawSources: new Map(),\n canonicalByModule: new Map(),\n globals: [],\n brand: new WeakSet(),\n sinks: new Set(),\n };\n stateByRegistry.set(registry, state);\n }\n return state;\n};\n\n/**\n * `@emotion/css`-shaped API over a distillery.\n *\n * `String(css\\`...\\`)` is the readable class name and does not collect. Passing the wrapper through `resolveClassName` collects and compacts like a native handle.\n *\n * @param distillery Bound distillery that owns the underlying registry.\n * @param options Optional sink for DOM injection.\n */\nexport const createEmotion = <TTokens>(\n distillery: Distillery<TTokens>,\n options: CreateEmotionOptions = {}\n): Emotion => {\n const { registry } = distillery;\n const state = stateFor(registry);\n\n const stylesheet = (): string =>\n distillery.renderStyles(distillery.stylesheetCollector('readable'));\n\n const invalidateSinks = (): void => {\n for (const sink of state.sinks) {\n sink.invalidate(stylesheet);\n }\n };\n\n if (options.sink) {\n state.sinks.add(options.sink);\n // A sink attached after styles registered needs one flush to catch up.\n options.sink.invalidate(stylesheet);\n }\n\n const inlineValue = (\n value: unknown,\n position: 'selector' | 'statement'\n ): TemplateSlice | null => {\n if (position !== 'statement' || !isBranded(state, value)) {\n return null;\n }\n return state.rawSources.get((value as StyleHandle).key) ?? null;\n };\n\n const css = (\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ): EmotionCss => {\n assertTemplate(strings, 'css');\n const hash = contentHash64(strings, values);\n const cached = state.wrappers.get(hash);\n if (cached) {\n return cached;\n }\n const moduleName = `css-${hash}`;\n const canonical = canonicalKey(strings, values);\n detectCollision(state, moduleName, canonical);\n\n const flat = flattenTemplate(strings, values, {\n mode: 'self',\n inlineValue,\n });\n const pending = pendingHandleFromFlattened(flat);\n const module = distillery.createStyleModule(moduleName, () => ({\n root: pending,\n }));\n const handle = module.handles.root;\n\n state.rawSources.set(handle.key, {\n strings: [...strings],\n values: [...values],\n });\n const wrapper = makeWrapper(handle);\n state.brand.add(wrapper);\n state.wrappers.set(hash, wrapper);\n state.canonicalByModule.set(moduleName, canonical);\n invalidateSinks();\n return wrapper;\n };\n\n const injectGlobal = (\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ): void => {\n assertTemplate(strings, 'injectGlobal');\n const hash = contentHash64(strings, values);\n const moduleName = `global-${hash}`;\n if (registry.module(moduleName)) {\n return;\n }\n const canonical = canonicalKey(strings, values);\n detectCollision(state, moduleName, canonical);\n\n const flat = flattenTemplate(strings, values, {\n mode: 'global',\n inlineValue,\n });\n const module = distillery.createStyleModule(moduleName, () =>\n globalStylesFromFlattened(flat)\n );\n state.canonicalByModule.set(moduleName, canonical);\n state.globals.push(module);\n invalidateSinks();\n };\n\n const cx = (...args: readonly ClassNameArg[]): string => {\n const classes: string[] = [];\n const walk = (arg: ClassNameArg): void => {\n if (!arg) {\n return;\n }\n if (typeof arg === 'string') {\n classes.push(arg);\n return;\n }\n if (typeof arg === 'number') {\n classes.push(String(arg));\n return;\n }\n if (Array.isArray(arg)) {\n arg.forEach(walk);\n return;\n }\n if (isBranded(state, arg)) {\n classes.push(String(arg));\n return;\n }\n if (isHandleLike(arg)) {\n classes.push(arg.readableName);\n return;\n }\n for (const [className, enabled] of Object.entries(arg)) {\n if (enabled) {\n classes.push(className);\n }\n }\n };\n args.forEach(walk);\n return classes.join(' ');\n };\n\n return {\n css,\n cx,\n injectGlobal,\n stylesheet,\n globalModules: () => [...state.globals],\n };\n};\n\nconst makeWrapper = (handle: StyleHandle): EmotionCss => {\n const readable = handle.readableName;\n const asString = (): string => readable;\n const wrapper = { ...handle } as EmotionCss & {\n toString: () => string;\n [Symbol.toPrimitive]: () => string;\n };\n wrapper.toString = asString;\n wrapper[Symbol.toPrimitive] = asString;\n return wrapper;\n};\n\nconst isBranded = (state: EmotionState, value: unknown): value is EmotionCss =>\n Boolean(value && typeof value === 'object' && state.brand.has(value));\n\nconst assertTemplate = (strings: unknown, fn: string): void => {\n if (!Array.isArray(strings) || !('raw' in (strings as object))) {\n throw new Error(\n `${fn} is a template tag; object styles (${fn}({...})) are not supported.`\n );\n }\n};\n\nconst detectCollision = (\n state: EmotionState,\n moduleName: string,\n canonical: string\n): void => {\n const prior = state.canonicalByModule.get(moduleName);\n if (prior !== undefined && prior !== canonical) {\n throw new Error(\n `Content-hash collision for \"${moduleName}\"; two distinct templates hashed to the same name.`\n );\n }\n};\n\n// Exact tripwire for hash collisions, compared only against another canonical string for the same module name.\nconst canonicalKey = (\n strings: readonly string[],\n values: readonly unknown[]\n): string => {\n const segments: string[] = [];\n strings.forEach((part, index) => {\n segments.push(part);\n if (index < values.length) {\n segments.push(String(values[index]));\n }\n });\n return segments.join('\\u0000');\n};\n"]}
|
package/dist/cjs/minify.js
CHANGED
|
@@ -39,15 +39,12 @@ const spaceIsSignificant = (before, after) => {
|
|
|
39
39
|
* @param value Raw CSS text.
|
|
40
40
|
*/
|
|
41
41
|
const minifyCss = (value) => {
|
|
42
|
-
// Dropping
|
|
43
|
-
// — and emitting one space per span would keep both. Coalescing after the
|
|
44
|
-
// filter makes the run a single decision.
|
|
42
|
+
// Dropping a comment can leave two whitespace spans adjacent (`.a /*c*/ .b`).
|
|
45
43
|
const spans = (0, css_scan_1.scanCss)(value)
|
|
46
44
|
.filter((span) => span.kind !== 'comment')
|
|
47
45
|
.filter((span, index, all) => span.kind !== 'whitespace' || all[index - 1]?.kind !== 'whitespace');
|
|
48
46
|
const out = [];
|
|
49
|
-
//
|
|
50
|
-
// whitespace being decided about.
|
|
47
|
+
// Non-whitespace spans, so lookaround skips the whitespace being decided.
|
|
51
48
|
const significant = spans.filter((span) => span.kind !== 'whitespace');
|
|
52
49
|
let significantIndex = 0;
|
|
53
50
|
spans.forEach((span) => {
|
|
@@ -59,9 +56,7 @@ const minifyCss = (value) => {
|
|
|
59
56
|
}
|
|
60
57
|
return;
|
|
61
58
|
}
|
|
62
|
-
// A
|
|
63
|
-
// Only a bare `;` qualifies: an escaped one is part of a value, and it
|
|
64
|
-
// arrives as an `escape` span rather than a structural `;`.
|
|
59
|
+
// A bare `;` before `}` is redundant; an escaped one arrives as an `escape` span.
|
|
65
60
|
if (span.kind === 'structural' &&
|
|
66
61
|
span.text === '}' &&
|
|
67
62
|
significant[significantIndex - 1]?.kind === 'structural' &&
|
package/dist/cjs/minify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minify.js","sourceRoot":"","sources":["../../src/minify.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yCAAmD;AAEnD;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,CACzB,MAA2B,EAC3B,KAA0B,EACjB,EAAE;IACX,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,0EAA0E;QAC1E,gEAAgE;QAChE,OAAO,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACI,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;IACjD,
|
|
1
|
+
{"version":3,"file":"minify.js","sourceRoot":"","sources":["../../src/minify.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yCAAmD;AAEnD;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,CACzB,MAA2B,EAC3B,KAA0B,EACjB,EAAE;IACX,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,0EAA0E;QAC1E,gEAAgE;QAChE,OAAO,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACI,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;IACjD,8EAA8E;IAC9E,MAAM,KAAK,GAAG,IAAA,kBAAO,EAAC,KAAK,CAAC;SACzB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;SACzC,MAAM,CACL,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CACnB,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,YAAY,CACtE,CAAC;IACJ,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,0EAA0E;IAC1E,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IACvE,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;YAC5C,IAAI,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;gBACtC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,OAAO;QACT,CAAC;QAED,kFAAkF;QAClF,IACE,IAAI,CAAC,IAAI,KAAK,YAAY;YAC1B,IAAI,CAAC,IAAI,KAAK,GAAG;YACjB,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,YAAY;YACxD,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,GAAG,EAC/C,CAAC;YACD,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,gBAAgB,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC,CAAC;AAtCW,QAAA,SAAS,aAsCpB","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 CssSpan, scanCss } from './css_scan';\n\n/**\n * A space between two non-structural spans is significant wherever it sits: a\n * descendant combinator in a selector (`.a .b`), a token separator in a value\n * (`margin:0 auto`). Beside a structural character it is noise, except before\n * a pseudo-class colon in a rules block — `.menu :hover` is not `.menu:hover`,\n * while `color : red` is `color:red`.\n */\nconst spaceIsSignificant = (\n before: CssSpan | undefined,\n after: CssSpan | undefined\n): boolean => {\n if (!before || !after) {\n return false;\n }\n if (before.kind === 'structural') {\n return false;\n }\n if (after.kind === 'structural') {\n // Only a pseudo-class colon in a selector keeps the space in front of it.\n // Space before `{`, `}`, `;`, `,`, or `>` is never significant.\n return after.text === ':' && after.block === 'rules';\n }\n return true;\n};\n\n/**\n * Strips comments and insignificant whitespace from CSS.\n *\n * Strings, unquoted `url(…)` tokens, and backslash escapes pass through\n * untouched: their contents are literal, so a `/*` or a `;` inside one is data\n * rather than syntax.\n *\n * @param value Raw CSS text.\n */\nexport const minifyCss = (value: string): string => {\n // Dropping a comment can leave two whitespace spans adjacent (`.a /*c*/ .b`).\n const spans = scanCss(value)\n .filter((span) => span.kind !== 'comment')\n .filter(\n (span, index, all) =>\n span.kind !== 'whitespace' || all[index - 1]?.kind !== 'whitespace'\n );\n const out: string[] = [];\n // Non-whitespace spans, so lookaround skips the whitespace being decided.\n const significant = spans.filter((span) => span.kind !== 'whitespace');\n let significantIndex = 0;\n\n spans.forEach((span) => {\n if (span.kind === 'whitespace') {\n const before = significant[significantIndex - 1];\n const after = significant[significantIndex];\n if (spaceIsSignificant(before, after)) {\n out.push(' ');\n }\n return;\n }\n\n // A bare `;` before `}` is redundant; an escaped one arrives as an `escape` span.\n if (\n span.kind === 'structural' &&\n span.text === '}' &&\n significant[significantIndex - 1]?.kind === 'structural' &&\n significant[significantIndex - 1]?.text === ';'\n ) {\n out.pop();\n }\n\n out.push(span.text);\n significantIndex += 1;\n });\n\n return out.join('').trim();\n};\n"]}
|