Skip to content

Commit 9cb2bd4

Browse files
committed
feat(merge): 重构内部运行时工厂
1 parent 8b20e71 commit 9cb2bd4

File tree

11 files changed

+357
-92
lines changed

11 files changed

+357
-92
lines changed

.changeset/heavy-yaks-merge.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@weapp-tailwindcss/merge": minor
3+
---
4+
5+
重构内部运行时工厂,统一 escape 处理并新增 tailwind-merge 版本元数据导出,提升不同 Tailwind CSS 版本下的适配能力。
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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+
}

packages/merge/src/core/escape.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import type { CreateOptions, EscapeFn } from '../types'
2+
import { escape } from 'weapp-tailwindcss/escape'
3+
4+
const noop = (value: string) => value
5+
6+
export function resolveEscape(options?: CreateOptions): EscapeFn {
7+
if (options?.disableEscape) {
8+
return noop
9+
}
10+
11+
return options?.escapeFn ?? escape
12+
}
13+
14+
export {
15+
noop,
16+
}

packages/merge/src/cva.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import type { ClassValue, Config, Props } from './cva/index'
22
import type { CreateOptions } from './types'
33
import { cva as _cva } from 'class-variance-authority'
4-
import { escape } from 'weapp-tailwindcss/escape'
5-
import { noop } from './utils'
4+
import { resolveEscape } from './core/escape'
65

76
function create(options?: CreateOptions) {
8-
const e = options?.disableEscape ? noop : escape
7+
const escapeFn = resolveEscape(options)
98
function cva<T>(base?: ClassValue, config?: Config<T>): (props?: Props<T> | undefined) => string {
10-
// @ts-ignore
11-
const fn = _cva(base, config)
9+
const fn = _cva(base, config) as (...args: any[]) => string
1210
return (...props) => {
13-
return e(fn(...props))
11+
return escapeFn(fn(...props))
1412
}
1513
}
1614
return {

packages/merge/src/types.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
1+
import type { ClassValue } from 'clsx'
2+
3+
export type EscapeFn = (value: string) => string
4+
15
export interface CreateOptions {
26
disableEscape?: boolean
3-
escapeFn?: (value: string) => string
7+
escapeFn?: EscapeFn
48
}
9+
10+
export type TailwindMergeLibraryFn = (...inputs: any[]) => string
11+
12+
export type TailwindMergeRuntime = (...inputs: ClassValue[]) => string
13+
14+
export type TailwindMergeFactory<TFactory extends (...args: any[]) => TailwindMergeLibraryFn>
15+
= (...args: Parameters<TFactory>) => TailwindMergeRuntime
16+
17+
export type TailwindMergeVersion = 2 | 3

packages/merge/src/utils.ts

Lines changed: 0 additions & 77 deletions
This file was deleted.

packages/merge/src/v3.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,31 @@ import {
88
mergeConfigs,
99
} from 'tailwind-merge-v2'
1010
import { weappTwIgnore } from 'weapp-tailwindcss/escape'
11-
import { createFactory } from './utils'
11+
import { createRuntimeFactory } from './core/create-runtime'
1212

13-
const create = createFactory({
13+
const create = createRuntimeFactory({
1414
createTailwindMerge: _createTailwindMerge,
1515
extendTailwindMerge: _extendTailwindMerge,
1616
twJoin: _twJoin,
1717
twMerge: _twMerge,
1818
version: 2,
1919
})
2020

21-
const { twMerge, twJoin, extendTailwindMerge, createTailwindMerge } = create()
21+
const {
22+
version: tailwindMergeVersion,
23+
twMerge,
24+
twJoin,
25+
extendTailwindMerge,
26+
createTailwindMerge,
27+
} = create()
2228

2329
export {
2430
create,
2531
createTailwindMerge,
2632
extendTailwindMerge,
2733
getDefaultConfig,
2834
mergeConfigs,
35+
tailwindMergeVersion,
2936
twJoin,
3037
twMerge,
3138
weappTwIgnore,

packages/merge/src/v4.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,31 @@ import {
88
mergeConfigs,
99
} from 'tailwind-merge'
1010
import { weappTwIgnore } from 'weapp-tailwindcss/escape'
11-
import { createFactory } from './utils'
11+
import { createRuntimeFactory } from './core/create-runtime'
1212

13-
const create = createFactory({
13+
const create = createRuntimeFactory({
1414
createTailwindMerge: _createTailwindMerge,
1515
extendTailwindMerge: _extendTailwindMerge,
1616
twJoin: _twJoin,
1717
twMerge: _twMerge,
1818
version: 3,
1919
})
2020

21-
const { twMerge, twJoin, extendTailwindMerge, createTailwindMerge } = create()
21+
const {
22+
version: tailwindMergeVersion,
23+
twMerge,
24+
twJoin,
25+
extendTailwindMerge,
26+
createTailwindMerge,
27+
} = create()
2228

2329
export {
2430
create,
2531
createTailwindMerge,
2632
extendTailwindMerge,
2733
getDefaultConfig,
2834
mergeConfigs,
35+
tailwindMergeVersion,
2936
twJoin,
3037
twMerge,
3138
weappTwIgnore,

0 commit comments

Comments
 (0)