@@ -9,11 +9,8 @@ import {
99 readonly ,
1010 type BaseIssue ,
1111 type BaseSchema ,
12- type ObjectSchema ,
1312 type OptionalSchema ,
14- type PicklistSchema ,
15- type ReadonlyAction ,
16- type SchemaWithPipe
13+ type PicklistSchema
1714} from 'valibot' ;
1815import React , { type ComponentType } from 'react' ;
1916
@@ -31,10 +28,20 @@ type SafeModifierList<TCSSModuleClasses> = keyof ModifierMap<TCSSModuleClasses>
3128 ? string
3229 : keyof ModifierMap < TCSSModuleClasses > ;
3330
31+ type ModifierSchemaEntry = OptionalSchema < PicklistSchema < readonly [ string , ...string [ ] ] , undefined > , undefined > ;
32+
33+ export type IconModifierPropsSchema < TModifiers extends string > = BaseSchema <
34+ Partial < Record < TModifiers , string > > ,
35+ Readonly < Partial < Record < TModifiers , string > > > ,
36+ BaseIssue < unknown >
37+ > & {
38+ readonly entries : Partial < Record < TModifiers , ModifierSchemaEntry > > ;
39+ } ;
40+
3441function createPropsSchema <
3542 const TCSSModuleClasses extends CSSModuleClasses ,
3643 const TModifiers extends SafeModifierList < TCSSModuleClasses >
37- > ( styles : TCSSModuleClasses , modifiers : TModifiers [ ] ) {
44+ > ( styles : TCSSModuleClasses , modifiers : TModifiers [ ] ) : IconModifierPropsSchema < TModifiers > {
3845 const props = Object . keys ( styles ) . reduce ( ( acc , key ) => {
3946 const [ rawBase , modifier ] = key . split ( '--' ) as [ string , string | undefined ] ;
4047
@@ -60,16 +67,6 @@ function createPropsSchema<
6067 return acc ;
6168 } , new Map < TModifiers , Set < string > > ( ) ) ;
6269
63- type ModifierSchemaEntry = OptionalSchema < PicklistSchema < readonly [ string , ...string [ ] ] , undefined > , undefined > ;
64-
65- type ModifierPropsSchema < TModifiers extends string > = SchemaWithPipe <
66- readonly [
67- ObjectSchema < Partial < Record < TModifiers , ModifierSchemaEntry > > , undefined > ,
68- ReadonlyAction < Readonly < Partial < Record < TModifiers , string > > > >
69- ]
70- > &
71- BaseSchema < unknown , Readonly < Partial < Record < TModifiers , string > > > , BaseIssue < unknown > > ;
72-
7370 const schemaEntries = Array . from ( props . entries ( ) ) . reduce < Partial < Record < TModifiers , ModifierSchemaEntry > > > (
7471 ( acc , [ base , modifierSet ] ) => {
7572 const values = Array . from ( modifierSet ) ;
@@ -86,14 +83,26 @@ function createPropsSchema<
8683
8784 const schema = object ( schemaEntries as Partial < Record < TModifiers , ModifierSchemaEntry > > ) ;
8885
89- return pipe ( schema , readonly ( ) ) as ModifierPropsSchema < TModifiers > ;
86+ return pipe ( schema , readonly ( ) ) as IconModifierPropsSchema < TModifiers > ;
9087}
9188
9289export default function createIconComponent <
9390 const TProps extends { className ?: string | undefined } ,
9491 const TModifiers extends SafeModifierList < TCSSModuleClasses > ,
9592 const TCSSModuleClasses extends CSSModuleClasses
96- > ( styles : TCSSModuleClasses , modifiers : TModifiers [ ] , BaseIcon : ComponentType < TProps > ) {
93+ > (
94+ styles : TCSSModuleClasses ,
95+ modifiers : TModifiers [ ] ,
96+ BaseIcon : ComponentType < TProps >
97+ ) : {
98+ component : ComponentType <
99+ ( TModifiers extends Prefixes < keyof TCSSModuleClasses >
100+ ? Pick < ModifierMap < TCSSModuleClasses > , TModifiers >
101+ : Partial < Record < TModifiers , string > > ) &
102+ TProps
103+ > ;
104+ modifierPropsSchema : IconModifierPropsSchema < TModifiers > ;
105+ } {
97106 type CSSModuleModifiers = ModifierMap < TCSSModuleClasses > ;
98107
99108 // Do not bail if no CSS modules TypeScript plugin is provided.
0 commit comments