@tenphi/tasty 0.0.0-snapshot.bbd10c7 → 0.0.0-snapshot.bbfcd75
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 +196 -140
- package/dist/babel-Zs1Q03qt.d.ts +83 -0
- package/dist/chunks/async-storage-CG5HnUT5.js +20 -0
- package/dist/chunks/async-storage-CG5HnUT5.js.map +1 -0
- package/dist/chunks/build-config-CUQVwdWF.js +42 -0
- package/dist/chunks/build-config-CUQVwdWF.js.map +1 -0
- package/dist/chunks/collector-B0LTHw6Z.js +208 -0
- package/dist/chunks/collector-B0LTHw6Z.js.map +1 -0
- package/dist/chunks/config-engine-C3pF9EK9.js +267 -0
- package/dist/chunks/config-engine-C3pF9EK9.js.map +1 -0
- package/dist/chunks/css-definitions-D_it4XZH.js +875 -0
- package/dist/chunks/css-definitions-D_it4XZH.js.map +1 -0
- package/dist/chunks/css-resources-BN8apgxt.js +142 -0
- package/dist/chunks/css-resources-BN8apgxt.js.map +1 -0
- package/dist/{debug.js → chunks/debug-C9LeNVoJ.js} +187 -139
- package/dist/chunks/debug-C9LeNVoJ.js.map +1 -0
- package/dist/chunks/dsl-C5yuAn41.js +1373 -0
- package/dist/chunks/dsl-C5yuAn41.js.map +1 -0
- package/dist/chunks/hydration-TRcz5vnk.js +41 -0
- package/dist/chunks/hydration-TRcz5vnk.js.map +1 -0
- package/dist/chunks/react-runtime-O-OUrKLH.js +557 -0
- package/dist/chunks/react-runtime-O-OUrKLH.js.map +1 -0
- package/dist/chunks/runtime-engine-DvnE2g-E.js +2437 -0
- package/dist/chunks/runtime-engine-DvnE2g-E.js.map +1 -0
- package/dist/chunks/runtime-state-BTDqSYBk.js +127 -0
- package/dist/chunks/runtime-state-BTDqSYBk.js.map +1 -0
- package/dist/{utils/merge-styles.js → chunks/shared-utils-DWA4LjIa.js} +55 -55
- package/dist/chunks/shared-utils-DWA4LjIa.js.map +1 -0
- package/dist/chunks/style-engine-C1ECBZxR.js +5131 -0
- package/dist/chunks/style-engine-C1ECBZxR.js.map +1 -0
- package/dist/{zero/extractor.js → chunks/zero-engine-B6EnYcXY.js} +89 -82
- package/dist/chunks/zero-engine-B6EnYcXY.js.map +1 -0
- package/dist/collector-hl5KNH7k.d.ts +165 -0
- package/dist/config-DWL1ZYue.d.ts +1358 -0
- package/dist/core/index.d.ts +5 -34
- package/dist/core/index.js +9 -27
- package/dist/index-D9N9GV24.d.ts +1947 -0
- package/dist/index.d.ts +5 -51
- package/dist/index.js +11 -36
- package/dist/{utils/merge-styles.d.ts → merge-styles-C_oMoJVd.d.ts} +3 -3
- package/dist/ssr/astro-client.js +6 -0
- package/dist/ssr/astro-client.js.map +1 -0
- package/dist/ssr/astro-middleware-extract-static.d.ts +11 -0
- package/dist/ssr/astro-middleware-extract-static.js +9 -0
- package/dist/ssr/astro-middleware-extract-static.js.map +1 -0
- package/dist/ssr/astro-middleware-extract.d.ts +11 -0
- package/dist/ssr/astro-middleware-extract.js +9 -0
- package/dist/ssr/astro-middleware-extract.js.map +1 -0
- package/dist/ssr/astro-middleware-static.d.ts +18 -0
- package/dist/ssr/astro-middleware-static.js +7 -0
- package/dist/ssr/astro-middleware-static.js.map +1 -0
- package/dist/ssr/astro-middleware.d.ts +19 -0
- package/dist/ssr/astro-middleware.js +7 -0
- package/dist/ssr/astro-middleware.js.map +1 -0
- package/dist/ssr/astro.d.ts +117 -11
- package/dist/ssr/astro.js +204 -48
- package/dist/ssr/astro.js.map +1 -1
- package/dist/ssr/index.d.ts +37 -4
- package/dist/ssr/index.js +6 -6
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/next-config.d.ts +66 -0
- package/dist/ssr/next-config.js +124 -0
- package/dist/ssr/next-config.js.map +1 -0
- package/dist/ssr/next.d.ts +14 -5
- package/dist/ssr/next.js +31 -46
- package/dist/ssr/next.js.map +1 -1
- package/dist/static/index.d.ts +91 -5
- package/dist/static/index.js +31 -3
- package/dist/static/index.js.map +1 -0
- package/dist/static/inject.js.map +1 -1
- package/dist/types-jKZNpias.d.ts +1616 -0
- package/dist/zero/babel.d.ts +2 -182
- package/dist/zero/babel.js +82 -113
- package/dist/zero/babel.js.map +1 -1
- package/dist/zero/index.d.ts +81 -3
- package/dist/zero/index.js +2 -3
- package/dist/zero/next.d.ts +1 -1
- package/dist/zero/next.js +0 -31
- package/dist/zero/next.js.map +1 -1
- package/docs/README.md +20 -12
- package/docs/adoption.md +59 -32
- package/docs/ai-agents.md +229 -0
- package/docs/comparison.md +76 -48
- package/docs/configuration.md +566 -69
- package/docs/debug.md +37 -23
- package/docs/design-system.md +63 -32
- package/docs/dsl.md +527 -179
- package/docs/getting-started.md +62 -41
- package/docs/injector.md +157 -51
- package/docs/methodology.md +69 -37
- package/docs/migration-v3.md +285 -0
- package/docs/pipeline.md +744 -0
- package/docs/plugins.md +353 -0
- package/docs/{runtime.md → react-api.md} +176 -67
- package/docs/runtime-benchmarks.md +377 -0
- package/docs/ssr.md +350 -94
- package/docs/styles.md +108 -27
- package/docs/tasty-static.md +149 -87
- package/package.json +121 -23
- package/tasty.config.ts +6 -0
- package/dist/_virtual/_rolldown/runtime.js +0 -7
- package/dist/chunks/cacheKey.js +0 -77
- package/dist/chunks/cacheKey.js.map +0 -1
- package/dist/chunks/definitions.d.ts +0 -37
- package/dist/chunks/definitions.js +0 -258
- package/dist/chunks/definitions.js.map +0 -1
- package/dist/chunks/index.d.ts +0 -1
- package/dist/chunks/renderChunk.d.ts +0 -1
- package/dist/chunks/renderChunk.js +0 -59
- package/dist/chunks/renderChunk.js.map +0 -1
- package/dist/compute-styles.d.ts +0 -31
- package/dist/compute-styles.js +0 -356
- package/dist/compute-styles.js.map +0 -1
- package/dist/config.d.ts +0 -372
- package/dist/config.js +0 -507
- package/dist/config.js.map +0 -1
- package/dist/counter-style/index.js +0 -51
- package/dist/counter-style/index.js.map +0 -1
- package/dist/debug.d.ts +0 -89
- package/dist/debug.js.map +0 -1
- package/dist/font-face/index.js +0 -63
- package/dist/font-face/index.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -7
- package/dist/hooks/useCounterStyle.d.ts +0 -50
- package/dist/hooks/useCounterStyle.js +0 -45
- package/dist/hooks/useCounterStyle.js.map +0 -1
- package/dist/hooks/useFontFace.d.ts +0 -43
- package/dist/hooks/useFontFace.js +0 -69
- package/dist/hooks/useFontFace.js.map +0 -1
- package/dist/hooks/useGlobalStyles.d.ts +0 -30
- package/dist/hooks/useGlobalStyles.js +0 -77
- package/dist/hooks/useGlobalStyles.js.map +0 -1
- package/dist/hooks/useKeyframes.d.ts +0 -56
- package/dist/hooks/useKeyframes.js +0 -63
- package/dist/hooks/useKeyframes.js.map +0 -1
- package/dist/hooks/useProperty.d.ts +0 -79
- package/dist/hooks/useProperty.js +0 -108
- package/dist/hooks/useProperty.js.map +0 -1
- package/dist/hooks/useRawCSS.d.ts +0 -53
- package/dist/hooks/useRawCSS.js +0 -34
- package/dist/hooks/useRawCSS.js.map +0 -1
- package/dist/hooks/useStyles.d.ts +0 -40
- package/dist/hooks/useStyles.js +0 -29
- package/dist/hooks/useStyles.js.map +0 -1
- package/dist/injector/index.d.ts +0 -166
- package/dist/injector/index.js +0 -166
- package/dist/injector/index.js.map +0 -1
- package/dist/injector/injector.d.ts +0 -166
- package/dist/injector/injector.js +0 -464
- package/dist/injector/injector.js.map +0 -1
- package/dist/injector/sheet-manager.d.ts +0 -136
- package/dist/injector/sheet-manager.js +0 -733
- package/dist/injector/sheet-manager.js.map +0 -1
- package/dist/injector/types.d.ts +0 -204
- package/dist/keyframes/index.js +0 -206
- package/dist/keyframes/index.js.map +0 -1
- package/dist/parser/classify.js +0 -319
- package/dist/parser/classify.js.map +0 -1
- package/dist/parser/const.js +0 -60
- package/dist/parser/const.js.map +0 -1
- package/dist/parser/lru.js +0 -109
- package/dist/parser/lru.js.map +0 -1
- package/dist/parser/parser.d.ts +0 -25
- package/dist/parser/parser.js +0 -115
- package/dist/parser/parser.js.map +0 -1
- package/dist/parser/tokenizer.js +0 -69
- package/dist/parser/tokenizer.js.map +0 -1
- package/dist/parser/types.d.ts +0 -51
- package/dist/parser/types.js +0 -46
- package/dist/parser/types.js.map +0 -1
- package/dist/pipeline/conditions.d.ts +0 -134
- package/dist/pipeline/conditions.js +0 -406
- package/dist/pipeline/conditions.js.map +0 -1
- package/dist/pipeline/exclusive.js +0 -230
- package/dist/pipeline/exclusive.js.map +0 -1
- package/dist/pipeline/index.d.ts +0 -55
- package/dist/pipeline/index.js +0 -708
- package/dist/pipeline/index.js.map +0 -1
- package/dist/pipeline/materialize.js +0 -1103
- package/dist/pipeline/materialize.js.map +0 -1
- package/dist/pipeline/parseStateKey.d.ts +0 -15
- package/dist/pipeline/parseStateKey.js +0 -446
- package/dist/pipeline/parseStateKey.js.map +0 -1
- package/dist/pipeline/simplify.js +0 -515
- package/dist/pipeline/simplify.js.map +0 -1
- package/dist/pipeline/warnings.js +0 -18
- package/dist/pipeline/warnings.js.map +0 -1
- package/dist/plugins/index.d.ts +0 -2
- package/dist/plugins/okhsl-plugin.d.ts +0 -35
- package/dist/plugins/okhsl-plugin.js +0 -97
- package/dist/plugins/okhsl-plugin.js.map +0 -1
- package/dist/plugins/types.d.ts +0 -76
- package/dist/properties/index.js +0 -222
- package/dist/properties/index.js.map +0 -1
- package/dist/properties/property-type-resolver.d.ts +0 -24
- package/dist/properties/property-type-resolver.js +0 -90
- package/dist/properties/property-type-resolver.js.map +0 -1
- package/dist/ssr/async-storage.d.ts +0 -17
- package/dist/ssr/async-storage.js +0 -34
- package/dist/ssr/async-storage.js.map +0 -1
- package/dist/ssr/collect-auto-properties.js +0 -39
- package/dist/ssr/collect-auto-properties.js.map +0 -1
- package/dist/ssr/collector.d.ts +0 -102
- package/dist/ssr/collector.js +0 -219
- package/dist/ssr/collector.js.map +0 -1
- package/dist/ssr/format-global-rules.js +0 -22
- package/dist/ssr/format-global-rules.js.map +0 -1
- package/dist/ssr/format-keyframes.js +0 -69
- package/dist/ssr/format-keyframes.js.map +0 -1
- package/dist/ssr/format-property.js +0 -49
- package/dist/ssr/format-property.js.map +0 -1
- package/dist/ssr/format-rules.js +0 -73
- package/dist/ssr/format-rules.js.map +0 -1
- package/dist/ssr/hydrate.d.ts +0 -22
- package/dist/ssr/hydrate.js +0 -49
- package/dist/ssr/hydrate.js.map +0 -1
- package/dist/ssr/ssr-collector-ref.js +0 -12
- package/dist/ssr/ssr-collector-ref.js.map +0 -1
- package/dist/states/index.d.ts +0 -49
- package/dist/states/index.js +0 -170
- package/dist/states/index.js.map +0 -1
- package/dist/static/tastyStatic.d.ts +0 -46
- package/dist/static/tastyStatic.js +0 -30
- package/dist/static/tastyStatic.js.map +0 -1
- package/dist/static/types.d.ts +0 -49
- package/dist/static/types.js +0 -24
- package/dist/static/types.js.map +0 -1
- package/dist/styles/border.d.ts +0 -25
- package/dist/styles/border.js +0 -120
- package/dist/styles/border.js.map +0 -1
- package/dist/styles/color.d.ts +0 -14
- package/dist/styles/color.js +0 -26
- package/dist/styles/color.js.map +0 -1
- package/dist/styles/const.js +0 -17
- package/dist/styles/const.js.map +0 -1
- package/dist/styles/createStyle.js +0 -79
- package/dist/styles/createStyle.js.map +0 -1
- package/dist/styles/dimension.js +0 -109
- package/dist/styles/dimension.js.map +0 -1
- package/dist/styles/directional.js +0 -133
- package/dist/styles/directional.js.map +0 -1
- package/dist/styles/display.d.ts +0 -30
- package/dist/styles/display.js +0 -73
- package/dist/styles/display.js.map +0 -1
- package/dist/styles/fade.d.ts +0 -15
- package/dist/styles/fade.js +0 -62
- package/dist/styles/fade.js.map +0 -1
- package/dist/styles/fill.d.ts +0 -42
- package/dist/styles/fill.js +0 -51
- package/dist/styles/fill.js.map +0 -1
- package/dist/styles/flow.d.ts +0 -16
- package/dist/styles/flow.js +0 -12
- package/dist/styles/flow.js.map +0 -1
- package/dist/styles/gap.d.ts +0 -31
- package/dist/styles/gap.js +0 -38
- package/dist/styles/gap.js.map +0 -1
- package/dist/styles/height.d.ts +0 -17
- package/dist/styles/height.js +0 -19
- package/dist/styles/height.js.map +0 -1
- package/dist/styles/index.d.ts +0 -1
- package/dist/styles/index.js +0 -8
- package/dist/styles/index.js.map +0 -1
- package/dist/styles/inset.d.ts +0 -24
- package/dist/styles/inset.js +0 -34
- package/dist/styles/inset.js.map +0 -1
- package/dist/styles/list.d.ts +0 -16
- package/dist/styles/list.js +0 -100
- package/dist/styles/list.js.map +0 -1
- package/dist/styles/margin.d.ts +0 -24
- package/dist/styles/margin.js +0 -32
- package/dist/styles/margin.js.map +0 -1
- package/dist/styles/outline.d.ts +0 -29
- package/dist/styles/outline.js +0 -55
- package/dist/styles/outline.js.map +0 -1
- package/dist/styles/padding.d.ts +0 -24
- package/dist/styles/padding.js +0 -32
- package/dist/styles/padding.js.map +0 -1
- package/dist/styles/placement.d.ts +0 -37
- package/dist/styles/placement.js +0 -74
- package/dist/styles/placement.js.map +0 -1
- package/dist/styles/predefined.d.ts +0 -71
- package/dist/styles/predefined.js +0 -237
- package/dist/styles/predefined.js.map +0 -1
- package/dist/styles/preset.d.ts +0 -52
- package/dist/styles/preset.js +0 -127
- package/dist/styles/preset.js.map +0 -1
- package/dist/styles/radius.d.ts +0 -12
- package/dist/styles/radius.js +0 -83
- package/dist/styles/radius.js.map +0 -1
- package/dist/styles/scrollMargin.d.ts +0 -24
- package/dist/styles/scrollMargin.js +0 -32
- package/dist/styles/scrollMargin.js.map +0 -1
- package/dist/styles/scrollbar.d.ts +0 -25
- package/dist/styles/scrollbar.js +0 -51
- package/dist/styles/scrollbar.js.map +0 -1
- package/dist/styles/shadow.d.ts +0 -14
- package/dist/styles/shadow.js +0 -25
- package/dist/styles/shadow.js.map +0 -1
- package/dist/styles/shared.js +0 -17
- package/dist/styles/shared.js.map +0 -1
- package/dist/styles/transition.d.ts +0 -14
- package/dist/styles/transition.js +0 -159
- package/dist/styles/transition.js.map +0 -1
- package/dist/styles/types.d.ts +0 -564
- package/dist/styles/width.d.ts +0 -17
- package/dist/styles/width.js +0 -19
- package/dist/styles/width.js.map +0 -1
- package/dist/tasty.d.ts +0 -134
- package/dist/tasty.js +0 -240
- package/dist/tasty.js.map +0 -1
- package/dist/types.d.ts +0 -184
- package/dist/utils/cache-wrapper.js +0 -21
- package/dist/utils/cache-wrapper.js.map +0 -1
- package/dist/utils/case-converter.js +0 -8
- package/dist/utils/case-converter.js.map +0 -1
- package/dist/utils/color-math.d.ts +0 -46
- package/dist/utils/color-math.js +0 -749
- package/dist/utils/color-math.js.map +0 -1
- package/dist/utils/color-space.d.ts +0 -5
- package/dist/utils/color-space.js +0 -228
- package/dist/utils/color-space.js.map +0 -1
- package/dist/utils/colors.d.ts +0 -5
- package/dist/utils/colors.js +0 -10
- package/dist/utils/colors.js.map +0 -1
- package/dist/utils/css-types.d.ts +0 -7
- package/dist/utils/dotize.d.ts +0 -26
- package/dist/utils/dotize.js +0 -122
- package/dist/utils/dotize.js.map +0 -1
- package/dist/utils/filter-base-props.d.ts +0 -15
- package/dist/utils/filter-base-props.js +0 -45
- package/dist/utils/filter-base-props.js.map +0 -1
- package/dist/utils/get-display-name.d.ts +0 -7
- package/dist/utils/get-display-name.js +0 -10
- package/dist/utils/get-display-name.js.map +0 -1
- package/dist/utils/has-keys.js +0 -13
- package/dist/utils/has-keys.js.map +0 -1
- package/dist/utils/is-dev-env.js +0 -19
- package/dist/utils/is-dev-env.js.map +0 -1
- package/dist/utils/is-valid-element-type.js +0 -15
- package/dist/utils/is-valid-element-type.js.map +0 -1
- package/dist/utils/merge-styles.js.map +0 -1
- package/dist/utils/mod-attrs.d.ts +0 -6
- package/dist/utils/mod-attrs.js +0 -20
- package/dist/utils/mod-attrs.js.map +0 -1
- package/dist/utils/process-tokens.d.ts +0 -17
- package/dist/utils/process-tokens.js +0 -83
- package/dist/utils/process-tokens.js.map +0 -1
- package/dist/utils/resolve-recipes.d.ts +0 -17
- package/dist/utils/resolve-recipes.js +0 -146
- package/dist/utils/resolve-recipes.js.map +0 -1
- package/dist/utils/selector-transform.js +0 -32
- package/dist/utils/selector-transform.js.map +0 -1
- package/dist/utils/string.js +0 -8
- package/dist/utils/string.js.map +0 -1
- package/dist/utils/styles.d.ts +0 -99
- package/dist/utils/styles.js +0 -220
- package/dist/utils/styles.js.map +0 -1
- package/dist/utils/typography.d.ts +0 -47
- package/dist/utils/typography.js +0 -51
- package/dist/utils/typography.js.map +0 -1
- package/dist/utils/warnings.d.ts +0 -16
- package/dist/utils/warnings.js +0 -16
- package/dist/utils/warnings.js.map +0 -1
- package/dist/zero/css-writer.d.ts +0 -45
- package/dist/zero/css-writer.js +0 -73
- package/dist/zero/css-writer.js.map +0 -1
- package/dist/zero/extractor.d.ts +0 -24
- package/dist/zero/extractor.js.map +0 -1
- package/docs/PIPELINE.md +0 -519
- /package/dist/{chunks/cacheKey.d.ts → ssr/astro-client.d.ts} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CHUNK_NAMES } from "./
|
|
3
|
-
import {
|
|
1
|
+
import { k as tastyClassRegex } from "./css-definitions-D_it4XZH.js";
|
|
2
|
+
import { j as CHUNK_NAMES } from "./style-engine-C1ECBZxR.js";
|
|
3
|
+
import { B as getNamePrefix, D as injector, Y as flushStyles, x as getCSSTextForNode } from "./runtime-engine-DvnE2g-E.js";
|
|
4
4
|
//#region src/debug.ts
|
|
5
5
|
function fmtSize(bytes) {
|
|
6
6
|
return bytes > 1024 ? `${(bytes / 1024).toFixed(1)}KB` : `${bytes}B`;
|
|
@@ -9,80 +9,76 @@ function countRules(css) {
|
|
|
9
9
|
return (css.match(/\{[^}]*\}/g) || []).length;
|
|
10
10
|
}
|
|
11
11
|
function sortTastyClasses(classes) {
|
|
12
|
-
return Array.from(classes).sort((a, b) =>
|
|
12
|
+
return Array.from(classes).sort((a, b) => a.localeCompare(b));
|
|
13
13
|
}
|
|
14
|
-
function
|
|
15
|
-
return
|
|
14
|
+
function defaultRoot() {
|
|
15
|
+
return typeof document === "undefined" ? null : document;
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return sortTastyClasses(result);
|
|
17
|
+
let warnedNoDom = false;
|
|
18
|
+
function warnNoDom(raw) {
|
|
19
|
+
if (raw || warnedNoDom) return;
|
|
20
|
+
warnedNoDom = true;
|
|
21
|
+
console.warn("[Tasty] tastyDebug reads the DOM and this environment has none, so the result is empty. During SSR, read the ServerStyleCollector instead.");
|
|
23
22
|
}
|
|
24
|
-
function
|
|
23
|
+
function getRegistry(root = defaultRoot()) {
|
|
24
|
+
if (!root) return void 0;
|
|
25
|
+
flushStyles();
|
|
26
|
+
return injector.instance._sheetManager?.getRegistry(root);
|
|
27
|
+
}
|
|
28
|
+
function findDomTastyClasses(root = defaultRoot()) {
|
|
29
|
+
if (!root) return [];
|
|
25
30
|
const classes = /* @__PURE__ */ new Set();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
const elements = root.querySelectorAll?.("[class]") || [];
|
|
32
|
+
const classRegex = tastyClassRegex(getNamePrefix());
|
|
33
|
+
for (const element of elements) {
|
|
34
|
+
const attribute = element.getAttribute("class");
|
|
35
|
+
if (!attribute) continue;
|
|
36
|
+
for (const className of attribute.split(/\s+/)) if (classRegex.test(className)) classes.add(className);
|
|
37
|
+
}
|
|
32
38
|
return sortTastyClasses(classes);
|
|
33
39
|
}
|
|
40
|
+
function getAllCSS(root = defaultRoot()) {
|
|
41
|
+
const registry = getRegistry(root);
|
|
42
|
+
const sheetManager = injector.instance._sheetManager;
|
|
43
|
+
if (!root || !registry || !sheetManager) return "";
|
|
44
|
+
return sheetManager.getOwnedCSSInOrder(registry, root).join("\n");
|
|
45
|
+
}
|
|
46
|
+
function cssTextForClasses(classNames, root) {
|
|
47
|
+
if (!root) return "";
|
|
48
|
+
return injector.instance.getCSSTextForClasses(classNames, { root });
|
|
49
|
+
}
|
|
50
|
+
function getInjectorMetrics(root) {
|
|
51
|
+
if (!root) return null;
|
|
52
|
+
return injector.instance.getMetrics({ root });
|
|
53
|
+
}
|
|
54
|
+
function getUnusedClasses(root = defaultRoot()) {
|
|
55
|
+
if (!root) return [];
|
|
56
|
+
return sortTastyClasses(injector.instance.getUnusedClasses({ root }));
|
|
57
|
+
}
|
|
58
|
+
function getOwnedClasses(root = defaultRoot()) {
|
|
59
|
+
const registry = getRegistry(root);
|
|
60
|
+
if (!registry) return [];
|
|
61
|
+
const owned = [];
|
|
62
|
+
for (const [className, info] of registry.rules) if (info.sheetIndex >= 0) owned.push(className);
|
|
63
|
+
return sortTastyClasses(owned);
|
|
64
|
+
}
|
|
34
65
|
function prettifyCSS(css) {
|
|
35
66
|
if (!css || !css.trim()) return "";
|
|
36
67
|
const out = [];
|
|
37
68
|
let depth = 0;
|
|
38
|
-
const
|
|
39
|
-
let
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const header = buf.trim();
|
|
47
|
-
if (header) {
|
|
48
|
-
const parts = splitOutsideParens(header, ",");
|
|
49
|
-
if (parts.length > 1) out.push(parts.map((p, idx) => idx === 0 ? `${indent()}${p.trim()},` : `${indent()}${p.trim()}${idx < parts.length - 1 ? "," : ""}`).join("\n") + " {");
|
|
50
|
-
else out.push(`${indent()}${header} {`);
|
|
51
|
-
} else out.push(`${indent()}{`);
|
|
52
|
-
depth++;
|
|
53
|
-
buf = "";
|
|
54
|
-
} else if (t === "}") {
|
|
55
|
-
if (buf.trim()) {
|
|
56
|
-
for (const decl of buf.split(";").filter((s) => s.trim())) out.push(`${indent()}${decl.trim()};`);
|
|
57
|
-
buf = "";
|
|
58
|
-
}
|
|
59
|
-
depth = Math.max(0, depth - 1);
|
|
60
|
-
out.push(`${indent()}}`);
|
|
61
|
-
} else if (t.endsWith(";")) {
|
|
62
|
-
buf += ` ${t}`;
|
|
63
|
-
const full = buf.trim();
|
|
64
|
-
if (full) out.push(`${indent()}${full}`);
|
|
65
|
-
buf = "";
|
|
66
|
-
} else buf += ` ${t}`;
|
|
67
|
-
if (buf.trim()) out.push(buf.trim());
|
|
68
|
-
return out.filter((l) => l.trim()).join("\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
69
|
-
}
|
|
70
|
-
/** Split `str` by `sep` only when not inside parentheses */
|
|
71
|
-
function splitOutsideParens(str, sep) {
|
|
72
|
-
const parts = [];
|
|
73
|
-
let depth = 0;
|
|
74
|
-
let start = 0;
|
|
75
|
-
for (let i = 0; i < str.length; i++) {
|
|
76
|
-
const ch = str[i];
|
|
77
|
-
if (ch === "(") depth++;
|
|
78
|
-
else if (ch === ")") depth--;
|
|
79
|
-
else if (depth === 0 && str.startsWith(sep, i)) {
|
|
80
|
-
parts.push(str.slice(start, i));
|
|
81
|
-
start = i + sep.length;
|
|
69
|
+
const lines = css.replace(/\s+/g, " ").trim().replaceAll(" {", "{").replaceAll("{", " {\n").replaceAll("}", "\n}\n").replaceAll(";", ";\n").split("\n");
|
|
70
|
+
for (let line of lines) {
|
|
71
|
+
line = line.trim();
|
|
72
|
+
if (!line) continue;
|
|
73
|
+
if (line === "}") {
|
|
74
|
+
const last = out.at(-1);
|
|
75
|
+
if (last && !/[;{}]$/.test(last)) out[out.length - 1] += ";";
|
|
76
|
+
depth = Math.max(0, depth - 1);
|
|
82
77
|
}
|
|
78
|
+
out.push(`${" ".repeat(depth)}${line}`);
|
|
79
|
+
if (line.endsWith("{")) depth++;
|
|
83
80
|
}
|
|
84
|
-
|
|
85
|
-
return parts;
|
|
81
|
+
return out.join("\n");
|
|
86
82
|
}
|
|
87
83
|
function extractChunkName(cacheKey) {
|
|
88
84
|
for (const part of cacheKey.split("\0")) {
|
|
@@ -91,15 +87,15 @@ function extractChunkName(cacheKey) {
|
|
|
91
87
|
}
|
|
92
88
|
return null;
|
|
93
89
|
}
|
|
94
|
-
function getChunkForClass(className, root =
|
|
90
|
+
function getChunkForClass(className, root = defaultRoot()) {
|
|
95
91
|
const registry = getRegistry(root);
|
|
96
92
|
if (!registry) return null;
|
|
97
93
|
for (const [key, cn] of registry.cacheKeyToClassName) if (cn === className) return extractChunkName(key);
|
|
98
94
|
return null;
|
|
99
95
|
}
|
|
100
|
-
function buildChunkBreakdown(root =
|
|
96
|
+
function buildChunkBreakdown(root = defaultRoot()) {
|
|
101
97
|
const registry = getRegistry(root);
|
|
102
|
-
if (!registry) return {
|
|
98
|
+
if (!root || !registry) return {
|
|
103
99
|
byChunk: {},
|
|
104
100
|
totalChunkTypes: 0,
|
|
105
101
|
totalClasses: 0
|
|
@@ -107,36 +103,56 @@ function buildChunkBreakdown(root = document) {
|
|
|
107
103
|
const byChunk = {};
|
|
108
104
|
for (const [cacheKey, className] of registry.cacheKeyToClassName) {
|
|
109
105
|
const chunk = extractChunkName(cacheKey) || "unknown";
|
|
110
|
-
|
|
106
|
+
const entry = byChunk[chunk] ??= {
|
|
111
107
|
classes: [],
|
|
112
108
|
cssSize: 0,
|
|
113
109
|
ruleCount: 0
|
|
114
110
|
};
|
|
115
|
-
|
|
116
|
-
const css =
|
|
117
|
-
|
|
118
|
-
|
|
111
|
+
entry.classes.push(className);
|
|
112
|
+
const css = cssTextForClasses([className], root);
|
|
113
|
+
entry.cssSize += css.length;
|
|
114
|
+
entry.ruleCount += countRules(css);
|
|
119
115
|
}
|
|
120
|
-
|
|
121
|
-
const
|
|
116
|
+
const entries = Object.values(byChunk);
|
|
117
|
+
for (const entry of entries) entry.classes = sortTastyClasses(entry.classes);
|
|
118
|
+
const totalClasses = entries.reduce((sum, entry) => {
|
|
119
|
+
return sum + entry.classes.length;
|
|
120
|
+
}, 0);
|
|
122
121
|
return {
|
|
123
122
|
byChunk,
|
|
124
123
|
totalChunkTypes: Object.keys(byChunk).length,
|
|
125
124
|
totalClasses
|
|
126
125
|
};
|
|
127
126
|
}
|
|
128
|
-
|
|
127
|
+
const GLOBAL_RULE_PREFIXES = {
|
|
128
|
+
global: "global:",
|
|
129
|
+
property: "property:",
|
|
130
|
+
fontFace: "fontface:",
|
|
131
|
+
counterStyle: "counterstyle:",
|
|
132
|
+
function: "function:"
|
|
133
|
+
};
|
|
134
|
+
function getGlobalTypeCSS(type, root = defaultRoot(), includeCSS = true) {
|
|
129
135
|
const registry = getRegistry(root);
|
|
130
|
-
if (!registry) return {
|
|
136
|
+
if (!root || !registry) return {
|
|
131
137
|
css: "",
|
|
132
138
|
ruleCount: 0,
|
|
133
139
|
size: 0
|
|
134
140
|
};
|
|
135
141
|
const chunks = [];
|
|
142
|
+
const sheetManager = injector.instance._sheetManager;
|
|
136
143
|
let rc = 0;
|
|
144
|
+
if (type === "raw") {
|
|
145
|
+
const css = injector.instance.getRawCSSText({ root });
|
|
146
|
+
return {
|
|
147
|
+
css: includeCSS ? prettifyCSS(css) : "",
|
|
148
|
+
ruleCount: sheetManager?.getRawRuleCount(root) ?? 0,
|
|
149
|
+
size: css.length
|
|
150
|
+
};
|
|
151
|
+
}
|
|
137
152
|
if (type === "keyframes") for (const [, entry] of registry.keyframesCache) {
|
|
138
153
|
const info = entry.info;
|
|
139
|
-
const
|
|
154
|
+
const sheetInfo = registry.sheets[info.sheetIndex];
|
|
155
|
+
const ss = sheetInfo && sheetManager ? sheetManager.getCSSSheet(sheetInfo) : null;
|
|
140
156
|
if (ss && info.ruleIndex < ss.cssRules.length) {
|
|
141
157
|
const rule = ss.cssRules[info.ruleIndex];
|
|
142
158
|
if (rule) {
|
|
@@ -149,10 +165,11 @@ function getGlobalTypeCSS(type, root = document) {
|
|
|
149
165
|
}
|
|
150
166
|
}
|
|
151
167
|
else {
|
|
152
|
-
const prefix = type
|
|
168
|
+
const prefix = GLOBAL_RULE_PREFIXES[type];
|
|
153
169
|
for (const [key, ri] of registry.globalRules) {
|
|
154
170
|
if (!key.startsWith(prefix)) continue;
|
|
155
|
-
const
|
|
171
|
+
const sheetInfo = registry.sheets[ri.sheetIndex];
|
|
172
|
+
const ss = sheetInfo && sheetManager ? sheetManager.getCSSSheet(sheetInfo) : null;
|
|
156
173
|
if (ss) {
|
|
157
174
|
const start = Math.max(0, ri.ruleIndex);
|
|
158
175
|
const end = Math.min(ss.cssRules.length - 1, ri.endRuleIndex ?? ri.ruleIndex);
|
|
@@ -171,12 +188,12 @@ function getGlobalTypeCSS(type, root = document) {
|
|
|
171
188
|
}
|
|
172
189
|
const raw = chunks.join("\n");
|
|
173
190
|
return {
|
|
174
|
-
css: prettifyCSS(raw),
|
|
191
|
+
css: includeCSS ? prettifyCSS(raw) : "",
|
|
175
192
|
ruleCount: rc,
|
|
176
193
|
size: raw.length
|
|
177
194
|
};
|
|
178
195
|
}
|
|
179
|
-
function getSourceCssForClasses(classNames, root =
|
|
196
|
+
function getSourceCssForClasses(classNames, root = defaultRoot()) {
|
|
180
197
|
const registry = getRegistry(root);
|
|
181
198
|
if (!registry) return null;
|
|
182
199
|
const chunks = [];
|
|
@@ -190,7 +207,7 @@ function getSourceCssForClasses(classNames, root = document) {
|
|
|
190
207
|
}
|
|
191
208
|
return found ? chunks.join("\n") : null;
|
|
192
209
|
}
|
|
193
|
-
function getDefs(root =
|
|
210
|
+
function getDefs(root = defaultRoot()) {
|
|
194
211
|
const registry = getRegistry(root);
|
|
195
212
|
let properties = [];
|
|
196
213
|
if (registry?.injectedProperties) properties = Array.from(registry.injectedProperties.keys()).sort();
|
|
@@ -218,42 +235,50 @@ const CHUNK_ORDER = [
|
|
|
218
235
|
CHUNK_NAMES.MISC,
|
|
219
236
|
CHUNK_NAMES.SUBCOMPONENTS
|
|
220
237
|
];
|
|
238
|
+
function logChunkEntries(breakdown) {
|
|
239
|
+
for (const name of CHUNK_ORDER) {
|
|
240
|
+
const data = breakdown.byChunk[name];
|
|
241
|
+
if (data) console.log(` ${name}: ${data.classes.length} cls, ${data.ruleCount} rules, ${fmtSize(data.cssSize)}`);
|
|
242
|
+
}
|
|
243
|
+
for (const [name, data] of Object.entries(breakdown.byChunk)) if (!CHUNK_ORDER.includes(name)) console.log(` ${name}: ${data.classes.length} cls, ${data.ruleCount} rules, ${fmtSize(data.cssSize)}`);
|
|
244
|
+
}
|
|
221
245
|
const tastyDebug = {
|
|
222
246
|
css(target, opts) {
|
|
223
|
-
const { root =
|
|
247
|
+
const { root = defaultRoot(), prettify = true, raw = false, source = false } = opts || {};
|
|
248
|
+
if (!root) {
|
|
249
|
+
warnNoDom(raw);
|
|
250
|
+
return "";
|
|
251
|
+
}
|
|
224
252
|
let css = "";
|
|
225
|
-
|
|
253
|
+
const classRegex = tastyClassRegex(getNamePrefix());
|
|
254
|
+
if (source && typeof target === "string" && classRegex.test(target)) {
|
|
226
255
|
const src = getSourceCssForClasses([target], root);
|
|
227
256
|
if (src) css = src;
|
|
228
257
|
else {
|
|
229
|
-
if (!raw) console.warn("
|
|
230
|
-
css =
|
|
258
|
+
if (!raw) console.warn("[Tasty] source CSS not available (requires dev mode or TASTY_DEBUG=true). Falling back to live CSSOM.");
|
|
259
|
+
css = cssTextForClasses([target], root);
|
|
231
260
|
}
|
|
232
261
|
} else if (source && Array.isArray(target)) {
|
|
233
262
|
const src = getSourceCssForClasses(target, root);
|
|
234
263
|
if (src) css = src;
|
|
235
264
|
else {
|
|
236
|
-
if (!raw) console.warn("
|
|
237
|
-
css =
|
|
265
|
+
if (!raw) console.warn("[Tasty] source CSS not available. Falling back to live CSSOM.");
|
|
266
|
+
css = cssTextForClasses(target, root);
|
|
238
267
|
}
|
|
239
|
-
} else if (typeof target === "string") if (target === "all") css =
|
|
268
|
+
} else if (typeof target === "string") if (target === "all") css = getAllCSS(root);
|
|
240
269
|
else if (target === "global") {
|
|
241
270
|
css = getGlobalTypeCSS("global", root).css;
|
|
242
271
|
return css;
|
|
243
|
-
} else if (target === "active")
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
const unused = getUnusedClasses(root);
|
|
248
|
-
css = injector.instance.getCssTextForClasses(unused, { root });
|
|
249
|
-
} else if (target === "page") css = getPageCSS(root);
|
|
250
|
-
else if (/^t\d+$/.test(target)) css = injector.instance.getCssTextForClasses([target], { root });
|
|
272
|
+
} else if (target === "active") css = cssTextForClasses(findDomTastyClasses(root), root);
|
|
273
|
+
else if (target === "unused") css = cssTextForClasses(getUnusedClasses(root), root);
|
|
274
|
+
else if (target === "page") css = getPageCSS(root);
|
|
275
|
+
else if (classRegex.test(target)) css = cssTextForClasses([target], root);
|
|
251
276
|
else {
|
|
252
277
|
const el = root.querySelector?.(target);
|
|
253
|
-
if (el) css =
|
|
278
|
+
if (el) css = getCSSTextForNode(el, { root });
|
|
254
279
|
}
|
|
255
|
-
else if (Array.isArray(target)) css =
|
|
256
|
-
else if (target instanceof Element) css =
|
|
280
|
+
else if (Array.isArray(target)) css = cssTextForClasses(target, root);
|
|
281
|
+
else if (target instanceof Element) css = getCSSTextForNode(target, { root });
|
|
257
282
|
const result = prettify ? prettifyCSS(css) : css;
|
|
258
283
|
if (!raw) {
|
|
259
284
|
const label = Array.isArray(target) ? `[${target.join(", ")}]` : target;
|
|
@@ -265,8 +290,9 @@ const tastyDebug = {
|
|
|
265
290
|
return result;
|
|
266
291
|
},
|
|
267
292
|
inspect(target, opts) {
|
|
268
|
-
const { root =
|
|
269
|
-
const element = typeof target === "string" ? root.querySelector?.(target) : target;
|
|
293
|
+
const { root = defaultRoot(), raw = false } = opts || {};
|
|
294
|
+
const element = !root ? null : typeof target === "string" ? root.querySelector?.(target) : target;
|
|
295
|
+
if (!root) warnNoDom(raw);
|
|
270
296
|
if (!element) {
|
|
271
297
|
const empty = {
|
|
272
298
|
element: null,
|
|
@@ -276,15 +302,17 @@ const tastyDebug = {
|
|
|
276
302
|
size: 0,
|
|
277
303
|
rules: 0
|
|
278
304
|
};
|
|
279
|
-
if (!raw) console.warn("
|
|
305
|
+
if (!raw && root) console.warn("[Tasty] debug.inspect: element not found");
|
|
280
306
|
return empty;
|
|
281
307
|
}
|
|
282
|
-
const
|
|
308
|
+
const classList = element.getAttribute("class") || "";
|
|
309
|
+
const classRegex = tastyClassRegex(getNamePrefix());
|
|
310
|
+
const tastyClasses = classList.split(/\s+/).filter((cls) => classRegex.test(cls));
|
|
283
311
|
const chunks = tastyClasses.map((className) => ({
|
|
284
312
|
className,
|
|
285
313
|
chunkName: getChunkForClass(className, root)
|
|
286
314
|
}));
|
|
287
|
-
const css =
|
|
315
|
+
const css = getCSSTextForNode(element, { root: root ?? void 0 });
|
|
288
316
|
const rules = countRules(css);
|
|
289
317
|
const result = {
|
|
290
318
|
element,
|
|
@@ -307,37 +335,60 @@ const tastyDebug = {
|
|
|
307
335
|
return result;
|
|
308
336
|
},
|
|
309
337
|
summary(opts) {
|
|
310
|
-
const { root =
|
|
338
|
+
const { root = defaultRoot(), raw = false } = opts || {};
|
|
339
|
+
if (!root) warnNoDom(raw);
|
|
311
340
|
const activeClasses = findDomTastyClasses(root);
|
|
312
341
|
const unusedClasses = getUnusedClasses(root);
|
|
313
|
-
const
|
|
314
|
-
const
|
|
315
|
-
const
|
|
316
|
-
const
|
|
342
|
+
const ownedClasses = getOwnedClasses(root);
|
|
343
|
+
const totalStyledClasses = sortTastyClasses(new Set([...activeClasses, ...ownedClasses]));
|
|
344
|
+
const unusedSet = new Set(unusedClasses);
|
|
345
|
+
const activeSet = new Set(activeClasses);
|
|
346
|
+
const hotClasses = ownedClasses.filter((className) => !activeSet.has(className) && !unusedSet.has(className));
|
|
347
|
+
const hotCSS = cssTextForClasses(hotClasses, root);
|
|
348
|
+
const activeCSS = cssTextForClasses(activeClasses, root);
|
|
349
|
+
const unusedCSS = cssTextForClasses(unusedClasses, root);
|
|
350
|
+
const allCSS = getAllCSS(root);
|
|
317
351
|
const activeRuleCount = countRules(activeCSS);
|
|
318
352
|
const unusedRuleCount = countRules(unusedCSS);
|
|
319
|
-
const globalData = getGlobalTypeCSS("global", root);
|
|
320
|
-
const rawData = getGlobalTypeCSS("raw", root);
|
|
321
|
-
const kfData = getGlobalTypeCSS("keyframes", root);
|
|
322
|
-
const propData = getGlobalTypeCSS("property", root);
|
|
323
|
-
const
|
|
324
|
-
|
|
353
|
+
const globalData = getGlobalTypeCSS("global", root, false);
|
|
354
|
+
const rawData = getGlobalTypeCSS("raw", root, false);
|
|
355
|
+
const kfData = getGlobalTypeCSS("keyframes", root, false);
|
|
356
|
+
const propData = getGlobalTypeCSS("property", root, false);
|
|
357
|
+
const atRuleData = [
|
|
358
|
+
"fontFace",
|
|
359
|
+
"counterStyle",
|
|
360
|
+
"function"
|
|
361
|
+
].reduce((total, type) => {
|
|
362
|
+
const data = getGlobalTypeCSS(type, root, false);
|
|
363
|
+
total.ruleCount += data.ruleCount;
|
|
364
|
+
total.size += data.size;
|
|
365
|
+
return total;
|
|
366
|
+
}, {
|
|
367
|
+
ruleCount: 0,
|
|
368
|
+
size: 0
|
|
369
|
+
});
|
|
370
|
+
const hotRuleCount = countRules(hotCSS);
|
|
371
|
+
const globalRuleCount = globalData.ruleCount + atRuleData.ruleCount;
|
|
372
|
+
const globalCSSSize = globalData.size + atRuleData.size;
|
|
373
|
+
const totalRuleCount = activeRuleCount + unusedRuleCount + hotRuleCount + globalRuleCount + rawData.ruleCount + kfData.ruleCount + propData.ruleCount;
|
|
374
|
+
const metrics = getInjectorMetrics(root);
|
|
325
375
|
const defs = getDefs(root);
|
|
326
376
|
const chunkBreakdown = buildChunkBreakdown(root);
|
|
327
377
|
const summary = {
|
|
328
378
|
activeClasses,
|
|
329
379
|
unusedClasses,
|
|
380
|
+
hotClasses,
|
|
330
381
|
totalStyledClasses,
|
|
331
382
|
activeCSSSize: activeCSS.length,
|
|
332
383
|
unusedCSSSize: unusedCSS.length,
|
|
333
|
-
globalCSSSize
|
|
384
|
+
globalCSSSize,
|
|
334
385
|
rawCSSSize: rawData.size,
|
|
335
386
|
keyframesCSSSize: kfData.size,
|
|
336
387
|
propertyCSSSize: propData.size,
|
|
337
388
|
totalCSSSize: allCSS.length,
|
|
338
389
|
activeRuleCount,
|
|
339
390
|
unusedRuleCount,
|
|
340
|
-
globalRuleCount
|
|
391
|
+
globalRuleCount,
|
|
341
392
|
rawRuleCount: rawData.ruleCount,
|
|
342
393
|
keyframesRuleCount: kfData.ruleCount,
|
|
343
394
|
propertyRuleCount: propData.ruleCount,
|
|
@@ -351,7 +402,8 @@ const tastyDebug = {
|
|
|
351
402
|
console.group("Tasty Summary");
|
|
352
403
|
console.log(`Active: ${activeClasses.length} classes, ${activeRuleCount} rules, ${fmtSize(activeCSS.length)}`);
|
|
353
404
|
console.log(`Unused: ${unusedClasses.length} classes, ${unusedRuleCount} rules, ${fmtSize(unusedCSS.length)}`);
|
|
354
|
-
console.log(`
|
|
405
|
+
if (hotClasses.length) console.log(`Held: ${hotClasses.length} classes, ${hotRuleCount} rules, ${fmtSize(hotCSS.length)} (not rendered, not yet collectable)`);
|
|
406
|
+
console.log(`Global: ${globalRuleCount} rules, ${fmtSize(globalCSSSize)}`);
|
|
355
407
|
if (rawData.ruleCount) console.log(`Raw: ${rawData.ruleCount} rules, ${fmtSize(rawData.size)}`);
|
|
356
408
|
if (kfData.ruleCount) console.log(`Keyframes: ${kfData.ruleCount} rules, ${fmtSize(kfData.size)}`);
|
|
357
409
|
if (propData.ruleCount) console.log(`@property: ${propData.ruleCount} rules, ${fmtSize(propData.size)}`);
|
|
@@ -363,11 +415,7 @@ const tastyDebug = {
|
|
|
363
415
|
}
|
|
364
416
|
if (chunkBreakdown.totalChunkTypes > 0) {
|
|
365
417
|
console.groupCollapsed(`Chunks (${chunkBreakdown.totalChunkTypes} types, ${chunkBreakdown.totalClasses} classes)`);
|
|
366
|
-
|
|
367
|
-
const d = chunkBreakdown.byChunk[name];
|
|
368
|
-
if (d) console.log(` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`);
|
|
369
|
-
}
|
|
370
|
-
for (const [name, d] of Object.entries(chunkBreakdown.byChunk)) if (!CHUNK_ORDER.includes(name)) console.log(` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`);
|
|
418
|
+
logChunkEntries(chunkBreakdown);
|
|
371
419
|
console.groupEnd();
|
|
372
420
|
}
|
|
373
421
|
if (defs.properties.length || defs.keyframes.length) console.log(`Defs: ${defs.properties.length} @property, ${defs.keyframes.length} @keyframes`);
|
|
@@ -376,29 +424,27 @@ const tastyDebug = {
|
|
|
376
424
|
return summary;
|
|
377
425
|
},
|
|
378
426
|
chunks(opts) {
|
|
379
|
-
const { root =
|
|
427
|
+
const { root = defaultRoot(), raw = false } = opts || {};
|
|
428
|
+
if (!root) warnNoDom(raw);
|
|
380
429
|
const breakdown = buildChunkBreakdown(root);
|
|
381
430
|
if (!raw) {
|
|
382
431
|
console.group(`Chunks (${breakdown.totalChunkTypes} types, ${breakdown.totalClasses} classes)`);
|
|
383
|
-
|
|
384
|
-
const d = breakdown.byChunk[name];
|
|
385
|
-
if (d) console.log(` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`);
|
|
386
|
-
}
|
|
387
|
-
for (const [name, d] of Object.entries(breakdown.byChunk)) if (!CHUNK_ORDER.includes(name)) console.log(` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`);
|
|
432
|
+
logChunkEntries(breakdown);
|
|
388
433
|
console.groupEnd();
|
|
389
434
|
}
|
|
390
435
|
return breakdown;
|
|
391
436
|
},
|
|
392
437
|
cache(opts) {
|
|
393
|
-
const { root =
|
|
438
|
+
const { root = defaultRoot(), raw = false } = opts || {};
|
|
439
|
+
if (!root) warnNoDom(raw);
|
|
394
440
|
const active = findDomTastyClasses(root);
|
|
395
441
|
const unused = getUnusedClasses(root);
|
|
396
|
-
const metrics =
|
|
442
|
+
const metrics = getInjectorMetrics(root);
|
|
397
443
|
const status = {
|
|
398
444
|
classes: {
|
|
399
445
|
active,
|
|
400
446
|
unused,
|
|
401
|
-
all: [...active, ...
|
|
447
|
+
all: sortTastyClasses(new Set([...active, ...getOwnedClasses(root)]))
|
|
402
448
|
},
|
|
403
449
|
metrics
|
|
404
450
|
};
|
|
@@ -415,7 +461,9 @@ const tastyDebug = {
|
|
|
415
461
|
return status;
|
|
416
462
|
},
|
|
417
463
|
cleanup(opts) {
|
|
418
|
-
|
|
464
|
+
const root = opts?.root ?? defaultRoot();
|
|
465
|
+
if (!root) return;
|
|
466
|
+
injector.instance.cleanup(root);
|
|
419
467
|
},
|
|
420
468
|
help() {
|
|
421
469
|
console.log(`tastyDebug API:
|
|
@@ -437,7 +485,8 @@ Options: { raw: true } suppresses logging, { root: shadowRoot } targets Shadow D
|
|
|
437
485
|
}
|
|
438
486
|
}
|
|
439
487
|
};
|
|
440
|
-
function getPageCSS(root =
|
|
488
|
+
function getPageCSS(root = defaultRoot()) {
|
|
489
|
+
if (!root) return "";
|
|
441
490
|
const chunks = [];
|
|
442
491
|
try {
|
|
443
492
|
if ("styleSheets" in root) for (const sheet of Array.from(root.styleSheets)) try {
|
|
@@ -446,8 +495,7 @@ function getPageCSS(root = document) {
|
|
|
446
495
|
} catch {}
|
|
447
496
|
return chunks.join("\n");
|
|
448
497
|
}
|
|
449
|
-
if (typeof window !== "undefined" && isDevEnv()) tastyDebug.install();
|
|
450
498
|
//#endregion
|
|
451
|
-
export { tastyDebug };
|
|
499
|
+
export { tastyDebug as t };
|
|
452
500
|
|
|
453
|
-
//# sourceMappingURL=debug.js.map
|
|
501
|
+
//# sourceMappingURL=debug-C9LeNVoJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-C9LeNVoJ.js","names":[],"sources":["../../src/debug.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { CHUNK_NAMES } from './chunks/definitions';\nimport { getNamePrefix } from './config';\nimport { flushStyles, getCSSTextForNode, injector } from './injector';\nimport type { CacheMetrics, RootRegistry } from './injector/types';\nimport { tastyClassRegex } from './utils/name-prefix';\n\ndeclare global {\n interface Window {\n tastyDebug?: typeof tastyDebug;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype CSSTarget =\n 'all' | 'global' | 'active' | 'unused' | 'page' | string | string[] | Element;\n\nexport interface DebugOptions {\n root?: Document | ShadowRoot;\n /** Suppress console logging and return data only (default: false) */\n raw?: boolean;\n}\n\nexport interface CSSOptions extends DebugOptions {\n prettify?: boolean;\n /** Read from stored source CSS (dev-mode only) instead of live CSSOM */\n source?: boolean;\n}\n\nexport interface DebugChunkInfo {\n className: string;\n chunkName: string | null;\n}\n\nexport interface InspectResult {\n element?: Element | null;\n classes: string[];\n chunks: DebugChunkInfo[];\n css: string;\n size: number;\n rules: number;\n}\n\nexport interface CacheStatus {\n classes: {\n active: string[];\n unused: string[];\n all: string[];\n };\n metrics: CacheMetrics | null;\n}\n\nexport interface ChunkBreakdown {\n byChunk: Record<\n string,\n { classes: string[]; cssSize: number; ruleCount: number }\n >;\n totalChunkTypes: number;\n totalClasses: number;\n}\n\nexport interface Summary {\n activeClasses: string[];\n /** Classes `gc({ force: true })` would delete right now. */\n unusedClasses: string[];\n /**\n * Held but in neither list: nothing renders them, yet collection will not\n * take them — inside the grace window, or pinned by an `inject()` handle.\n */\n hotClasses: string[];\n totalStyledClasses: string[];\n\n activeCSSSize: number;\n unusedCSSSize: number;\n globalCSSSize: number;\n rawCSSSize: number;\n keyframesCSSSize: number;\n propertyCSSSize: number;\n totalCSSSize: number;\n\n activeRuleCount: number;\n unusedRuleCount: number;\n globalRuleCount: number;\n rawRuleCount: number;\n keyframesRuleCount: number;\n propertyRuleCount: number;\n totalRuleCount: number;\n\n metrics: CacheMetrics | null;\n definedProperties: string[];\n definedKeyframes: { name: string; refCount: number }[];\n chunkBreakdown: ChunkBreakdown;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction fmtSize(bytes: number): string {\n return bytes > 1024 ? `${(bytes / 1024).toFixed(1)}KB` : `${bytes}B`;\n}\n\nfunction countRules(css: string): number {\n return (css.match(/\\{[^}]*\\}/g) || []).length;\n}\n\nfunction sortTastyClasses(classes: Iterable<string>): string[] {\n // Class names use a base36 hash format (e.g. `t3a5f`), so sort lexicographically.\n return Array.from(classes).sort((a, b) => a.localeCompare(b));\n}\n\n/** A DOM root to read, or `null` when the environment has no DOM at all. */\ntype DebugRoot = Document | ShadowRoot | null;\n\n/**\n * The root these helpers read, or `null` where there is no DOM.\n *\n * `document` used to be a default parameter value, and a default is evaluated\n * at the call site — so every read below threw a bare `ReferenceError` under\n * Node, taking out five of the eight public methods. A debug utility must not\n * be able to fail an SSR render because a call was left in, so the DOM-less\n * case reports an empty result and says why.\n */\nfunction defaultRoot(): DebugRoot {\n return typeof document === 'undefined' ? null : document;\n}\n\nlet warnedNoDom = false;\n\n/** Say once why the numbers are empty. Silent under `{ raw: true }`. */\nfunction warnNoDom(raw: boolean): void {\n if (raw || warnedNoDom) return;\n warnedNoDom = true;\n console.warn(\n '[Tasty] tastyDebug reads the DOM and this environment has none, so the ' +\n 'result is empty. During SSR, read the ServerStyleCollector instead.',\n );\n}\n\n/**\n * The registry for `root`, with every queued write landed first.\n *\n * Every injector read API is a flush point, and the reads below reach past\n * those APIs straight into the registry and the sheet manager. Without this\n * they would report a batch window's contents as absent — a rule that is\n * enqueued but not yet in a sheet is missing from `globalRules`, from the\n * sheets, and from anything counting either.\n */\nfunction getRegistry(\n root: DebugRoot = defaultRoot(),\n): RootRegistry | undefined {\n if (!root) return undefined;\n flushStyles();\n\n return injector.instance._sheetManager?.getRegistry(root);\n}\n\nfunction findDomTastyClasses(root: DebugRoot = defaultRoot()): string[] {\n if (!root) return [];\n const classes = new Set<string>();\n const elements = (root as Document).querySelectorAll?.('[class]') || [];\n const classRegex = tastyClassRegex(getNamePrefix());\n for (const element of elements) {\n const attribute = element.getAttribute('class');\n if (!attribute) continue;\n for (const className of attribute.split(/\\s+/)) {\n if (classRegex.test(className)) classes.add(className);\n }\n }\n return sortTastyClasses(classes);\n}\n\n/**\n * Everything this injector holds in `root`, in the order the engine applies it,\n * with the sources kept byte-for-byte — trimming would report a total smaller\n * than one of its own parts whenever raw CSS has edge whitespace.\n */\nfunction getAllCSS(root: DebugRoot = defaultRoot()): string {\n const registry = getRegistry(root);\n const sheetManager = injector.instance._sheetManager;\n // `getRegistry` already returns nothing for a null root; the `!root` is what\n // narrows the type for the call below.\n if (!root || !registry || !sheetManager) return '';\n\n return sheetManager.getOwnedCSSInOrder(registry, root).join('\\n');\n}\n\n/**\n * The injector's own readers fall back to `document` when `root` is omitted, so\n * they have to be reached with a real root or not at all.\n */\nfunction cssTextForClasses(classNames: string[], root: DebugRoot): string {\n if (!root) return '';\n\n return injector.instance.getCSSTextForClasses(classNames, { root });\n}\n\nfunction getInjectorMetrics(root: DebugRoot): CacheMetrics | null {\n if (!root) return null;\n\n return injector.instance.getMetrics({ root });\n}\n\n/**\n * Injected classes that no element carries and nobody pinned — the exact set\n * `gc({ force: true })` would delete.\n *\n * Deliberately borrowed from the injector rather than recomputed here: the two\n * drifted apart once before, when this file still read \"unused\" off the pin\n * counts the render path had stopped maintaining.\n */\nfunction getUnusedClasses(root: DebugRoot = defaultRoot()): string[] {\n if (!root) return [];\n\n return sortTastyClasses(injector.instance.getUnusedClasses({ root }));\n}\n\n/** Every class this injector holds CSS for in `root`. */\nfunction getOwnedClasses(root: DebugRoot = defaultRoot()): string[] {\n const registry = getRegistry(root);\n if (!registry) return [];\n\n const owned: string[] = [];\n for (const [className, info] of registry.rules) {\n // A negative sheet index marks a class whose CSS this injector does not\n // hold: server-rendered, pre-allocated, or queued.\n if (info.sheetIndex >= 0) owned.push(className);\n }\n\n return sortTastyClasses(owned);\n}\n\n// ---------------------------------------------------------------------------\n// prettifyCSS — readable output for nested rules\n// ---------------------------------------------------------------------------\n\nfunction prettifyCSS(css: string): string {\n if (!css || !css.trim()) return '';\n\n const out: string[] = [];\n let depth = 0;\n\n const lines = css\n .replace(/\\s+/g, ' ')\n .trim()\n .replaceAll(' {', '{')\n .replaceAll('{', ' {\\n')\n .replaceAll('}', '\\n}\\n')\n .replaceAll(';', ';\\n')\n .split('\\n');\n\n for (let line of lines) {\n line = line.trim();\n if (!line) continue;\n\n if (line === '}') {\n const last = out.at(-1);\n if (last && !/[;{}]$/.test(last)) {\n out[out.length - 1] += ';';\n }\n depth = Math.max(0, depth - 1);\n }\n out.push(`${' '.repeat(depth)}${line}`);\n if (line.endsWith('{')) depth++;\n }\n\n return out.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Chunk helpers\n// ---------------------------------------------------------------------------\n\nfunction extractChunkName(cacheKey: string): string | null {\n for (const part of cacheKey.split('\\0')) {\n if (part.startsWith('[states:')) continue;\n if (!part.includes(':') && part.length > 0) return part;\n }\n return null;\n}\n\nfunction getChunkForClass(\n className: string,\n root: DebugRoot = defaultRoot(),\n): string | null {\n const registry = getRegistry(root);\n if (!registry) return null;\n for (const [key, cn] of registry.cacheKeyToClassName) {\n if (cn === className) return extractChunkName(key);\n }\n return null;\n}\n\nfunction buildChunkBreakdown(root: DebugRoot = defaultRoot()): ChunkBreakdown {\n const registry = getRegistry(root);\n if (!root || !registry)\n return { byChunk: {}, totalChunkTypes: 0, totalClasses: 0 };\n\n const byChunk: ChunkBreakdown['byChunk'] = {};\n for (const [cacheKey, className] of registry.cacheKeyToClassName) {\n const chunk = extractChunkName(cacheKey) || 'unknown';\n const entry = (byChunk[chunk] ??= {\n classes: [],\n cssSize: 0,\n ruleCount: 0,\n });\n entry.classes.push(className);\n const css = cssTextForClasses([className], root);\n entry.cssSize += css.length;\n entry.ruleCount += countRules(css);\n }\n\n const entries = Object.values(byChunk);\n for (const entry of entries) {\n entry.classes = sortTastyClasses(entry.classes);\n }\n\n const totalClasses = entries.reduce((sum, entry) => {\n return sum + entry.classes.length;\n }, 0);\n return {\n byChunk,\n totalChunkTypes: Object.keys(byChunk).length,\n totalClasses,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Global-type CSS helper (internal only)\n// ---------------------------------------------------------------------------\n\n/**\n * Every prefix `registry.globalRules` is keyed by. Anything missing here is a\n * rule the summary would hold but never count, which is how the totals stopped\n * adding up the first time.\n */\nconst GLOBAL_RULE_PREFIXES = {\n global: 'global:',\n property: 'property:',\n fontFace: 'fontface:',\n counterStyle: 'counterstyle:',\n function: 'function:',\n} as const;\n\nfunction getGlobalTypeCSS(\n type: keyof typeof GLOBAL_RULE_PREFIXES | 'raw' | 'keyframes',\n root: DebugRoot = defaultRoot(),\n includeCSS = true,\n): { css: string; ruleCount: number; size: number } {\n const registry = getRegistry(root);\n if (!root || !registry) return { css: '', ruleCount: 0, size: 0 };\n\n const chunks: string[] = [];\n const sheetManager = injector.instance._sheetManager;\n let rc = 0;\n\n if (type === 'raw') {\n // Raw blocks are kept by the sheet manager, not in `globalRules`, so the\n // prefix scan below never sees them — and their rules are counted from the\n // parsed sheet, since one raw block is one string but any number of rules.\n const css = injector.instance.getRawCSSText({ root });\n\n return {\n css: includeCSS ? prettifyCSS(css) : '',\n ruleCount: sheetManager?.getRawRuleCount(root) ?? 0,\n size: css.length,\n };\n }\n\n if (type === 'keyframes') {\n for (const [, entry] of registry.keyframesCache) {\n const info = entry.info;\n const sheetInfo = registry.sheets[info.sheetIndex];\n const ss =\n sheetInfo && sheetManager ? sheetManager.getCSSSheet(sheetInfo) : null;\n if (ss && info.ruleIndex < ss.cssRules.length) {\n const rule = ss.cssRules[info.ruleIndex];\n if (rule) {\n chunks.push(rule.cssText);\n rc++;\n }\n } else if (info.cssText) {\n chunks.push(info.cssText);\n rc++;\n }\n }\n } else {\n const prefix = GLOBAL_RULE_PREFIXES[type];\n for (const [key, ri] of registry.globalRules) {\n if (!key.startsWith(prefix)) continue;\n const sheetInfo = registry.sheets[ri.sheetIndex];\n const ss =\n sheetInfo && sheetManager ? sheetManager.getCSSSheet(sheetInfo) : null;\n if (ss) {\n const start = Math.max(0, ri.ruleIndex);\n const end = Math.min(\n ss.cssRules.length - 1,\n (ri.endRuleIndex as number) ?? ri.ruleIndex,\n );\n if (start >= 0 && end >= start && start < ss.cssRules.length) {\n for (let i = start; i <= end; i++) {\n const rule = ss.cssRules[i];\n if (rule) {\n chunks.push(rule.cssText);\n rc++;\n }\n }\n }\n } else if (ri.cssText?.length) {\n chunks.push(...ri.cssText);\n rc += ri.cssText.length;\n }\n }\n }\n\n const raw = chunks.join('\\n');\n return {\n css: includeCSS ? prettifyCSS(raw) : '',\n ruleCount: rc,\n size: raw.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Source CSS (dev-mode RuleInfo.cssText)\n// ---------------------------------------------------------------------------\n\nfunction getSourceCssForClasses(\n classNames: string[],\n root: DebugRoot = defaultRoot(),\n): string | null {\n const registry = getRegistry(root);\n if (!registry) return null;\n\n const chunks: string[] = [];\n let found = false;\n for (const cls of classNames) {\n const info = registry.rules.get(cls);\n if (info?.cssText?.length) {\n chunks.push(...info.cssText);\n found = true;\n }\n }\n return found ? chunks.join('\\n') : null;\n}\n\n// ---------------------------------------------------------------------------\n// Definitions helper (internal)\n// ---------------------------------------------------------------------------\n\nfunction getDefs(root: DebugRoot = defaultRoot()) {\n const registry = getRegistry(root);\n let properties: string[] = [];\n if (registry?.injectedProperties) {\n properties = Array.from(\n (registry.injectedProperties as Map<string, string>).keys(),\n ).sort();\n }\n\n const keyframes: { name: string; refCount: number }[] = [];\n if (registry) {\n for (const entry of registry.keyframesCache.values()) {\n keyframes.push({ name: entry.name, refCount: entry.refCount });\n }\n keyframes.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n return { properties, keyframes };\n}\n\n// ---------------------------------------------------------------------------\n// Chunk display order\n// ---------------------------------------------------------------------------\n\nconst CHUNK_ORDER = [\n CHUNK_NAMES.COMBINED,\n CHUNK_NAMES.APPEARANCE,\n CHUNK_NAMES.FONT,\n CHUNK_NAMES.DIMENSION,\n CHUNK_NAMES.DISPLAY,\n CHUNK_NAMES.LAYOUT,\n CHUNK_NAMES.POSITION,\n CHUNK_NAMES.MISC,\n CHUNK_NAMES.SUBCOMPONENTS,\n];\n\nfunction logChunkEntries(breakdown: ChunkBreakdown): void {\n for (const name of CHUNK_ORDER) {\n const data = breakdown.byChunk[name];\n if (data)\n console.log(\n ` ${name}: ${data.classes.length} cls, ${data.ruleCount} rules, ${fmtSize(data.cssSize)}`,\n );\n }\n for (const [name, data] of Object.entries(breakdown.byChunk)) {\n if (!CHUNK_ORDER.includes(name as (typeof CHUNK_ORDER)[number]))\n console.log(\n ` ${name}: ${data.classes.length} cls, ${data.ruleCount} rules, ${fmtSize(data.cssSize)}`,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// tastyDebug API\n// ---------------------------------------------------------------------------\n\nexport const tastyDebug = {\n css(target: CSSTarget, opts?: CSSOptions): string {\n const {\n root = defaultRoot(),\n prettify = true,\n raw = false,\n source = false,\n } = opts || {};\n if (!root) {\n warnNoDom(raw);\n\n return '';\n }\n let css = '';\n\n const classRegex = tastyClassRegex(getNamePrefix());\n if (source && typeof target === 'string' && classRegex.test(target)) {\n const src = getSourceCssForClasses([target], root);\n if (src) {\n css = src;\n } else {\n if (!raw) {\n console.warn(\n '[Tasty] source CSS not available (requires dev mode or TASTY_DEBUG=true). Falling back to live CSSOM.',\n );\n }\n css = cssTextForClasses([target], root);\n }\n } else if (source && Array.isArray(target)) {\n const src = getSourceCssForClasses(target, root);\n if (src) {\n css = src;\n } else {\n if (!raw) {\n console.warn(\n '[Tasty] source CSS not available. Falling back to live CSSOM.',\n );\n }\n css = cssTextForClasses(target, root);\n }\n } else if (typeof target === 'string') {\n if (target === 'all') {\n // Documented as component + global + raw, and raw has its own sheet.\n css = getAllCSS(root);\n } else if (target === 'global') {\n css = getGlobalTypeCSS('global', root).css;\n return css; // already prettified\n } else if (target === 'active') {\n const active = findDomTastyClasses(root);\n css = cssTextForClasses(active, root);\n } else if (target === 'unused') {\n const unused = getUnusedClasses(root);\n css = cssTextForClasses(unused, root);\n } else if (target === 'page') {\n css = getPageCSS(root);\n } else if (classRegex.test(target)) {\n css = cssTextForClasses([target], root);\n } else {\n const el = (root as Document).querySelector?.(target);\n if (el) css = getCSSTextForNode(el, { root });\n }\n } else if (Array.isArray(target)) {\n css = cssTextForClasses(target, root);\n } else if (target instanceof Element) {\n css = getCSSTextForNode(target, { root });\n }\n\n const result = prettify ? prettifyCSS(css) : css;\n\n if (!raw) {\n const label = Array.isArray(target) ? `[${target.join(', ')}]` : target;\n const rc = countRules(css);\n console.group(`CSS for ${label} (${rc} rules, ${fmtSize(css.length)})`);\n console.log(result || '(empty)');\n console.groupEnd();\n }\n\n return result;\n },\n\n inspect(target: string | Element, opts?: DebugOptions): InspectResult {\n const { root = defaultRoot(), raw = false } = opts || {};\n const element = !root\n ? null\n : typeof target === 'string'\n ? (root as Document).querySelector?.(target)\n : target;\n if (!root) warnNoDom(raw);\n\n if (!element) {\n const empty: InspectResult = {\n element: null,\n classes: [],\n chunks: [],\n css: '',\n size: 0,\n rules: 0,\n };\n // With no DOM at all, `warnNoDom` above already said why; \"element not\n // found\" would only misdirect.\n if (!raw && root)\n console.warn('[Tasty] debug.inspect: element not found');\n return empty;\n }\n\n const classList = element.getAttribute('class') || '';\n const classRegex = tastyClassRegex(getNamePrefix());\n const tastyClasses = classList\n .split(/\\s+/)\n .filter((cls) => classRegex.test(cls));\n\n const chunks: DebugChunkInfo[] = tastyClasses.map((className) => ({\n className,\n chunkName: getChunkForClass(className, root),\n }));\n\n const css = getCSSTextForNode(element, { root: root ?? undefined });\n const rules = countRules(css);\n\n const result: InspectResult = {\n element,\n classes: tastyClasses,\n chunks,\n css: prettifyCSS(css),\n size: css.length,\n rules,\n };\n\n if (!raw) {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n console.group(\n `inspect ${tag}${id} — ${tastyClasses.length} classes, ${rules} rules, ${fmtSize(css.length)}`,\n );\n if (chunks.length) {\n console.log(\n 'Chunks:',\n chunks.map((c) => `${c.className}→${c.chunkName || '?'}`).join(', '),\n );\n }\n console.groupCollapsed('CSS');\n console.log(result.css || '(empty)');\n console.groupEnd();\n console.groupEnd();\n }\n\n return result;\n },\n\n summary(opts?: DebugOptions): Summary {\n const { root = defaultRoot(), raw = false } = opts || {};\n if (!root) warnNoDom(raw);\n\n const activeClasses = findDomTastyClasses(root);\n const unusedClasses = getUnusedClasses(root);\n // Everything, not just the two bands above: a class that went cold a\n // moment ago is in neither, and dropping it here is the accounting failure\n // this whole change started from.\n const ownedClasses = getOwnedClasses(root);\n const totalStyledClasses = sortTastyClasses(\n new Set([...activeClasses, ...ownedClasses]),\n );\n const unusedSet = new Set(unusedClasses);\n const activeSet = new Set(activeClasses);\n const hotClasses = ownedClasses.filter(\n (className) => !activeSet.has(className) && !unusedSet.has(className),\n );\n const hotCSS = cssTextForClasses(hotClasses, root);\n\n const activeCSS = cssTextForClasses(activeClasses, root);\n const unusedCSS = cssTextForClasses(unusedClasses, root);\n const allCSS = getAllCSS(root);\n\n const activeRuleCount = countRules(activeCSS);\n const unusedRuleCount = countRules(unusedCSS);\n\n const globalData = getGlobalTypeCSS('global', root, false);\n const rawData = getGlobalTypeCSS('raw', root, false);\n const kfData = getGlobalTypeCSS('keyframes', root, false);\n const propData = getGlobalTypeCSS('property', root, false);\n // Folded into the global line rather than given their own: they are all\n // at-rules injected once and kept forever, and leaving them out of the\n // total is what made it not a total.\n const atRuleData = (\n ['fontFace', 'counterStyle', 'function'] as const\n ).reduce(\n (total, type) => {\n const data = getGlobalTypeCSS(type, root, false);\n total.ruleCount += data.ruleCount;\n total.size += data.size;\n return total;\n },\n { ruleCount: 0, size: 0 },\n );\n\n const hotRuleCount = countRules(hotCSS);\n const globalRuleCount = globalData.ruleCount + atRuleData.ruleCount;\n const globalCSSSize = globalData.size + atRuleData.size;\n\n const totalRuleCount =\n activeRuleCount +\n unusedRuleCount +\n hotRuleCount +\n globalRuleCount +\n rawData.ruleCount +\n kfData.ruleCount +\n propData.ruleCount;\n\n const metrics = getInjectorMetrics(root);\n const defs = getDefs(root);\n const chunkBreakdown = buildChunkBreakdown(root);\n\n const summary: Summary = {\n activeClasses,\n unusedClasses,\n hotClasses,\n totalStyledClasses,\n activeCSSSize: activeCSS.length,\n unusedCSSSize: unusedCSS.length,\n globalCSSSize,\n rawCSSSize: rawData.size,\n keyframesCSSSize: kfData.size,\n propertyCSSSize: propData.size,\n totalCSSSize: allCSS.length,\n activeRuleCount,\n unusedRuleCount,\n globalRuleCount,\n rawRuleCount: rawData.ruleCount,\n keyframesRuleCount: kfData.ruleCount,\n propertyRuleCount: propData.ruleCount,\n totalRuleCount,\n metrics,\n definedProperties: defs.properties,\n definedKeyframes: defs.keyframes,\n chunkBreakdown,\n };\n\n if (!raw) {\n console.group('Tasty Summary');\n console.log(\n `Active: ${activeClasses.length} classes, ${activeRuleCount} rules, ${fmtSize(activeCSS.length)}`,\n );\n console.log(\n `Unused: ${unusedClasses.length} classes, ${unusedRuleCount} rules, ${fmtSize(unusedCSS.length)}`,\n );\n if (hotClasses.length)\n console.log(\n `Held: ${hotClasses.length} classes, ${hotRuleCount} rules, ${fmtSize(hotCSS.length)} (not rendered, not yet collectable)`,\n );\n console.log(\n `Global: ${globalRuleCount} rules, ${fmtSize(globalCSSSize)}`,\n );\n if (rawData.ruleCount)\n console.log(\n `Raw: ${rawData.ruleCount} rules, ${fmtSize(rawData.size)}`,\n );\n if (kfData.ruleCount)\n console.log(\n `Keyframes: ${kfData.ruleCount} rules, ${fmtSize(kfData.size)}`,\n );\n if (propData.ruleCount)\n console.log(\n `@property: ${propData.ruleCount} rules, ${fmtSize(propData.size)}`,\n );\n console.log(\n `Total: ${totalStyledClasses.length} classes, ${totalRuleCount} rules, ${fmtSize(allCSS.length)}`,\n );\n\n if (metrics) {\n const total = metrics.hits + metrics.misses;\n const rate = total > 0 ? ((metrics.hits / total) * 100).toFixed(1) : 0;\n console.log(`Cache: ${rate}% hit rate (${total} lookups)`);\n }\n\n if (chunkBreakdown.totalChunkTypes > 0) {\n console.groupCollapsed(\n `Chunks (${chunkBreakdown.totalChunkTypes} types, ${chunkBreakdown.totalClasses} classes)`,\n );\n logChunkEntries(chunkBreakdown);\n console.groupEnd();\n }\n\n if (defs.properties.length || defs.keyframes.length) {\n console.log(\n `Defs: ${defs.properties.length} @property, ${defs.keyframes.length} @keyframes`,\n );\n }\n\n console.groupEnd();\n }\n\n return summary;\n },\n\n chunks(opts?: DebugOptions): ChunkBreakdown {\n const { root = defaultRoot(), raw = false } = opts || {};\n if (!root) warnNoDom(raw);\n const breakdown = buildChunkBreakdown(root);\n\n if (!raw) {\n console.group(\n `Chunks (${breakdown.totalChunkTypes} types, ${breakdown.totalClasses} classes)`,\n );\n logChunkEntries(breakdown);\n console.groupEnd();\n }\n\n return breakdown;\n },\n\n cache(opts?: DebugOptions): CacheStatus {\n const { root = defaultRoot(), raw = false } = opts || {};\n if (!root) warnNoDom(raw);\n const active = findDomTastyClasses(root);\n const unused = getUnusedClasses(root);\n const metrics = getInjectorMetrics(root);\n\n // `all` is everything held, not the two bands above: a class that went cold\n // a moment ago is in neither, and it is still taking up a sheet.\n const all = sortTastyClasses(\n new Set([...active, ...getOwnedClasses(root)]),\n );\n\n const status: CacheStatus = {\n classes: { active, unused, all },\n metrics,\n };\n\n if (!raw) {\n console.group('Cache');\n console.log(`Active: ${active.length}, Unused: ${unused.length}`);\n if (metrics) {\n const total = metrics.hits + metrics.misses;\n const rate = total > 0 ? ((metrics.hits / total) * 100).toFixed(1) : 0;\n console.log(\n `Hits: ${metrics.hits}, Misses: ${metrics.misses}, Rate: ${rate}%`,\n );\n }\n console.groupEnd();\n }\n\n return status;\n },\n\n cleanup(opts?: { root?: Document | ShadowRoot }): void {\n const root = opts?.root ?? defaultRoot();\n if (!root) return;\n injector.instance.cleanup(root);\n },\n\n help(): void {\n console.log(`tastyDebug API:\n .summary() — overview (classes, rules, sizes)\n .css(\"active\") — CSS for classes in DOM\n .css(\"t42\") — CSS for a specific class\n .css(\"t42\",{source:1})— original CSS before browser parsing (dev only)\n .css(\".selector\") — CSS for a DOM element\n .inspect(\".selector\") — element details (classes, chunks, rules)\n .chunks() — style chunk breakdown\n .cache() — cache status and metrics\n .cleanup() — force unused style cleanup\nOptions: { raw: true } suppresses logging, { root: shadowRoot } targets Shadow DOM`);\n },\n\n install(): void {\n if (typeof window !== 'undefined' && window.tastyDebug !== tastyDebug) {\n window.tastyDebug = tastyDebug;\n console.log('tastyDebug installed. Run tastyDebug.help() for commands.');\n }\n },\n};\n\n// ---------------------------------------------------------------------------\n// Page CSS (minimal, kept internal)\n// ---------------------------------------------------------------------------\n\nfunction getPageCSS(root: DebugRoot = defaultRoot()): string {\n if (!root) return '';\n const chunks: string[] = [];\n try {\n if ('styleSheets' in root) {\n for (const sheet of Array.from((root as Document).styleSheets)) {\n try {\n if (sheet.cssRules)\n chunks.push(\n Array.from(sheet.cssRules)\n .map((r) => r.cssText)\n .join('\\n'),\n );\n } catch {\n /* cross-origin */\n }\n }\n }\n } catch {\n /* ignore */\n }\n return chunks.join('\\n');\n}\n"],"mappings":"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"}
|