|
| 1 | +import type { ClassValue } from 'clsx' |
| 2 | +import type { |
| 3 | + CreateOptions, |
| 4 | + EscapeFn, |
| 5 | + TailwindMergeFactory, |
| 6 | + TailwindMergeLibraryFn, |
| 7 | + TailwindMergeRuntime, |
| 8 | + TailwindMergeVersion, |
| 9 | +} from '../types' |
| 10 | +import { clsx } from 'clsx' |
| 11 | +import { resolveEscape } from './escape' |
| 12 | + |
| 13 | +type TailwindMergeFactoryFn = (...args: any[]) => TailwindMergeLibraryFn |
| 14 | + |
| 15 | +interface CreateRuntimeFactoryOptions< |
| 16 | + TTwMerge extends TailwindMergeLibraryFn, |
| 17 | + TTwJoin extends TailwindMergeLibraryFn, |
| 18 | + TExtendFactory extends TailwindMergeFactoryFn, |
| 19 | + TCreateFactory extends TailwindMergeFactoryFn, |
| 20 | +> { |
| 21 | + version: TailwindMergeVersion |
| 22 | + twMerge: TTwMerge |
| 23 | + twJoin: TTwJoin |
| 24 | + extendTailwindMerge: TExtendFactory |
| 25 | + createTailwindMerge: TCreateFactory |
| 26 | +} |
| 27 | + |
| 28 | +function wrapClassAggregator(fn: TailwindMergeLibraryFn, escapeFn: EscapeFn): TailwindMergeRuntime { |
| 29 | + return (...inputs: ClassValue[]) => { |
| 30 | + return escapeFn(fn(clsx(...inputs))) |
| 31 | + } |
| 32 | +} |
| 33 | + |
| 34 | +function wrapFactory<TFactory extends TailwindMergeFactoryFn>( |
| 35 | + factory: TFactory, |
| 36 | + escapeFn: EscapeFn, |
| 37 | +): TailwindMergeFactory<TFactory> { |
| 38 | + return (...args: Parameters<TFactory>) => { |
| 39 | + const runtime = factory(...args) |
| 40 | + return wrapClassAggregator(runtime, escapeFn) |
| 41 | + } |
| 42 | +} |
| 43 | + |
| 44 | +export function createRuntimeFactory< |
| 45 | + TTwMerge extends TailwindMergeLibraryFn, |
| 46 | + TTwJoin extends TailwindMergeLibraryFn, |
| 47 | + TExtendFactory extends TailwindMergeFactoryFn, |
| 48 | + TCreateFactory extends TailwindMergeFactoryFn, |
| 49 | +>(options: CreateRuntimeFactoryOptions<TTwMerge, TTwJoin, TExtendFactory, TCreateFactory>) { |
| 50 | + const { |
| 51 | + version, |
| 52 | + twMerge: _twMerge, |
| 53 | + twJoin: _twJoin, |
| 54 | + extendTailwindMerge: _extendTailwindMerge, |
| 55 | + createTailwindMerge: _createTailwindMerge, |
| 56 | + } = options |
| 57 | + |
| 58 | + return function createRuntime(createOptions?: CreateOptions) { |
| 59 | + const escapeFn = resolveEscape(createOptions) |
| 60 | + |
| 61 | + const twMerge: TailwindMergeRuntime = wrapClassAggregator(_twMerge, escapeFn) |
| 62 | + const twJoin: TailwindMergeRuntime = wrapClassAggregator(_twJoin, escapeFn) |
| 63 | + const extendTailwindMerge = wrapFactory(_extendTailwindMerge, escapeFn) |
| 64 | + const createTailwindMerge = wrapFactory(_createTailwindMerge, escapeFn) |
| 65 | + |
| 66 | + return { |
| 67 | + version, |
| 68 | + twMerge, |
| 69 | + twJoin, |
| 70 | + extendTailwindMerge, |
| 71 | + createTailwindMerge, |
| 72 | + } |
| 73 | + } |
| 74 | +} |
0 commit comments