@yahoo/uds 3.119.2 → 3.121.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/client/Menu/Menu.ItemCheckbox.d.cts +1 -1
- package/dist/components/client/Menu/Menu.ItemCheckbox.d.ts +1 -1
- package/dist/components/client/Popover/Popover.cjs +1 -1
- package/dist/components/client/Popover/Popover.js +1 -1
- package/dist/components/client/Popover/PopoverContent.cjs +12 -17
- package/dist/components/client/Popover/PopoverContent.js +12 -17
- package/dist/components/client/Popover/UDSPopoverConfigProvider.cjs +13 -3
- package/dist/components/client/Popover/UDSPopoverConfigProvider.d.cts +13 -5
- package/dist/components/client/Popover/UDSPopoverConfigProvider.d.ts +13 -5
- package/dist/components/client/Popover/UDSPopoverConfigProvider.js +13 -3
- package/dist/components/client/Toast/UDSToastConfigProvider.d.cts +5 -5
- package/dist/components/client/Toast/UDSToastConfigProvider.d.ts +5 -5
- package/dist/components/experimental/client/SegmentedControl.cjs +2 -2
- package/dist/components/experimental/client/SegmentedControl.d.cts +5 -1
- package/dist/components/experimental/client/SegmentedControl.d.ts +5 -1
- package/dist/components/experimental/client/SegmentedControl.js +2 -2
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/runtime/popoverConfig.cjs +2 -0
- package/dist/runtime/popoverConfig.d.cts +3 -1
- package/dist/runtime/popoverConfig.d.ts +3 -1
- package/dist/runtime/popoverConfig.js +2 -0
- package/dist/styles/styler.d.cts +45 -45
- package/dist/styles/styler.d.ts +45 -45
- package/dist/tailwind/dist/commands/generateComponentData.cjs +5 -1
- package/dist/tailwind/dist/commands/generateComponentData.d.cts +3 -0
- package/dist/tailwind/dist/commands/generateComponentData.d.cts.map +1 -1
- package/dist/tailwind/dist/commands/generateComponentData.d.ts +3 -0
- package/dist/tailwind/dist/commands/generateComponentData.d.ts.map +1 -1
- package/dist/tailwind/dist/commands/generateComponentData.js +5 -1
- package/dist/tailwind/dist/commands/generateComponentData.js.map +1 -1
- package/dist/tailwind/dist/css/generate.cjs +2 -1
- package/dist/tailwind/dist/css/generate.d.cts.map +1 -1
- package/dist/tailwind/dist/css/generate.d.ts.map +1 -1
- package/dist/tailwind/dist/css/generate.js +3 -2
- package/dist/tailwind/dist/css/generate.js.map +1 -1
- package/dist/tailwind/dist/css/nodeUtils.cjs +7 -5
- package/dist/tailwind/dist/css/nodeUtils.js +7 -5
- package/dist/tailwind/dist/css/nodeUtils.js.map +1 -1
- package/dist/tailwind/dist/css/runner.cjs +4 -3
- package/dist/tailwind/dist/css/runner.js +5 -4
- package/dist/tailwind/dist/css/runner.js.map +1 -1
- package/dist/tailwind/dist/css/utils.cjs +62 -0
- package/dist/tailwind/dist/css/utils.js +62 -1
- package/dist/tailwind/dist/css/utils.js.map +1 -1
- package/dist/tailwind/dist/purger/optimized/purgeFromCode.cjs +104 -19
- package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.cts +5 -0
- package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.cts.map +1 -1
- package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.ts +5 -0
- package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.ts.map +1 -1
- package/dist/tailwind/dist/purger/optimized/purgeFromCode.js +104 -19
- package/dist/tailwind/dist/purger/optimized/purgeFromCode.js.map +1 -1
- package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.cjs +99 -10
- package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js +99 -10
- package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js.map +1 -1
- package/dist/tailwind/dist/runtimeConfig/hookMetadata.cjs +364 -0
- package/dist/tailwind/dist/runtimeConfig/hookMetadata.js +358 -0
- package/dist/tailwind/dist/runtimeConfig/hookMetadata.js.map +1 -0
- package/dist/tailwind/dist/types/dist/index.d.cts.map +1 -1
- package/dist/tailwind/dist/types/dist/index.d.ts.map +1 -1
- package/dist/tokens/index.d.cts +2 -2
- package/dist/tokens/index.d.ts +2 -2
- package/dist/tokens/types.d.cts +2 -2
- package/dist/tokens/types.d.ts +2 -2
- package/dist/types/dist/index.d.cts +2 -1
- package/dist/types/dist/index.d.ts +2 -1
- package/dist/uds/generated/componentData.cjs +1474 -1188
- package/dist/uds/generated/componentData.js +1474 -1188
- package/generated/componentData.json +2013 -1661
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
|
|
2
2
|
import { configurableProperties } from "../automated-config/dist/properties.js";
|
|
3
|
+
import { getRuntimeDefaultPropSelector, getRuntimeDefaultPropValue, getRuntimeFieldSelector, getRuntimeFieldStaticValue, getRuntimeFieldTokenValue, getRuntimeSelectorParamValues } from "../runtimeConfig/hookMetadata.js";
|
|
3
4
|
|
|
4
5
|
//#region src/css/utils.ts
|
|
5
6
|
/**
|
|
@@ -32,6 +33,66 @@ const extractVariantDefaults = (config) => {
|
|
|
32
33
|
} : acc;
|
|
33
34
|
}, {});
|
|
34
35
|
};
|
|
36
|
+
const extractRuntimeConfigValues = (config) => {
|
|
37
|
+
const values = {};
|
|
38
|
+
const setRuntimeValue = (selector, value) => {
|
|
39
|
+
if (!selector || value === void 0) return;
|
|
40
|
+
values[selector] = value;
|
|
41
|
+
};
|
|
42
|
+
const bottomSheetBackgroundColor = getRuntimeFieldTokenValue(config, "useBottomSheetConfig", "backgroundColor", { variant: "default" });
|
|
43
|
+
if (bottomSheetBackgroundColor !== void 0) setRuntimeValue(getRuntimeFieldSelector("useBottomSheetConfig", "backgroundColor", { variant: "default" }), bottomSheetBackgroundColor);
|
|
44
|
+
if (config.toast?.variables && config.toast?.defaults) {
|
|
45
|
+
setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "autoClose"), getRuntimeFieldStaticValue("useToastConfig", "autoClose") ?? void 0);
|
|
46
|
+
setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "position"), getRuntimeFieldStaticValue("useToastConfig", "position") ?? void 0);
|
|
47
|
+
setRuntimeValue(getRuntimeDefaultPropSelector("useToastConfig", "size"), getRuntimeDefaultPropValue(config, "useToastConfig", "size"));
|
|
48
|
+
setRuntimeValue(getRuntimeDefaultPropSelector("useToastConfig", "variant"), getRuntimeDefaultPropValue(config, "useToastConfig", "variant"));
|
|
49
|
+
getRuntimeSelectorParamValues("useToastConfig", "size").forEach((size) => {
|
|
50
|
+
const textVariant = getRuntimeFieldTokenValue(config, "useToastConfig", "textVariant", { size });
|
|
51
|
+
const iconSize = getRuntimeFieldTokenValue(config, "useToastConfig", "iconSize", { size });
|
|
52
|
+
const buttonSize = getRuntimeFieldTokenValue(config, "useToastConfig", "buttonSize", { size });
|
|
53
|
+
setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "textVariant", { size }), textVariant);
|
|
54
|
+
setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "iconSize", { size }), iconSize);
|
|
55
|
+
setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "buttonSize", { size }), buttonSize);
|
|
56
|
+
});
|
|
57
|
+
getRuntimeSelectorParamValues("useToastConfig", "variant").forEach((variant) => {
|
|
58
|
+
const textColor = getRuntimeFieldTokenValue(config, "useToastConfig", "textColor", { variant });
|
|
59
|
+
const buttonVariant = getRuntimeFieldTokenValue(config, "useToastConfig", "buttonVariant", { variant });
|
|
60
|
+
const iconVariant = getRuntimeFieldTokenValue(config, "useToastConfig", "iconVariant", { variant });
|
|
61
|
+
const backgroundColor = getRuntimeFieldTokenValue(config, "useToastConfig", "backgroundColor", { variant });
|
|
62
|
+
setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "textColor", { variant }), textColor);
|
|
63
|
+
setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "buttonVariant", { variant }), buttonVariant);
|
|
64
|
+
setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "iconVariant", { variant }), iconVariant);
|
|
65
|
+
setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "backgroundColor", { variant }), backgroundColor);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const tooltipBorderRadius = getRuntimeFieldTokenValue(config, "useTooltipConfig", "borderRadius", { size: "default" });
|
|
69
|
+
if (tooltipBorderRadius !== void 0) {
|
|
70
|
+
setRuntimeValue(getRuntimeFieldSelector("useTooltipConfig", "animationDuration"), getRuntimeFieldStaticValue("useTooltipConfig", "animationDuration") ?? void 0);
|
|
71
|
+
setRuntimeValue(getRuntimeFieldSelector("useTooltipConfig", "placement"), getRuntimeFieldStaticValue("useTooltipConfig", "placement") ?? void 0);
|
|
72
|
+
setRuntimeValue(getRuntimeFieldSelector("useTooltipConfig", "borderRadius", { size: "default" }), tooltipBorderRadius);
|
|
73
|
+
}
|
|
74
|
+
if (config.popover?.variables && config.scaleMode?.medium) {
|
|
75
|
+
setRuntimeValue(getRuntimeDefaultPropSelector("usePopoverConfig", "size"), getRuntimeDefaultPropValue(config, "usePopoverConfig", "size") ?? void 0);
|
|
76
|
+
setRuntimeValue(getRuntimeDefaultPropSelector("usePopoverConfig", "variant"), getRuntimeDefaultPropValue(config, "usePopoverConfig", "variant") ?? void 0);
|
|
77
|
+
setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "animationDuration"), getRuntimeFieldStaticValue("usePopoverConfig", "animationDuration") ?? void 0);
|
|
78
|
+
setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "placement"), getRuntimeFieldStaticValue("usePopoverConfig", "placement") ?? void 0);
|
|
79
|
+
getRuntimeSelectorParamValues("usePopoverConfig", "size").forEach((size) => {
|
|
80
|
+
const borderRadius = getRuntimeFieldTokenValue(config, "usePopoverConfig", "borderRadius", { size });
|
|
81
|
+
const gap = getRuntimeFieldTokenValue(config, "usePopoverConfig", "gap", { size });
|
|
82
|
+
const spacingHorizontal = getRuntimeFieldTokenValue(config, "usePopoverConfig", "spacingHorizontal", { size });
|
|
83
|
+
const spacingVertical = getRuntimeFieldTokenValue(config, "usePopoverConfig", "spacingVertical", { size });
|
|
84
|
+
const dismissButtonSpacing = getRuntimeFieldTokenValue(config, "usePopoverConfig", "dismissButtonSpacing", { size });
|
|
85
|
+
const dismissIconSize = getRuntimeFieldTokenValue(config, "usePopoverConfig", "dismissIconSize", { size });
|
|
86
|
+
setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "borderRadius", { size }), borderRadius);
|
|
87
|
+
setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "gap", { size }), gap);
|
|
88
|
+
setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "spacingHorizontal", { size }), spacingHorizontal);
|
|
89
|
+
setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "spacingVertical", { size }), spacingVertical);
|
|
90
|
+
setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "dismissButtonSpacing", { size }), dismissButtonSpacing);
|
|
91
|
+
setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "dismissIconSize", { size }), dismissIconSize);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return values;
|
|
95
|
+
};
|
|
35
96
|
/**
|
|
36
97
|
* Format bytes to human readable string
|
|
37
98
|
*/
|
|
@@ -65,5 +126,5 @@ const getConfigurableCssVariables = () => {
|
|
|
65
126
|
};
|
|
66
127
|
|
|
67
128
|
//#endregion
|
|
68
|
-
export { extractVariantDefaults, formatBytes, getConfigurableCssVariables, getMotionVarPrefixes };
|
|
129
|
+
export { extractRuntimeConfigValues, extractVariantDefaults, formatBytes, getConfigurableCssVariables, getMotionVarPrefixes };
|
|
69
130
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../src/css/utils.ts"],"sourcesContent":["import { configurableProperties } from '@yahoo/uds-automated-config/properties';\nimport type { UniversalTokensConfig } from '@yahoo/uds-config';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport type { VariantDefaults } from '../purger/optimized/purgeFromCode';\n\n/**\n * Extract variant defaults from a UniversalTokensConfig.\n * Converts from config structure to a simpler lookup format.\n * e.g., { button: { defaults: { size: 'md' } } } -> { Button: { size: 'md' } }\n */\nconst extractVariantDefaults = (config: UniversalTokensConfig): VariantDefaults => {\n // Component names in config are lowercase, but we need PascalCase for matching\n const componentNameMap: Record<string, string> = {\n avatar: 'Avatar',\n badge: 'Badge',\n button: 'Button',\n checkbox: 'Checkbox',\n chip: 'Chip',\n divider: 'Divider',\n iconButton: 'IconButton',\n input: 'Input',\n link: 'Link',\n menu: 'Menu',\n radio: 'Radio',\n switch: 'Switch',\n };\n\n // Extract defaults from each component in the config\n return Object.entries(config).reduce<VariantDefaults>((acc, [configKey, componentConfig]) => {\n const pascalName = componentNameMap[configKey];\n if (!pascalName || !componentConfig || typeof componentConfig !== 'object') {\n return acc;\n }\n\n const configWithDefaults = componentConfig as { defaults?: Record<string, string> };\n return configWithDefaults.defaults\n ? { ...acc, [pascalName]: configWithDefaults.defaults }\n : acc;\n }, {});\n};\n\n/**\n * Format bytes to human readable string\n */\nconst formatBytes = (bytes: number): string => {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const kb = bytes / 1024;\n if (kb < 1024) {\n return `${kb.toFixed(1)} KB`;\n }\n const mb = kb / 1024;\n return `${mb.toFixed(2)} MB`;\n};\n\n/**\n * Get motion CSS variable prefixes needed by a set of components.\n * Looks up motionVarPrefixes from componentData.json for each component.\n */\nconst getMotionVarPrefixes = (\n componentData: Record<string, SerializedComponentInfo>,\n components: string[],\n): string[] => {\n const prefixes = components.flatMap((componentName) => {\n const info = (componentData as Record<string, { motionVarPrefixes?: string[] }>)[componentName];\n return info?.motionVarPrefixes ?? [];\n });\n\n return [...new Set(prefixes)];\n};\n\n/**\n * Collect css variable names exposed by configurable properties.\n */\nconst getConfigurableCssVariables = (): string[] => {\n const udsVarPrefix = '--uds';\n const cssVars = Object.values(configurableProperties).flatMap(({ cssProperties }) => {\n if (typeof cssProperties === 'string') {\n return cssProperties.startsWith(udsVarPrefix) ? [cssProperties] : [];\n }\n\n if (Array.isArray(cssProperties)) {\n return cssProperties.filter(\n (cssProperty): cssProperty is string =>\n typeof cssProperty === 'string' && cssProperty.startsWith(udsVarPrefix),\n );\n }\n\n return [];\n });\n\n return [...new Set(['--uds-button-gap', ...cssVars])];\n};\n\nexport { extractVariantDefaults, formatBytes, getConfigurableCssVariables, getMotionVarPrefixes };\n"],"mappings":";;;;;;;;;AAWA,MAAM,0BAA0B,WAAmD;CAEjF,MAAM,mBAA2C;EAC/C,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,UAAU;EACV,MAAM;EACN,SAAS;EACT,YAAY;EACZ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,QAAQ;EACT;AAGD,QAAO,OAAO,QAAQ,OAAO,CAAC,QAAyB,KAAK,CAAC,WAAW,qBAAqB;EAC3F,MAAM,aAAa,iBAAiB;AACpC,MAAI,CAAC,cAAc,CAAC,mBAAmB,OAAO,oBAAoB,SAChE,QAAO;EAGT,MAAM,qBAAqB;AAC3B,SAAO,mBAAmB,WACtB;GAAE,GAAG;IAAM,aAAa,mBAAmB;GAAU,GACrD;IACH,EAAE,CAAC;;;;;AAMR,MAAM,eAAe,UAA0B;AAC7C,KAAI,QAAQ,KACV,QAAO,GAAG,MAAM;CAElB,MAAM,KAAK,QAAQ;AACnB,KAAI,KAAK,KACP,QAAO,GAAG,GAAG,QAAQ,EAAE,CAAC;AAG1B,QAAO,IADI,KAAK,MACH,QAAQ,EAAE,CAAC;;;;;;AAO1B,MAAM,wBACJ,eACA,eACa;CACb,MAAM,WAAW,WAAW,SAAS,kBAAkB;AAErD,SADc,cAAmE,gBACpE,qBAAqB,EAAE;GACpC;AAEF,QAAO,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;;;;;AAM/B,MAAM,oCAA8C;CAClD,MAAM,eAAe;CACrB,MAAM,UAAU,OAAO,OAAO,uBAAuB,CAAC,SAAS,EAAE,oBAAoB;AACnF,MAAI,OAAO,kBAAkB,SAC3B,QAAO,cAAc,WAAW,aAAa,GAAG,CAAC,cAAc,GAAG,EAAE;AAGtE,MAAI,MAAM,QAAQ,cAAc,CAC9B,QAAO,cAAc,QAClB,gBACC,OAAO,gBAAgB,YAAY,YAAY,WAAW,aAAa,CAC1E;AAGH,SAAO,EAAE;GACT;AAEF,QAAO,CAAC,GAAG,IAAI,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../src/css/utils.ts"],"sourcesContent":["import { configurableProperties } from '@yahoo/uds-automated-config/properties';\nimport type { UniversalTokensConfig } from '@yahoo/uds-config';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport type { RuntimeConfigValues, VariantDefaults } from '../purger/optimized/purgeFromCode';\nimport {\n getRuntimeDefaultPropSelector,\n getRuntimeDefaultPropValue,\n getRuntimeFieldSelector,\n getRuntimeFieldStaticValue,\n getRuntimeFieldTokenValue,\n getRuntimeSelectorParamValues,\n} from '../runtimeConfig/hookMetadata';\n\n/**\n * Extract variant defaults from a UniversalTokensConfig.\n * Converts from config structure to a simpler lookup format.\n * e.g., { button: { defaults: { size: 'md' } } } -> { Button: { size: 'md' } }\n */\nconst extractVariantDefaults = (config: UniversalTokensConfig): VariantDefaults => {\n // Component names in config are lowercase, but we need PascalCase for matching\n const componentNameMap: Record<string, string> = {\n avatar: 'Avatar',\n badge: 'Badge',\n button: 'Button',\n checkbox: 'Checkbox',\n chip: 'Chip',\n divider: 'Divider',\n iconButton: 'IconButton',\n input: 'Input',\n link: 'Link',\n menu: 'Menu',\n radio: 'Radio',\n switch: 'Switch',\n };\n\n // Extract defaults from each component in the config\n return Object.entries(config).reduce<VariantDefaults>((acc, [configKey, componentConfig]) => {\n const pascalName = componentNameMap[configKey];\n if (!pascalName || !componentConfig || typeof componentConfig !== 'object') {\n return acc;\n }\n\n const configWithDefaults = componentConfig as { defaults?: Record<string, string> };\n return configWithDefaults.defaults\n ? { ...acc, [pascalName]: configWithDefaults.defaults }\n : acc;\n }, {});\n};\n\nconst extractRuntimeConfigValues = (config: UniversalTokensConfig): RuntimeConfigValues => {\n const values: RuntimeConfigValues = {};\n\n const setRuntimeValue = (\n selector: string | null,\n value: string | number | boolean | undefined,\n ) => {\n if (!selector || value === undefined) {\n return;\n }\n\n values[selector] = value;\n };\n\n const bottomSheetBackgroundColor = getRuntimeFieldTokenValue(\n config,\n 'useBottomSheetConfig',\n 'backgroundColor',\n { variant: 'default' },\n );\n\n if (bottomSheetBackgroundColor !== undefined) {\n setRuntimeValue(\n getRuntimeFieldSelector('useBottomSheetConfig', 'backgroundColor', { variant: 'default' }),\n bottomSheetBackgroundColor,\n );\n }\n\n if (config.toast?.variables && config.toast?.defaults) {\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'autoClose'),\n getRuntimeFieldStaticValue('useToastConfig', 'autoClose') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'position'),\n getRuntimeFieldStaticValue('useToastConfig', 'position') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeDefaultPropSelector('useToastConfig', 'size'),\n getRuntimeDefaultPropValue(config, 'useToastConfig', 'size'),\n );\n setRuntimeValue(\n getRuntimeDefaultPropSelector('useToastConfig', 'variant'),\n getRuntimeDefaultPropValue(config, 'useToastConfig', 'variant'),\n );\n\n getRuntimeSelectorParamValues('useToastConfig', 'size').forEach((size) => {\n const textVariant = getRuntimeFieldTokenValue(config, 'useToastConfig', 'textVariant', {\n size,\n });\n const iconSize = getRuntimeFieldTokenValue(config, 'useToastConfig', 'iconSize', { size });\n const buttonSize = getRuntimeFieldTokenValue(config, 'useToastConfig', 'buttonSize', {\n size,\n });\n\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'textVariant', { size }),\n textVariant,\n );\n setRuntimeValue(getRuntimeFieldSelector('useToastConfig', 'iconSize', { size }), iconSize);\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'buttonSize', { size }),\n buttonSize,\n );\n });\n\n getRuntimeSelectorParamValues('useToastConfig', 'variant').forEach((variant) => {\n const textColor = getRuntimeFieldTokenValue(config, 'useToastConfig', 'textColor', {\n variant,\n });\n const buttonVariant = getRuntimeFieldTokenValue(config, 'useToastConfig', 'buttonVariant', {\n variant,\n });\n const iconVariant = getRuntimeFieldTokenValue(config, 'useToastConfig', 'iconVariant', {\n variant,\n });\n const backgroundColor = getRuntimeFieldTokenValue(\n config,\n 'useToastConfig',\n 'backgroundColor',\n { variant },\n );\n\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'textColor', { variant }),\n textColor,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'buttonVariant', { variant }),\n buttonVariant,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'iconVariant', { variant }),\n iconVariant,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'backgroundColor', { variant }),\n backgroundColor,\n );\n });\n }\n\n const tooltipBorderRadius = getRuntimeFieldTokenValue(\n config,\n 'useTooltipConfig',\n 'borderRadius',\n {\n size: 'default',\n },\n );\n\n if (tooltipBorderRadius !== undefined) {\n setRuntimeValue(\n getRuntimeFieldSelector('useTooltipConfig', 'animationDuration'),\n getRuntimeFieldStaticValue('useTooltipConfig', 'animationDuration') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useTooltipConfig', 'placement'),\n getRuntimeFieldStaticValue('useTooltipConfig', 'placement') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useTooltipConfig', 'borderRadius', { size: 'default' }),\n tooltipBorderRadius,\n );\n }\n\n if (config.popover?.variables && config.scaleMode?.medium) {\n setRuntimeValue(\n getRuntimeDefaultPropSelector('usePopoverConfig', 'size'),\n getRuntimeDefaultPropValue(config, 'usePopoverConfig', 'size') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeDefaultPropSelector('usePopoverConfig', 'variant'),\n getRuntimeDefaultPropValue(config, 'usePopoverConfig', 'variant') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'animationDuration'),\n getRuntimeFieldStaticValue('usePopoverConfig', 'animationDuration') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'placement'),\n getRuntimeFieldStaticValue('usePopoverConfig', 'placement') ?? undefined,\n );\n\n getRuntimeSelectorParamValues('usePopoverConfig', 'size').forEach((size) => {\n const borderRadius = getRuntimeFieldTokenValue(config, 'usePopoverConfig', 'borderRadius', {\n size,\n });\n const gap = getRuntimeFieldTokenValue(config, 'usePopoverConfig', 'gap', { size });\n const spacingHorizontal = getRuntimeFieldTokenValue(\n config,\n 'usePopoverConfig',\n 'spacingHorizontal',\n { size },\n );\n const spacingVertical = getRuntimeFieldTokenValue(\n config,\n 'usePopoverConfig',\n 'spacingVertical',\n { size },\n );\n const dismissButtonSpacing = getRuntimeFieldTokenValue(\n config,\n 'usePopoverConfig',\n 'dismissButtonSpacing',\n { size },\n );\n const dismissIconSize = getRuntimeFieldTokenValue(\n config,\n 'usePopoverConfig',\n 'dismissIconSize',\n { size },\n );\n\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'borderRadius', { size }),\n borderRadius,\n );\n setRuntimeValue(getRuntimeFieldSelector('usePopoverConfig', 'gap', { size }), gap);\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'spacingHorizontal', { size }),\n spacingHorizontal,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'spacingVertical', { size }),\n spacingVertical,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'dismissButtonSpacing', { size }),\n dismissButtonSpacing,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'dismissIconSize', { size }),\n dismissIconSize,\n );\n });\n }\n\n return values;\n};\n\n/**\n * Format bytes to human readable string\n */\nconst formatBytes = (bytes: number): string => {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const kb = bytes / 1024;\n if (kb < 1024) {\n return `${kb.toFixed(1)} KB`;\n }\n const mb = kb / 1024;\n return `${mb.toFixed(2)} MB`;\n};\n\n/**\n * Get motion CSS variable prefixes needed by a set of components.\n * Looks up motionVarPrefixes from componentData.json for each component.\n */\nconst getMotionVarPrefixes = (\n componentData: Record<string, SerializedComponentInfo>,\n components: string[],\n): string[] => {\n const prefixes = components.flatMap((componentName) => {\n const info = (componentData as Record<string, { motionVarPrefixes?: string[] }>)[componentName];\n return info?.motionVarPrefixes ?? [];\n });\n\n return [...new Set(prefixes)];\n};\n\n/**\n * Collect css variable names exposed by configurable properties.\n */\nconst getConfigurableCssVariables = (): string[] => {\n const udsVarPrefix = '--uds';\n const cssVars = Object.values(configurableProperties).flatMap(({ cssProperties }) => {\n if (typeof cssProperties === 'string') {\n return cssProperties.startsWith(udsVarPrefix) ? [cssProperties] : [];\n }\n\n if (Array.isArray(cssProperties)) {\n return cssProperties.filter(\n (cssProperty): cssProperty is string =>\n typeof cssProperty === 'string' && cssProperty.startsWith(udsVarPrefix),\n );\n }\n\n return [];\n });\n\n return [...new Set(['--uds-button-gap', ...cssVars])];\n};\n\nexport {\n extractRuntimeConfigValues,\n extractVariantDefaults,\n formatBytes,\n getConfigurableCssVariables,\n getMotionVarPrefixes,\n};\n"],"mappings":"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"}
|
|
@@ -91,6 +91,38 @@ const getVariantKeysForProp = (componentInfo, propName) => {
|
|
|
91
91
|
getAutoVariantKeysForProp(componentInfo.name, propName).forEach((inferred) => keys.add(inferred));
|
|
92
92
|
return [...keys];
|
|
93
93
|
};
|
|
94
|
+
const addVariantGroupClasses = (variantGroup, safelist) => {
|
|
95
|
+
if (!variantGroup) return;
|
|
96
|
+
Object.values(variantGroup).forEach((cls) => {
|
|
97
|
+
safelist.push(cls.replaceAll("\\", ""));
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
const getRuntimeDefaultPropValues = (componentInfo, propName, runtimeConfigValues) => {
|
|
101
|
+
const selector = componentInfo.runtimeConfigDefaultProps?.[propName];
|
|
102
|
+
if (!selector || !runtimeConfigValues) return [];
|
|
103
|
+
const value = runtimeConfigValues[selector];
|
|
104
|
+
return value === void 0 ? [] : [String(value)];
|
|
105
|
+
};
|
|
106
|
+
const getPropCandidateValues = (componentInfo, propName, userProps, options) => {
|
|
107
|
+
const explicitValues = userProps.get(propName);
|
|
108
|
+
if (explicitValues && explicitValues.size > 0) return [...explicitValues];
|
|
109
|
+
const configuredDefault = options.variantDefaults?.[componentInfo.name]?.[propName];
|
|
110
|
+
if (configuredDefault) return [configuredDefault];
|
|
111
|
+
if (componentInfo.defaultProps[propName]) return [componentInfo.defaultProps[propName]];
|
|
112
|
+
return getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);
|
|
113
|
+
};
|
|
114
|
+
const resolveRuntimeSelectorValues = (selectorTemplate, componentInfo, userProps, options) => {
|
|
115
|
+
const runtimeConfigValues = options.runtimeConfigValues;
|
|
116
|
+
if (!runtimeConfigValues) return [];
|
|
117
|
+
return [...selectorTemplate.matchAll(/\$\{(\w+)\}/g)].map((match) => match[1]).reduce((acc, propName) => {
|
|
118
|
+
const propValues = getPropCandidateValues(componentInfo, propName, userProps, options);
|
|
119
|
+
if (propValues.length === 0) return [];
|
|
120
|
+
return acc.flatMap((selector) => propValues.map((value) => selector.replaceAll("${" + propName + "}", value)));
|
|
121
|
+
}, [selectorTemplate]).flatMap((selector) => {
|
|
122
|
+
const value = runtimeConfigValues[selector];
|
|
123
|
+
return value === void 0 ? [] : [String(value)];
|
|
124
|
+
});
|
|
125
|
+
};
|
|
94
126
|
const extractClassNamePrimitives = (sourceFile) => {
|
|
95
127
|
const classes = [];
|
|
96
128
|
sourceFile.getDescendantsOfKind(ts_morph.SyntaxKind.JsxAttribute).forEach((attr) => {
|
|
@@ -140,6 +172,7 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
140
172
|
});
|
|
141
173
|
});
|
|
142
174
|
const componentProps = /* @__PURE__ */ new Map();
|
|
175
|
+
const componentUnresolvedSpreadProps = /* @__PURE__ */ new Map();
|
|
143
176
|
const referencedComponents = /* @__PURE__ */ new Set();
|
|
144
177
|
const getStylesProps = extractGetStylesCalls(sourceFile, stats, variants);
|
|
145
178
|
imports.forEach((imp) => {
|
|
@@ -147,16 +180,21 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
147
180
|
const componentName = reference.getTagNameNode().getText() || imp;
|
|
148
181
|
referencedComponents.add(componentName);
|
|
149
182
|
const propsMap = componentProps.get(componentName) ?? /* @__PURE__ */ new Map();
|
|
150
|
-
|
|
183
|
+
const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentName) ?? /* @__PURE__ */ new Set();
|
|
184
|
+
extractPropsFromReference(reference, stats, sourceFile).forEach(({ propName, values, fromSpread }) => {
|
|
151
185
|
if (values.length > 0) {
|
|
152
186
|
const existing = propsMap.get(propName) ?? /* @__PURE__ */ new Set();
|
|
153
187
|
values.forEach((val) => existing.add(val));
|
|
154
188
|
propsMap.set(propName, existing);
|
|
189
|
+
return;
|
|
155
190
|
}
|
|
191
|
+
if (fromSpread) unresolvedSpreadProps.add(propName);
|
|
156
192
|
});
|
|
157
193
|
componentProps.set(componentName, propsMap);
|
|
194
|
+
componentUnresolvedSpreadProps.set(componentName, unresolvedSpreadProps);
|
|
158
195
|
});
|
|
159
196
|
if (!componentProps.has(imp)) componentProps.set(imp, /* @__PURE__ */ new Map());
|
|
197
|
+
if (!componentUnresolvedSpreadProps.has(imp)) componentUnresolvedSpreadProps.set(imp, /* @__PURE__ */ new Set());
|
|
160
198
|
});
|
|
161
199
|
const allComponents = [];
|
|
162
200
|
const seenComponents = /* @__PURE__ */ new Set();
|
|
@@ -178,6 +216,7 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
178
216
|
});
|
|
179
217
|
allComponents.forEach((componentInfo) => {
|
|
180
218
|
const userProps = componentProps.get(componentInfo.name) ?? /* @__PURE__ */ new Map();
|
|
219
|
+
const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentInfo.name) ?? /* @__PURE__ */ new Set();
|
|
181
220
|
Object.entries(componentInfo.defaultProps).forEach(([propName, propValue]) => {
|
|
182
221
|
if (userProps.has(propName)) return;
|
|
183
222
|
const variantGroup = variants[propName];
|
|
@@ -201,17 +240,29 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
201
240
|
if (cls) safelist.push(cls.replaceAll("\\", ""));
|
|
202
241
|
}
|
|
203
242
|
});
|
|
243
|
+
Object.entries(componentInfo.runtimeConfigGetStyles ?? {}).forEach(([propName, selectors]) => {
|
|
244
|
+
const variantGroup = variants[propName] ?? autoVariantsCache[propName];
|
|
245
|
+
if (!variantGroup) return;
|
|
246
|
+
selectors.forEach((selector) => {
|
|
247
|
+
resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach((value) => {
|
|
248
|
+
const cls = variantGroup[value];
|
|
249
|
+
if (cls) safelist.push(cls.replaceAll("\\", ""));
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
});
|
|
204
253
|
if (componentInfo.cxLiterals) componentInfo.cxLiterals.forEach((cls) => safelist.push(cls));
|
|
205
254
|
if (componentInfo.propToVariantKeys) {
|
|
206
255
|
const componentDefaults = options.variantDefaults?.[componentInfo.name] ?? {};
|
|
207
256
|
Object.keys(componentInfo.propToVariantKeys).forEach((propName) => {
|
|
208
257
|
if (userProps.has(propName)) return;
|
|
209
|
-
const
|
|
258
|
+
const defaultValues = componentDefaults[propName] ? [componentDefaults[propName]] : getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);
|
|
210
259
|
getVariantKeysForProp(componentInfo, propName).forEach((variantKey) => {
|
|
211
260
|
const variantGroup = autoVariantsCache[variantKey];
|
|
212
261
|
if (variantGroup) {
|
|
213
262
|
if (variantGroup["default"]) safelist.push(variantGroup["default"]);
|
|
214
|
-
|
|
263
|
+
defaultValues.forEach((defaultValue) => {
|
|
264
|
+
if (variantGroup[defaultValue]) safelist.push(variantGroup[defaultValue]);
|
|
265
|
+
});
|
|
215
266
|
}
|
|
216
267
|
});
|
|
217
268
|
});
|
|
@@ -231,6 +282,18 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
231
282
|
});
|
|
232
283
|
});
|
|
233
284
|
});
|
|
285
|
+
Object.entries(componentInfo.runtimeConfigInternalComponentProps ?? {}).forEach(([_internalCompName, propsRecord]) => {
|
|
286
|
+
Object.entries(propsRecord).forEach(([propName, selectors]) => {
|
|
287
|
+
const variantGroup = variants[propName];
|
|
288
|
+
if (!variantGroup) return;
|
|
289
|
+
selectors.forEach((selector) => {
|
|
290
|
+
resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach((value) => {
|
|
291
|
+
const cls = variantGroup[value];
|
|
292
|
+
if (cls) safelist.push(cls.replaceAll("\\", ""));
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
});
|
|
234
297
|
[...userProps.entries()].forEach(([propName, usedValues]) => {
|
|
235
298
|
if (propName === "className") {
|
|
236
299
|
[...usedValues].forEach((value) => {
|
|
@@ -254,6 +317,14 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
254
317
|
});
|
|
255
318
|
});
|
|
256
319
|
});
|
|
320
|
+
unresolvedSpreadProps.forEach((propName) => {
|
|
321
|
+
addVariantGroupClasses(variants[propName] ?? autoVariantsCache[propName], safelist);
|
|
322
|
+
[componentInfo, ...getComponentWithDeps(componentInfo.name).slice(1)].forEach((comp) => {
|
|
323
|
+
getVariantKeysForProp(comp, propName).forEach((variantKey) => {
|
|
324
|
+
addVariantGroupClasses(variants[variantKey] ?? autoVariantsCache[variantKey], safelist);
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
});
|
|
257
328
|
});
|
|
258
329
|
if (options.includeAllClassNamePrimitives) safelist.push(...extractClassNamePrimitives(sourceFile));
|
|
259
330
|
const finalSafelist = [...new Set(safelist)];
|
|
@@ -323,12 +394,20 @@ const extractPropsFromReference = (reference, stats, sourceFile) => {
|
|
|
323
394
|
if (resolved.length > 0) stats.expressionsResolved++;
|
|
324
395
|
}
|
|
325
396
|
}
|
|
326
|
-
props.push(
|
|
397
|
+
props.push({
|
|
398
|
+
propName,
|
|
399
|
+
values,
|
|
400
|
+
fromSpread: false
|
|
401
|
+
});
|
|
327
402
|
}
|
|
328
403
|
if (attr.asKind(ts_morph.SyntaxKind.JsxSpreadAttribute)) {
|
|
329
404
|
stats.spreadsTraced++;
|
|
330
405
|
traceSpreadInFile(attr.asKindOrThrow(ts_morph.SyntaxKind.JsxSpreadAttribute).getExpression().getText(), sourceFile).forEach(([propName, values]) => {
|
|
331
|
-
|
|
406
|
+
props.push({
|
|
407
|
+
propName,
|
|
408
|
+
values,
|
|
409
|
+
fromSpread: true
|
|
410
|
+
});
|
|
332
411
|
});
|
|
333
412
|
}
|
|
334
413
|
});
|
|
@@ -338,25 +417,31 @@ const extractPropsFromReference = (reference, stats, sourceFile) => {
|
|
|
338
417
|
* Trace spread props to their source within the same file.
|
|
339
418
|
*/
|
|
340
419
|
const traceSpreadInFile = (spreadName, sourceFile) => {
|
|
341
|
-
const props =
|
|
342
|
-
const varDecl = sourceFile.
|
|
343
|
-
if (!varDecl) return
|
|
420
|
+
const props = /* @__PURE__ */ new Map();
|
|
421
|
+
const varDecl = sourceFile.getDescendantsOfKind(ts_morph.SyntaxKind.VariableDeclaration).find((declaration) => declaration.getName() === spreadName);
|
|
422
|
+
if (!varDecl) return [];
|
|
344
423
|
const initializer = varDecl.getInitializer();
|
|
345
|
-
if (!initializer) return
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
if (prop.asKind(ts_morph.SyntaxKind.PropertyAssignment)) {
|
|
424
|
+
if (!initializer) return [];
|
|
425
|
+
getSpreadObjectLiteralCandidates(initializer).forEach((objLiteral) => {
|
|
426
|
+
objLiteral.getProperties().forEach((prop) => {
|
|
427
|
+
if (!prop.asKind(ts_morph.SyntaxKind.PropertyAssignment)) return;
|
|
350
428
|
const propAssign = prop.asKindOrThrow(ts_morph.SyntaxKind.PropertyAssignment);
|
|
351
429
|
const propName = propAssign.getName();
|
|
352
430
|
const propInit = propAssign.getInitializer();
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
}
|
|
431
|
+
const values = propInit ? require_expressions.extractStringLiterals(propInit) : [];
|
|
432
|
+
const existingValues = props.get(propName) ?? /* @__PURE__ */ new Set();
|
|
433
|
+
values.forEach((value) => existingValues.add(value));
|
|
434
|
+
props.set(propName, existingValues);
|
|
435
|
+
});
|
|
358
436
|
});
|
|
359
|
-
return props;
|
|
437
|
+
return [...props.entries()].map(([propName, values]) => [propName, [...values]]);
|
|
438
|
+
};
|
|
439
|
+
const getSpreadObjectLiteralCandidates = (node) => {
|
|
440
|
+
if (ts_morph.Node.isObjectLiteralExpression(node)) return [node];
|
|
441
|
+
if (ts_morph.Node.isParenthesizedExpression(node)) return getSpreadObjectLiteralCandidates(node.getExpression());
|
|
442
|
+
if (ts_morph.Node.isAsExpression(node) || ts_morph.Node.isTypeAssertion(node) || ts_morph.Node.isSatisfiesExpression(node)) return getSpreadObjectLiteralCandidates(node.getExpression());
|
|
443
|
+
if (ts_morph.Node.isConditionalExpression(node)) return [...getSpreadObjectLiteralCandidates(node.getWhenTrue()), ...getSpreadObjectLiteralCandidates(node.getWhenFalse())];
|
|
444
|
+
return [];
|
|
360
445
|
};
|
|
361
446
|
/**
|
|
362
447
|
* Extract props from getStyles() calls in user code.
|
|
@@ -8,6 +8,7 @@ interface PurgeFromCodeResult {
|
|
|
8
8
|
components: string[];
|
|
9
9
|
stats: PurgeStats;
|
|
10
10
|
}
|
|
11
|
+
type RuntimeConfigValues = Record<string, string | number | boolean>;
|
|
11
12
|
/**
|
|
12
13
|
* Serialized component info from pre-generated data
|
|
13
14
|
*/
|
|
@@ -19,6 +20,9 @@ interface SerializedComponentInfo {
|
|
|
19
20
|
internalComponents: string[];
|
|
20
21
|
internalComponentProps: Record<string, Record<string, string[]>>;
|
|
21
22
|
propToVariantKeys: Record<string, string[]>;
|
|
23
|
+
runtimeConfigDefaultProps?: Record<string, string>;
|
|
24
|
+
runtimeConfigGetStyles?: Record<string, string[]>;
|
|
25
|
+
runtimeConfigInternalComponentProps?: Record<string, Record<string, string[]>>;
|
|
22
26
|
}
|
|
23
27
|
/**
|
|
24
28
|
* Optimized purge from code string.
|
|
@@ -46,6 +50,7 @@ interface PurgeFromCodeOptions {
|
|
|
46
50
|
colorModes?: ('dark' | 'light')[];
|
|
47
51
|
/** Variant defaults from consumer's config - used to include default CSS when prop not specified */
|
|
48
52
|
variantDefaults?: VariantDefaults;
|
|
53
|
+
runtimeConfigValues?: RuntimeConfigValues;
|
|
49
54
|
variants: Record<string, Record<string, string>>;
|
|
50
55
|
autoVariants: Record<string, Record<string, string>>;
|
|
51
56
|
componentData: Record<string, SerializedComponentInfo>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purgeFromCode.d.cts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;;;;
|
|
1
|
+
{"version":3,"file":"purgeFromCode.d.cts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;AAAA,KAGJ,mBAAA,GAAsB,MAAA;;;;UAKjB,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;EACnB,yBAAA,GAA4B,MAAA;EAC5B,sBAAA,GAAyB,MAAA;EACzB,mCAAA,GAAsC,MAAA,SAAe,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;KAoDlD,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EAxDA;EA0DA,eAAA,GAAkB,eAAA;EAClB,mBAAA,GAAsB,mBAAA;EACtB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAqQI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
|
|
@@ -8,6 +8,7 @@ interface PurgeFromCodeResult {
|
|
|
8
8
|
components: string[];
|
|
9
9
|
stats: PurgeStats;
|
|
10
10
|
}
|
|
11
|
+
type RuntimeConfigValues = Record<string, string | number | boolean>;
|
|
11
12
|
/**
|
|
12
13
|
* Serialized component info from pre-generated data
|
|
13
14
|
*/
|
|
@@ -19,6 +20,9 @@ interface SerializedComponentInfo {
|
|
|
19
20
|
internalComponents: string[];
|
|
20
21
|
internalComponentProps: Record<string, Record<string, string[]>>;
|
|
21
22
|
propToVariantKeys: Record<string, string[]>;
|
|
23
|
+
runtimeConfigDefaultProps?: Record<string, string>;
|
|
24
|
+
runtimeConfigGetStyles?: Record<string, string[]>;
|
|
25
|
+
runtimeConfigInternalComponentProps?: Record<string, Record<string, string[]>>;
|
|
22
26
|
}
|
|
23
27
|
/**
|
|
24
28
|
* Optimized purge from code string.
|
|
@@ -46,6 +50,7 @@ interface PurgeFromCodeOptions {
|
|
|
46
50
|
colorModes?: ('dark' | 'light')[];
|
|
47
51
|
/** Variant defaults from consumer's config - used to include default CSS when prop not specified */
|
|
48
52
|
variantDefaults?: VariantDefaults;
|
|
53
|
+
runtimeConfigValues?: RuntimeConfigValues;
|
|
49
54
|
variants: Record<string, Record<string, string>>;
|
|
50
55
|
autoVariants: Record<string, Record<string, string>>;
|
|
51
56
|
componentData: Record<string, SerializedComponentInfo>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purgeFromCode.d.ts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;;;;
|
|
1
|
+
{"version":3,"file":"purgeFromCode.d.ts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;AAAA,KAGJ,mBAAA,GAAsB,MAAA;;;;UAKjB,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;EACnB,yBAAA,GAA4B,MAAA;EAC5B,sBAAA,GAAyB,MAAA;EACzB,mCAAA,GAAsC,MAAA,SAAe,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;KAoDlD,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EAxDA;EA0DA,eAAA,GAAkB,eAAA;EAClB,mBAAA,GAAsB,mBAAA;EACtB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAqQI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
|
|
@@ -90,6 +90,38 @@ const getVariantKeysForProp = (componentInfo, propName) => {
|
|
|
90
90
|
getAutoVariantKeysForProp(componentInfo.name, propName).forEach((inferred) => keys.add(inferred));
|
|
91
91
|
return [...keys];
|
|
92
92
|
};
|
|
93
|
+
const addVariantGroupClasses = (variantGroup, safelist) => {
|
|
94
|
+
if (!variantGroup) return;
|
|
95
|
+
Object.values(variantGroup).forEach((cls) => {
|
|
96
|
+
safelist.push(cls.replaceAll("\\", ""));
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
const getRuntimeDefaultPropValues = (componentInfo, propName, runtimeConfigValues) => {
|
|
100
|
+
const selector = componentInfo.runtimeConfigDefaultProps?.[propName];
|
|
101
|
+
if (!selector || !runtimeConfigValues) return [];
|
|
102
|
+
const value = runtimeConfigValues[selector];
|
|
103
|
+
return value === void 0 ? [] : [String(value)];
|
|
104
|
+
};
|
|
105
|
+
const getPropCandidateValues = (componentInfo, propName, userProps, options) => {
|
|
106
|
+
const explicitValues = userProps.get(propName);
|
|
107
|
+
if (explicitValues && explicitValues.size > 0) return [...explicitValues];
|
|
108
|
+
const configuredDefault = options.variantDefaults?.[componentInfo.name]?.[propName];
|
|
109
|
+
if (configuredDefault) return [configuredDefault];
|
|
110
|
+
if (componentInfo.defaultProps[propName]) return [componentInfo.defaultProps[propName]];
|
|
111
|
+
return getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);
|
|
112
|
+
};
|
|
113
|
+
const resolveRuntimeSelectorValues = (selectorTemplate, componentInfo, userProps, options) => {
|
|
114
|
+
const runtimeConfigValues = options.runtimeConfigValues;
|
|
115
|
+
if (!runtimeConfigValues) return [];
|
|
116
|
+
return [...selectorTemplate.matchAll(/\$\{(\w+)\}/g)].map((match) => match[1]).reduce((acc, propName) => {
|
|
117
|
+
const propValues = getPropCandidateValues(componentInfo, propName, userProps, options);
|
|
118
|
+
if (propValues.length === 0) return [];
|
|
119
|
+
return acc.flatMap((selector) => propValues.map((value) => selector.replaceAll("${" + propName + "}", value)));
|
|
120
|
+
}, [selectorTemplate]).flatMap((selector) => {
|
|
121
|
+
const value = runtimeConfigValues[selector];
|
|
122
|
+
return value === void 0 ? [] : [String(value)];
|
|
123
|
+
});
|
|
124
|
+
};
|
|
93
125
|
const extractClassNamePrimitives = (sourceFile) => {
|
|
94
126
|
const classes = [];
|
|
95
127
|
sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {
|
|
@@ -139,6 +171,7 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
139
171
|
});
|
|
140
172
|
});
|
|
141
173
|
const componentProps = /* @__PURE__ */ new Map();
|
|
174
|
+
const componentUnresolvedSpreadProps = /* @__PURE__ */ new Map();
|
|
142
175
|
const referencedComponents = /* @__PURE__ */ new Set();
|
|
143
176
|
const getStylesProps = extractGetStylesCalls(sourceFile, stats, variants);
|
|
144
177
|
imports.forEach((imp) => {
|
|
@@ -146,16 +179,21 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
146
179
|
const componentName = reference.getTagNameNode().getText() || imp;
|
|
147
180
|
referencedComponents.add(componentName);
|
|
148
181
|
const propsMap = componentProps.get(componentName) ?? /* @__PURE__ */ new Map();
|
|
149
|
-
|
|
182
|
+
const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentName) ?? /* @__PURE__ */ new Set();
|
|
183
|
+
extractPropsFromReference(reference, stats, sourceFile).forEach(({ propName, values, fromSpread }) => {
|
|
150
184
|
if (values.length > 0) {
|
|
151
185
|
const existing = propsMap.get(propName) ?? /* @__PURE__ */ new Set();
|
|
152
186
|
values.forEach((val) => existing.add(val));
|
|
153
187
|
propsMap.set(propName, existing);
|
|
188
|
+
return;
|
|
154
189
|
}
|
|
190
|
+
if (fromSpread) unresolvedSpreadProps.add(propName);
|
|
155
191
|
});
|
|
156
192
|
componentProps.set(componentName, propsMap);
|
|
193
|
+
componentUnresolvedSpreadProps.set(componentName, unresolvedSpreadProps);
|
|
157
194
|
});
|
|
158
195
|
if (!componentProps.has(imp)) componentProps.set(imp, /* @__PURE__ */ new Map());
|
|
196
|
+
if (!componentUnresolvedSpreadProps.has(imp)) componentUnresolvedSpreadProps.set(imp, /* @__PURE__ */ new Set());
|
|
159
197
|
});
|
|
160
198
|
const allComponents = [];
|
|
161
199
|
const seenComponents = /* @__PURE__ */ new Set();
|
|
@@ -177,6 +215,7 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
177
215
|
});
|
|
178
216
|
allComponents.forEach((componentInfo) => {
|
|
179
217
|
const userProps = componentProps.get(componentInfo.name) ?? /* @__PURE__ */ new Map();
|
|
218
|
+
const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentInfo.name) ?? /* @__PURE__ */ new Set();
|
|
180
219
|
Object.entries(componentInfo.defaultProps).forEach(([propName, propValue]) => {
|
|
181
220
|
if (userProps.has(propName)) return;
|
|
182
221
|
const variantGroup = variants[propName];
|
|
@@ -200,17 +239,29 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
200
239
|
if (cls) safelist.push(cls.replaceAll("\\", ""));
|
|
201
240
|
}
|
|
202
241
|
});
|
|
242
|
+
Object.entries(componentInfo.runtimeConfigGetStyles ?? {}).forEach(([propName, selectors]) => {
|
|
243
|
+
const variantGroup = variants[propName] ?? autoVariantsCache[propName];
|
|
244
|
+
if (!variantGroup) return;
|
|
245
|
+
selectors.forEach((selector) => {
|
|
246
|
+
resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach((value) => {
|
|
247
|
+
const cls = variantGroup[value];
|
|
248
|
+
if (cls) safelist.push(cls.replaceAll("\\", ""));
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
});
|
|
203
252
|
if (componentInfo.cxLiterals) componentInfo.cxLiterals.forEach((cls) => safelist.push(cls));
|
|
204
253
|
if (componentInfo.propToVariantKeys) {
|
|
205
254
|
const componentDefaults = options.variantDefaults?.[componentInfo.name] ?? {};
|
|
206
255
|
Object.keys(componentInfo.propToVariantKeys).forEach((propName) => {
|
|
207
256
|
if (userProps.has(propName)) return;
|
|
208
|
-
const
|
|
257
|
+
const defaultValues = componentDefaults[propName] ? [componentDefaults[propName]] : getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);
|
|
209
258
|
getVariantKeysForProp(componentInfo, propName).forEach((variantKey) => {
|
|
210
259
|
const variantGroup = autoVariantsCache[variantKey];
|
|
211
260
|
if (variantGroup) {
|
|
212
261
|
if (variantGroup["default"]) safelist.push(variantGroup["default"]);
|
|
213
|
-
|
|
262
|
+
defaultValues.forEach((defaultValue) => {
|
|
263
|
+
if (variantGroup[defaultValue]) safelist.push(variantGroup[defaultValue]);
|
|
264
|
+
});
|
|
214
265
|
}
|
|
215
266
|
});
|
|
216
267
|
});
|
|
@@ -230,6 +281,18 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
230
281
|
});
|
|
231
282
|
});
|
|
232
283
|
});
|
|
284
|
+
Object.entries(componentInfo.runtimeConfigInternalComponentProps ?? {}).forEach(([_internalCompName, propsRecord]) => {
|
|
285
|
+
Object.entries(propsRecord).forEach(([propName, selectors]) => {
|
|
286
|
+
const variantGroup = variants[propName];
|
|
287
|
+
if (!variantGroup) return;
|
|
288
|
+
selectors.forEach((selector) => {
|
|
289
|
+
resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach((value) => {
|
|
290
|
+
const cls = variantGroup[value];
|
|
291
|
+
if (cls) safelist.push(cls.replaceAll("\\", ""));
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
});
|
|
233
296
|
[...userProps.entries()].forEach(([propName, usedValues]) => {
|
|
234
297
|
if (propName === "className") {
|
|
235
298
|
[...usedValues].forEach((value) => {
|
|
@@ -253,6 +316,14 @@ const purgeFromCodeOptimized = async (code, options) => {
|
|
|
253
316
|
});
|
|
254
317
|
});
|
|
255
318
|
});
|
|
319
|
+
unresolvedSpreadProps.forEach((propName) => {
|
|
320
|
+
addVariantGroupClasses(variants[propName] ?? autoVariantsCache[propName], safelist);
|
|
321
|
+
[componentInfo, ...getComponentWithDeps(componentInfo.name).slice(1)].forEach((comp) => {
|
|
322
|
+
getVariantKeysForProp(comp, propName).forEach((variantKey) => {
|
|
323
|
+
addVariantGroupClasses(variants[variantKey] ?? autoVariantsCache[variantKey], safelist);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
});
|
|
256
327
|
});
|
|
257
328
|
if (options.includeAllClassNamePrimitives) safelist.push(...extractClassNamePrimitives(sourceFile));
|
|
258
329
|
const finalSafelist = [...new Set(safelist)];
|
|
@@ -322,12 +393,20 @@ const extractPropsFromReference = (reference, stats, sourceFile) => {
|
|
|
322
393
|
if (resolved.length > 0) stats.expressionsResolved++;
|
|
323
394
|
}
|
|
324
395
|
}
|
|
325
|
-
props.push(
|
|
396
|
+
props.push({
|
|
397
|
+
propName,
|
|
398
|
+
values,
|
|
399
|
+
fromSpread: false
|
|
400
|
+
});
|
|
326
401
|
}
|
|
327
402
|
if (attr.asKind(SyntaxKind.JsxSpreadAttribute)) {
|
|
328
403
|
stats.spreadsTraced++;
|
|
329
404
|
traceSpreadInFile(attr.asKindOrThrow(SyntaxKind.JsxSpreadAttribute).getExpression().getText(), sourceFile).forEach(([propName, values]) => {
|
|
330
|
-
|
|
405
|
+
props.push({
|
|
406
|
+
propName,
|
|
407
|
+
values,
|
|
408
|
+
fromSpread: true
|
|
409
|
+
});
|
|
331
410
|
});
|
|
332
411
|
}
|
|
333
412
|
});
|
|
@@ -337,25 +416,31 @@ const extractPropsFromReference = (reference, stats, sourceFile) => {
|
|
|
337
416
|
* Trace spread props to their source within the same file.
|
|
338
417
|
*/
|
|
339
418
|
const traceSpreadInFile = (spreadName, sourceFile) => {
|
|
340
|
-
const props =
|
|
341
|
-
const varDecl = sourceFile.
|
|
342
|
-
if (!varDecl) return
|
|
419
|
+
const props = /* @__PURE__ */ new Map();
|
|
420
|
+
const varDecl = sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration).find((declaration) => declaration.getName() === spreadName);
|
|
421
|
+
if (!varDecl) return [];
|
|
343
422
|
const initializer = varDecl.getInitializer();
|
|
344
|
-
if (!initializer) return
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
if (prop.asKind(SyntaxKind.PropertyAssignment)) {
|
|
423
|
+
if (!initializer) return [];
|
|
424
|
+
getSpreadObjectLiteralCandidates(initializer).forEach((objLiteral) => {
|
|
425
|
+
objLiteral.getProperties().forEach((prop) => {
|
|
426
|
+
if (!prop.asKind(SyntaxKind.PropertyAssignment)) return;
|
|
349
427
|
const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);
|
|
350
428
|
const propName = propAssign.getName();
|
|
351
429
|
const propInit = propAssign.getInitializer();
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
}
|
|
430
|
+
const values = propInit ? extractStringLiterals(propInit) : [];
|
|
431
|
+
const existingValues = props.get(propName) ?? /* @__PURE__ */ new Set();
|
|
432
|
+
values.forEach((value) => existingValues.add(value));
|
|
433
|
+
props.set(propName, existingValues);
|
|
434
|
+
});
|
|
357
435
|
});
|
|
358
|
-
return props;
|
|
436
|
+
return [...props.entries()].map(([propName, values]) => [propName, [...values]]);
|
|
437
|
+
};
|
|
438
|
+
const getSpreadObjectLiteralCandidates = (node) => {
|
|
439
|
+
if (Node.isObjectLiteralExpression(node)) return [node];
|
|
440
|
+
if (Node.isParenthesizedExpression(node)) return getSpreadObjectLiteralCandidates(node.getExpression());
|
|
441
|
+
if (Node.isAsExpression(node) || Node.isTypeAssertion(node) || Node.isSatisfiesExpression(node)) return getSpreadObjectLiteralCandidates(node.getExpression());
|
|
442
|
+
if (Node.isConditionalExpression(node)) return [...getSpreadObjectLiteralCandidates(node.getWhenTrue()), ...getSpreadObjectLiteralCandidates(node.getWhenFalse())];
|
|
443
|
+
return [];
|
|
359
444
|
};
|
|
360
445
|
/**
|
|
361
446
|
* Extract props from getStyles() calls in user code.
|