@yahoo/uds 3.117.2 → 3.117.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/styles/styler.d.cts +35 -35
  2. package/dist/styles/styler.d.ts +35 -35
  3. package/dist/tailwind/dist/cli/dist/lib/colors.cjs +22 -0
  4. package/dist/tailwind/dist/cli/dist/lib/colors.js +17 -0
  5. package/dist/tailwind/dist/cli/dist/lib/colors.js.map +1 -0
  6. package/dist/{cli → tailwind/dist/cli}/dist/lib/logger.cjs +1 -1
  7. package/dist/{cli → tailwind/dist/cli}/dist/lib/logger.js +3 -2
  8. package/dist/tailwind/dist/cli/dist/lib/logger.js.map +1 -0
  9. package/dist/tailwind/dist/cli/dist/lib/print.cjs +13 -0
  10. package/dist/tailwind/dist/cli/dist/lib/print.js +13 -0
  11. package/dist/tailwind/dist/cli/dist/lib/print.js.map +1 -0
  12. package/dist/{cli → tailwind/dist/cli}/dist/lib/spinner.cjs +1 -1
  13. package/dist/{cli → tailwind/dist/cli}/dist/lib/spinner.js +3 -2
  14. package/dist/tailwind/dist/cli/dist/lib/spinner.js.map +1 -0
  15. package/dist/tailwind/dist/commands/css.cjs +34 -34
  16. package/dist/tailwind/dist/commands/css.js +2 -1
  17. package/dist/tailwind/dist/commands/css.js.map +1 -1
  18. package/dist/tailwind/dist/commands/generateComponentData.cjs +9 -9
  19. package/dist/tailwind/dist/commands/generateComponentData.d.ts +1 -1
  20. package/dist/tailwind/dist/commands/generateComponentData.js +1 -1
  21. package/dist/tailwind/dist/commands/generatePurgeCSSData.cjs +3 -2
  22. package/dist/tailwind/dist/commands/generatePurgeCSSData.d.ts +1 -1
  23. package/dist/tailwind/dist/commands/generatePurgeCSSData.js +2 -1
  24. package/dist/tailwind/dist/commands/generatePurgeCSSData.js.map +1 -1
  25. package/dist/tailwind/dist/commands/purge.cjs +13 -13
  26. package/dist/tailwind/dist/commands/purge.js +2 -1
  27. package/dist/tailwind/dist/commands/purge.js.map +1 -1
  28. package/dist/tailwind/dist/css/generate.cjs +8 -6
  29. package/dist/tailwind/dist/css/generate.js +3 -1
  30. package/dist/tailwind/dist/css/generate.js.map +1 -1
  31. package/dist/tailwind/dist/css/nodeUtils.cjs +10 -9
  32. package/dist/tailwind/dist/css/nodeUtils.js +2 -1
  33. package/dist/tailwind/dist/css/nodeUtils.js.map +1 -1
  34. package/dist/tailwind/dist/css/runner.cjs +25 -22
  35. package/dist/tailwind/dist/css/runner.js +4 -1
  36. package/dist/tailwind/dist/css/runner.js.map +1 -1
  37. package/dist/tailwind/dist/purger/legacy/purgeCSS.cjs +8 -7
  38. package/dist/tailwind/dist/purger/legacy/purgeCSS.js +2 -1
  39. package/dist/tailwind/dist/purger/legacy/purgeCSS.js.map +1 -1
  40. package/dist/tailwind/dist/utils/generatePurgeCSSData.cjs +4 -3
  41. package/dist/tailwind/dist/utils/generatePurgeCSSData.js +2 -1
  42. package/dist/tailwind/dist/utils/generatePurgeCSSData.js.map +1 -1
  43. package/dist/uds/generated/componentData.cjs +81 -81
  44. package/dist/uds/generated/componentData.js +81 -81
  45. package/generated/componentData.json +112 -112
  46. package/package.json +1 -1
@@ -1,43 +1,43 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+ const require_colors = require('../cli/dist/lib/colors.cjs');
3
+ const require_print = require('../cli/dist/lib/print.cjs');
3
4
  const require_nodeUtils = require('../css/nodeUtils.cjs');
4
5
  const require_runner = require('../css/runner.cjs');
5
6
  const require_css_helpers = require('./css.helpers.cjs');
6
- let _yahoo_uds_cli_lib = require("@yahoo/uds-cli/lib");
7
7
 
8
8
  //#region src/commands/css.ts
9
9
  const showHelp = () => {
10
- (0, _yahoo_uds_cli_lib.print)("");
11
- (0, _yahoo_uds_cli_lib.print)(`${(0, _yahoo_uds_cli_lib.green)("uds css")} - Generate CSS for app`);
12
- (0, _yahoo_uds_cli_lib.print)("");
13
- (0, _yahoo_uds_cli_lib.print)(`${(0, _yahoo_uds_cli_lib.magenta)("Usage:")}`);
14
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("uds css")} [options]`);
15
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("uds css init")} [options]`);
16
- (0, _yahoo_uds_cli_lib.print)("");
17
- (0, _yahoo_uds_cli_lib.print)(`${(0, _yahoo_uds_cli_lib.magenta)("Commands:")}`);
18
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("init")} Create a new uds.theme.ts file`);
19
- (0, _yahoo_uds_cli_lib.print)("");
20
- (0, _yahoo_uds_cli_lib.print)(`${(0, _yahoo_uds_cli_lib.magenta)("Options:")}`);
21
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("--entry <path>")} Entry directory to scan (default: /src/)`);
22
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("--outFile <path>")} Output CSS file (default: dist/uds.css)`);
23
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("--config <path>")} Path to uds.config.ts for tokens`);
24
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("--theme <path>")} Path to uds.theme.ts (default: uds.theme.ts)`);
25
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("--watch, -w")} Watch for file changes and regenerate`);
26
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("--silent, -s")} Suppress output logging`);
27
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("--force")} Overwrite existing uds.theme.ts (for init)`);
28
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.cyan)("--help, -h")} Show this help message`);
29
- (0, _yahoo_uds_cli_lib.print)("");
30
- (0, _yahoo_uds_cli_lib.print)(`${(0, _yahoo_uds_cli_lib.magenta)("Initialize theme config:")}`);
31
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.gray)("uds css init")}`);
32
- (0, _yahoo_uds_cli_lib.print)("");
33
- (0, _yahoo_uds_cli_lib.print)(`${(0, _yahoo_uds_cli_lib.magenta)("Simple mode")} (no uds.theme.ts):`);
34
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.gray)("uds css --entry ./src --outFile dist/uds.css")}`);
35
- (0, _yahoo_uds_cli_lib.print)("");
36
- (0, _yahoo_uds_cli_lib.print)(`${(0, _yahoo_uds_cli_lib.magenta)("Theme mode")} (with uds.theme.ts):`);
37
- (0, _yahoo_uds_cli_lib.print)(` ${(0, _yahoo_uds_cli_lib.gray)("uds css --theme uds.theme.ts --outFile dist/uds.css")}`);
38
- (0, _yahoo_uds_cli_lib.print)("");
39
- (0, _yahoo_uds_cli_lib.print)(`${(0, _yahoo_uds_cli_lib.magenta)("Example uds.theme.ts:")}`);
40
- (0, _yahoo_uds_cli_lib.print)((0, _yahoo_uds_cli_lib.gray)(` import { defineTheme } from '@yahoo/uds';
10
+ require_print.print("");
11
+ require_print.print(`${require_colors.green("uds css")} - Generate CSS for app`);
12
+ require_print.print("");
13
+ require_print.print(`${require_colors.magenta("Usage:")}`);
14
+ require_print.print(` ${require_colors.cyan("uds css")} [options]`);
15
+ require_print.print(` ${require_colors.cyan("uds css init")} [options]`);
16
+ require_print.print("");
17
+ require_print.print(`${require_colors.magenta("Commands:")}`);
18
+ require_print.print(` ${require_colors.cyan("init")} Create a new uds.theme.ts file`);
19
+ require_print.print("");
20
+ require_print.print(`${require_colors.magenta("Options:")}`);
21
+ require_print.print(` ${require_colors.cyan("--entry <path>")} Entry directory to scan (default: /src/)`);
22
+ require_print.print(` ${require_colors.cyan("--outFile <path>")} Output CSS file (default: dist/uds.css)`);
23
+ require_print.print(` ${require_colors.cyan("--config <path>")} Path to uds.config.ts for tokens`);
24
+ require_print.print(` ${require_colors.cyan("--theme <path>")} Path to uds.theme.ts (default: uds.theme.ts)`);
25
+ require_print.print(` ${require_colors.cyan("--watch, -w")} Watch for file changes and regenerate`);
26
+ require_print.print(` ${require_colors.cyan("--silent, -s")} Suppress output logging`);
27
+ require_print.print(` ${require_colors.cyan("--force")} Overwrite existing uds.theme.ts (for init)`);
28
+ require_print.print(` ${require_colors.cyan("--help, -h")} Show this help message`);
29
+ require_print.print("");
30
+ require_print.print(`${require_colors.magenta("Initialize theme config:")}`);
31
+ require_print.print(` ${require_colors.gray("uds css init")}`);
32
+ require_print.print("");
33
+ require_print.print(`${require_colors.magenta("Simple mode")} (no uds.theme.ts):`);
34
+ require_print.print(` ${require_colors.gray("uds css --entry ./src --outFile dist/uds.css")}`);
35
+ require_print.print("");
36
+ require_print.print(`${require_colors.magenta("Theme mode")} (with uds.theme.ts):`);
37
+ require_print.print(` ${require_colors.gray("uds css --theme uds.theme.ts --outFile dist/uds.css")}`);
38
+ require_print.print("");
39
+ require_print.print(`${require_colors.magenta("Example uds.theme.ts:")}`);
40
+ require_print.print(require_colors.gray(` import { defineTheme } from '@yahoo/uds';
41
41
 
42
42
  export default defineTheme({
43
43
  config: './uds.config.ts',
@@ -50,7 +50,7 @@ const showHelp = () => {
50
50
  disableOverrideTailwindTheme: true // Don't merge into Tailwind defaults
51
51
  }
52
52
  });`));
53
- (0, _yahoo_uds_cli_lib.print)("");
53
+ require_print.print("");
54
54
  };
