@yahoo/uds 3.120.0 → 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 +1 -1
- package/dist/components/client/Toast/UDSToastConfigProvider.d.ts +1 -1
- 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 +51 -51
- package/dist/styles/styler.d.ts +51 -51
- 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 +858 -571
- package/dist/uds/generated/componentData.js +858 -571
- package/generated/componentData.json +1786 -1437
- package/package.json +1 -1
|
@@ -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":"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"}
|
|
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 { RuntimeConfigValues, 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 runtimeConfigValues?: RuntimeConfigValues,\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 runtimeConfigValues,\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 runtimeConfigValues?: RuntimeConfigValues,\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 runtimeConfigValues,\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 runtimeConfigValues?: RuntimeConfigValues,\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 runtimeConfigValues,\n includeAllClassNamePrimitives,\n );\n }\n\n return scanDirectoryForSafelist(\n dir,\n colorModes,\n variants,\n autoVariants,\n componentData,\n variantDefaults,\n runtimeConfigValues,\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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"}
|
|
@@ -178,6 +178,7 @@ const loadThemeModeSetup = async (options) => {
|
|
|
178
178
|
entries: require_entryPoints.resolveEntryPaths(themeConfig.entry, options.workspaceDir),
|
|
179
179
|
appConfig,
|
|
180
180
|
appVariantDefaults: require_utils.extractVariantDefaults(appConfig),
|
|
181
|
+
runtimeConfigValues: require_utils.extractRuntimeConfigValues(appConfig),
|
|
181
182
|
effectiveSilent: options.silent || themeConfig.silent === true
|
|
182
183
|
};
|
|
183
184
|
};
|
|
@@ -194,7 +195,7 @@ const runThemeMode = async (options, context) => {
|
|
|
194
195
|
process.exitCode = 1;
|
|
195
196
|
return;
|
|
196
197
|
}
|
|
197
|
-
const { themeConfig, colorModes, entries, appConfig, appVariantDefaults } = setup;
|
|
198
|
+
const { themeConfig, colorModes, entries, appConfig, appVariantDefaults, runtimeConfigValues } = setup;
|
|
198
199
|
effectiveSilent = setup.effectiveSilent;
|
|
199
200
|
log = require_logger.createLogger({ silent: effectiveSilent });
|
|
200
201
|
const entryDirs = entries.map((entry) => entry.absolutePath);
|
|
@@ -205,7 +206,7 @@ const runThemeMode = async (options, context) => {
|
|
|
205
206
|
const genStartTime = performance.now();
|
|
206
207
|
const genLog = opts?.isWatch ? require_logger.createLogger({ silent: true }) : log;
|
|
207
208
|
genLog.spinStart("Scanning app code...");
|
|
208
|
-
const appScanResult = await require_nodeUtils.scanDirectoriesForSafelist(entryDirs, colorModes, context.variants, context.autoVariants, context.componentData, appVariantDefaults);
|
|
209
|
+
const appScanResult = await require_nodeUtils.scanDirectoriesForSafelist(entryDirs, colorModes, context.variants, context.autoVariants, context.componentData, appVariantDefaults, runtimeConfigValues);
|
|
209
210
|
genLog.spinStop("✅", `Scanned ${appScanResult.filesScanned} files`);
|
|
210
211
|
genLog.spinStart("Generating main CSS...");
|
|
211
212
|
const inheritedClasses = [...appScanResult.safelist];
|
|
@@ -218,7 +219,7 @@ const runThemeMode = async (options, context) => {
|
|
|
218
219
|
return;
|
|
219
220
|
}
|
|
220
221
|
if (!packageDirs.includes(packageDir)) packageDirs.push(packageDir);
|
|
221
|
-
const packageScanResult = await require_nodeUtils.scanDirectoryForSafelist(packageDir, colorModes, context.variants, context.autoVariants, context.componentData, appVariantDefaults, true);
|
|
222
|
+
const packageScanResult = await require_nodeUtils.scanDirectoryForSafelist(packageDir, colorModes, context.variants, context.autoVariants, context.componentData, appVariantDefaults, runtimeConfigValues, true);
|
|
222
223
|
inheritedClasses.push(...packageScanResult.safelist);
|
|
223
224
|
packageScanResult.components.forEach((comp) => inheritedComponents.add(comp));
|
|
224
225
|
genLog.spinStop("✅", `${packageName}: ${packageScanResult.filesScanned} files (inherit)`);
|
|
@@ -7,7 +7,7 @@ import { DEFAULT_ENTRY, resolveEntryPaths } from "../utils/entryPoints.js";
|
|
|
7
7
|
import { findPackageSourceDir, loadConfigFile, scanDirectoriesForSafelist, scanDirectoryForSafelist } from "./nodeUtils.js";
|
|
8
8
|
import { defaultTokensConfig } from "../config/dist/index.js";
|
|
9
9
|
import { deduplicateSafelist, getThemeAndScaleClasses } from "../purger/optimized/utils/safelist.js";
|
|
10
|
-
import { extractVariantDefaults, formatBytes, getConfigurableCssVariables, getMotionVarPrefixes } from "./utils.js";
|
|
10
|
+
import { extractRuntimeConfigValues, extractVariantDefaults, formatBytes, getConfigurableCssVariables, getMotionVarPrefixes } from "./utils.js";
|
|
11
11
|
import { getPruneVarSafelist } from "./generate.helpers.js";
|
|
12
12
|
import { generateCSS, generateSimpleModeCSS } from "./generate.js";
|
|
13
13
|
import { getMainCssSummaryMessage, getWatchDirectoryGroups } from "./runner.helpers.js";
|
|
@@ -175,6 +175,7 @@ const loadThemeModeSetup = async (options) => {
|
|
|
175
175
|
entries: resolveEntryPaths(themeConfig.entry, options.workspaceDir),
|
|
176
176
|
appConfig,
|
|
177
177
|
appVariantDefaults: extractVariantDefaults(appConfig),
|
|
178
|
+
runtimeConfigValues: extractRuntimeConfigValues(appConfig),
|
|
178
179
|
effectiveSilent: options.silent || themeConfig.silent === true
|
|
179
180
|
};
|
|
180
181
|
};
|
|
@@ -191,7 +192,7 @@ const runThemeMode = async (options, context) => {
|
|
|
191
192
|
process.exitCode = 1;
|
|
192
193
|
return;
|
|
193
194
|
}
|
|
194
|
-
const { themeConfig, colorModes, entries, appConfig, appVariantDefaults } = setup;
|
|
195
|
+
const { themeConfig, colorModes, entries, appConfig, appVariantDefaults, runtimeConfigValues } = setup;
|
|
195
196
|
effectiveSilent = setup.effectiveSilent;
|
|
196
197
|
log = createLogger({ silent: effectiveSilent });
|
|
197
198
|
const entryDirs = entries.map((entry) => entry.absolutePath);
|
|
@@ -202,7 +203,7 @@ const runThemeMode = async (options, context) => {
|
|
|
202
203
|
const genStartTime = performance.now();
|
|
203
204
|
const genLog = opts?.isWatch ? createLogger({ silent: true }) : log;
|
|
204
205
|
genLog.spinStart("Scanning app code...");
|
|
205
|
-
const appScanResult = await scanDirectoriesForSafelist(entryDirs, colorModes, context.variants, context.autoVariants, context.componentData, appVariantDefaults);
|
|
206
|
+
const appScanResult = await scanDirectoriesForSafelist(entryDirs, colorModes, context.variants, context.autoVariants, context.componentData, appVariantDefaults, runtimeConfigValues);
|
|
206
207
|
genLog.spinStop("✅", `Scanned ${appScanResult.filesScanned} files`);
|
|
207
208
|
genLog.spinStart("Generating main CSS...");
|
|
208
209
|
const inheritedClasses = [...appScanResult.safelist];
|
|
@@ -215,7 +216,7 @@ const runThemeMode = async (options, context) => {
|
|
|
215
216
|
return;
|
|
216
217
|
}
|
|
217
218
|
if (!packageDirs.includes(packageDir)) packageDirs.push(packageDir);
|
|
218
|
-
const packageScanResult = await scanDirectoryForSafelist(packageDir, colorModes, context.variants, context.autoVariants, context.componentData, appVariantDefaults, true);
|
|
219
|
+
const packageScanResult = await scanDirectoryForSafelist(packageDir, colorModes, context.variants, context.autoVariants, context.componentData, appVariantDefaults, runtimeConfigValues, true);
|
|
219
220
|
inheritedClasses.push(...packageScanResult.safelist);
|
|
220
221
|
packageScanResult.components.forEach((comp) => inheritedComponents.add(comp));
|
|
221
222
|
genLog.spinStop("✅", `${packageName}: ${packageScanResult.filesScanned} files (inherit)`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","names":[],"sources":["../../src/css/runner.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { createLogger, gray, green, magenta, print, spinStart, spinStop } from '@yahoo/uds-cli/lib';\nimport type { UniversalTokensConfig } from '@yahoo/uds-config';\nimport { defaultTokensConfig } from '@yahoo/uds-config';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport { deduplicateSafelist, getThemeAndScaleClasses } from '../purger/optimized/utils/safelist';\nimport type { EntryValue, ResolvedEntryPath } from '../utils/entryPoints';\nimport { DEFAULT_ENTRY, resolveEntryPaths } from '../utils/entryPoints';\nimport { generateCSS, generateSimpleModeCSS } from './generate';\nimport { getPruneVarSafelist } from './generate.helpers';\nimport {\n findPackageSourceDir,\n loadConfigFile,\n scanDirectoriesForSafelist,\n scanDirectoryForSafelist,\n} from './nodeUtils';\nimport { getMainCssSummaryMessage, getWatchDirectoryGroups } from './runner.helpers';\nimport type { UDSThemeConfig, UDSThemeConfigInput, UDSThemeContext } from './theme';\nimport {\n extractVariantDefaults,\n formatBytes,\n getConfigurableCssVariables,\n getMotionVarPrefixes,\n} from './utils';\n\ntype CssCommandContext = {\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n};\n\ntype CssCommandOptions = {\n workspaceDir: string;\n outFile: string;\n themeConfigPath: string;\n scope?: string;\n entryOption?: EntryValue;\n configOption?: string;\n watch: boolean;\n silent: boolean;\n};\n\ntype ThemeModeSetup = {\n themeConfig: UDSThemeConfig;\n colorModes: ('dark' | 'light')[];\n entries: ResolvedEntryPath[];\n appConfig: UniversalTokensConfig;\n appVariantDefaults: ReturnType<typeof extractVariantDefaults>;\n effectiveSilent: boolean;\n};\n\nconst SOURCE_FILE_PATTERN = /\\.(jsx?|tsx?)$/i;\n\ntype WatchTarget = {\n watchPath: string;\n recursive: boolean;\n fileNames?: string[];\n};\n\nconst getWatchDirs = (dirs: string[]): string[] => [\n ...new Set(dirs.filter((dir) => !dir.split(path.sep).includes('node_modules'))),\n];\n\nconst isCoveredByRecursiveWatch = (watchPath: string, targetPath: string): boolean =>\n targetPath === watchPath || targetPath.startsWith(`${watchPath}${path.sep}`);\n\nconst getEntryWatchTargets = (entries: ResolvedEntryPath[]): WatchTarget[] => {\n const directoryTargets = getWatchDirs(\n entries.filter((entry) => entry.kind === 'directory').map((entry) => entry.absolutePath),\n ).map((watchPath) => ({ watchPath, recursive: true }));\n\n const fileNamesByDirectory = new Map<string, Set<string>>();\n\n entries\n .filter(\n (entry): entry is ResolvedEntryPath & { kind: 'file'; fileName: string } =>\n entry.kind === 'file' && typeof entry.fileName === 'string',\n )\n .forEach((entry) => {\n if (\n directoryTargets.some((target) =>\n isCoveredByRecursiveWatch(target.watchPath, entry.absolutePath),\n )\n ) {\n return;\n }\n\n const fileNames = fileNamesByDirectory.get(entry.watchDirectory) ?? new Set<string>();\n fileNames.add(entry.fileName);\n fileNamesByDirectory.set(entry.watchDirectory, fileNames);\n });\n\n const fileTargets = [...fileNamesByDirectory.entries()].map(([watchPath, fileNames]) => ({\n watchPath,\n recursive: false,\n fileNames: [...fileNames],\n }));\n\n return [...directoryTargets, ...fileTargets];\n};\n\nconst watchSourceFiles = (targets: WatchTarget[], onFileChange: () => void): void => {\n targets.forEach((target) => {\n fs.watch(target.watchPath, { recursive: target.recursive }, (_eventType, filename) => {\n if (!filename || !SOURCE_FILE_PATTERN.test(filename)) {\n return;\n }\n\n if (target.fileNames && !target.fileNames.includes(path.basename(String(filename)))) {\n return;\n }\n\n onFileChange();\n });\n });\n};\n\nconst createDebouncedAction = (action: () => void, delayMs: number): (() => void) => {\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n return () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(action, delayMs);\n };\n};\n\nconst createQueuedRegenerator = <T>(options: {\n onStart?: () => void;\n onSuccess?: (result: T) => void;\n onError: (message: string) => void;\n regenerateOnce: () => Promise<T>;\n}): (() => Promise<void>) => {\n let isGenerating = false;\n let pendingRegenerate = false;\n\n const regenerate = async (): Promise<void> => {\n if (isGenerating) {\n pendingRegenerate = true;\n return;\n }\n\n isGenerating = true;\n try {\n options.onStart?.();\n const result = await options.regenerateOnce();\n options.onSuccess?.(result);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'CSS generation failed';\n options.onError(message);\n } finally {\n isGenerating = false;\n\n if (pendingRegenerate) {\n pendingRegenerate = false;\n await regenerate();\n }\n }\n };\n\n return regenerate;\n};\n\nconst runCssCommand = async (\n options: CssCommandOptions,\n context: CssCommandContext,\n): Promise<void> => {\n const themeConfigExists = fs.existsSync(\n path.join(options.workspaceDir, String(options.themeConfigPath)),\n );\n\n if (!themeConfigExists) {\n await runSimpleMode(options, context);\n return;\n }\n\n await runThemeMode(options, context);\n};\n\nconst runSimpleMode = async (\n options: CssCommandOptions,\n context: CssCommandContext,\n): Promise<void> => {\n const entry = options.entryOption ?? DEFAULT_ENTRY;\n const configPath = typeof options.configOption === 'string' ? options.configOption : undefined;\n\n if (!options.watch && !options.silent) {\n spinStart('Generating CSS...');\n }\n\n try {\n const result = await generateSimpleModeCSS({\n workspaceDir: options.workspaceDir,\n entry,\n outFile: String(options.outFile),\n variants: context.variants,\n autoVariants: context.autoVariants,\n componentData: context.componentData,\n scope: options.scope,\n configPath,\n isWatch: options.watch,\n silent: options.silent,\n });\n\n if (options.watch) {\n await runSimpleModeWatch(options, context, entry, configPath, result.packageDirs ?? []);\n }\n } catch (error) {\n spinStop('❌', error instanceof Error ? error.message : 'CSS generation failed');\n process.exitCode = 1;\n }\n};\n\nconst runSimpleModeWatch = async (\n options: CssCommandOptions,\n context: CssCommandContext,\n entry: EntryValue,\n configPath: string | undefined,\n packageDirs: string[],\n): Promise<void> => {\n const resolvedEntries = resolveEntryPaths(entry, options.workspaceDir);\n const entryWatchTargets = getEntryWatchTargets(resolvedEntries);\n const fallbackTargets = getWatchDirs(packageDirs).map((watchPath) => ({\n watchPath,\n recursive: true,\n }));\n const watchTargets = packageDirs.length > 0 ? fallbackTargets : entryWatchTargets;\n\n if (!options.silent) {\n print('');\n print(`${magenta('Watching for changes...')}`);\n watchTargets.forEach((target) => print(` ${gray('•')} ${target.watchPath}`));\n print(`${gray('Press Ctrl+C to stop')}`);\n print('');\n }\n\n const regenerate = createQueuedRegenerator({\n onStart: () => {\n if (!options.silent) {\n const timestamp = new Date().toLocaleTimeString();\n print(`${gray(`[${timestamp}]`)} Change detected, regenerating...`);\n }\n },\n regenerateOnce: async () => {\n await generateSimpleModeCSS({\n workspaceDir: options.workspaceDir,\n entry,\n outFile: String(options.outFile),\n variants: context.variants,\n autoVariants: context.autoVariants,\n componentData: context.componentData,\n scope: options.scope,\n configPath,\n isWatch: true,\n silent: true,\n });\n },\n onSuccess: () => {\n if (!options.silent) {\n const updatedAt = new Date().toLocaleTimeString();\n print(`${gray(`[${updatedAt}]`)} ${green('CSS updated')}`);\n print('');\n }\n },\n onError: (message) => {\n print(`Error: ${message}`);\n },\n });\n\n watchSourceFiles(\n watchTargets,\n createDebouncedAction(() => {\n void regenerate();\n }, 100),\n );\n\n await new Promise(() => {});\n};\n\nconst loadThemeModeSetup = async (options: CssCommandOptions): Promise<ThemeModeSetup | null> => {\n const themeConfigInput = await loadConfigFile<UDSThemeConfigInput>(\n String(options.themeConfigPath),\n );\n if (!themeConfigInput) {\n return null;\n }\n\n const themeContext: UDSThemeContext = {\n cwd: options.workspaceDir,\n watch: options.watch,\n };\n const themeConfig: UDSThemeConfig =\n typeof themeConfigInput === 'function'\n ? await themeConfigInput(themeContext)\n : themeConfigInput;\n\n let appConfig: UniversalTokensConfig = defaultTokensConfig;\n if (themeConfig.config) {\n const loadedConfig = await loadConfigFile<UniversalTokensConfig>(themeConfig.config);\n if (loadedConfig) {\n appConfig = loadedConfig;\n }\n }\n\n return {\n themeConfig,\n colorModes: themeConfig.colorModes ?? ['dark'],\n entries: resolveEntryPaths(themeConfig.entry, options.workspaceDir),\n appConfig,\n appVariantDefaults: extractVariantDefaults(appConfig),\n effectiveSilent: options.silent || themeConfig.silent === true,\n };\n};\n\nconst runThemeMode = async (\n options: CssCommandOptions,\n context: CssCommandContext,\n): Promise<void> => {\n const workspaceDir = options.workspaceDir;\n const outputPath = path.isAbsolute(options.outFile)\n ? options.outFile\n : path.join(workspaceDir, String(options.outFile));\n let effectiveSilent = options.silent;\n let log = createLogger({ silent: effectiveSilent });\n\n log.spinStart('Loading theme configuration...');\n\n try {\n const setup = await loadThemeModeSetup(options);\n if (!setup) {\n log.spinStop('❌', `Theme config not found: ${options.themeConfigPath}`);\n process.exitCode = 1;\n return;\n }\n\n const { themeConfig, colorModes, entries, appConfig, appVariantDefaults } = setup;\n effectiveSilent = setup.effectiveSilent;\n log = createLogger({ silent: effectiveSilent });\n const entryDirs = entries.map((entry) => entry.absolutePath);\n\n if (!effectiveSilent) {\n log.spinStop('✅', 'Theme configuration loaded');\n }\n\n if (themeConfig.config && appConfig === defaultTokensConfig) {\n log.warn(`App config not found: ${themeConfig.config}, using defaults`);\n }\n const packageDirs: string[] = [];\n\n const generateThemeModeCSS = async (opts?: { isWatch?: boolean }) => {\n const genStartTime = performance.now();\n const genLog = opts?.isWatch ? createLogger({ silent: true }) : log;\n\n genLog.spinStart('Scanning app code...');\n const appScanResult = await scanDirectoriesForSafelist(\n entryDirs,\n colorModes,\n context.variants,\n context.autoVariants,\n context.componentData,\n appVariantDefaults,\n );\n genLog.spinStop('✅', `Scanned ${appScanResult.filesScanned} files`);\n\n genLog.spinStart('Generating main CSS...');\n\n const inheritedClasses: string[] = [...appScanResult.safelist];\n const inheritedComponents = new Set<string>(appScanResult.components);\n\n const processInheritedPackage = async (packageName: string) => {\n genLog.spinStart(`Processing package: ${packageName}...`);\n\n const packageDir = findPackageSourceDir(packageName);\n if (!packageDir) {\n genLog.spinStop('⚠️', `Package not found: ${packageName}`);\n return;\n }\n\n if (!packageDirs.includes(packageDir)) {\n packageDirs.push(packageDir);\n }\n\n const packageScanResult = await scanDirectoryForSafelist(\n packageDir,\n colorModes,\n context.variants,\n context.autoVariants,\n context.componentData,\n appVariantDefaults,\n true,\n );\n inheritedClasses.push(...packageScanResult.safelist);\n packageScanResult.components.forEach((comp) => inheritedComponents.add(comp));\n genLog.spinStop('✅', `${packageName}: ${packageScanResult.filesScanned} files (inherit)`);\n };\n\n await (themeConfig.inherit ?? []).reduce(async (promise, packageName) => {\n await promise;\n await processInheritedPackage(packageName);\n }, Promise.resolve());\n\n const mainSafelist = deduplicateSafelist([\n ...inheritedClasses,\n ...getThemeAndScaleClasses(colorModes),\n ]);\n\n const allMotionComponents: string[] = [...inheritedComponents];\n\n const mainCssResult = await generateCSS(\n [...(themeConfig.css?.safelist ?? []), ...mainSafelist],\n appConfig,\n {\n scope: options.scope,\n contentDir: entryDirs,\n cssOptions: themeConfig.css,\n safeVarPrefixes: [\n ...getMotionVarPrefixes(context.componentData, allMotionComponents),\n ...getConfigurableCssVariables(),\n ...getPruneVarSafelist(themeConfig.css),\n ],\n },\n );\n\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, mainCssResult.css);\n\n genLog.spinStop(\n '✅',\n getMainCssSummaryMessage({\n sizeGzipBytes: mainCssResult.sizeGzipBytes,\n optimizationStats: mainCssResult.optimizationStats,\n formatBytes,\n }),\n );\n\n const duration = Math.round(performance.now() - genStartTime);\n\n genLog.newline();\n genLog.print(green('CSS generation complete!'));\n genLog.newline();\n genLog.label('Output file:', outputPath);\n genLog.newline();\n genLog.print(`${magenta('Total time:')} ${duration}ms`);\n\n return { duration, outputPath, packageDirs };\n };\n\n await generateThemeModeCSS();\n\n if (options.watch) {\n const entryWatchTargets = getEntryWatchTargets(entries);\n const entryWatchDirs = getWatchDirs(entryWatchTargets.map((target) => target.watchPath));\n const { filteredPackageDirs } = getWatchDirectoryGroups(entryWatchDirs, [\n ...entryDirs,\n ...packageDirs,\n ]);\n\n if (!effectiveSilent) {\n log.newline();\n log.print(`${magenta('Watching for changes...')}`);\n entryDirs.forEach((entryDir) => {\n log.listItem(`App: ${entryDir}`);\n });\n filteredPackageDirs.forEach((dir) => {\n log.listItem(`Package: ${dir}`);\n });\n log.print(`${gray('Press Ctrl+C to stop')}`);\n log.newline();\n }\n\n const regenerate = createQueuedRegenerator({\n onStart: () => {\n if (!effectiveSilent) {\n const timestamp = new Date().toLocaleTimeString();\n log.print(`${gray(`[${timestamp}]`)} Change detected, regenerating...`);\n }\n },\n regenerateOnce: async () => generateThemeModeCSS({ isWatch: true }),\n onSuccess: (result) => {\n if (!effectiveSilent) {\n const updatedAt = new Date().toLocaleTimeString();\n log.print(`${gray(`[${updatedAt}]`)} ${green(`CSS updated (${result?.duration}ms)`)}`);\n log.newline();\n }\n },\n onError: (message) => {\n log.print(message);\n },\n });\n\n const watchDebounce = themeConfig.css?.watchDebounce ?? 100;\n\n watchSourceFiles(\n [\n ...entryWatchTargets,\n ...filteredPackageDirs\n .filter(\n (packageDir) =>\n !entryWatchTargets.some((target) =>\n isCoveredByRecursiveWatch(target.watchPath, packageDir),\n ),\n )\n .map((watchPath) => ({ watchPath, recursive: true })),\n ],\n createDebouncedAction(() => {\n void regenerate();\n }, watchDebounce),\n );\n\n await new Promise(() => {});\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'CSS generation failed';\n if (effectiveSilent) {\n spinStop('❌', message);\n } else {\n log.spinStop('❌', message);\n }\n process.exitCode = 1;\n }\n};\n\nexport { runCssCommand };\nexport type { CssCommandContext, CssCommandOptions };\n"],"mappings":";;;;;;;;;;;;;;;;;AAsDA,MAAM,sBAAsB;AAQ5B,MAAM,gBAAgB,SAA6B,CACjD,GAAG,IAAI,IAAI,KAAK,QAAQ,QAAQ,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC,SAAS,eAAe,CAAC,CAAC,CAChF;AAED,MAAM,6BAA6B,WAAmB,eACpD,eAAe,aAAa,WAAW,WAAW,GAAG,YAAY,KAAK,MAAM;AAE9E,MAAM,wBAAwB,YAAgD;CAC5E,MAAM,mBAAmB,aACvB,QAAQ,QAAQ,UAAU,MAAM,SAAS,YAAY,CAAC,KAAK,UAAU,MAAM,aAAa,CACzF,CAAC,KAAK,eAAe;EAAE;EAAW,WAAW;EAAM,EAAE;CAEtD,MAAM,uCAAuB,IAAI,KAA0B;AAE3D,SACG,QACE,UACC,MAAM,SAAS,UAAU,OAAO,MAAM,aAAa,SACtD,CACA,SAAS,UAAU;AAClB,MACE,iBAAiB,MAAM,WACrB,0BAA0B,OAAO,WAAW,MAAM,aAAa,CAChE,CAED;EAGF,MAAM,YAAY,qBAAqB,IAAI,MAAM,eAAe,oBAAI,IAAI,KAAa;AACrF,YAAU,IAAI,MAAM,SAAS;AAC7B,uBAAqB,IAAI,MAAM,gBAAgB,UAAU;GACzD;CAEJ,MAAM,cAAc,CAAC,GAAG,qBAAqB,SAAS,CAAC,CAAC,KAAK,CAAC,WAAW,gBAAgB;EACvF;EACA,WAAW;EACX,WAAW,CAAC,GAAG,UAAU;EAC1B,EAAE;AAEH,QAAO,CAAC,GAAG,kBAAkB,GAAG,YAAY;;AAG9C,MAAM,oBAAoB,SAAwB,iBAAmC;AACnF,SAAQ,SAAS,WAAW;AAC1B,KAAG,MAAM,OAAO,WAAW,EAAE,WAAW,OAAO,WAAW,GAAG,YAAY,aAAa;AACpF,OAAI,CAAC,YAAY,CAAC,oBAAoB,KAAK,SAAS,CAClD;AAGF,OAAI,OAAO,aAAa,CAAC,OAAO,UAAU,SAAS,KAAK,SAAS,OAAO,SAAS,CAAC,CAAC,CACjF;AAGF,iBAAc;IACd;GACF;;AAGJ,MAAM,yBAAyB,QAAoB,YAAkC;CACnF,IAAI,gBAAsD;AAE1D,cAAa;AACX,MAAI,cACF,cAAa,cAAc;AAE7B,kBAAgB,WAAW,QAAQ,QAAQ;;;AAI/C,MAAM,2BAA8B,YAKP;CAC3B,IAAI,eAAe;CACnB,IAAI,oBAAoB;CAExB,MAAM,aAAa,YAA2B;AAC5C,MAAI,cAAc;AAChB,uBAAoB;AACpB;;AAGF,iBAAe;AACf,MAAI;AACF,WAAQ,WAAW;GACnB,MAAM,SAAS,MAAM,QAAQ,gBAAgB;AAC7C,WAAQ,YAAY,OAAO;WACpB,OAAO;GACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAQ,QAAQ,QAAQ;YAChB;AACR,kBAAe;AAEf,OAAI,mBAAmB;AACrB,wBAAoB;AACpB,UAAM,YAAY;;;;AAKxB,QAAO;;AAGT,MAAM,gBAAgB,OACpB,SACA,YACkB;AAKlB,KAAI,CAJsB,GAAG,WAC3B,KAAK,KAAK,QAAQ,cAAc,OAAO,QAAQ,gBAAgB,CAAC,CACjE,EAEuB;AACtB,QAAM,cAAc,SAAS,QAAQ;AACrC;;AAGF,OAAM,aAAa,SAAS,QAAQ;;AAGtC,MAAM,gBAAgB,OACpB,SACA,YACkB;CAClB,MAAM,QAAQ,QAAQ,eAAe;CACrC,MAAM,aAAa,OAAO,QAAQ,iBAAiB,WAAW,QAAQ,eAAe;AAErF,KAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,OAC7B,WAAU,oBAAoB;AAGhC,KAAI;EACF,MAAM,SAAS,MAAM,sBAAsB;GACzC,cAAc,QAAQ;GACtB;GACA,SAAS,OAAO,QAAQ,QAAQ;GAChC,UAAU,QAAQ;GAClB,cAAc,QAAQ;GACtB,eAAe,QAAQ;GACvB,OAAO,QAAQ;GACf;GACA,SAAS,QAAQ;GACjB,QAAQ,QAAQ;GACjB,CAAC;AAEF,MAAI,QAAQ,MACV,OAAM,mBAAmB,SAAS,SAAS,OAAO,YAAY,OAAO,eAAe,EAAE,CAAC;UAElF,OAAO;AACd,WAAS,KAAK,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB;AAC/E,UAAQ,WAAW;;;AAIvB,MAAM,qBAAqB,OACzB,SACA,SACA,OACA,YACA,gBACkB;CAElB,MAAM,oBAAoB,qBADF,kBAAkB,OAAO,QAAQ,aAAa,CACP;CAC/D,MAAM,kBAAkB,aAAa,YAAY,CAAC,KAAK,eAAe;EACpE;EACA,WAAW;EACZ,EAAE;CACH,MAAM,eAAe,YAAY,SAAS,IAAI,kBAAkB;AAEhE,KAAI,CAAC,QAAQ,QAAQ;AACnB,QAAM,GAAG;AACT,QAAM,GAAG,QAAQ,0BAA0B,GAAG;AAC9C,eAAa,SAAS,WAAW,MAAM,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,YAAY,CAAC;AAC9E,QAAM,GAAG,KAAK,uBAAuB,GAAG;AACxC,QAAM,GAAG;;CAGX,MAAM,aAAa,wBAAwB;EACzC,eAAe;AACb,OAAI,CAAC,QAAQ,OAEX,OAAM,GAAG,KAAK,qBADI,IAAI,MAAM,EAAC,oBAAoB,CACrB,GAAG,CAAC,mCAAmC;;EAGvE,gBAAgB,YAAY;AAC1B,SAAM,sBAAsB;IAC1B,cAAc,QAAQ;IACtB;IACA,SAAS,OAAO,QAAQ,QAAQ;IAChC,UAAU,QAAQ;IAClB,cAAc,QAAQ;IACtB,eAAe,QAAQ;IACvB,OAAO,QAAQ;IACf;IACA,SAAS;IACT,QAAQ;IACT,CAAC;;EAEJ,iBAAiB;AACf,OAAI,CAAC,QAAQ,QAAQ;AAEnB,UAAM,GAAG,KAAK,qBADI,IAAI,MAAM,EAAC,oBAAoB,CACrB,GAAG,CAAC,GAAG,MAAM,cAAc,GAAG;AAC1D,UAAM,GAAG;;;EAGb,UAAU,YAAY;AACpB,SAAM,UAAU,UAAU;;EAE7B,CAAC;AAEF,kBACE,cACA,4BAA4B;AAC1B,EAAK,YAAY;IAChB,IAAI,CACR;AAED,OAAM,IAAI,cAAc,GAAG;;AAG7B,MAAM,qBAAqB,OAAO,YAA+D;CAC/F,MAAM,mBAAmB,MAAM,eAC7B,OAAO,QAAQ,gBAAgB,CAChC;AACD,KAAI,CAAC,iBACH,QAAO;CAGT,MAAM,eAAgC;EACpC,KAAK,QAAQ;EACb,OAAO,QAAQ;EAChB;CACD,MAAM,cACJ,OAAO,qBAAqB,aACxB,MAAM,iBAAiB,aAAa,GACpC;CAEN,IAAI,YAAmC;AACvC,KAAI,YAAY,QAAQ;EACtB,MAAM,eAAe,MAAM,eAAsC,YAAY,OAAO;AACpF,MAAI,aACF,aAAY;;AAIhB,QAAO;EACL;EACA,YAAY,YAAY,cAAc,CAAC,OAAO;EAC9C,SAAS,kBAAkB,YAAY,OAAO,QAAQ,aAAa;EACnE;EACA,oBAAoB,uBAAuB,UAAU;EACrD,iBAAiB,QAAQ,UAAU,YAAY,WAAW;EAC3D;;AAGH,MAAM,eAAe,OACnB,SACA,YACkB;CAClB,MAAM,eAAe,QAAQ;CAC7B,MAAM,aAAa,KAAK,WAAW,QAAQ,QAAQ,GAC/C,QAAQ,UACR,KAAK,KAAK,cAAc,OAAO,QAAQ,QAAQ,CAAC;CACpD,IAAI,kBAAkB,QAAQ;CAC9B,IAAI,MAAM,aAAa,EAAE,QAAQ,iBAAiB,CAAC;AAEnD,KAAI,UAAU,iCAAiC;AAE/C,KAAI;EACF,MAAM,QAAQ,MAAM,mBAAmB,QAAQ;AAC/C,MAAI,CAAC,OAAO;AACV,OAAI,SAAS,KAAK,2BAA2B,QAAQ,kBAAkB;AACvE,WAAQ,WAAW;AACnB;;EAGF,MAAM,EAAE,aAAa,YAAY,SAAS,WAAW,uBAAuB;AAC5E,oBAAkB,MAAM;AACxB,QAAM,aAAa,EAAE,QAAQ,iBAAiB,CAAC;EAC/C,MAAM,YAAY,QAAQ,KAAK,UAAU,MAAM,aAAa;AAE5D,MAAI,CAAC,gBACH,KAAI,SAAS,KAAK,6BAA6B;AAGjD,MAAI,YAAY,UAAU,cAAc,oBACtC,KAAI,KAAK,yBAAyB,YAAY,OAAO,kBAAkB;EAEzE,MAAM,cAAwB,EAAE;EAEhC,MAAM,uBAAuB,OAAO,SAAiC;GACnE,MAAM,eAAe,YAAY,KAAK;GACtC,MAAM,SAAS,MAAM,UAAU,aAAa,EAAE,QAAQ,MAAM,CAAC,GAAG;AAEhE,UAAO,UAAU,uBAAuB;GACxC,MAAM,gBAAgB,MAAM,2BAC1B,WACA,YACA,QAAQ,UACR,QAAQ,cACR,QAAQ,eACR,mBACD;AACD,UAAO,SAAS,KAAK,WAAW,cAAc,aAAa,QAAQ;AAEnE,UAAO,UAAU,yBAAyB;GAE1C,MAAM,mBAA6B,CAAC,GAAG,cAAc,SAAS;GAC9D,MAAM,sBAAsB,IAAI,IAAY,cAAc,WAAW;GAErE,MAAM,0BAA0B,OAAO,gBAAwB;AAC7D,WAAO,UAAU,uBAAuB,YAAY,KAAK;IAEzD,MAAM,aAAa,qBAAqB,YAAY;AACpD,QAAI,CAAC,YAAY;AACf,YAAO,SAAS,MAAM,sBAAsB,cAAc;AAC1D;;AAGF,QAAI,CAAC,YAAY,SAAS,WAAW,CACnC,aAAY,KAAK,WAAW;IAG9B,MAAM,oBAAoB,MAAM,yBAC9B,YACA,YACA,QAAQ,UACR,QAAQ,cACR,QAAQ,eACR,oBACA,KACD;AACD,qBAAiB,KAAK,GAAG,kBAAkB,SAAS;AACpD,sBAAkB,WAAW,SAAS,SAAS,oBAAoB,IAAI,KAAK,CAAC;AAC7E,WAAO,SAAS,KAAK,GAAG,YAAY,IAAI,kBAAkB,aAAa,kBAAkB;;AAG3F,UAAO,YAAY,WAAW,EAAE,EAAE,OAAO,OAAO,SAAS,gBAAgB;AACvE,UAAM;AACN,UAAM,wBAAwB,YAAY;MACzC,QAAQ,SAAS,CAAC;GAErB,MAAM,eAAe,oBAAoB,CACvC,GAAG,kBACH,GAAG,wBAAwB,WAAW,CACvC,CAAC;GAEF,MAAM,sBAAgC,CAAC,GAAG,oBAAoB;GAE9D,MAAM,gBAAgB,MAAM,YAC1B,CAAC,GAAI,YAAY,KAAK,YAAY,EAAE,EAAG,GAAG,aAAa,EACvD,WACA;IACE,OAAO,QAAQ;IACf,YAAY;IACZ,YAAY,YAAY;IACxB,iBAAiB;KACf,GAAG,qBAAqB,QAAQ,eAAe,oBAAoB;KACnE,GAAG,6BAA6B;KAChC,GAAG,oBAAoB,YAAY,IAAI;KACxC;IACF,CACF;GAED,MAAM,YAAY,KAAK,QAAQ,WAAW;AAC1C,OAAI,CAAC,GAAG,WAAW,UAAU,CAC3B,IAAG,UAAU,WAAW,EAAE,WAAW,MAAM,CAAC;AAG9C,MAAG,cAAc,YAAY,cAAc,IAAI;AAE/C,UAAO,SACL,KACA,yBAAyB;IACvB,eAAe,cAAc;IAC7B,mBAAmB,cAAc;IACjC;IACD,CAAC,CACH;GAED,MAAM,WAAW,KAAK,MAAM,YAAY,KAAK,GAAG,aAAa;AAE7D,UAAO,SAAS;AAChB,UAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,UAAO,SAAS;AAChB,UAAO,MAAM,gBAAgB,WAAW;AACxC,UAAO,SAAS;AAChB,UAAO,MAAM,GAAG,QAAQ,cAAc,CAAC,GAAG,SAAS,IAAI;AAEvD,UAAO;IAAE;IAAU;IAAY;IAAa;;AAG9C,QAAM,sBAAsB;AAE5B,MAAI,QAAQ,OAAO;GACjB,MAAM,oBAAoB,qBAAqB,QAAQ;GAEvD,MAAM,EAAE,wBAAwB,wBADT,aAAa,kBAAkB,KAAK,WAAW,OAAO,UAAU,CAAC,EAChB,CACtE,GAAG,WACH,GAAG,YACJ,CAAC;AAEF,OAAI,CAAC,iBAAiB;AACpB,QAAI,SAAS;AACb,QAAI,MAAM,GAAG,QAAQ,0BAA0B,GAAG;AAClD,cAAU,SAAS,aAAa;AAC9B,SAAI,SAAS,QAAQ,WAAW;MAChC;AACF,wBAAoB,SAAS,QAAQ;AACnC,SAAI,SAAS,YAAY,MAAM;MAC/B;AACF,QAAI,MAAM,GAAG,KAAK,uBAAuB,GAAG;AAC5C,QAAI,SAAS;;GAGf,MAAM,aAAa,wBAAwB;IACzC,eAAe;AACb,SAAI,CAAC,iBAAiB;MACpB,MAAM,6BAAY,IAAI,MAAM,EAAC,oBAAoB;AACjD,UAAI,MAAM,GAAG,KAAK,IAAI,UAAU,GAAG,CAAC,mCAAmC;;;IAG3E,gBAAgB,YAAY,qBAAqB,EAAE,SAAS,MAAM,CAAC;IACnE,YAAY,WAAW;AACrB,SAAI,CAAC,iBAAiB;MACpB,MAAM,6BAAY,IAAI,MAAM,EAAC,oBAAoB;AACjD,UAAI,MAAM,GAAG,KAAK,IAAI,UAAU,GAAG,CAAC,GAAG,MAAM,gBAAgB,QAAQ,SAAS,KAAK,GAAG;AACtF,UAAI,SAAS;;;IAGjB,UAAU,YAAY;AACpB,SAAI,MAAM,QAAQ;;IAErB,CAAC;GAEF,MAAM,gBAAgB,YAAY,KAAK,iBAAiB;AAExD,oBACE,CACE,GAAG,mBACH,GAAG,oBACA,QACE,eACC,CAAC,kBAAkB,MAAM,WACvB,0BAA0B,OAAO,WAAW,WAAW,CACxD,CACJ,CACA,KAAK,eAAe;IAAE;IAAW,WAAW;IAAM,EAAE,CACxD,EACD,4BAA4B;AAC1B,IAAK,YAAY;MAChB,cAAc,CAClB;AAED,SAAM,IAAI,cAAc,GAAG;;UAEtB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,MAAI,gBACF,UAAS,KAAK,QAAQ;MAEtB,KAAI,SAAS,KAAK,QAAQ;AAE5B,UAAQ,WAAW"}
|
|
1
|
+
{"version":3,"file":"runner.js","names":[],"sources":["../../src/css/runner.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { createLogger, gray, green, magenta, print, spinStart, spinStop } from '@yahoo/uds-cli/lib';\nimport type { UniversalTokensConfig } from '@yahoo/uds-config';\nimport { defaultTokensConfig } from '@yahoo/uds-config';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport { deduplicateSafelist, getThemeAndScaleClasses } from '../purger/optimized/utils/safelist';\nimport type { EntryValue, ResolvedEntryPath } from '../utils/entryPoints';\nimport { DEFAULT_ENTRY, resolveEntryPaths } from '../utils/entryPoints';\nimport { generateCSS, generateSimpleModeCSS } from './generate';\nimport { getPruneVarSafelist } from './generate.helpers';\nimport {\n findPackageSourceDir,\n loadConfigFile,\n scanDirectoriesForSafelist,\n scanDirectoryForSafelist,\n} from './nodeUtils';\nimport { getMainCssSummaryMessage, getWatchDirectoryGroups } from './runner.helpers';\nimport type { UDSThemeConfig, UDSThemeConfigInput, UDSThemeContext } from './theme';\nimport {\n extractRuntimeConfigValues,\n extractVariantDefaults,\n formatBytes,\n getConfigurableCssVariables,\n getMotionVarPrefixes,\n} from './utils';\n\ntype CssCommandContext = {\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n};\n\ntype CssCommandOptions = {\n workspaceDir: string;\n outFile: string;\n themeConfigPath: string;\n scope?: string;\n entryOption?: EntryValue;\n configOption?: string;\n watch: boolean;\n silent: boolean;\n};\n\ntype ThemeModeSetup = {\n themeConfig: UDSThemeConfig;\n colorModes: ('dark' | 'light')[];\n entries: ResolvedEntryPath[];\n appConfig: UniversalTokensConfig;\n appVariantDefaults: ReturnType<typeof extractVariantDefaults>;\n runtimeConfigValues: ReturnType<typeof extractRuntimeConfigValues>;\n effectiveSilent: boolean;\n};\n\nconst SOURCE_FILE_PATTERN = /\\.(jsx?|tsx?)$/i;\n\ntype WatchTarget = {\n watchPath: string;\n recursive: boolean;\n fileNames?: string[];\n};\n\nconst getWatchDirs = (dirs: string[]): string[] => [\n ...new Set(dirs.filter((dir) => !dir.split(path.sep).includes('node_modules'))),\n];\n\nconst isCoveredByRecursiveWatch = (watchPath: string, targetPath: string): boolean =>\n targetPath === watchPath || targetPath.startsWith(`${watchPath}${path.sep}`);\n\nconst getEntryWatchTargets = (entries: ResolvedEntryPath[]): WatchTarget[] => {\n const directoryTargets = getWatchDirs(\n entries.filter((entry) => entry.kind === 'directory').map((entry) => entry.absolutePath),\n ).map((watchPath) => ({ watchPath, recursive: true }));\n\n const fileNamesByDirectory = new Map<string, Set<string>>();\n\n entries\n .filter(\n (entry): entry is ResolvedEntryPath & { kind: 'file'; fileName: string } =>\n entry.kind === 'file' && typeof entry.fileName === 'string',\n )\n .forEach((entry) => {\n if (\n directoryTargets.some((target) =>\n isCoveredByRecursiveWatch(target.watchPath, entry.absolutePath),\n )\n ) {\n return;\n }\n\n const fileNames = fileNamesByDirectory.get(entry.watchDirectory) ?? new Set<string>();\n fileNames.add(entry.fileName);\n fileNamesByDirectory.set(entry.watchDirectory, fileNames);\n });\n\n const fileTargets = [...fileNamesByDirectory.entries()].map(([watchPath, fileNames]) => ({\n watchPath,\n recursive: false,\n fileNames: [...fileNames],\n }));\n\n return [...directoryTargets, ...fileTargets];\n};\n\nconst watchSourceFiles = (targets: WatchTarget[], onFileChange: () => void): void => {\n targets.forEach((target) => {\n fs.watch(target.watchPath, { recursive: target.recursive }, (_eventType, filename) => {\n if (!filename || !SOURCE_FILE_PATTERN.test(filename)) {\n return;\n }\n\n if (target.fileNames && !target.fileNames.includes(path.basename(String(filename)))) {\n return;\n }\n\n onFileChange();\n });\n });\n};\n\nconst createDebouncedAction = (action: () => void, delayMs: number): (() => void) => {\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n return () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(action, delayMs);\n };\n};\n\nconst createQueuedRegenerator = <T>(options: {\n onStart?: () => void;\n onSuccess?: (result: T) => void;\n onError: (message: string) => void;\n regenerateOnce: () => Promise<T>;\n}): (() => Promise<void>) => {\n let isGenerating = false;\n let pendingRegenerate = false;\n\n const regenerate = async (): Promise<void> => {\n if (isGenerating) {\n pendingRegenerate = true;\n return;\n }\n\n isGenerating = true;\n try {\n options.onStart?.();\n const result = await options.regenerateOnce();\n options.onSuccess?.(result);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'CSS generation failed';\n options.onError(message);\n } finally {\n isGenerating = false;\n\n if (pendingRegenerate) {\n pendingRegenerate = false;\n await regenerate();\n }\n }\n };\n\n return regenerate;\n};\n\nconst runCssCommand = async (\n options: CssCommandOptions,\n context: CssCommandContext,\n): Promise<void> => {\n const themeConfigExists = fs.existsSync(\n path.join(options.workspaceDir, String(options.themeConfigPath)),\n );\n\n if (!themeConfigExists) {\n await runSimpleMode(options, context);\n return;\n }\n\n await runThemeMode(options, context);\n};\n\nconst runSimpleMode = async (\n options: CssCommandOptions,\n context: CssCommandContext,\n): Promise<void> => {\n const entry = options.entryOption ?? DEFAULT_ENTRY;\n const configPath = typeof options.configOption === 'string' ? options.configOption : undefined;\n\n if (!options.watch && !options.silent) {\n spinStart('Generating CSS...');\n }\n\n try {\n const result = await generateSimpleModeCSS({\n workspaceDir: options.workspaceDir,\n entry,\n outFile: String(options.outFile),\n variants: context.variants,\n autoVariants: context.autoVariants,\n componentData: context.componentData,\n scope: options.scope,\n configPath,\n isWatch: options.watch,\n silent: options.silent,\n });\n\n if (options.watch) {\n await runSimpleModeWatch(options, context, entry, configPath, result.packageDirs ?? []);\n }\n } catch (error) {\n spinStop('❌', error instanceof Error ? error.message : 'CSS generation failed');\n process.exitCode = 1;\n }\n};\n\nconst runSimpleModeWatch = async (\n options: CssCommandOptions,\n context: CssCommandContext,\n entry: EntryValue,\n configPath: string | undefined,\n packageDirs: string[],\n): Promise<void> => {\n const resolvedEntries = resolveEntryPaths(entry, options.workspaceDir);\n const entryWatchTargets = getEntryWatchTargets(resolvedEntries);\n const fallbackTargets = getWatchDirs(packageDirs).map((watchPath) => ({\n watchPath,\n recursive: true,\n }));\n const watchTargets = packageDirs.length > 0 ? fallbackTargets : entryWatchTargets;\n\n if (!options.silent) {\n print('');\n print(`${magenta('Watching for changes...')}`);\n watchTargets.forEach((target) => print(` ${gray('•')} ${target.watchPath}`));\n print(`${gray('Press Ctrl+C to stop')}`);\n print('');\n }\n\n const regenerate = createQueuedRegenerator({\n onStart: () => {\n if (!options.silent) {\n const timestamp = new Date().toLocaleTimeString();\n print(`${gray(`[${timestamp}]`)} Change detected, regenerating...`);\n }\n },\n regenerateOnce: async () => {\n await generateSimpleModeCSS({\n workspaceDir: options.workspaceDir,\n entry,\n outFile: String(options.outFile),\n variants: context.variants,\n autoVariants: context.autoVariants,\n componentData: context.componentData,\n scope: options.scope,\n configPath,\n isWatch: true,\n silent: true,\n });\n },\n onSuccess: () => {\n if (!options.silent) {\n const updatedAt = new Date().toLocaleTimeString();\n print(`${gray(`[${updatedAt}]`)} ${green('CSS updated')}`);\n print('');\n }\n },\n onError: (message) => {\n print(`Error: ${message}`);\n },\n });\n\n watchSourceFiles(\n watchTargets,\n createDebouncedAction(() => {\n void regenerate();\n }, 100),\n );\n\n await new Promise(() => {});\n};\n\nconst loadThemeModeSetup = async (options: CssCommandOptions): Promise<ThemeModeSetup | null> => {\n const themeConfigInput = await loadConfigFile<UDSThemeConfigInput>(\n String(options.themeConfigPath),\n );\n if (!themeConfigInput) {\n return null;\n }\n\n const themeContext: UDSThemeContext = {\n cwd: options.workspaceDir,\n watch: options.watch,\n };\n const themeConfig: UDSThemeConfig =\n typeof themeConfigInput === 'function'\n ? await themeConfigInput(themeContext)\n : themeConfigInput;\n\n let appConfig: UniversalTokensConfig = defaultTokensConfig;\n if (themeConfig.config) {\n const loadedConfig = await loadConfigFile<UniversalTokensConfig>(themeConfig.config);\n if (loadedConfig) {\n appConfig = loadedConfig;\n }\n }\n\n return {\n themeConfig,\n colorModes: themeConfig.colorModes ?? ['dark'],\n entries: resolveEntryPaths(themeConfig.entry, options.workspaceDir),\n appConfig,\n appVariantDefaults: extractVariantDefaults(appConfig),\n runtimeConfigValues: extractRuntimeConfigValues(appConfig),\n effectiveSilent: options.silent || themeConfig.silent === true,\n };\n};\n\nconst runThemeMode = async (\n options: CssCommandOptions,\n context: CssCommandContext,\n): Promise<void> => {\n const workspaceDir = options.workspaceDir;\n const outputPath = path.isAbsolute(options.outFile)\n ? options.outFile\n : path.join(workspaceDir, String(options.outFile));\n let effectiveSilent = options.silent;\n let log = createLogger({ silent: effectiveSilent });\n\n log.spinStart('Loading theme configuration...');\n\n try {\n const setup = await loadThemeModeSetup(options);\n if (!setup) {\n log.spinStop('❌', `Theme config not found: ${options.themeConfigPath}`);\n process.exitCode = 1;\n return;\n }\n\n const { themeConfig, colorModes, entries, appConfig, appVariantDefaults, runtimeConfigValues } =\n setup;\n effectiveSilent = setup.effectiveSilent;\n log = createLogger({ silent: effectiveSilent });\n const entryDirs = entries.map((entry) => entry.absolutePath);\n\n if (!effectiveSilent) {\n log.spinStop('✅', 'Theme configuration loaded');\n }\n\n if (themeConfig.config && appConfig === defaultTokensConfig) {\n log.warn(`App config not found: ${themeConfig.config}, using defaults`);\n }\n const packageDirs: string[] = [];\n\n const generateThemeModeCSS = async (opts?: { isWatch?: boolean }) => {\n const genStartTime = performance.now();\n const genLog = opts?.isWatch ? createLogger({ silent: true }) : log;\n\n genLog.spinStart('Scanning app code...');\n const appScanResult = await scanDirectoriesForSafelist(\n entryDirs,\n colorModes,\n context.variants,\n context.autoVariants,\n context.componentData,\n appVariantDefaults,\n runtimeConfigValues,\n );\n genLog.spinStop('✅', `Scanned ${appScanResult.filesScanned} files`);\n\n genLog.spinStart('Generating main CSS...');\n\n const inheritedClasses: string[] = [...appScanResult.safelist];\n const inheritedComponents = new Set<string>(appScanResult.components);\n\n const processInheritedPackage = async (packageName: string) => {\n genLog.spinStart(`Processing package: ${packageName}...`);\n\n const packageDir = findPackageSourceDir(packageName);\n if (!packageDir) {\n genLog.spinStop('⚠️', `Package not found: ${packageName}`);\n return;\n }\n\n if (!packageDirs.includes(packageDir)) {\n packageDirs.push(packageDir);\n }\n\n const packageScanResult = await scanDirectoryForSafelist(\n packageDir,\n colorModes,\n context.variants,\n context.autoVariants,\n context.componentData,\n appVariantDefaults,\n runtimeConfigValues,\n true,\n );\n inheritedClasses.push(...packageScanResult.safelist);\n packageScanResult.components.forEach((comp) => inheritedComponents.add(comp));\n genLog.spinStop('✅', `${packageName}: ${packageScanResult.filesScanned} files (inherit)`);\n };\n\n await (themeConfig.inherit ?? []).reduce(async (promise, packageName) => {\n await promise;\n await processInheritedPackage(packageName);\n }, Promise.resolve());\n\n const mainSafelist = deduplicateSafelist([\n ...inheritedClasses,\n ...getThemeAndScaleClasses(colorModes),\n ]);\n\n const allMotionComponents: string[] = [...inheritedComponents];\n\n const mainCssResult = await generateCSS(\n [...(themeConfig.css?.safelist ?? []), ...mainSafelist],\n appConfig,\n {\n scope: options.scope,\n contentDir: entryDirs,\n cssOptions: themeConfig.css,\n safeVarPrefixes: [\n ...getMotionVarPrefixes(context.componentData, allMotionComponents),\n ...getConfigurableCssVariables(),\n ...getPruneVarSafelist(themeConfig.css),\n ],\n },\n );\n\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, mainCssResult.css);\n\n genLog.spinStop(\n '✅',\n getMainCssSummaryMessage({\n sizeGzipBytes: mainCssResult.sizeGzipBytes,\n optimizationStats: mainCssResult.optimizationStats,\n formatBytes,\n }),\n );\n\n const duration = Math.round(performance.now() - genStartTime);\n\n genLog.newline();\n genLog.print(green('CSS generation complete!'));\n genLog.newline();\n genLog.label('Output file:', outputPath);\n genLog.newline();\n genLog.print(`${magenta('Total time:')} ${duration}ms`);\n\n return { duration, outputPath, packageDirs };\n };\n\n await generateThemeModeCSS();\n\n if (options.watch) {\n const entryWatchTargets = getEntryWatchTargets(entries);\n const entryWatchDirs = getWatchDirs(entryWatchTargets.map((target) => target.watchPath));\n const { filteredPackageDirs } = getWatchDirectoryGroups(entryWatchDirs, [\n ...entryDirs,\n ...packageDirs,\n ]);\n\n if (!effectiveSilent) {\n log.newline();\n log.print(`${magenta('Watching for changes...')}`);\n entryDirs.forEach((entryDir) => {\n log.listItem(`App: ${entryDir}`);\n });\n filteredPackageDirs.forEach((dir) => {\n log.listItem(`Package: ${dir}`);\n });\n log.print(`${gray('Press Ctrl+C to stop')}`);\n log.newline();\n }\n\n const regenerate = createQueuedRegenerator({\n onStart: () => {\n if (!effectiveSilent) {\n const timestamp = new Date().toLocaleTimeString();\n log.print(`${gray(`[${timestamp}]`)} Change detected, regenerating...`);\n }\n },\n regenerateOnce: async () => generateThemeModeCSS({ isWatch: true }),\n onSuccess: (result) => {\n if (!effectiveSilent) {\n const updatedAt = new Date().toLocaleTimeString();\n log.print(`${gray(`[${updatedAt}]`)} ${green(`CSS updated (${result?.duration}ms)`)}`);\n log.newline();\n }\n },\n onError: (message) => {\n log.print(message);\n },\n });\n\n const watchDebounce = themeConfig.css?.watchDebounce ?? 100;\n\n watchSourceFiles(\n [\n ...entryWatchTargets,\n ...filteredPackageDirs\n .filter(\n (packageDir) =>\n !entryWatchTargets.some((target) =>\n isCoveredByRecursiveWatch(target.watchPath, packageDir),\n ),\n )\n .map((watchPath) => ({ watchPath, recursive: true })),\n ],\n createDebouncedAction(() => {\n void regenerate();\n }, watchDebounce),\n );\n\n await new Promise(() => {});\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'CSS generation failed';\n if (effectiveSilent) {\n spinStop('❌', message);\n } else {\n log.spinStop('❌', message);\n }\n process.exitCode = 1;\n }\n};\n\nexport { runCssCommand };\nexport type { CssCommandContext, CssCommandOptions };\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
|
|
2
2
|
const require_properties = require('../automated-config/dist/properties.cjs');
|
|
3
|
+
const require_hookMetadata = require('../runtimeConfig/hookMetadata.cjs');
|
|
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 = require_hookMetadata.getRuntimeFieldTokenValue(config, "useBottomSheetConfig", "backgroundColor", { variant: "default" });
|
|
43
|
+
if (bottomSheetBackgroundColor !== void 0) setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useBottomSheetConfig", "backgroundColor", { variant: "default" }), bottomSheetBackgroundColor);
|
|
44
|
+
if (config.toast?.variables && config.toast?.defaults) {
|
|
45
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useToastConfig", "autoClose"), require_hookMetadata.getRuntimeFieldStaticValue("useToastConfig", "autoClose") ?? void 0);
|
|
46
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useToastConfig", "position"), require_hookMetadata.getRuntimeFieldStaticValue("useToastConfig", "position") ?? void 0);
|
|
47
|
+
setRuntimeValue(require_hookMetadata.getRuntimeDefaultPropSelector("useToastConfig", "size"), require_hookMetadata.getRuntimeDefaultPropValue(config, "useToastConfig", "size"));
|
|
48
|
+
setRuntimeValue(require_hookMetadata.getRuntimeDefaultPropSelector("useToastConfig", "variant"), require_hookMetadata.getRuntimeDefaultPropValue(config, "useToastConfig", "variant"));
|
|
49
|
+
require_hookMetadata.getRuntimeSelectorParamValues("useToastConfig", "size").forEach((size) => {
|
|
50
|
+
const textVariant = require_hookMetadata.getRuntimeFieldTokenValue(config, "useToastConfig", "textVariant", { size });
|
|
51
|
+
const iconSize = require_hookMetadata.getRuntimeFieldTokenValue(config, "useToastConfig", "iconSize", { size });
|
|
52
|
+
const buttonSize = require_hookMetadata.getRuntimeFieldTokenValue(config, "useToastConfig", "buttonSize", { size });
|
|
53
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useToastConfig", "textVariant", { size }), textVariant);
|
|
54
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useToastConfig", "iconSize", { size }), iconSize);
|
|
55
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useToastConfig", "buttonSize", { size }), buttonSize);
|
|
56
|
+
});
|
|
57
|
+
require_hookMetadata.getRuntimeSelectorParamValues("useToastConfig", "variant").forEach((variant) => {
|
|
58
|
+
const textColor = require_hookMetadata.getRuntimeFieldTokenValue(config, "useToastConfig", "textColor", { variant });
|
|
59
|
+
const buttonVariant = require_hookMetadata.getRuntimeFieldTokenValue(config, "useToastConfig", "buttonVariant", { variant });
|
|
60
|
+
const iconVariant = require_hookMetadata.getRuntimeFieldTokenValue(config, "useToastConfig", "iconVariant", { variant });
|
|
61
|
+
const backgroundColor = require_hookMetadata.getRuntimeFieldTokenValue(config, "useToastConfig", "backgroundColor", { variant });
|
|
62
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useToastConfig", "textColor", { variant }), textColor);
|
|
63
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useToastConfig", "buttonVariant", { variant }), buttonVariant);
|
|
64
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useToastConfig", "iconVariant", { variant }), iconVariant);
|
|
65
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useToastConfig", "backgroundColor", { variant }), backgroundColor);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const tooltipBorderRadius = require_hookMetadata.getRuntimeFieldTokenValue(config, "useTooltipConfig", "borderRadius", { size: "default" });
|
|
69
|
+
if (tooltipBorderRadius !== void 0) {
|
|
70
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useTooltipConfig", "animationDuration"), require_hookMetadata.getRuntimeFieldStaticValue("useTooltipConfig", "animationDuration") ?? void 0);
|
|
71
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useTooltipConfig", "placement"), require_hookMetadata.getRuntimeFieldStaticValue("useTooltipConfig", "placement") ?? void 0);
|
|
72
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("useTooltipConfig", "borderRadius", { size: "default" }), tooltipBorderRadius);
|
|
73
|
+
}
|
|
74
|
+
if (config.popover?.variables && config.scaleMode?.medium) {
|
|
75
|
+
setRuntimeValue(require_hookMetadata.getRuntimeDefaultPropSelector("usePopoverConfig", "size"), require_hookMetadata.getRuntimeDefaultPropValue(config, "usePopoverConfig", "size") ?? void 0);
|
|
76
|
+
setRuntimeValue(require_hookMetadata.getRuntimeDefaultPropSelector("usePopoverConfig", "variant"), require_hookMetadata.getRuntimeDefaultPropValue(config, "usePopoverConfig", "variant") ?? void 0);
|
|
77
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("usePopoverConfig", "animationDuration"), require_hookMetadata.getRuntimeFieldStaticValue("usePopoverConfig", "animationDuration") ?? void 0);
|
|
78
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("usePopoverConfig", "placement"), require_hookMetadata.getRuntimeFieldStaticValue("usePopoverConfig", "placement") ?? void 0);
|
|
79
|
+
require_hookMetadata.getRuntimeSelectorParamValues("usePopoverConfig", "size").forEach((size) => {
|
|
80
|
+
const borderRadius = require_hookMetadata.getRuntimeFieldTokenValue(config, "usePopoverConfig", "borderRadius", { size });
|
|
81
|
+
const gap = require_hookMetadata.getRuntimeFieldTokenValue(config, "usePopoverConfig", "gap", { size });
|
|
82
|
+
const spacingHorizontal = require_hookMetadata.getRuntimeFieldTokenValue(config, "usePopoverConfig", "spacingHorizontal", { size });
|
|
83
|
+
const spacingVertical = require_hookMetadata.getRuntimeFieldTokenValue(config, "usePopoverConfig", "spacingVertical", { size });
|
|
84
|
+
const dismissButtonSpacing = require_hookMetadata.getRuntimeFieldTokenValue(config, "usePopoverConfig", "dismissButtonSpacing", { size });
|
|
85
|
+
const dismissIconSize = require_hookMetadata.getRuntimeFieldTokenValue(config, "usePopoverConfig", "dismissIconSize", { size });
|
|
86
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("usePopoverConfig", "borderRadius", { size }), borderRadius);
|
|
87
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("usePopoverConfig", "gap", { size }), gap);
|
|
88
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("usePopoverConfig", "spacingHorizontal", { size }), spacingHorizontal);
|
|
89
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("usePopoverConfig", "spacingVertical", { size }), spacingVertical);
|
|
90
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("usePopoverConfig", "dismissButtonSpacing", { size }), dismissButtonSpacing);
|
|
91
|
+
setRuntimeValue(require_hookMetadata.getRuntimeFieldSelector("usePopoverConfig", "dismissIconSize", { size }), dismissIconSize);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return values;
|
|
95
|
+
};
|
|
35
96
|
/**
|
|
36
97
|
* Format bytes to human readable string
|
|
37
98
|
*/
|
|
@@ -65,6 +126,7 @@ const getConfigurableCssVariables = () => {
|
|
|
65
126
|
};
|
|
66
127
|
|
|
67
128
|
//#endregion
|
|
129
|
+
exports.extractRuntimeConfigValues = extractRuntimeConfigValues;
|
|
68
130
|
exports.extractVariantDefaults = extractVariantDefaults;
|
|
69
131
|
exports.formatBytes = formatBytes;
|
|
70
132
|
exports.getConfigurableCssVariables = getConfigurableCssVariables;
|
|
@@ -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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"}
|