Skip to content

Commit 71a9833

Browse files
committed
Final fix for componentIcon
1 parent 259fab2 commit 71a9833

File tree

1 file changed

+26
-17
lines changed

1 file changed

+26
-17
lines changed

packages/component/src/Utils/createIconComponent.tsx

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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';
1815
import 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+
3441
function 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

9289
export 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

Comments
 (0)