55
55
  const makeCSSCommand = (getContext) => ({
56
56
  name: "css",
@@ -1,8 +1,9 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
+ import { cyan, gray, green, magenta } from "../cli/dist/lib/colors.js";
3
+ import { print } from "../cli/dist/lib/print.js";
2
4
  import { scaffoldThemeConfig } from "../css/nodeUtils.js";
3
5
  import { runCssCommand } from "../css/runner.js";
4
6
  import { getCssInitOptions, getCssRunOptions, isInitCommand, shouldShowHelp } from "./css.helpers.js";
5
- import { cyan, gray, green, magenta, print } from "@yahoo/uds-cli/lib";
6
7
 
7
8
  //#region src/commands/css.ts
8
9
  const showHelp = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"css.js","names":[],"sources":["../../src/commands/css.ts"],"sourcesContent":["import type { Command, Props } from '@yahoo/uds-cli/lib';\nimport { cyan, gray, green, magenta, print } from '@yahoo/uds-cli/lib';\n\nimport { scaffoldThemeConfig } from '../css/nodeUtils';\nimport { runCssCommand } from '../css/runner';\nimport { getCssInitOptions, getCssRunOptions, isInitCommand, shouldShowHelp } from './css.helpers';\nimport type { SerializedComponentInfo } from './generateComponentData';\n\nconst showHelp = () => {\n print('');\n print(`${green('uds css')} - Generate CSS for app`);\n print('');\n print(`${magenta('Usage:')}`);\n print(` ${cyan('uds css')} [options]`);\n print(` ${cyan('uds css init')} [options]`);\n print('');\n print(`${magenta('Commands:')}`);\n print(` ${cyan('init')} Create a new uds.theme.ts file`);\n print('');\n print(`${magenta('Options:')}`);\n print(` ${cyan('--entry <path>')} Entry directory to scan (default: /src/)`);\n print(` ${cyan('--outFile <path>')} Output CSS file (default: dist/uds.css)`);\n print(` ${cyan('--config <path>')} Path to uds.config.ts for tokens`);\n print(` ${cyan('--theme <path>')} Path to uds.theme.ts (default: uds.theme.ts)`);\n print(` ${cyan('--watch, -w')} Watch for file changes and regenerate`);\n print(` ${cyan('--silent, -s')} Suppress output logging`);\n print(` ${cyan('--force')} Overwrite existing uds.theme.ts (for init)`);\n print(` ${cyan('--help, -h')} Show this help message`);\n print('');\n print(`${magenta('Initialize theme config:')}`);\n print(` ${gray('uds css init')}`);\n print('');\n print(`${magenta('Simple mode')} (no uds.theme.ts):`);\n print(` ${gray('uds css --entry ./src --outFile dist/uds.css')}`);\n print('');\n print(`${magenta('Theme mode')} (with uds.theme.ts):`);\n print(` ${gray('uds css --theme uds.theme.ts --outFile dist/uds.css')}`);\n print('');\n print(`${magenta('Example uds.theme.ts:')}`);\n print(\n gray(` import { defineTheme } from '@yahoo/uds';\n\n export default defineTheme({\n config: './uds.config.ts',\n entry: './src',\n colorModes: ['dark'],\n css: {\n preflight: true,\n fontFaceDeclarations: true,\n enableSystemColorMode: false, // Auto dark mode via prefers-color-scheme\n disableOverrideTailwindTheme: true // Don't merge into Tailwind defaults\n }\n });`),\n );\n print('');\n};\n\ntype Context = {\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n};\n\nconst makeCSSCommand = (getContext: () => Promise<Context>): Command => ({\n name: 'css',\n description: 'Generate CSS for app',\n tag: 'hidden',\n\n run: async (props: Props) => {\n const { variants, autoVariants, componentData } = await getContext();\n\n if (shouldShowHelp(props.options)) {\n showHelp();\n return;\n }\n\n if (isInitCommand(props.first)) {\n await scaffoldThemeConfig(getCssInitOptions(props.options));\n return;\n }\n\n const cssRunOptions = getCssRunOptions(process.cwd(), props.options);\n\n await runCssCommand(cssRunOptions, { variants, autoVariants, componentData });\n },\n});\n\nexport { makeCSSCommand };\n"],"mappings":";;;;;;;AAQA,MAAM,iBAAiB;AACrB,OAAM,GAAG;AACT,OAAM,GAAG,MAAM,UAAU,CAAC,yBAAyB;AACnD,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,SAAS,GAAG;AAC7B,OAAM,KAAK,KAAK,UAAU,CAAC,YAAY;AACvC,OAAM,KAAK,KAAK,eAAe,CAAC,YAAY;AAC5C,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,YAAY,GAAG;AAChC,OAAM,KAAK,KAAK,OAAO,CAAC,8CAA8C;AACtE,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,WAAW,GAAG;AAC/B,OAAM,KAAK,KAAK,iBAAiB,CAAC,8CAA8C;AAChF,OAAM,KAAK,KAAK,mBAAmB,CAAC,2CAA2C;AAC/E,OAAM,KAAK,KAAK,kBAAkB,CAAC,qCAAqC;AACxE,OAAM,KAAK,KAAK,iBAAiB,CAAC,kDAAkD;AACpF,OAAM,KAAK,KAAK,cAAc,CAAC,8CAA8C;AAC7E,OAAM,KAAK,KAAK,eAAe,CAAC,+BAA+B;AAC/D,OAAM,KAAK,KAAK,UAAU,CAAC,uDAAuD;AAClF,OAAM,KAAK,KAAK,aAAa,CAAC,gCAAgC;AAC9D,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,2BAA2B,GAAG;AAC/C,OAAM,KAAK,KAAK,eAAe,GAAG;AAClC,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,cAAc,CAAC,qBAAqB;AACrD,OAAM,KAAK,KAAK,+CAA+C,GAAG;AAClE,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,aAAa,CAAC,uBAAuB;AACtD,OAAM,KAAK,KAAK,sDAAsD,GAAG;AACzE,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,wBAAwB,GAAG;AAC5C,OACE,KAAK;;;;;;;;;;;;OAYF,CACJ;AACD,OAAM,GAAG;;AASX,MAAM,kBAAkB,gBAAiD;CACvE,MAAM;CACN,aAAa;CACb,KAAK;CAEL,KAAK,OAAO,UAAiB;EAC3B,MAAM,EAAE,UAAU,cAAc,kBAAkB,MAAM,YAAY;AAEpE,MAAI,eAAe,MAAM,QAAQ,EAAE;AACjC,aAAU;AACV;;AAGF,MAAI,cAAc,MAAM,MAAM,EAAE;AAC9B,SAAM,oBAAoB,kBAAkB,MAAM,QAAQ,CAAC;AAC3D;;AAKF,QAAM,cAFgB,iBAAiB,QAAQ,KAAK,EAAE,MAAM,QAAQ,EAEjC;GAAE;GAAU;GAAc;GAAe,CAAC;;CAEhF"}
1
+ {"version":3,"file":"css.js","names":[],"sources":["../../src/commands/css.ts"],"sourcesContent":["import type { Command, Props } from '@yahoo/uds-cli/lib';\nimport { cyan, gray, green, magenta, print } from '@yahoo/uds-cli/lib';\n\nimport { scaffoldThemeConfig } from '../css/nodeUtils';\nimport { runCssCommand } from '../css/runner';\nimport { getCssInitOptions, getCssRunOptions, isInitCommand, shouldShowHelp } from './css.helpers';\nimport type { SerializedComponentInfo } from './generateComponentData';\n\nconst showHelp = () => {\n print('');\n print(`${green('uds css')} - Generate CSS for app`);\n print('');\n print(`${magenta('Usage:')}`);\n print(` ${cyan('uds css')} [options]`);\n print(` ${cyan('uds css init')} [options]`);\n print('');\n print(`${magenta('Commands:')}`);\n print(` ${cyan('init')} Create a new uds.theme.ts file`);\n print('');\n print(`${magenta('Options:')}`);\n print(` ${cyan('--entry <path>')} Entry directory to scan (default: /src/)`);\n print(` ${cyan('--outFile <path>')} Output CSS file (default: dist/uds.css)`);\n print(` ${cyan('--config <path>')} Path to uds.config.ts for tokens`);\n print(` ${cyan('--theme <path>')} Path to uds.theme.ts (default: uds.theme.ts)`);\n print(` ${cyan('--watch, -w')} Watch for file changes and regenerate`);\n print(` ${cyan('--silent, -s')} Suppress output logging`);\n print(` ${cyan('--force')} Overwrite existing uds.theme.ts (for init)`);\n print(` ${cyan('--help, -h')} Show this help message`);\n print('');\n print(`${magenta('Initialize theme config:')}`);\n print(` ${gray('uds css init')}`);\n print('');\n print(`${magenta('Simple mode')} (no uds.theme.ts):`);\n print(` ${gray('uds css --entry ./src --outFile dist/uds.css')}`);\n print('');\n print(`${magenta('Theme mode')} (with uds.theme.ts):`);\n print(` ${gray('uds css --theme uds.theme.ts --outFile dist/uds.css')}`);\n print('');\n print(`${magenta('Example uds.theme.ts:')}`);\n print(\n gray(` import { defineTheme } from '@yahoo/uds';\n\n export default defineTheme({\n config: './uds.config.ts',\n entry: './src',\n colorModes: ['dark'],\n css: {\n preflight: true,\n fontFaceDeclarations: true,\n enableSystemColorMode: false, // Auto dark mode via prefers-color-scheme\n disableOverrideTailwindTheme: true // Don't merge into Tailwind defaults\n }\n });`),\n );\n print('');\n};\n\ntype Context = {\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n};\n\nconst makeCSSCommand = (getContext: () => Promise<Context>): Command => ({\n name: 'css',\n description: 'Generate CSS for app',\n tag: 'hidden',\n\n run: async (props: Props) => {\n const { variants, autoVariants, componentData } = await getContext();\n\n if (shouldShowHelp(props.options)) {\n showHelp();\n return;\n }\n\n if (isInitCommand(props.first)) {\n await scaffoldThemeConfig(getCssInitOptions(props.options));\n return;\n }\n\n const cssRunOptions = getCssRunOptions(process.cwd(), props.options);\n\n await runCssCommand(cssRunOptions, { variants, autoVariants, componentData });\n },\n});\n\nexport { makeCSSCommand };\n"],"mappings":";;;;;;;;AAQA,MAAM,iBAAiB;AACrB,OAAM,GAAG;AACT,OAAM,GAAG,MAAM,UAAU,CAAC,yBAAyB;AACnD,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,SAAS,GAAG;AAC7B,OAAM,KAAK,KAAK,UAAU,CAAC,YAAY;AACvC,OAAM,KAAK,KAAK,eAAe,CAAC,YAAY;AAC5C,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,YAAY,GAAG;AAChC,OAAM,KAAK,KAAK,OAAO,CAAC,8CAA8C;AACtE,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,WAAW,GAAG;AAC/B,OAAM,KAAK,KAAK,iBAAiB,CAAC,8CAA8C;AAChF,OAAM,KAAK,KAAK,mBAAmB,CAAC,2CAA2C;AAC/E,OAAM,KAAK,KAAK,kBAAkB,CAAC,qCAAqC;AACxE,OAAM,KAAK,KAAK,iBAAiB,CAAC,kDAAkD;AACpF,OAAM,KAAK,KAAK,cAAc,CAAC,8CAA8C;AAC7E,OAAM,KAAK,KAAK,eAAe,CAAC,+BAA+B;AAC/D,OAAM,KAAK,KAAK,UAAU,CAAC,uDAAuD;AAClF,OAAM,KAAK,KAAK,aAAa,CAAC,gCAAgC;AAC9D,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,2BAA2B,GAAG;AAC/C,OAAM,KAAK,KAAK,eAAe,GAAG;AAClC,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,cAAc,CAAC,qBAAqB;AACrD,OAAM,KAAK,KAAK,+CAA+C,GAAG;AAClE,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,aAAa,CAAC,uBAAuB;AACtD,OAAM,KAAK,KAAK,sDAAsD,GAAG;AACzE,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,wBAAwB,GAAG;AAC5C,OACE,KAAK;;;;;;;;;;;;OAYF,CACJ;AACD,OAAM,GAAG;;AASX,MAAM,kBAAkB,gBAAiD;CACvE,MAAM;CACN,aAAa;CACb,KAAK;CAEL,KAAK,OAAO,UAAiB;EAC3B,MAAM,EAAE,UAAU,cAAc,kBAAkB,MAAM,YAAY;AAEpE,MAAI,eAAe,MAAM,QAAQ,EAAE;AACjC,aAAU;AACV;;AAGF,MAAI,cAAc,MAAM,MAAM,EAAE;AAC9B,SAAM,oBAAoB,kBAAkB,MAAM,QAAQ,CAAC;AAC3D;;AAKF,QAAM,cAFgB,iBAAiB,QAAQ,KAAK,EAAE,MAAM,QAAQ,EAEjC;GAAE;GAAU;GAAc;GAAe,CAAC;;CAEhF"}
@@ -1,7 +1,7 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
2
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
+ const require_print = require('../cli/dist/lib/print.cjs');
3
4
  const require_componentAnalyzer = require('../purger/optimized/utils/componentAnalyzer.cjs');
4
- let _yahoo_uds_cli_lib = require("@yahoo/uds-cli/lib");
5
5
  let node_fs = require("node:fs");
6
6
  let node_path = require("node:path");
7
7
 
@@ -20,9 +20,9 @@ const makeGenerateComponentDataCommand = (getContext) => ({
20
20
  tag: "hidden",
21
21
  run: async (_props) => {
22
22
  const { project, componentsDir, outputFile } = await getContext();
23
- (0, _yahoo_uds_cli_lib.print)("Scanning components in:", componentsDir);
23
+ require_print.print("Scanning components in:", componentsDir);
24
24
  const componentPaths = await require_componentAnalyzer.scanComponentFiles(componentsDir);
25
- (0, _yahoo_uds_cli_lib.print)(`Found ${componentPaths.size} components`);
25
+ require_print.print(`Found ${componentPaths.size} components`);
26
26
  const componentDataEntries = await Promise.all([...componentPaths].map(async ([name, filePath]) => {
27
27
  try {
28
28
  project.addSourceFileAtPath(filePath);
@@ -36,8 +36,8 @@ const makeGenerateComponentDataCommand = (getContext) => ({
36
36
  const componentData = Object.fromEntries(componentDataEntries.filter((entry) => Boolean(entry)));
37
37
  (0, node_fs.mkdirSync)((0, node_path.dirname)(outputFile), { recursive: true });
38
38
  (0, node_fs.writeFileSync)(outputFile, JSON.stringify(componentData, null, 2));
39
- (0, _yahoo_uds_cli_lib.print)(`Generated component data for ${Object.keys(componentData).length} components`);
40
- (0, _yahoo_uds_cli_lib.print)(`Output written to: ${outputFile}`);
39
+ require_print.print(`Generated component data for ${Object.keys(componentData).length} components`);
40
+ require_print.print(`Output written to: ${outputFile}`);
41
41
  const totals = Object.values(componentData).reduce((acc, comp) => ({
42
42
  totalDefaults: acc.totalDefaults + Object.keys(comp.defaultProps).length,
43
43
  totalLiterals: acc.totalLiterals + Object.keys(comp.getStylesLiterals).length,
@@ -47,10 +47,10 @@ const makeGenerateComponentDataCommand = (getContext) => ({
47
47
  totalLiterals: 0,
48
48
  totalInternalComponents: 0
49
49
  });
50
- (0, _yahoo_uds_cli_lib.print)("\nStats:");
51
- (0, _yahoo_uds_cli_lib.print)(` Default props: ${totals.totalDefaults}`);
52
- (0, _yahoo_uds_cli_lib.print)(` getStyles literals: ${totals.totalLiterals}`);
53
- (0, _yahoo_uds_cli_lib.print)(` Internal component refs: ${totals.totalInternalComponents}`);
50
+ require_print.print("\nStats:");
51
+ require_print.print(` Default props: ${totals.totalDefaults}`);
52
+ require_print.print(` getStyles literals: ${totals.totalLiterals}`);
53
+ require_print.print(` Internal component refs: ${totals.totalInternalComponents}`);
54
54
  }
55
55
  });
56
56
  const serializeComponentInfo = (info) => ({
@@ -1,6 +1,6 @@
1
1
 
2
- import { Command } from "@yahoo/uds-cli/lib";
3
2
  import { Project } from "ts-morph";
3
+ import { Command } from "@yahoo/uds-cli/lib";
4
4
 
5
5
  //#region src/commands/generateComponentData.d.ts
6
6
  interface SerializedComponentInfo {
@@ -1,6 +1,6 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
+ import { print } from "../cli/dist/lib/print.js";
2
3
  import { analyzeComponent, scanComponentFiles } from "../purger/optimized/utils/componentAnalyzer.js";
3
- import { print } from "@yahoo/uds-cli/lib";
4
4
  import { mkdirSync, writeFileSync } from "node:fs";
5
5
  import { dirname } from "node:path";
6
6
 
@@ -1,7 +1,8 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
2
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
+ const require_colors = require('../cli/dist/lib/colors.cjs');
4
+ const require_print = require('../cli/dist/lib/print.cjs');
3
5
  const require_generatePurgeCSSData = require('../utils/generatePurgeCSSData.cjs');
4
- let _yahoo_uds_cli_lib = require("@yahoo/uds-cli/lib");
5
6
  let node_path = require("node:path");
6
7
  node_path = require_runtime.__toESM(node_path);
7
8
 
@@ -37,7 +38,7 @@ export const componentToTwClasses: ComponentToTwClasses = ${JSON.stringify(compo
37
38
  export const componentsDependencies: ComponentDependencies = ${JSON.stringify(componentsDependencies)};
38
39
  `;
39
40
  await Bun.write(outputFilePath, fileContent);
40
- (0, _yahoo_uds_cli_lib.print)((0, _yahoo_uds_cli_lib.green)(`✅ Purge CSS Data saved ${outputFilePath}`));
41
+ require_print.print(require_colors.green(`✅ Purge CSS Data saved ${outputFilePath}`));
41
42
  }
42
43
  });
43
44
 
@@ -1,6 +1,6 @@
1
1
 
2
- import { Command } from "@yahoo/uds-cli/lib";
3
2
  import { Project } from "ts-morph";
3
+ import { Command } from "@yahoo/uds-cli/lib";
4
4
 
5
5
  //#region src/commands/generatePurgeCSSData.d.ts
6
6
  type Context = {
@@ -1,6 +1,7 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
+ import { green } from "../cli/dist/lib/colors.js";
3
+ import { print } from "../cli/dist/lib/print.js";
2
4
  import { addAutoVariantsToComponentClasses, convertVariantsIntoTailwindClass, getComponentsDependencies, getComponentsProps, getExportedComponents, getExportsToFilePath, getTwClassesInComponent } from "../utils/generatePurgeCSSData.js";
3
- import { green, print } from "@yahoo/uds-cli/lib";
4
5
  import path from "node:path";
5
6
 
6
7
  //#region src/commands/generatePurgeCSSData.ts
@@ -1 +1 @@
1
- {"version":3,"file":"generatePurgeCSSData.js","names":[],"sources":["../../src/commands/generatePurgeCSSData.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { Command, Props } from '@yahoo/uds-cli/lib';\nimport { green, print } from '@yahoo/uds-cli/lib';\nimport type { Project } from 'ts-morph';\n\nimport {\n addAutoVariantsToComponentClasses,\n convertVariantsIntoTailwindClass,\n getComponentsDependencies,\n getComponentsProps,\n getExportedComponents,\n getExportsToFilePath,\n getTwClassesInComponent,\n} from '../utils/generatePurgeCSSData';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface GeneratePurgeCSSDataProps extends Props {\n // options: PurgeOptions;\n}\n\ntype Context = {\n project: Project;\n\n variants: Record<string, Record<string, string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UDS: Record<string, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UDS_EXPERIMENTAL: Record<string, any>;\n};\n\nexport const makeGeneratePurgeCSSDataCommand = (getContext: () => Promise<Context>): Command => ({\n name: 'generatePurgeCSSData',\n description: `Generates purge CSS data for UDS components. This is an internal command used to generate the data needed to purge unused CSS in UDS. It should not be used directly by users.`,\n tag: 'hidden',\n\n run: async (_props: GeneratePurgeCSSDataProps) => {\n const { project, variants, UDS, UDS_EXPERIMENTAL } = await getContext();\n\n // 1. Get all the exported components form UDS as a list\n const exportedComponents = getExportedComponents(UDS, UDS_EXPERIMENTAL);\n const exportsToFilePath = getExportsToFilePath(project);\n // 2. Convert the CVA variants list into something we can easily work with\n const variantsList = convertVariantsIntoTailwindClass(variants);\n // 3. Get the styling props for each component\n const componentToVariants = getComponentsProps(\n project,\n exportedComponents,\n variants,\n variantsList,\n exportsToFilePath,\n );\n // 4. Get components dependencies\n const componentsDependencies = getComponentsDependencies(\n project,\n exportedComponents,\n exportsToFilePath,\n );\n // 5. Get the inline TW classes per component\n let componentToTwClasses = await getTwClassesInComponent(exportedComponents, exportsToFilePath);\n // 6. Add auto variants to component classes\n // NOTE: this is temporary while we work on a proper solution to purge the YOS components\n componentToTwClasses = addAutoVariantsToComponentClasses(componentToTwClasses);\n // 7. Save everything under UDS\n const outputFilePath = path.resolve(process.cwd(), './generated/tailwindPurge.ts');\n const fileContent = `\n//! This file is generated by \\`uds purge\\` from @yahoo/uds\n//! Do not edit directly\n//! If there is issue with this file please report to #ask-uds\n\nexport type PropToUsedOptions = [string, string[]];\nexport type ComponentToVariants = { [key: string]: PropToUsedOptions[] };\nexport type VariantsList = string[];\nexport type ComponentDependencies = { [key: string]: string[] };\nexport type ComponentToTwClasses = { [key: string]: string };\n\nexport const variantsList: VariantsList = ${JSON.stringify(variantsList)};\nexport const componentToVariants: ComponentToVariants = ${JSON.stringify(componentToVariants)};\nexport const componentToTwClasses: ComponentToTwClasses = ${JSON.stringify(componentToTwClasses)};\nexport const componentsDependencies: ComponentDependencies = ${JSON.stringify(componentsDependencies)};\n`;\n\n await Bun.write(outputFilePath, fileContent);\n\n print(green(`✅ Purge CSS Data saved ${outputFilePath}`));\n },\n});\n"],"mappings":";;;;;;AA+BA,MAAa,mCAAmC,gBAAiD;CAC/F,MAAM;CACN,aAAa;CACb,KAAK;CAEL,KAAK,OAAO,WAAsC;EAChD,MAAM,EAAE,SAAS,UAAU,KAAK,qBAAqB,MAAM,YAAY;EAGvE,MAAM,qBAAqB,sBAAsB,KAAK,iBAAiB;EACvE,MAAM,oBAAoB,qBAAqB,QAAQ;EAEvD,MAAM,eAAe,iCAAiC,SAAS;EAE/D,MAAM,sBAAsB,mBAC1B,SACA,oBACA,UACA,cACA,kBACD;EAED,MAAM,yBAAyB,0BAC7B,SACA,oBACA,kBACD;EAED,IAAI,uBAAuB,MAAM,wBAAwB,oBAAoB,kBAAkB;AAG/F,yBAAuB,kCAAkC,qBAAqB;EAE9E,MAAM,iBAAiB,KAAK,QAAQ,QAAQ,KAAK,EAAE,+BAA+B;EAClF,MAAM,cAAc;;;;;;;;;;;4CAWoB,KAAK,UAAU,aAAa,CAAC;0DACf,KAAK,UAAU,oBAAoB,CAAC;4DAClC,KAAK,UAAU,qBAAqB,CAAC;+DAClC,KAAK,UAAU,uBAAuB,CAAC;;AAGlG,QAAM,IAAI,MAAM,gBAAgB,YAAY;AAE5C,QAAM,MAAM,0BAA0B,iBAAiB,CAAC;;CAE3D"}
1
+ {"version":3,"file":"generatePurgeCSSData.js","names":[],"sources":["../../src/commands/generatePurgeCSSData.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { Command, Props } from '@yahoo/uds-cli/lib';\nimport { green, print } from '@yahoo/uds-cli/lib';\nimport type { Project } from 'ts-morph';\n\nimport {\n addAutoVariantsToComponentClasses,\n convertVariantsIntoTailwindClass,\n getComponentsDependencies,\n getComponentsProps,\n getExportedComponents,\n getExportsToFilePath,\n getTwClassesInComponent,\n} from '../utils/generatePurgeCSSData';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface GeneratePurgeCSSDataProps extends Props {\n // options: PurgeOptions;\n}\n\ntype Context = {\n project: Project;\n\n variants: Record<string, Record<string, string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UDS: Record<string, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n UDS_EXPERIMENTAL: Record<string, any>;\n};\n\nexport const makeGeneratePurgeCSSDataCommand = (getContext: () => Promise<Context>): Command => ({\n name: 'generatePurgeCSSData',\n description: `Generates purge CSS data for UDS components. This is an internal command used to generate the data needed to purge unused CSS in UDS. It should not be used directly by users.`,\n tag: 'hidden',\n\n run: async (_props: GeneratePurgeCSSDataProps) => {\n const { project, variants, UDS, UDS_EXPERIMENTAL } = await getContext();\n\n // 1. Get all the exported components form UDS as a list\n const exportedComponents = getExportedComponents(UDS, UDS_EXPERIMENTAL);\n const exportsToFilePath = getExportsToFilePath(project);\n // 2. Convert the CVA variants list into something we can easily work with\n const variantsList = convertVariantsIntoTailwindClass(variants);\n // 3. Get the styling props for each component\n const componentToVariants = getComponentsProps(\n project,\n exportedComponents,\n variants,\n variantsList,\n exportsToFilePath,\n );\n // 4. Get components dependencies\n const componentsDependencies = getComponentsDependencies(\n project,\n exportedComponents,\n exportsToFilePath,\n );\n // 5. Get the inline TW classes per component\n let componentToTwClasses = await getTwClassesInComponent(exportedComponents, exportsToFilePath);\n // 6. Add auto variants to component classes\n // NOTE: this is temporary while we work on a proper solution to purge the YOS components\n componentToTwClasses = addAutoVariantsToComponentClasses(componentToTwClasses);\n // 7. Save everything under UDS\n const outputFilePath = path.resolve(process.cwd(), './generated/tailwindPurge.ts');\n const fileContent = `\n//! This file is generated by \\`uds purge\\` from @yahoo/uds\n//! Do not edit directly\n//! If there is issue with this file please report to #ask-uds\n\nexport type PropToUsedOptions = [string, string[]];\nexport type ComponentToVariants = { [key: string]: PropToUsedOptions[] };\nexport type VariantsList = string[];\nexport type ComponentDependencies = { [key: string]: string[] };\nexport type ComponentToTwClasses = { [key: string]: string };\n\nexport const variantsList: VariantsList = ${JSON.stringify(variantsList)};\nexport const componentToVariants: ComponentToVariants = ${JSON.stringify(componentToVariants)};\nexport const componentToTwClasses: ComponentToTwClasses = ${JSON.stringify(componentToTwClasses)};\nexport const componentsDependencies: ComponentDependencies = ${JSON.stringify(componentsDependencies)};\n`;\n\n await Bun.write(outputFilePath, fileContent);\n\n print(green(`✅ Purge CSS Data saved ${outputFilePath}`));\n },\n});\n"],"mappings":";;;;;;;AA+BA,MAAa,mCAAmC,gBAAiD;CAC/F,MAAM;CACN,aAAa;CACb,KAAK;CAEL,KAAK,OAAO,WAAsC;EAChD,MAAM,EAAE,SAAS,UAAU,KAAK,qBAAqB,MAAM,YAAY;EAGvE,MAAM,qBAAqB,sBAAsB,KAAK,iBAAiB;EACvE,MAAM,oBAAoB,qBAAqB,QAAQ;EAEvD,MAAM,eAAe,iCAAiC,SAAS;EAE/D,MAAM,sBAAsB,mBAC1B,SACA,oBACA,UACA,cACA,kBACD;EAED,MAAM,yBAAyB,0BAC7B,SACA,oBACA,kBACD;EAED,IAAI,uBAAuB,MAAM,wBAAwB,oBAAoB,kBAAkB;AAG/F,yBAAuB,kCAAkC,qBAAqB;EAE9E,MAAM,iBAAiB,KAAK,QAAQ,QAAQ,KAAK,EAAE,+BAA+B;EAClF,MAAM,cAAc;;;;;;;;;;;4CAWoB,KAAK,UAAU,aAAa,CAAC;0DACf,KAAK,UAAU,oBAAoB,CAAC;4DAClC,KAAK,UAAU,qBAAqB,CAAC;+DAClC,KAAK,UAAU,uBAAuB,CAAC;;AAGlG,QAAM,IAAI,MAAM,gBAAgB,YAAY;AAE5C,QAAM,MAAM,0BAA0B,iBAAiB,CAAC;;CAE3D"}
@@ -1,8 +1,8 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+ const require_print = require('../cli/dist/lib/print.cjs');
3
+ const require_spinner = require('../cli/dist/lib/spinner.cjs');
3
4
  const require_purge = require('../purger/optimized/purge.cjs');
4
5
  const require_purgeCSS = require('../purger/legacy/purgeCSS.cjs');
5
- let _yahoo_uds_cli_lib = require("@yahoo/uds-cli/lib");
6
6
 
7
7
  //#region src/commands/purge.ts
8
8
  const makePurgeCommand = (getContext) => ({
@@ -13,7 +13,7 @@ const makePurgeCommand = (getContext) => ({
13
13
  const useOptimized = optimized === "true" || optimized === true;
14
14
  const { variants, autoVariants, packageJson, generatedPurgeCssData, componentData } = await getContext();
15
15
  if (useOptimized) {
16
- (0, _yahoo_uds_cli_lib.spinStart)("Purging CSS with optimized purger...");
16
+ require_spinner.spinStart("Purging CSS with optimized purger...");
17
17
  try {
18
18
  const result = await require_purge.purgeOptimized({
19
19
  entry: typeof entry === "string" || Array.isArray(entry) ? entry : void 0,
@@ -22,29 +22,29 @@ const makePurgeCommand = (getContext) => ({
22
22
  autoVariants,
23
23
  componentData
24
24
  });
25
- (0, _yahoo_uds_cli_lib.spinStop)("✅", `Purging done (optimized)! Generated ${result.stats.classesGenerated} classes in ${result.stats.timeMs}ms`);
26
- (0, _yahoo_uds_cli_lib.print)(` Files scanned: ${result.stats.filesScanned}`);
27
- (0, _yahoo_uds_cli_lib.print)(` Spreads traced: ${result.stats.spreadsTraced}`);
28
- (0, _yahoo_uds_cli_lib.print)(` Expressions resolved: ${result.stats.expressionsResolved}`);
25
+ require_spinner.spinStop("✅", `Purging done (optimized)! Generated ${result.stats.classesGenerated} classes in ${result.stats.timeMs}ms`);
26
+ require_print.print(` Files scanned: ${result.stats.filesScanned}`);
27
+ require_print.print(` Spreads traced: ${result.stats.spreadsTraced}`);
28
+ require_print.print(` Expressions resolved: ${result.stats.expressionsResolved}`);
29
29
  return;
30
30
  } catch (error) {
31
- if (error instanceof Error) (0, _yahoo_uds_cli_lib.spinStop)("❌", error.message);
32
- else (0, _yahoo_uds_cli_lib.spinStop)("❌", "Purging css failed! Please reach out to #uds-ask channel for support.");
31
+ if (error instanceof Error) require_spinner.spinStop("❌", error.message);
32
+ else require_spinner.spinStop("❌", "Purging css failed! Please reach out to #uds-ask channel for support.");
33
33
  process.exitCode = 1;
34
34
  }
35
35
  } else {
36
- (0, _yahoo_uds_cli_lib.spinStart)("Purging css started...");
36
+ require_spinner.spinStart("Purging css started...");
37
37
  try {
38
38
  await require_purgeCSS.purge(variants, packageJson, generatedPurgeCssData, {
39
39
  config: typeof config === "string" ? config : void 0,
40
40
  entry: typeof entry === "string" || Array.isArray(entry) ? entry : void 0,
41
41
  output: typeof output === "string" ? output : void 0
42
42
  });
43
- (0, _yahoo_uds_cli_lib.spinStop)("✅", "Purging css done!");
43
+ require_spinner.spinStop("✅", "Purging css done!");
44
44
  return;
45
45
  } catch (error) {
46
- if (error instanceof Error) (0, _yahoo_uds_cli_lib.spinStop)("❌", error.message);
47
- else (0, _yahoo_uds_cli_lib.spinStop)("❌", "Purging css failed! Please reach out to #uds-ask channel for support.");
46
+ if (error instanceof Error) require_spinner.spinStop("❌", error.message);
47
+ else require_spinner.spinStop("❌", "Purging css failed! Please reach out to #uds-ask channel for support.");
48
48
  process.exitCode = 1;
49
49
  }
50
50
  }
@@ -1,7 +1,8 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
+ import { print } from "../cli/dist/lib/print.js";
3
+ import { spinStart, spinStop } from "../cli/dist/lib/spinner.js";
2
4
  import { purgeOptimized } from "../purger/optimized/purge.js";
3
5
  import { purge } from "../purger/legacy/purgeCSS.js";
4
- import { print, spinStart, spinStop } from "@yahoo/uds-cli/lib";
5
6
 
6
7
  //#region src/commands/purge.ts
7
8
  const makePurgeCommand = (getContext) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"purge.js","names":[],"sources":["../../src/commands/purge.ts"],"sourcesContent":["import type { Command, Props } from '@yahoo/uds-cli/lib';\nimport { print, spinStart, spinStop } from '@yahoo/uds-cli/lib';\n\nimport type { GeneratedPurgeCSSData, PurgeOptions } from '../purger/legacy/purgeCSS';\nimport { purge } from '../purger/legacy/purgeCSS';\nimport { purgeOptimized } from '../purger/optimized';\nimport type { SerializedComponentInfo } from './generateComponentData';\n\ntype Context = {\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n packageJson: Record<string, any>;\n generatedPurgeCssData: GeneratedPurgeCSSData;\n};\n\nexport const makePurgeCommand = (getContext: () => Promise<Context>): Command => ({\n name: 'purge',\n description: `Purge unused CSS`,\n\n run: async (props: Props) => {\n const { entry, output, optimized, config } = props.options as Props['options'] & PurgeOptions;\n const useOptimized = optimized === 'true' || optimized === true;\n\n const { variants, autoVariants, packageJson, generatedPurgeCssData, componentData } =\n await getContext();\n\n if (useOptimized) {\n spinStart('Purging CSS with optimized purger...');\n try {\n const result = await purgeOptimized({\n entry: typeof entry === 'string' || Array.isArray(entry) ? entry : undefined,\n output: typeof output === 'string' ? output : undefined,\n variants,\n autoVariants,\n componentData,\n });\n\n spinStop(\n '✅',\n `Purging done (optimized)! Generated ${result.stats.classesGenerated} classes in ${result.stats.timeMs}ms`,\n );\n print(` Files scanned: ${result.stats.filesScanned}`);\n print(` Spreads traced: ${result.stats.spreadsTraced}`);\n print(` Expressions resolved: ${result.stats.expressionsResolved}`);\n // await trackEvent('purge', { optimized: true });\n return;\n } catch (error) {\n if (error instanceof Error) {\n spinStop('❌', error.message);\n } else {\n spinStop('❌', 'Purging css failed! Please reach out to #uds-ask channel for support.');\n }\n process.exitCode = 1;\n }\n } else {\n spinStart('Purging css started...');\n try {\n await purge(variants, packageJson, generatedPurgeCssData, {\n config: typeof config === 'string' ? config : undefined,\n entry: typeof entry === 'string' || Array.isArray(entry) ? entry : undefined,\n output: typeof output === 'string' ? output : undefined,\n });\n spinStop('✅', 'Purging css done!');\n // await trackEvent('purge');\n return;\n } catch (error) {\n if (error instanceof Error) {\n spinStop('❌', error.message);\n } else {\n spinStop('❌', 'Purging css failed! Please reach out to #uds-ask channel for support.');\n }\n process.exitCode = 1;\n }\n }\n },\n});\n"],"mappings":";;;;;;AAiBA,MAAa,oBAAoB,gBAAiD;CAChF,MAAM;CACN,aAAa;CAEb,KAAK,OAAO,UAAiB;EAC3B,MAAM,EAAE,OAAO,QAAQ,WAAW,WAAW,MAAM;EACnD,MAAM,eAAe,cAAc,UAAU,cAAc;EAE3D,MAAM,EAAE,UAAU,cAAc,aAAa,uBAAuB,kBAClE,MAAM,YAAY;AAEpB,MAAI,cAAc;AAChB,aAAU,uCAAuC;AACjD,OAAI;IACF,MAAM,SAAS,MAAM,eAAe;KAClC,OAAO,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,GAAG,QAAQ;KACnE,QAAQ,OAAO,WAAW,WAAW,SAAS;KAC9C;KACA;KACA;KACD,CAAC;AAEF,aACE,KACA,uCAAuC,OAAO,MAAM,iBAAiB,cAAc,OAAO,MAAM,OAAO,IACxG;AACD,UAAM,qBAAqB,OAAO,MAAM,eAAe;AACvD,UAAM,sBAAsB,OAAO,MAAM,gBAAgB;AACzD,UAAM,4BAA4B,OAAO,MAAM,sBAAsB;AAErE;YACO,OAAO;AACd,QAAI,iBAAiB,MACnB,UAAS,KAAK,MAAM,QAAQ;QAE5B,UAAS,KAAK,wEAAwE;AAExF,YAAQ,WAAW;;SAEhB;AACL,aAAU,yBAAyB;AACnC,OAAI;AACF,UAAM,MAAM,UAAU,aAAa,uBAAuB;KACxD,QAAQ,OAAO,WAAW,WAAW,SAAS;KAC9C,OAAO,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,GAAG,QAAQ;KACnE,QAAQ,OAAO,WAAW,WAAW,SAAS;KAC/C,CAAC;AACF,aAAS,KAAK,oBAAoB;AAElC;YACO,OAAO;AACd,QAAI,iBAAiB,MACnB,UAAS,KAAK,MAAM,QAAQ;QAE5B,UAAS,KAAK,wEAAwE;AAExF,YAAQ,WAAW;;;;CAI1B"}
1
+ {"version":3,"file":"purge.js","names":[],"sources":["../../src/commands/purge.ts"],"sourcesContent":["import type { Command, Props } from '@yahoo/uds-cli/lib';\nimport { print, spinStart, spinStop } from '@yahoo/uds-cli/lib';\n\nimport type { GeneratedPurgeCSSData, PurgeOptions } from '../purger/legacy/purgeCSS';\nimport { purge } from '../purger/legacy/purgeCSS';\nimport { purgeOptimized } from '../purger/optimized';\nimport type { SerializedComponentInfo } from './generateComponentData';\n\ntype Context = {\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n packageJson: Record<string, any>;\n generatedPurgeCssData: GeneratedPurgeCSSData;\n};\n\nexport const makePurgeCommand = (getContext: () => Promise<Context>): Command => ({\n name: 'purge',\n description: `Purge unused CSS`,\n\n run: async (props: Props) => {\n const { entry, output, optimized, config } = props.options as Props['options'] & PurgeOptions;\n const useOptimized = optimized === 'true' || optimized === true;\n\n const { variants, autoVariants, packageJson, generatedPurgeCssData, componentData } =\n await getContext();\n\n if (useOptimized) {\n spinStart('Purging CSS with optimized purger...');\n try {\n const result = await purgeOptimized({\n entry: typeof entry === 'string' || Array.isArray(entry) ? entry : undefined,\n output: typeof output === 'string' ? output : undefined,\n variants,\n autoVariants,\n componentData,\n });\n\n spinStop(\n '✅',\n `Purging done (optimized)! Generated ${result.stats.classesGenerated} classes in ${result.stats.timeMs}ms`,\n );\n print(` Files scanned: ${result.stats.filesScanned}`);\n print(` Spreads traced: ${result.stats.spreadsTraced}`);\n print(` Expressions resolved: ${result.stats.expressionsResolved}`);\n // await trackEvent('purge', { optimized: true });\n return;\n } catch (error) {\n if (error instanceof Error) {\n spinStop('❌', error.message);\n } else {\n spinStop('❌', 'Purging css failed! Please reach out to #uds-ask channel for support.');\n }\n process.exitCode = 1;\n }\n } else {\n spinStart('Purging css started...');\n try {\n await purge(variants, packageJson, generatedPurgeCssData, {\n config: typeof config === 'string' ? config : undefined,\n entry: typeof entry === 'string' || Array.isArray(entry) ? entry : undefined,\n output: typeof output === 'string' ? output : undefined,\n });\n spinStop('✅', 'Purging css done!');\n // await trackEvent('purge');\n return;\n } catch (error) {\n if (error instanceof Error) {\n spinStop('❌', error.message);\n } else {\n spinStop('❌', 'Purging css failed! Please reach out to #uds-ask channel for support.');\n }\n process.exitCode = 1;\n }\n }\n },\n});\n"],"mappings":";;;;;;;AAiBA,MAAa,oBAAoB,gBAAiD;CAChF,MAAM;CACN,aAAa;CAEb,KAAK,OAAO,UAAiB;EAC3B,MAAM,EAAE,OAAO,QAAQ,WAAW,WAAW,MAAM;EACnD,MAAM,eAAe,cAAc,UAAU,cAAc;EAE3D,MAAM,EAAE,UAAU,cAAc,aAAa,uBAAuB,kBAClE,MAAM,YAAY;AAEpB,MAAI,cAAc;AAChB,aAAU,uCAAuC;AACjD,OAAI;IACF,MAAM,SAAS,MAAM,eAAe;KAClC,OAAO,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,GAAG,QAAQ;KACnE,QAAQ,OAAO,WAAW,WAAW,SAAS;KAC9C;KACA;KACA;KACD,CAAC;AAEF,aACE,KACA,uCAAuC,OAAO,MAAM,iBAAiB,cAAc,OAAO,MAAM,OAAO,IACxG;AACD,UAAM,qBAAqB,OAAO,MAAM,eAAe;AACvD,UAAM,sBAAsB,OAAO,MAAM,gBAAgB;AACzD,UAAM,4BAA4B,OAAO,MAAM,sBAAsB;AAErE;YACO,OAAO;AACd,QAAI,iBAAiB,MACnB,UAAS,KAAK,MAAM,QAAQ;QAE5B,UAAS,KAAK,wEAAwE;AAExF,YAAQ,WAAW;;SAEhB;AACL,aAAU,yBAAyB;AACnC,OAAI;AACF,UAAM,MAAM,UAAU,aAAa,uBAAuB;KACxD,QAAQ,OAAO,WAAW,WAAW,SAAS;KAC9C,OAAO,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,GAAG,QAAQ;KACnE,QAAQ,OAAO,WAAW,WAAW,SAAS;KAC/C,CAAC;AACF,aAAS,KAAK,oBAAoB;AAElC;YACO,OAAO;AACd,QAAI,iBAAiB,MACnB,UAAS,KAAK,MAAM,QAAQ;QAE5B,UAAS,KAAK,wEAAwE;AAExF,YAAQ,WAAW;;;;CAI1B"}
@@ -1,11 +1,13 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
2
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
+ const require_colors = require('../cli/dist/lib/colors.cjs');
4
+ const require_print = require('../cli/dist/lib/print.cjs');
5
+ const require_spinner = require('../cli/dist/lib/spinner.cjs');
3
6
  const require_entryPoints = require('../utils/entryPoints.cjs');
4
7
  const require_nodeUtils = require('./nodeUtils.cjs');
5
8
  const require_safelist = require('../purger/optimized/utils/safelist.cjs');
6
9
  const require_utils = require('./utils.cjs');
7
10
  const require_generate_helpers = require('./generate.helpers.cjs');
8
- let _yahoo_uds_cli_lib = require("@yahoo/uds-cli/lib");
9
11
  let node_fs = require("node:fs");
10
12
  node_fs = require_runtime.__toESM(node_fs);
11
13
  let node_path = require("node:path");
@@ -80,7 +82,7 @@ const generateSimpleModeCSS = async (options) => {
80
82
  if (options.configPath) {
81
83
  const loadedConfig = await require_nodeUtils.loadConfigFile(options.configPath);
82
84
  if (loadedConfig) tokensConfig = loadedConfig;
83
- else if (shouldLogStats) (0, _yahoo_uds_cli_lib.spinStop)("⚠️", `Config file not found: ${options.configPath}, using defaults`);
85
+ else if (shouldLogStats) require_spinner.spinStop("⚠️", `Config file not found: ${options.configPath}, using defaults`);
84
86
  }
85
87
  const variantDefaults = require_utils.extractVariantDefaults(tokensConfig);
86
88
  const resolvedEntries = require_entryPoints.resolveEntryPaths(options.entry, options.workspaceDir);
@@ -109,10 +111,10 @@ const generateSimpleModeCSS = async (options) => {
109
111
  duration,
110
112
  scope: options.scope,
111
113
  optimizationStats: cssResult.optimizationStats,
112
- print: _yahoo_uds_cli_lib.print,
113
- magenta: _yahoo_uds_cli_lib.magenta,
114
- cyan: _yahoo_uds_cli_lib.cyan,
115
- yellow: _yahoo_uds_cli_lib.yellow
114
+ print: require_print.print,
115
+ magenta: require_colors.magenta,
116
+ cyan: require_colors.cyan,
117
+ yellow: require_colors.yellow
116
118
  });
117
119
  return {
118
120
  success: true,
@@ -1,10 +1,12 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
+ import { cyan, magenta, yellow } from "../cli/dist/lib/colors.js";
3
+ import { print } from "../cli/dist/lib/print.js";
4
+ import { spinStop } from "../cli/dist/lib/spinner.js";
2
5
  import { resolveEntryPaths } from "../utils/entryPoints.js";
3
6
  import { loadConfigFile, scanDirectoriesForSafelist } from "./nodeUtils.js";
4
7
  import { deduplicateSafelist, getThemeAndScaleClasses } from "../purger/optimized/utils/safelist.js";
5
8
  import { extractVariantDefaults, getConfigurableCssVariables, getMotionVarPrefixes } from "./utils.js";
6
9
  import { applyScopedColorModeFix, buildPostcssPlugins, createTailwindPlugin, getCssFeatureFlags, optimizeGeneratedCss, printSimpleModeStats } from "./generate.helpers.js";
7
- import { cyan, magenta, print, spinStop, yellow } from "@yahoo/uds-cli/lib";
8
10
  import fs from "node:fs";
9
11
  import path from "node:path";
10
12
  import { defaultTokensConfig } from "@yahoo/uds-config";
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","names":[],"sources":["../../src/css/generate.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { gzipSync } from 'node:zlib';\n\nimport { cyan, magenta, print, spinStop, yellow } from '@yahoo/uds-cli/lib';\nimport type { UniversalTokensConfig } from '@yahoo/uds-config';\nimport { defaultTokensConfig } from '@yahoo/uds-config';\nimport postcss from 'postcss';\nimport type { SafelistConfig } from 'tailwindcss/types/config';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport { deduplicateSafelist, getThemeAndScaleClasses } from '../purger/optimized';\nimport type { EntryValue } from '../utils/entryPoints';\nimport { resolveEntryPaths } from '../utils/entryPoints';\nimport {\n applyScopedColorModeFix,\n buildPostcssPlugins,\n createTailwindPlugin,\n getCssFeatureFlags,\n optimizeGeneratedCss,\n printSimpleModeStats,\n} from './generate.helpers';\nimport { loadConfigFile, scanDirectoriesForSafelist } from './nodeUtils';\nimport type { UDSCSSOptimizationOptions, UDSCSSVarSafelistPattern } from './theme';\nimport { extractVariantDefaults, getConfigurableCssVariables, getMotionVarPrefixes } from './utils';\n\n/**\n * Result from generating CSS\n */\ninterface CSSResult {\n css: string;\n sizeBytes: number;\n sizeGzipBytes: number;\n classCount: number;\n optimizationStats?: {\n originalSize: number;\n originalSizeGzip: number;\n fontFacesRemoved: number;\n emptyRulesRemoved: number;\n validationErrors: string[];\n };\n}\n\n/**\n * CSS generation options for uds.theme.ts\n */\ninterface UDSCSSOptions {\n /** CSS scope wrapper class (optional) */\n scope?: string;\n /** Safelist of CSS classes to always include */\n safelist?: SafelistConfig[];\n /** CSS optimization settings */\n optimization?: UDSCSSOptimizationOptions;\n /** Include Tailwind preflight/reset styles (default: true) */\n preflight?: boolean;\n /** Include @font-face declarations (default: true) */\n fontFaceDeclarations?: boolean;\n /** Debounce delay (ms) for watch mode regenerations */\n watchDebounce?: number;\n}\n\n/**\n * Options for generateCSS function\n */\ninterface GenerateCSSOptions {\n /** CSS scope wrapper class */\n scope?: string;\n /** Directory to scan for arbitrary Tailwind classes (className props) */\n contentDir?: string | string[];\n /** CSS generation options from theme config */\n cssOptions?: UDSCSSOptions;\n /** Reference CSS to deduplicate font-faces against (for scoped CSS) */\n referenceCss?: string;\n /** CSS variable prefixes or patterns to preserve during pruning */\n safeVarPrefixes?: UDSCSSVarSafelistPattern[];\n}\n\nconst normalizeScope = (scope?: string): string | undefined => {\n const trimmedScope = scope?.trim();\n return trimmedScope ? trimmedScope : undefined;\n};\n\nconst getArbitrarySafelistRawContent = (safelist: SafelistConfig[]): string[] => {\n const arbitraryClasses = safelist.filter(\n (entry): entry is string => typeof entry === 'string' && entry.includes('['),\n );\n\n if (arbitraryClasses.length === 0) {\n return [];\n }\n\n return [`<div class=\"${arbitraryClasses.join(' ')}\"></div>`];\n};\n\n/**\n * Generate CSS from a safelist using Tailwind + PostCSS\n * @param safelist - UDS component classes to include\n * @param config - Token configuration\n * @param options - Additional options\n */\nconst generateCSS = async (\n safelist: SafelistConfig[],\n config: UniversalTokensConfig,\n options?: GenerateCSSOptions,\n): Promise<CSSResult> => {\n // Do we need base?\n const sourceCSS = '@tailwind base; @tailwind components; @tailwind utilities';\n\n const contentDir = options?.contentDir ?? path.join(process.cwd(), 'src');\n const cssFlags = getCssFeatureFlags(options?.cssOptions);\n const optimizationConfig = options?.cssOptions?.optimization;\n const scopeClass = normalizeScope(options?.scope) ?? normalizeScope(options?.cssOptions?.scope);\n const twPlugin = createTailwindPlugin({\n contentDir,\n rawContents: getArbitrarySafelistRawContent(safelist),\n safelist,\n config,\n enablePreflight: cssFlags.enablePreflight,\n enableFontFaceDeclarations: cssFlags.enableFontFaceDeclarations,\n });\n const plugins = buildPostcssPlugins({\n tailwindPlugin: twPlugin,\n shouldPruneVars: cssFlags.shouldPruneVars,\n safeVarPrefixes: options?.safeVarPrefixes ?? [],\n scopeClass,\n });\n\n const result = await postcss(plugins).process(sourceCSS, { from: undefined });\n let css = await applyScopedColorModeFix(result.css, scopeClass);\n const optimizedCss = await optimizeGeneratedCss({\n css,\n shouldOptimize: cssFlags.shouldOptimize,\n optimizationConfig,\n referenceCss: options?.referenceCss,\n scopeClass,\n });\n css = optimizedCss.css;\n\n const sizeBytes = Buffer.byteLength(css, 'utf8');\n const sizeGzipBytes = gzipSync(css).length;\n\n return {\n css,\n sizeBytes,\n sizeGzipBytes,\n classCount: safelist.length,\n optimizationStats: optimizedCss.optimizationStats,\n };\n};\n\n/**\n * Generate CSS in simple mode (no uds.theme.ts)\n */\nconst generateSimpleModeCSS = async (options: {\n workspaceDir: string;\n entry: EntryValue;\n outFile: string;\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n scope?: string;\n configPath?: string;\n isWatch?: boolean;\n silent?: boolean;\n}): Promise<{ success: boolean; outputPath: string; packageDirs?: string[] }> => {\n const isWatch = options.isWatch === true;\n const isSilent = options.silent === true;\n const shouldLogStats = !isSilent && !isWatch;\n const startTime = performance.now();\n const colorModes: ('dark' | 'light')[] = ['dark']; // Light mode is already in :root\n\n // Load config if provided, otherwise use default\n let tokensConfig: UniversalTokensConfig = defaultTokensConfig;\n if (options.configPath) {\n const loadedConfig = await loadConfigFile<UniversalTokensConfig>(options.configPath);\n if (loadedConfig) {\n tokensConfig = loadedConfig;\n } else if (shouldLogStats) {\n spinStop('⚠️', `Config file not found: ${options.configPath}, using defaults`);\n }\n }\n\n // Extract variant defaults from config for auto-variant class generation\n const variantDefaults = extractVariantDefaults(tokensConfig);\n\n const resolvedEntries = resolveEntryPaths(options.entry, options.workspaceDir);\n const entryDirs = resolvedEntries.map((entry) => entry.absolutePath);\n const scanResult = await scanDirectoriesForSafelist(\n entryDirs,\n colorModes,\n options.variants,\n options.autoVariants,\n options.componentData,\n variantDefaults,\n );\n\n const totalFilesScanned = scanResult.filesScanned;\n const allClasses: string[] = [...scanResult.safelist];\n const allComponents = new Set<string>(scanResult.components);\n const packageDirs: string[] = [\n ...new Set(\n resolvedEntries.map((entry) =>\n entry.kind === 'directory' ? entry.absolutePath : entry.watchDirectory,\n ),\n ),\n ];\n\n // Add color mode classes\n const fullSafelist = [...allClasses, ...getThemeAndScaleClasses(colorModes)];\n const finalSafelist = deduplicateSafelist(fullSafelist);\n\n // Generate CSS (Tailwind will scan entry dir for arbitrary classes on className props)\n const cssResult = await generateCSS(finalSafelist, tokensConfig, {\n scope: options.scope,\n contentDir: entryDirs,\n safeVarPrefixes: [\n ...getMotionVarPrefixes(options.componentData, [...allComponents]),\n ...getConfigurableCssVariables(),\n ],\n });\n\n // Write output\n const outputPath = path.isAbsolute(options.outFile)\n ? options.outFile\n : path.join(options.workspaceDir, options.outFile);\n const outputDir = path.dirname(outputPath);\n\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, cssResult.css);\n\n const duration = Math.round(performance.now() - startTime);\n\n if (shouldLogStats) {\n printSimpleModeStats({\n outputPath,\n totalFilesScanned,\n classCount: cssResult.classCount,\n sizeBytes: cssResult.sizeBytes,\n sizeGzipBytes: cssResult.sizeGzipBytes,\n duration,\n scope: options.scope,\n optimizationStats: cssResult.optimizationStats,\n print,\n magenta,\n cyan,\n yellow,\n });\n }\n\n return { success: true, outputPath, packageDirs };\n};\n\nexport { generateCSS, generateSimpleModeCSS };\nexport type { UDSCSSOptions };\n"],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","names":[],"sources":["../../src/css/generate.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { gzipSync } from 'node:zlib';\n\nimport { cyan, magenta, print, spinStop, yellow } from '@yahoo/uds-cli/lib';\nimport type { UniversalTokensConfig } from '@yahoo/uds-config';\nimport { defaultTokensConfig } from '@yahoo/uds-config';\nimport postcss from 'postcss';\nimport type { SafelistConfig } from 'tailwindcss/types/config';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport { deduplicateSafelist, getThemeAndScaleClasses } from '../purger/optimized';\nimport type { EntryValue } from '../utils/entryPoints';\nimport { resolveEntryPaths } from '../utils/entryPoints';\nimport {\n applyScopedColorModeFix,\n buildPostcssPlugins,\n createTailwindPlugin,\n getCssFeatureFlags,\n optimizeGeneratedCss,\n printSimpleModeStats,\n} from './generate.helpers';\nimport { loadConfigFile, scanDirectoriesForSafelist } from './nodeUtils';\nimport type { UDSCSSOptimizationOptions, UDSCSSVarSafelistPattern } from './theme';\nimport { extractVariantDefaults, getConfigurableCssVariables, getMotionVarPrefixes } from './utils';\n\n/**\n * Result from generating CSS\n */\ninterface CSSResult {\n css: string;\n sizeBytes: number;\n sizeGzipBytes: number;\n classCount: number;\n optimizationStats?: {\n originalSize: number;\n originalSizeGzip: number;\n fontFacesRemoved: number;\n emptyRulesRemoved: number;\n validationErrors: string[];\n };\n}\n\n/**\n * CSS generation options for uds.theme.ts\n */\ninterface UDSCSSOptions {\n /** CSS scope wrapper class (optional) */\n scope?: string;\n /** Safelist of CSS classes to always include */\n safelist?: SafelistConfig[];\n /** CSS optimization settings */\n optimization?: UDSCSSOptimizationOptions;\n /** Include Tailwind preflight/reset styles (default: true) */\n preflight?: boolean;\n /** Include @font-face declarations (default: true) */\n fontFaceDeclarations?: boolean;\n /** Debounce delay (ms) for watch mode regenerations */\n watchDebounce?: number;\n}\n\n/**\n * Options for generateCSS function\n */\ninterface GenerateCSSOptions {\n /** CSS scope wrapper class */\n scope?: string;\n /** Directory to scan for arbitrary Tailwind classes (className props) */\n contentDir?: string | string[];\n /** CSS generation options from theme config */\n cssOptions?: UDSCSSOptions;\n /** Reference CSS to deduplicate font-faces against (for scoped CSS) */\n referenceCss?: string;\n /** CSS variable prefixes or patterns to preserve during pruning */\n safeVarPrefixes?: UDSCSSVarSafelistPattern[];\n}\n\nconst normalizeScope = (scope?: string): string | undefined => {\n const trimmedScope = scope?.trim();\n return trimmedScope ? trimmedScope : undefined;\n};\n\nconst getArbitrarySafelistRawContent = (safelist: SafelistConfig[]): string[] => {\n const arbitraryClasses = safelist.filter(\n (entry): entry is string => typeof entry === 'string' && entry.includes('['),\n );\n\n if (arbitraryClasses.length === 0) {\n return [];\n }\n\n return [`<div class=\"${arbitraryClasses.join(' ')}\"></div>`];\n};\n\n/**\n * Generate CSS from a safelist using Tailwind + PostCSS\n * @param safelist - UDS component classes to include\n * @param config - Token configuration\n * @param options - Additional options\n */\nconst generateCSS = async (\n safelist: SafelistConfig[],\n config: UniversalTokensConfig,\n options?: GenerateCSSOptions,\n): Promise<CSSResult> => {\n // Do we need base?\n const sourceCSS = '@tailwind base; @tailwind components; @tailwind utilities';\n\n const contentDir = options?.contentDir ?? path.join(process.cwd(), 'src');\n const cssFlags = getCssFeatureFlags(options?.cssOptions);\n const optimizationConfig = options?.cssOptions?.optimization;\n const scopeClass = normalizeScope(options?.scope) ?? normalizeScope(options?.cssOptions?.scope);\n const twPlugin = createTailwindPlugin({\n contentDir,\n rawContents: getArbitrarySafelistRawContent(safelist),\n safelist,\n config,\n enablePreflight: cssFlags.enablePreflight,\n enableFontFaceDeclarations: cssFlags.enableFontFaceDeclarations,\n });\n const plugins = buildPostcssPlugins({\n tailwindPlugin: twPlugin,\n shouldPruneVars: cssFlags.shouldPruneVars,\n safeVarPrefixes: options?.safeVarPrefixes ?? [],\n scopeClass,\n });\n\n const result = await postcss(plugins).process(sourceCSS, { from: undefined });\n let css = await applyScopedColorModeFix(result.css, scopeClass);\n const optimizedCss = await optimizeGeneratedCss({\n css,\n shouldOptimize: cssFlags.shouldOptimize,\n optimizationConfig,\n referenceCss: options?.referenceCss,\n scopeClass,\n });\n css = optimizedCss.css;\n\n const sizeBytes = Buffer.byteLength(css, 'utf8');\n const sizeGzipBytes = gzipSync(css).length;\n\n return {\n css,\n sizeBytes,\n sizeGzipBytes,\n classCount: safelist.length,\n optimizationStats: optimizedCss.optimizationStats,\n };\n};\n\n/**\n * Generate CSS in simple mode (no uds.theme.ts)\n */\nconst generateSimpleModeCSS = async (options: {\n workspaceDir: string;\n entry: EntryValue;\n outFile: string;\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n scope?: string;\n configPath?: string;\n isWatch?: boolean;\n silent?: boolean;\n}): Promise<{ success: boolean; outputPath: string; packageDirs?: string[] }> => {\n const isWatch = options.isWatch === true;\n const isSilent = options.silent === true;\n const shouldLogStats = !isSilent && !isWatch;\n const startTime = performance.now();\n const colorModes: ('dark' | 'light')[] = ['dark']; // Light mode is already in :root\n\n // Load config if provided, otherwise use default\n let tokensConfig: UniversalTokensConfig = defaultTokensConfig;\n if (options.configPath) {\n const loadedConfig = await loadConfigFile<UniversalTokensConfig>(options.configPath);\n if (loadedConfig) {\n tokensConfig = loadedConfig;\n } else if (shouldLogStats) {\n spinStop('⚠️', `Config file not found: ${options.configPath}, using defaults`);\n }\n }\n\n // Extract variant defaults from config for auto-variant class generation\n const variantDefaults = extractVariantDefaults(tokensConfig);\n\n const resolvedEntries = resolveEntryPaths(options.entry, options.workspaceDir);\n const entryDirs = resolvedEntries.map((entry) => entry.absolutePath);\n const scanResult = await scanDirectoriesForSafelist(\n entryDirs,\n colorModes,\n options.variants,\n options.autoVariants,\n options.componentData,\n variantDefaults,\n );\n\n const totalFilesScanned = scanResult.filesScanned;\n const allClasses: string[] = [...scanResult.safelist];\n const allComponents = new Set<string>(scanResult.components);\n const packageDirs: string[] = [\n ...new Set(\n resolvedEntries.map((entry) =>\n entry.kind === 'directory' ? entry.absolutePath : entry.watchDirectory,\n ),\n ),\n ];\n\n // Add color mode classes\n const fullSafelist = [...allClasses, ...getThemeAndScaleClasses(colorModes)];\n const finalSafelist = deduplicateSafelist(fullSafelist);\n\n // Generate CSS (Tailwind will scan entry dir for arbitrary classes on className props)\n const cssResult = await generateCSS(finalSafelist, tokensConfig, {\n scope: options.scope,\n contentDir: entryDirs,\n safeVarPrefixes: [\n ...getMotionVarPrefixes(options.componentData, [...allComponents]),\n ...getConfigurableCssVariables(),\n ],\n });\n\n // Write output\n const outputPath = path.isAbsolute(options.outFile)\n ? options.outFile\n : path.join(options.workspaceDir, options.outFile);\n const outputDir = path.dirname(outputPath);\n\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, cssResult.css);\n\n const duration = Math.round(performance.now() - startTime);\n\n if (shouldLogStats) {\n printSimpleModeStats({\n outputPath,\n totalFilesScanned,\n classCount: cssResult.classCount,\n sizeBytes: cssResult.sizeBytes,\n sizeGzipBytes: cssResult.sizeGzipBytes,\n duration,\n scope: options.scope,\n optimizationStats: cssResult.optimizationStats,\n print,\n magenta,\n cyan,\n yellow,\n });\n }\n\n return { success: true, outputPath, packageDirs };\n};\n\nexport { generateCSS, generateSimpleModeCSS };\nexport type { UDSCSSOptions };\n"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
2
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
+ const require_colors = require('../cli/dist/lib/colors.cjs');
4
+ const require_print = require('../cli/dist/lib/print.cjs');
3
5
  const require_purgeFromCode = require('../purger/optimized/purgeFromCode.cjs');
4
6
  const require_entryPoints = require('../utils/entryPoints.cjs');
5
- let _yahoo_uds_cli_lib = require("@yahoo/uds-cli/lib");
6
7
  let node_fs = require("node:fs");
7
8
  node_fs = require_runtime.__toESM(node_fs);
8
9
  let node_module = require("node:module");
@@ -127,7 +128,7 @@ const scaffoldThemeConfig = async (options) => {
127
128
  const outputPath = options.outputPath ?? "uds.theme.ts";
128
129
  const absoluteOutputPath = node_path.default.isAbsolute(outputPath) ? outputPath : node_path.default.join(workspaceDir, outputPath);
129
130
  if (node_fs.default.existsSync(absoluteOutputPath) && !options.force) {
130
- (0, _yahoo_uds_cli_lib.print)((0, _yahoo_uds_cli_lib.red)(`Error: ${outputPath} already exists. Use --force to overwrite.`));
131
+ require_print.print(require_colors.red(`Error: ${outputPath} already exists. Use --force to overwrite.`));
131
132
  process.exitCode = 1;
132
133
  return;
133
134
  }
@@ -166,13 +167,13 @@ export default defineTheme({
166
167
  });
167
168
  `;
168
169
  node_fs.default.writeFileSync(absoluteOutputPath, template);
169
- (0, _yahoo_uds_cli_lib.print)("");
170
- (0, _yahoo_uds_cli_lib.print)((0, _yahoo_uds_cli_lib.green)("✅ Created uds.theme.ts"));
171
- (0, _yahoo_uds_cli_lib.print)("");
172
- (0, _yahoo_uds_cli_lib.print)(`${(0, _yahoo_uds_cli_lib.magenta)("Next steps:")}`);
173
- (0, _yahoo_uds_cli_lib.print)(` 1. Review and customize ${(0, _yahoo_uds_cli_lib.cyan)(outputPath)}`);
174
- (0, _yahoo_uds_cli_lib.print)(` 2. Run ${(0, _yahoo_uds_cli_lib.cyan)("uds css")} to generate CSS`);
175
- (0, _yahoo_uds_cli_lib.print)("");
170
+ require_print.print("");
171
+ require_print.print(require_colors.green("✅ Created uds.theme.ts"));
172
+ require_print.print("");
173
+ require_print.print(`${require_colors.magenta("Next steps:")}`);
174
+ require_print.print(` 1. Review and customize ${require_colors.cyan(outputPath)}`);
175
+ require_print.print(` 2. Run ${require_colors.cyan("uds css")} to generate CSS`);
176
+ require_print.print("");
176
177
  };
177
178
 
178
179
  //#endregion
@@ -1,7 +1,8 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
+ import { cyan, green, magenta, red } from "../cli/dist/lib/colors.js";
3
+ import { print } from "../cli/dist/lib/print.js";
2
4
  import { purgeFromCodeOptimized } from "../purger/optimized/purgeFromCode.js";
3
5
  import { formatEntryValue } from "../utils/entryPoints.js";
4
- import { cyan, green, magenta, print, red } from "@yahoo/uds-cli/lib";
5
6
  import fs from "node:fs";
6
7
  import { createRequire } from "node:module";
7
8
  import path from "node:path";
@@ -1 +1 @@
1
- {"version":3,"file":"nodeUtils.js","names":[],"sources":["../../src/css/nodeUtils.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport { cyan, green, magenta, print, red } from '@yahoo/uds-cli/lib';\nimport fg from 'fast-glob';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport type { VariantDefaults } from '../purger/optimized/purgeFromCode';\nimport { purgeFromCodeOptimized } from '../purger/optimized/purgeFromCode';\nimport type { EntryValue } from '../utils/entryPoints';\nimport { formatEntryValue } from '../utils/entryPoints';\n\nconst loadConfigFile = async <T>(configPath: string): Promise<T | null> => {\n const absolutePath = path.isAbsolute(configPath)\n ? configPath\n : path.join(process.cwd(), configPath);\n\n if (!fs.existsSync(absolutePath)) {\n return null;\n }\n\n try {\n const module = await import(absolutePath);\n return module.default ?? module.config ?? module;\n } catch (error) {\n throw new Error(\n `Failed to load config file: ${absolutePath}\\n${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n};\n\nconst scanDirectoryForSafelist = async (\n dir: string,\n colorModes: ('dark' | 'light')[],\n variants: Record<string, Record<string, string>>,\n autoVariants: Record<string, Record<string, string>>,\n componentData: Record<string, SerializedComponentInfo>,\n variantDefaults?: VariantDefaults,\n includeAllClassNamePrimitives = false,\n): Promise<{ safelist: string[]; components: string[]; filesScanned: number }> => {\n const files = await fg('**/*.{js,jsx,ts,tsx}', {\n cwd: dir,\n absolute: true,\n ignore: ['**/node_modules/**'],\n });\n\n const results = await Promise.all(\n files.map(async (filePath) => {\n const code = fs.readFileSync(filePath, 'utf-8');\n return purgeFromCodeOptimized(code, {\n colorModes,\n variantDefaults,\n variants,\n autoVariants,\n componentData,\n includeAllClassNamePrimitives,\n filePath,\n });\n }),\n );\n\n const allClasses = results.flatMap((result) => result.safelist);\n const allComponents = new Set(results.flatMap((result) => result.components));\n\n return {\n safelist: allClasses,\n components: [...allComponents],\n filesScanned: files.length,\n };\n};\n\nconst scanFileForSafelist = async (\n filePath: string,\n colorModes: ('dark' | 'light')[],\n variants: Record<string, Record<string, string>>,\n autoVariants: Record<string, Record<string, string>>,\n componentData: Record<string, SerializedComponentInfo>,\n variantDefaults?: VariantDefaults,\n includeAllClassNamePrimitives = false,\n): Promise<{ safelist: string[]; components: string[]; filesScanned: number }> => {\n const code = fs.readFileSync(filePath, 'utf-8');\n const result = await purgeFromCodeOptimized(code, {\n colorModes,\n variantDefaults,\n variants,\n autoVariants,\n componentData,\n includeAllClassNamePrimitives,\n });\n\n return {\n safelist: result.safelist,\n components: result.components,\n filesScanned: 1,\n };\n};\n\nconst scanDirectoriesForSafelist = async (\n dirs: string[],\n colorModes: ('dark' | 'light')[],\n variants: Record<string, Record<string, string>>,\n autoVariants: Record<string, Record<string, string>>,\n componentData: Record<string, SerializedComponentInfo>,\n variantDefaults?: VariantDefaults,\n includeAllClassNamePrimitives = false,\n): Promise<{ safelist: string[]; components: string[]; filesScanned: number }> => {\n const results = await Promise.all(\n dirs.map((dir) => {\n if (fs.existsSync(dir) && fs.statSync(dir).isFile()) {\n return scanFileForSafelist(\n dir,\n colorModes,\n variants,\n autoVariants,\n componentData,\n variantDefaults,\n includeAllClassNamePrimitives,\n );\n }\n\n return scanDirectoryForSafelist(\n dir,\n colorModes,\n variants,\n autoVariants,\n componentData,\n variantDefaults,\n includeAllClassNamePrimitives,\n );\n }),\n );\n\n return {\n safelist: results.flatMap((result) => result.safelist),\n components: [...new Set(results.flatMap((result) => result.components))],\n filesScanned: results.reduce((total, result) => total + result.filesScanned, 0),\n };\n};\n\nconst findMonorepoRoot = (startDir: string): string | null => {\n const findUp = (currentDir: string): string | null => {\n if (fs.existsSync(path.join(currentDir, 'packages'))) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n return parentDir === currentDir ? null : findUp(parentDir);\n };\n\n return findUp(startDir);\n};\n\nconst resolvePackageRoot = (workspaceDir: string, packageName: string): string | null => {\n const require = createRequire(import.meta.url);\n\n try {\n const resolvedPackageJson = require.resolve(path.join(packageName, 'package.json'), {\n paths: [workspaceDir],\n });\n return path.dirname(resolvedPackageJson);\n } catch {\n return null;\n }\n};\n\nconst findPackageRootInMonorepo = (monorepoRoot: string, packageName: string): string | null => {\n const packageJsonPaths = fg.sync('packages/**/package.json', {\n cwd: monorepoRoot,\n absolute: true,\n ignore: ['**/node_modules/**', '**/dist/**'],\n });\n\n const matchingPath = packageJsonPaths.find((pkgJsonPath) => {\n try {\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8')) as { name?: string };\n return pkgJson.name === packageName;\n } catch {\n return false;\n }\n });\n\n return matchingPath ? path.dirname(matchingPath) : null;\n};\n\nconst buildPackageSourceCandidates = (\n workspaceDir: string,\n packageName: string,\n packageRoot: string | null,\n): string[] => {\n return [\n packageRoot ? path.join(packageRoot, 'src') : null,\n packageRoot ? path.join(packageRoot, 'lib') : null,\n packageRoot ? path.join(packageRoot, 'dist') : null,\n packageRoot,\n path.join(workspaceDir, 'node_modules', packageName, 'src'),\n path.join(workspaceDir, 'node_modules', packageName, 'lib'),\n path.join(workspaceDir, 'node_modules', packageName, 'dist'),\n path.join(workspaceDir, 'node_modules', packageName),\n ].filter(Boolean) as string[];\n};\n\nconst getFirstExistingPath = (candidates: string[]): string | null =>\n candidates.find((candidate) => fs.existsSync(candidate)) ?? null;\n\nconst findPackageSourceDir = (packageName: string): string | null => {\n const workspaceDir = process.cwd();\n const monorepoRoot = findMonorepoRoot(workspaceDir);\n\n let packageRoot = resolvePackageRoot(workspaceDir, packageName);\n if (!packageRoot && monorepoRoot) {\n packageRoot = findPackageRootInMonorepo(monorepoRoot, packageName);\n }\n\n return getFirstExistingPath(buildPackageSourceCandidates(workspaceDir, packageName, packageRoot));\n};\n\nconst scaffoldThemeConfig = async (options: {\n outputPath?: string;\n configPath?: string;\n entry?: EntryValue;\n force?: boolean;\n}): Promise<void> => {\n const workspaceDir = process.cwd();\n const outputPath = options.outputPath ?? 'uds.theme.ts';\n const absoluteOutputPath = path.isAbsolute(outputPath)\n ? outputPath\n : path.join(workspaceDir, outputPath);\n\n if (fs.existsSync(absoluteOutputPath) && !options.force) {\n print(red(`Error: ${outputPath} already exists. Use --force to overwrite.`));\n process.exitCode = 1;\n return;\n }\n\n const configPath = options.configPath ?? './uds.config.ts';\n const entry = options.entry ?? './src';\n const serializedEntry = formatEntryValue(entry);\n\n const template = `import { defineTheme } from '@yahoo/uds';\n\n/**\n * UDS Theme Configuration\n * \n * This file configures CSS generation for your app and shared packages.\n * Run \\`uds css\\` to generate optimized CSS.\n */\nexport default defineTheme({\n // Path to your uds.config.ts file\n config: '${configPath}',\n\n // Entry directory or .tsx file path for scanning your app code\n entry: ${serializedEntry},\n\n // Color modes to include (light mode is always in :root)\n colorModes: ['dark'],\n\n // Packages that inherit your app's theme (merged into main uds.css)\n // inherit: ['@your-org/shared-ui'],\n\n // CSS generation options (all optional)\n // css: {\n // safelist: [],\n // preflight: true,\n // fontFaceDeclarations: true,\n // optimization: {\n // removeUnusedFonts: false,\n // removeEmptyRules: true,\n // deduplicateScopedCss: true\n // }\n // }\n});\n`;\n\n fs.writeFileSync(absoluteOutputPath, template);\n\n print('');\n print(green('✅ Created uds.theme.ts'));\n print('');\n print(`${magenta('Next steps:')}`);\n print(` 1. Review and customize ${cyan(outputPath)}`);\n print(` 2. Run ${cyan('uds css')} to generate CSS`);\n print('');\n};\n\nexport {\n findPackageSourceDir,\n loadConfigFile,\n scaffoldThemeConfig,\n scanDirectoriesForSafelist,\n scanDirectoryForSafelist,\n};\n"],"mappings":";;;;;;;;;;AAaA,MAAM,iBAAiB,OAAU,eAA0C;CACzE,MAAM,eAAe,KAAK,WAAW,WAAW,GAC5C,aACA,KAAK,KAAK,QAAQ,KAAK,EAAE,WAAW;AAExC,KAAI,CAAC,GAAG,WAAW,aAAa,CAC9B,QAAO;AAGT,KAAI;EACF,MAAM,SAAS,MAAM,OAAO;AAC5B,SAAO,OAAO,WAAW,OAAO,UAAU;UACnC,OAAO;AACd,QAAM,IAAI,MACR,+BAA+B,aAAa,IAAI,iBAAiB,QAAQ,MAAM,UAAU,kBAC1F;;;AAIL,MAAM,2BAA2B,OAC/B,KACA,YACA,UACA,cACA,eACA,iBACA,gCAAgC,UACgD;CAChF,MAAM,QAAQ,MAAM,GAAG,wBAAwB;EAC7C,KAAK;EACL,UAAU;EACV,QAAQ,CAAC,qBAAqB;EAC/B,CAAC;CAEF,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,IAAI,OAAO,aAAa;AAE5B,SAAO,uBADM,GAAG,aAAa,UAAU,QAAQ,EACX;GAClC;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;GACF,CACH;AAKD,QAAO;EACL,UAJiB,QAAQ,SAAS,WAAW,OAAO,SAAS;EAK7D,YAAY,CAAC,GAJO,IAAI,IAAI,QAAQ,SAAS,WAAW,OAAO,WAAW,CAAC,CAI7C;EAC9B,cAAc,MAAM;EACrB;;AAGH,MAAM,sBAAsB,OAC1B,UACA,YACA,UACA,cACA,eACA,iBACA,gCAAgC,UACgD;CAEhF,MAAM,SAAS,MAAM,uBADR,GAAG,aAAa,UAAU,QAAQ,EACG;EAChD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,QAAO;EACL,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,cAAc;EACf;;AAGH,MAAM,6BAA6B,OACjC,MACA,YACA,UACA,cACA,eACA,iBACA,gCAAgC,UACgD;CAChF,MAAM,UAAU,MAAM,QAAQ,IAC5B,KAAK,KAAK,QAAQ;AAChB,MAAI,GAAG,WAAW,IAAI,IAAI,GAAG,SAAS,IAAI,CAAC,QAAQ,CACjD,QAAO,oBACL,KACA,YACA,UACA,cACA,eACA,iBACA,8BACD;AAGH,SAAO,yBACL,KACA,YACA,UACA,cACA,eACA,iBACA,8BACD;GACD,CACH;AAED,QAAO;EACL,UAAU,QAAQ,SAAS,WAAW,OAAO,SAAS;EACtD,YAAY,CAAC,GAAG,IAAI,IAAI,QAAQ,SAAS,WAAW,OAAO,WAAW,CAAC,CAAC;EACxE,cAAc,QAAQ,QAAQ,OAAO,WAAW,QAAQ,OAAO,cAAc,EAAE;EAChF;;AAGH,MAAM,oBAAoB,aAAoC;CAC5D,MAAM,UAAU,eAAsC;AACpD,MAAI,GAAG,WAAW,KAAK,KAAK,YAAY,WAAW,CAAC,CAClD,QAAO;EAGT,MAAM,YAAY,KAAK,QAAQ,WAAW;AAC1C,SAAO,cAAc,aAAa,OAAO,OAAO,UAAU;;AAG5D,QAAO,OAAO,SAAS;;AAGzB,MAAM,sBAAsB,cAAsB,gBAAuC;CACvF,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;AAE9C,KAAI;EACF,MAAM,sBAAsB,QAAQ,QAAQ,KAAK,KAAK,aAAa,eAAe,EAAE,EAClF,OAAO,CAAC,aAAa,EACtB,CAAC;AACF,SAAO,KAAK,QAAQ,oBAAoB;SAClC;AACN,SAAO;;;AAIX,MAAM,6BAA6B,cAAsB,gBAAuC;CAO9F,MAAM,eANmB,GAAG,KAAK,4BAA4B;EAC3D,KAAK;EACL,UAAU;EACV,QAAQ,CAAC,sBAAsB,aAAa;EAC7C,CAAC,CAEoC,MAAM,gBAAgB;AAC1D,MAAI;AAEF,UADgB,KAAK,MAAM,GAAG,aAAa,aAAa,OAAO,CAAC,CACjD,SAAS;UAClB;AACN,UAAO;;GAET;AAEF,QAAO,eAAe,KAAK,QAAQ,aAAa,GAAG;;AAGrD,MAAM,gCACJ,cACA,aACA,gBACa;AACb,QAAO;EACL,cAAc,KAAK,KAAK,aAAa,MAAM,GAAG;EAC9C,cAAc,KAAK,KAAK,aAAa,MAAM,GAAG;EAC9C,cAAc,KAAK,KAAK,aAAa,OAAO,GAAG;EAC/C;EACA,KAAK,KAAK,cAAc,gBAAgB,aAAa,MAAM;EAC3D,KAAK,KAAK,cAAc,gBAAgB,aAAa,MAAM;EAC3D,KAAK,KAAK,cAAc,gBAAgB,aAAa,OAAO;EAC5D,KAAK,KAAK,cAAc,gBAAgB,YAAY;EACrD,CAAC,OAAO,QAAQ;;AAGnB,MAAM,wBAAwB,eAC5B,WAAW,MAAM,cAAc,GAAG,WAAW,UAAU,CAAC,IAAI;AAE9D,MAAM,wBAAwB,gBAAuC;CACnE,MAAM,eAAe,QAAQ,KAAK;CAClC,MAAM,eAAe,iBAAiB,aAAa;CAEnD,IAAI,cAAc,mBAAmB,cAAc,YAAY;AAC/D,KAAI,CAAC,eAAe,aAClB,eAAc,0BAA0B,cAAc,YAAY;AAGpE,QAAO,qBAAqB,6BAA6B,cAAc,aAAa,YAAY,CAAC;;AAGnG,MAAM,sBAAsB,OAAO,YAKd;CACnB,MAAM,eAAe,QAAQ,KAAK;CAClC,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,qBAAqB,KAAK,WAAW,WAAW,GAClD,aACA,KAAK,KAAK,cAAc,WAAW;AAEvC,KAAI,GAAG,WAAW,mBAAmB,IAAI,CAAC,QAAQ,OAAO;AACvD,QAAM,IAAI,UAAU,WAAW,4CAA4C,CAAC;AAC5E,UAAQ,WAAW;AACnB;;CAOF,MAAM,WAAW;;;;;;;;;;aAJE,QAAQ,cAAc,kBAcnB;;;WAZE,iBADV,QAAQ,SAAS,QACgB,CAetB;;;;;;;;;;;;;;;;;;;;;AAsBzB,IAAG,cAAc,oBAAoB,SAAS;AAE9C,OAAM,GAAG;AACT,OAAM,MAAM,yBAAyB,CAAC;AACtC,OAAM,GAAG;AACT,OAAM,GAAG,QAAQ,cAAc,GAAG;AAClC,OAAM,8BAA8B,KAAK,WAAW,GAAG;AACvD,OAAM,aAAa,KAAK,UAAU,CAAC,kBAAkB;AACrD,OAAM,GAAG"}
1
+ {"version":3,"file":"nodeUtils.js","names":[],"sources":["../../src/css/nodeUtils.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport { cyan, green, magenta, print, red } from '@yahoo/uds-cli/lib';\nimport fg from 'fast-glob';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport type { VariantDefaults } from '../purger/optimized/purgeFromCode';\nimport { purgeFromCodeOptimized } from '../purger/optimized/purgeFromCode';\nimport type { EntryValue } from '../utils/entryPoints';\nimport { formatEntryValue } from '../utils/entryPoints';\n\nconst loadConfigFile = async <T>(configPath: string): Promise<T | null> => {\n const absolutePath = path.isAbsolute(configPath)\n ? configPath\n : path.join(process.cwd(), configPath);\n\n if (!fs.existsSync(absolutePath)) {\n return null;\n }\n\n try {\n const module = await import(absolutePath);\n return module.default ?? module.config ?? module;\n } catch (error) {\n throw new Error(\n `Failed to load config file: ${absolutePath}\\n${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n};\n\nconst scanDirectoryForSafelist = async (\n dir: string,\n colorModes: ('dark' | 'light')[],\n variants: Record<string, Record<string, string>>,\n autoVariants: Record<string, Record<string, string>>,\n componentData: Record<string, SerializedComponentInfo>,\n variantDefaults?: VariantDefaults,\n includeAllClassNamePrimitives = false,\n): Promise<{ safelist: string[]; components: string[]; filesScanned: number }> => {\n const files = await fg('**/*.{js,jsx,ts,tsx}', {\n cwd: dir,\n absolute: true,\n ignore: ['**/node_modules/**'],\n });\n\n const results = await Promise.all(\n files.map(async (filePath) => {\n const code = fs.readFileSync(filePath, 'utf-8');\n return purgeFromCodeOptimized(code, {\n colorModes,\n variantDefaults,\n variants,\n autoVariants,\n componentData,\n includeAllClassNamePrimitives,\n filePath,\n });\n }),\n );\n\n const allClasses = results.flatMap((result) => result.safelist);\n const allComponents = new Set(results.flatMap((result) => result.components));\n\n return {\n safelist: allClasses,\n components: [...allComponents],\n filesScanned: files.length,\n };\n};\n\nconst scanFileForSafelist = async (\n filePath: string,\n colorModes: ('dark' | 'light')[],\n variants: Record<string, Record<string, string>>,\n autoVariants: Record<string, Record<string, string>>,\n componentData: Record<string, SerializedComponentInfo>,\n variantDefaults?: VariantDefaults,\n includeAllClassNamePrimitives = false,\n): Promise<{ safelist: string[]; components: string[]; filesScanned: number }> => {\n const code = fs.readFileSync(filePath, 'utf-8');\n const result = await purgeFromCodeOptimized(code, {\n colorModes,\n variantDefaults,\n variants,\n autoVariants,\n componentData,\n includeAllClassNamePrimitives,\n });\n\n return {\n safelist: result.safelist,\n components: result.components,\n filesScanned: 1,\n };\n};\n\nconst scanDirectoriesForSafelist = async (\n dirs: string[],\n colorModes: ('dark' | 'light')[],\n variants: Record<string, Record<string, string>>,\n autoVariants: Record<string, Record<string, string>>,\n componentData: Record<string, SerializedComponentInfo>,\n variantDefaults?: VariantDefaults,\n includeAllClassNamePrimitives = false,\n): Promise<{ safelist: string[]; components: string[]; filesScanned: number }> => {\n const results = await Promise.all(\n dirs.map((dir) => {\n if (fs.existsSync(dir) && fs.statSync(dir).isFile()) {\n return scanFileForSafelist(\n dir,\n colorModes,\n variants,\n autoVariants,\n componentData,\n variantDefaults,\n includeAllClassNamePrimitives,\n );\n }\n\n return scanDirectoryForSafelist(\n dir,\n colorModes,\n variants,\n autoVariants,\n componentData,\n variantDefaults,\n includeAllClassNamePrimitives,\n );\n }),\n );\n\n return {\n safelist: results.flatMap((result) => result.safelist),\n components: [...new Set(results.flatMap((result) => result.components))],\n filesScanned: results.reduce((total, result) => total + result.filesScanned, 0),\n };\n};\n\nconst findMonorepoRoot = (startDir: string): string | null => {\n const findUp = (currentDir: string): string | null => {\n if (fs.existsSync(path.join(currentDir, 'packages'))) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n return parentDir === currentDir ? null : findUp(parentDir);\n };\n\n return findUp(startDir);\n};\n\nconst resolvePackageRoot = (workspaceDir: string, packageName: string): string | null => {\n const require = createRequire(import.meta.url);\n\n try {\n const resolvedPackageJson = require.resolve(path.join(packageName, 'package.json'), {\n paths: [workspaceDir],\n });\n return path.dirname(resolvedPackageJson);\n } catch {\n return null;\n }\n};\n\nconst findPackageRootInMonorepo = (monorepoRoot: string, packageName: string): string | null => {\n const packageJsonPaths = fg.sync('packages/**/package.json', {\n cwd: monorepoRoot,\n absolute: true,\n ignore: ['**/node_modules/**', '**/dist/**'],\n });\n\n const matchingPath = packageJsonPaths.find((pkgJsonPath) => {\n try {\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8')) as { name?: string };\n return pkgJson.name === packageName;\n } catch {\n return false;\n }\n });\n\n return matchingPath ? path.dirname(matchingPath) : null;\n};\n\nconst buildPackageSourceCandidates = (\n workspaceDir: string,\n packageName: string,\n packageRoot: string | null,\n): string[] => {\n return [\n packageRoot ? path.join(packageRoot, 'src') : null,\n packageRoot ? path.join(packageRoot, 'lib') : null,\n packageRoot ? path.join(packageRoot, 'dist') : null,\n packageRoot,\n path.join(workspaceDir, 'node_modules', packageName, 'src'),\n path.join(workspaceDir, 'node_modules', packageName, 'lib'),\n path.join(workspaceDir, 'node_modules', packageName, 'dist'),\n path.join(workspaceDir, 'node_modules', packageName),\n ].filter(Boolean) as string[];\n};\n\nconst getFirstExistingPath = (candidates: string[]): string | null =>\n candidates.find((candidate) => fs.existsSync(candidate)) ?? null;\n\nconst findPackageSourceDir = (packageName: string): string | null => {\n const workspaceDir = process.cwd();\n const monorepoRoot = findMonorepoRoot(workspaceDir);\n\n let packageRoot = resolvePackageRoot(workspaceDir, packageName);\n if (!packageRoot && monorepoRoot) {\n packageRoot = findPackageRootInMonorepo(monorepoRoot, packageName);\n }\n\n return getFirstExistingPath(buildPackageSourceCandidates(workspaceDir, packageName, packageRoot));\n};\n\nconst scaffoldThemeConfig = async (options: {\n outputPath?: string;\n configPath?: string;\n entry?: EntryValue;\n force?: boolean;\n}): Promise<void> => {\n const workspaceDir = process.cwd();\n const outputPath = options.outputPath ?? 'uds.theme.ts';\n const absoluteOutputPath = path.isAbsolute(outputPath)\n ? outputPath\n : path.join(workspaceDir, outputPath);\n\n if (fs.existsSync(absoluteOutputPath) && !options.force) {\n print(red(`Error: ${outputPath} already exists. Use --force to overwrite.`));\n process.exitCode = 1;\n return;\n }\n\n const configPath = options.configPath ?? './uds.config.ts';\n const entry = options.entry ?? './src';\n const serializedEntry = formatEntryValue(entry);\n\n const template = `import { defineTheme } from '@yahoo/uds';\n\n/**\n * UDS Theme Configuration\n * \n * This file configures CSS generation for your app and shared packages.\n * Run \\`uds css\\` to generate optimized CSS.\n */\nexport default defineTheme({\n // Path to your uds.config.ts file\n config: '${configPath}',\n\n // Entry directory or .tsx file path for scanning your app code\n entry: ${serializedEntry},\n\n // Color modes to include (light mode is always in :root)\n colorModes: ['dark'],\n\n // Packages that inherit your app's theme (merged into main uds.css)\n // inherit: ['@your-org/shared-ui'],\n\n // CSS generation options (all optional)\n // css: {\n // safelist: [],\n // preflight: true,\n // fontFaceDeclarations: true,\n // optimization: {\n // removeUnusedFonts: false,\n // removeEmptyRules: true,\n // deduplicateScopedCss: true\n // }\n // }\n});\n`;\n\n fs.writeFileSync(absoluteOutputPath, template);\n\n print('');\n print(green('✅ Created uds.theme.ts'));\n print('');\n print(`${magenta('Next steps:')}`);\n print(` 1. Review and customize ${cyan(outputPath)}`);\n print(` 2. Run ${cyan('uds css')} to generate CSS`);\n print('');\n};\n\nexport {\n findPackageSourceDir,\n loadConfigFile,\n scaffoldThemeConfig,\n scanDirectoriesForSafelist,\n scanDirectoryForSafelist,\n};\n"],"mappings":"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"}