diff --git a/CHANGELOG.md b/CHANGELOG.md index eefc94f2a..8b4133398 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fallback to RegEx based parser when using custom transformers or extractors ([#11335](https://github.com/tailwindlabs/tailwindcss/pull/11335)) - Bump `lightningcss` and reflect related improvements in tests ([#11550](https://github.com/tailwindlabs/tailwindcss/pull/11550)) - Fix incorrect spaces around `-` in `calc()` expression ([#12283](https://github.com/tailwindlabs/tailwindcss/pull/12283)) +- Improve types for `resolveConfig` ([#12272](https://github.com/tailwindlabs/tailwindcss/pull/12272)) ### Added diff --git a/resolveConfig.d.ts b/resolveConfig.d.ts index 2402a267e..792162775 100644 --- a/resolveConfig.d.ts +++ b/resolveConfig.d.ts @@ -1,11 +1,30 @@ -import type { Config, ResolvableTo } from './types/config' +import { Config, ResolvableTo, ThemeConfig } from './types/config' +import { DefaultTheme } from './types/generated/default-theme' +import { DefaultColors } from './types/generated/colors' + +type ResolvedConfig = Omit & { + theme: MergeThemes< + UnwrapResolvables>, + T['theme'] extends { extend: infer TExtend } ? UnwrapResolvables : {} + > +} type UnwrapResolvables = { [K in keyof T]: T[K] extends ResolvableTo ? R : T[K] } -type ResolvedConfig = Omit & { - theme: UnwrapResolvables +type ThemeConfigResolved = UnwrapResolvables +type DefaultThemeFull = DefaultTheme & { colors: DefaultColors } + +type MergeThemes = { + [K in keyof ThemeConfigResolved | keyof Overrides]: (K extends keyof Overrides + ? Overrides[K] + : K extends keyof DefaultThemeFull + ? DefaultThemeFull[K] + : K extends keyof ThemeConfigResolved + ? ThemeConfigResolved[K] + : never) & + (K extends keyof Extensions ? Extensions[K] : {}) } declare function resolveConfig(config: T): ResolvedConfig diff --git a/scripts/generate-types.js b/scripts/generate-types.js index d3e0d303e..a0bd5d523 100644 --- a/scripts/generate-types.js +++ b/scripts/generate-types.js @@ -91,9 +91,8 @@ fs.writeFileSync( path.join(process.cwd(), 'types', 'generated', 'default-theme.d.ts'), prettier.format( ` - import { Config } from '../../types' type CSSDeclarationList = Record - export type DefaultTheme = Config['theme'] & { ${defaultThemeTypes} } + export type DefaultTheme = { ${defaultThemeTypes} } `, { semi: false, diff --git a/types/config.d.ts b/types/config.d.ts index fb3652cf5..051ccad5b 100644 --- a/types/config.d.ts +++ b/types/config.d.ts @@ -80,7 +80,7 @@ type Screen = { raw: string } | { min: string } | { max: string } | { min: strin type ScreensConfig = string[] | KeyValuePair // Theme related config -interface ThemeConfig { +export interface ThemeConfig { // Responsiveness screens: ResolvableTo supports: ResolvableTo> @@ -235,8 +235,9 @@ interface ThemeConfig { transitionDuration: ResolvableTo willChange: ResolvableTo content: ResolvableTo +} - // Custom +interface CustomThemeConfig extends ThemeConfig { [key: string]: any } @@ -361,7 +362,7 @@ interface OptionalConfig { future: Partial experimental: Partial darkMode: Partial - theme: Partial }> + theme: Partial }> corePlugins: Partial plugins: Partial // Custom