diff --git a/packages/classname/classname.ts b/packages/classname/classname.ts index 7c460b03..4fd33f9e 100644 --- a/packages/classname/classname.ts +++ b/packages/classname/classname.ts @@ -11,18 +11,30 @@ export type ClassNameList = string | Array export type NoStrictEntityMods = Record /** - * BEM Entity className initializer. + * BEM Entity className formatter for block-bound formatters (created with one argument). */ -export type ClassNameInitilizer = (blockName: string, elemName?: string) => ClassNameFormatter +export interface BlockClassNameFormatter { + (): string + (mods?: NoStrictEntityMods | null, mix?: ClassNameList): string + (elemName: string, elemMix?: ClassNameList): string + (elemName: string, elemMods?: NoStrictEntityMods | null, elemMix?: ClassNameList): string +} /** - * BEM Entity className formatter. + * BEM Entity className formatter for element-bound formatters (created with two arguments). + * Passing an element name is not allowed since the element is already fixed. */ -export interface ClassNameFormatter { +export interface ElementClassNameFormatter { (): string (mods?: NoStrictEntityMods | null, mix?: ClassNameList): string - (elemName: string, elemMix?: ClassNameList): string - (elemName: string, elemMods?: NoStrictEntityMods | null, elemMix?: ClassNameList): string +} + +/** + * BEM Entity className initializer. + */ +export interface ClassNameInitilizer { + (blockName: string): BlockClassNameFormatter + (blockName: string, elemName: string): ElementClassNameFormatter } /** @@ -111,7 +123,9 @@ export function withNaming(preset: Preset): ClassNameInitilizer { return className } - return function cnGenerator(b: string, e?: string): ClassNameFormatter { + function cnGenerator(b: string): BlockClassNameFormatter + function cnGenerator(b: string, e: string): ElementClassNameFormatter + function cnGenerator(b: string, e?: string): BlockClassNameFormatter | ElementClassNameFormatter { return ( elemOrMods?: NoStrictEntityMods | string | null, elemModsOrBlockMix?: NoStrictEntityMods | ClassNameList | null, @@ -126,6 +140,8 @@ export function withNaming(preset: Preset): ClassNameInitilizer { return stringify(b, e, elemOrMods, elemModsOrBlockMix as ClassNameList) } } + + return cnGenerator } /** diff --git a/packages/core/core.ts b/packages/core/core.ts index be0b4ece..4cf40e3e 100644 --- a/packages/core/core.ts +++ b/packages/core/core.ts @@ -1,6 +1,6 @@ import { ComponentType, FC, JSX } from 'react' import { jsx } from 'react/jsx-runtime' -import { cn, NoStrictEntityMods, ClassNameFormatter } from '@bem-react/classname' +import { cn, NoStrictEntityMods, BlockClassNameFormatter } from '@bem-react/classname' import { classnames } from '@bem-react/classnames' function getDisplayName(Component: ComponentType | string) { @@ -61,7 +61,7 @@ export function withBemMod( mod: NoStrictEntityMods, enhance?: Enhance | withBemModOptions, ) { - let entity: ClassNameFormatter + let entity: BlockClassNameFormatter let entityClassName: string let modNames: string[]