Skip to content

Commit 20600d4

Browse files
committed
chore: commit preserveFunction fn demo
1 parent 6cf745d commit 20600d4

File tree

13 files changed

+616
-133
lines changed

13 files changed

+616
-133
lines changed

apps/vite-react/.tw-patch/tw-class-list.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
"before:rounded-full",
2525
"before:to-transparent",
2626
"before:w-[480px]",
27+
"bg-[#B91C1C]",
2728
"bg-gradient-to-b",
2829
"bg-gradient-to-t",
30+
"bg-red-100",
2931
"border",
3032
"border-b",
3133
"border-gray-300",
@@ -51,6 +53,7 @@
5153
"group-hover:translate-x-1",
5254
"h-48",
5355
"hover:bg-gray-100",
56+
"hover:bg-red-800",
5457
"hover:border-gray-300",
5558
"hover:dark:bg-neutral-800/30",
5659
"hover:dark:border-neutral-700",
@@ -84,12 +87,15 @@
8487
"motion-reduce:transform-none",
8588
"opacity-50",
8689
"p-24",
90+
"p-3",
8791
"p-8",
8892
"pb-6",
8993
"place-items-center",
9094
"pointer-events-none",
9195
"pt-8",
96+
"px-2",
9297
"px-5",
98+
"py-1",
9399
"py-4",
94100
"relative",
95101
"rounded-lg",

apps/vite-react/src/App.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import { useState } from 'react'
2+
import { twMerge } from 'tailwind-merge'
23
import reactLogo from './assets/react.svg'
3-
44
import './App.css'
5+
// 'hover:bg-dark-red p-3 bg-[#B91C1C]'
6+
const aaa = twMerge('px-2 py-1 bg-red-100 hover:bg-red-800', 'p-3 bg-[#B91C1C]')
57

68
function App() {
79
const [count, setCount] = useState(0)
810

911
return (
1012
<main className="flex min-h-screen flex-col items-center justify-between p-24">
13+
<nav className={aaa}>{aaa}</nav>
1114
<div className="z-10 w-full max-w-5xl items-center justify-between font-mono text-sm lg:flex">
1215
<p className="fixed left-0 top-0 flex w-full justify-center border-b border-gray-300 bg-gradient-to-b from-zinc-200 pb-6 pt-8 backdrop-blur-2xl dark:border-neutral-800 dark:bg-zinc-800/30 dark:from-inherit lg:static lg:w-auto lg:rounded-xl lg:border lg:bg-gray-200 lg:p-4 lg:dark:bg-zinc-800/30">
1316
Get started by editing&nbsp;
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
import { defineConfig } from 'tailwindcss-patch'
22

3-
export default defineConfig({})
3+
export default defineConfig({
4+
mangle: {
5+
preserveFunction: ['twMerge']
6+
}
7+
})

packages/core/src/ctx/index.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ export class Context {
5252
return this.preserveFunctionSet.has(calleeName)
5353
}
5454

55-
private mergeOptions(opts?: MangleUserConfig) {
55+
private mergeOptions(...opts: (MangleUserConfig | undefined)[]) {
5656
// 配置选项优先
57-
this.options = defu(this.options, opts)
57+
this.options = defu(this.options, ...opts)
5858
this.includeMatcher = createGlobMatcher(this.options.include, true)
5959
this.excludeMatcher = createGlobMatcher(this.options.exclude, false)
6060
this.classGenerator = new ClassGenerator(this.options.classGenerator)
61-
this.preserveFunctionSet = new Set(opts?.preserveFunction ?? [])
61+
this.preserveFunctionSet = new Set(this.options?.preserveFunction ?? [])
6262
this.preserveFunctionRegexs = [...this.preserveFunctionSet.values()].map((x) => {
6363
return new RegExp(escapeStringRegexp(x) + '\\(([^)]*)\\)', 'g')
6464
})
@@ -96,8 +96,8 @@ export class Context {
9696
async initConfig(opts: InitConfigOptions = {}) {
9797
const { cwd, classList: _classList, mangleOptions } = opts
9898
const { config, cwd: configCwd } = await getConfig(cwd)
99-
const mangleConfig = mangleOptions ?? config?.mangle
100-
this.mergeOptions(mangleConfig)
99+
100+
this.mergeOptions(mangleOptions, config?.mangle)
101101
if (_classList) {
102102
const classList = sort(_classList).desc((c) => c.length)
103103
for (const className of classList) {

packages/core/test/__snapshots__/js.test.ts.snap

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,177 @@ exports[`js handler > trailing slash case 1 1`] = `"document.querySelector(\\"#a
744744
745745
exports[`js handler > trailing slash case 2 1`] = `"document.querySelector(\\"#app\\").classList.add(\\"tw-a tw-b tw-a s tw-a\\");"`;
746746
747+
exports[`js handler > ts vanilla-0 1`] = `
748+
"import './style.css'
749+
import typescriptLogo from './typescript.svg'
750+
751+
import { setupCounter } from './counter'
752+
753+
document.querySelector<HTMLDivElement>('#app')!.innerHTML = \`
754+
<main class=\\"flex tw-fb tw-yb tw-cb tw-ra tw-mc\\">
755+
<div class=\\"tw-rc tw-gc tw-ub tw-cb tw-ra tw-ob tw-cc tw-ac\\">
756+
<p
757+
class=\\"fixed tw-dc tw-jc flex tw-gc tw-va tw-wb tw-pa tw-ja tw-za tw-nc tw-oc tw-ca tw-l tw-v tw-ea tw-sb tw-tb tw-ab tw-qb tw-wa tw-fc tw-m\\">
758+
Get started by editing&nbsp;
759+
<code class=\\"tw-ob tw-nb\\">pages/index.tsx</code>
760+
</p>
761+
<div
762+
class=\\"fixed tw-xb tw-dc flex tw-kc tw-gc tw-pb tw-va tw-ka tw-jb tw-vb tw-qa tw-ua tw-sb tw-rb tw-tb tw-kb\\">
763+
<a class=\\"tw-w flex tw-ba tw-hc tw-tc tw-n tw-ec\\"
764+
href=\\"https://vercel.com?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
765+
target=\\"_blank\\" rel=\\"noopener noreferrer\\">
766+
By
767+
<img src=\\"\${typescriptLogo}\\" alt=\\"Vercel Logo\\" class=\\"tw-hb\\" priority />
768+
</a>
769+
</div>
770+
</div>
771+
772+
<div
773+
class=\\"relative flex tw-ba tw-na tw-ha tw-ia tw-k tw-u before:bg-gradient-radial tw-da tw-p tw-oa tw-s tw-sa tw-gb tw-la tw-ma tw-o after:bg-gradient-conic tw-y tw-z tw-ta tw-x tw-b tw-d tw-h tw-j tw-g tw-t\\">
774+
<img class=\\"relative tw-a tw-hb\\" src=\\"/vite.svg\\" alt=\\"Next.js Logo\\"
775+
priority />
776+
</div>
777+
778+
<div class=\\"tw-ic grid tw-ib tw-bc tw-xa tw-db\\">
779+
<a href=\\"https://nextjs.org/docs?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
780+
class=\\"group tw-mb border tw-aa tw-pc tw-qc tw-ga tw-q tw-fa tw-c tw-e\\"
781+
target=\\"_blank\\" rel=\\"noopener noreferrer\\">
782+
<h2 class=\\"tw-lc tw-zb tw-ya\\">
783+
Docs <span
784+
class=\\"tw-bb tw-r tw-i tw-f\\">-&gt;</span>
785+
</h2>
786+
<p class=\\"tw-sc tw-eb tw-cc tw-lb\\">Find in-depth information about Next.js
787+
features and API.</p>
788+
</a>
789+
790+
<a href=\\"https://nextjs.org/learn?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
791+
class=\\"group tw-mb border tw-aa tw-pc tw-qc tw-ga tw-q tw-fa tw-c tw-e\\"
792+
target=\\"_blank\\" rel=\\"noopener noreferrer\\">
793+
<h2 class=\\"tw-lc tw-zb tw-ya\\">
794+
Learn <span
795+
class=\\"tw-bb tw-r tw-i tw-f\\">-&gt;</span>
796+
</h2>
797+
<p class=\\"tw-sc tw-eb tw-cc tw-lb\\">Learn about Next.js in an interactive
798+
course with&nbsp;quizzes!</p>
799+
</a>
800+
801+
<a href=\\"https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
802+
class=\\"group tw-mb border tw-aa tw-pc tw-qc tw-ga tw-q tw-fa tw-c tw-e\\"
803+
target=\\"_blank\\" rel=\\"noopener noreferrer\\">
804+
<h2 class=\\"tw-lc tw-zb tw-ya\\">
805+
Templates <span
806+
class=\\"tw-bb tw-r tw-i tw-f\\">-&gt;</span>
807+
</h2>
808+
<p class=\\"tw-sc tw-eb tw-cc tw-lb\\">Discover and deploy boilerplate example
809+
Next.js&nbsp;projects.</p>
810+
</a>
811+
812+
<a href=\\"https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
813+
class=\\"group tw-mb border tw-aa tw-pc tw-qc tw-ga tw-q tw-fa tw-c tw-e\\"
814+
target=\\"_blank\\" rel=\\"noopener noreferrer\\">
815+
<h2 class=\\"tw-lc tw-zb tw-ya\\">
816+
Deploy <span
817+
class=\\"tw-bb tw-r tw-i tw-f\\">-&gt;</span>
818+
</h2>
819+
<p class=\\"tw-sc tw-eb tw-cc tw-lb\\">Instantly deploy your Next.js site to a
820+
shareable URL with Vercel.</p>
821+
</a>
822+
</div>
823+
</main>
824+
\`
825+
826+
setupCounter(document.querySelector<HTMLButtonElement>('#counter')!)
827+
"
828+
`;
829+
830+
exports[`js handler > tsx app0 1`] = `
831+
"import { useState } from 'react'
832+
import reactLogo from './assets/react.svg'
833+
834+
import './App.css'
835+
836+
function App() {
837+
const [count, setCount] = useState(0)
838+
839+
return (
840+
<main className=\\"flex tw-fb tw-zb tw-cb tw-ra tw-nc\\">
841+
<div className=\\"tw-sc tw-hc tw-vb tw-cb tw-ra tw-pb tw-dc tw-bc\\">
842+
<p className=\\"fixed tw-ec tw-kc flex tw-hc tw-va tw-xb tw-pa tw-ja tw-za tw-oc tw-pc tw-ca tw-l tw-v tw-ea tw-tb tw-ub tw-ab tw-rb tw-wa tw-gc tw-m\\">
843+
Get started by editing&nbsp;
844+
<code className=\\"tw-pb tw-ob\\">pages/index.tsx</code>
845+
</p>
846+
<div className=\\"fixed tw-yb tw-ec flex tw-lc tw-hc tw-qb tw-va tw-ka tw-jb tw-wb tw-qa tw-ua tw-tb tw-sb tw-ub tw-kb\\">
847+
<a
848+
className=\\"tw-w flex tw-ba tw-ic tw-uc tw-n tw-fc\\"
849+
href=\\"https://vercel.com?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
850+
target=\\"_blank\\"
851+
rel=\\"noopener noreferrer\\"
852+
>
853+
By <img src=\\"/vite.svg\\" alt=\\"Vercel Logo\\" className=\\"tw-hb\\" width={100} height={24} />
854+
</a>
855+
</div>
856+
</div>
857+
858+
<div className=\\"relative flex tw-ba tw-na tw-ha tw-ia tw-k tw-u before:bg-gradient-radial tw-da tw-p tw-oa tw-s tw-sa tw-gb tw-la tw-ma tw-o after:bg-gradient-conic tw-y tw-z tw-ta tw-x tw-b tw-d tw-h tw-j tw-g tw-t\\">
859+
<img className=\\"relative tw-a tw-hb\\" src={reactLogo} alt=\\"Next.js Logo\\" width={180} height={37} />
860+
</div>
861+
862+
<div className=\\"tw-jc grid tw-ib tw-cc tw-xa tw-db\\">
863+
<a
864+
href=\\"https://nextjs.org/docs?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
865+
className=\\"group tw-mb border tw-aa tw-qc tw-rc tw-ga tw-q tw-fa tw-c tw-e\\"
866+
target=\\"_blank\\"
867+
rel=\\"noopener noreferrer\\"
868+
>
869+
<h2 className={\` tw-mc tw-ac tw-ya\`}>
870+
Docs <span className=\\"tw-bb tw-r tw-i tw-f\\">-&gt;</span>
871+
</h2>
872+
<p className={\` tw-tc tw-eb tw-dc tw-lb\`}>Find in-depth information about Next.js features and API.</p>
873+
</a>
874+
875+
<a
876+
href=\\"https://nextjs.org/learn?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
877+
className=\\"group tw-mb border tw-aa tw-qc tw-rc tw-ga tw-q tw-fa tw-c tw-e\\"
878+
target=\\"_blank\\"
879+
rel=\\"noopener noreferrer\\"
880+
>
881+
<h2 className={\` tw-mc tw-ac tw-ya\`}>
882+
Learn <span className=\\"tw-bb tw-r tw-i tw-f\\">-&gt;</span>
883+
</h2>
884+
<p className={\` tw-tc tw-eb tw-dc tw-lb\`}>Learn about Next.js in an interactive course with&nbsp;quizzes!</p>
885+
</a>
886+
887+
<a
888+
href=\\"https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
889+
className=\\"group tw-mb border tw-aa tw-qc tw-rc tw-ga tw-q tw-fa tw-c tw-e\\"
890+
target=\\"_blank\\"
891+
rel=\\"noopener noreferrer\\"
892+
>
893+
<h2 className={\` tw-mc tw-ac tw-ya\`}>
894+
Templates <span className=\\"tw-bb tw-r tw-i tw-f\\">-&gt;</span>
895+
</h2>
896+
<p className={\` tw-tc tw-eb tw-dc tw-lb\`}>Discover and deploy boilerplate example Next.js&nbsp;projects.</p>
897+
</a>
898+
899+
<a
900+
href=\\"https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app\\"
901+
className=\\"group tw-mb border tw-aa tw-qc tw-rc tw-ga tw-q tw-fa tw-c tw-e\\"
902+
target=\\"_blank\\"
903+
rel=\\"noopener noreferrer\\"
904+
>
905+
<h2 className={\` tw-mc tw-ac tw-ya\`}>
906+
Deploy <span className=\\"tw-bb tw-r tw-i tw-f\\">-&gt;</span>
907+
</h2>
908+
<p className={\` tw-tc tw-eb tw-dc tw-lb\`}>Instantly deploy your Next.js site to a shareable URL with Vercel.</p>
909+
</a>
910+
</div>
911+
</main>
912+
)
913+
}
914+
915+
export default App"
916+
`;
917+
747918
exports[`js handler > z-10 not transform 1`] = `
748919
"{
749920
className: \\"tw-a tw-b tw-c tw-d tw-e tw-f tw-g tw-h\\";

packages/core/test/fixtures/app0.json

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
[
2+
"after:-z-20",
3+
"after:absolute",
4+
"after:blur-2xl",
5+
"after:content-['']",
6+
"after:dark:from-sky-900",
7+
"after:dark:via-[#0141ff]/40",
8+
"after:from-sky-200",
9+
"after:h-[180px]",
10+
"after:translate-x-1/3",
11+
"after:via-blue-200",
12+
"after:w-[240px]",
13+
"backdrop-blur-2xl",
14+
"before:-translate-x-1/2",
15+
"before:absolute",
16+
"before:blur-2xl",
17+
"before:content-['']",
18+
"before:dark:bg-gradient-to-br",
19+
"before:dark:from-transparent",
20+
"before:dark:to-blue-700/10",
21+
"before:from-white",
22+
"before:h-[300px]",
23+
"before:lg:h-[360px]",
24+
"before:rounded-full",
25+
"before:to-transparent",
26+
"before:w-[480px]",
27+
"bg-gradient-to-b",
28+
"bg-gradient-to-t",
29+
"border",
30+
"border-b",
31+
"border-gray-300",
32+
"border-transparent",
33+
"bottom-0",
34+
"dark:bg-zinc-800/30",
35+
"dark:border-neutral-800",
36+
"dark:drop-shadow-[0_0_0.3rem_#ffffff70]",
37+
"dark:from-black",
38+
"dark:from-inherit",
39+
"dark:invert",
40+
"dark:via-black",
41+
"fixed",
42+
"flex",
43+
"flex-col",
44+
"font-bold",
45+
"font-mono",
46+
"font-semibold",
47+
"from-white",
48+
"from-zinc-200",
49+
"gap-2",
50+
"grid",
51+
"group-hover:translate-x-1",
52+
"h-48",
53+
"hover:bg-gray-100",
54+
"hover:border-gray-300",
55+
"hover:dark:bg-neutral-800/30",
56+
"hover:dark:border-neutral-700",
57+
"inline-block",
58+
"items-center",
59+
"items-end",
60+
"justify-between",
61+
"justify-center",
62+
"left-0",
63+
"lg:bg-gray-200",
64+
"lg:bg-none",
65+
"lg:border",
66+
"lg:dark:bg-zinc-800/30",
67+
"lg:flex",
68+
"lg:grid-cols-4",
69+
"lg:h-auto",
70+
"lg:mb-0",
71+
"lg:p-0",
72+
"lg:p-4",
73+
"lg:pointer-events-auto",
74+
"lg:rounded-xl",
75+
"lg:static",
76+
"lg:text-left",
77+
"lg:w-auto",
78+
"m-0",
79+
"max-w-5xl",
80+
"max-w-[30ch]",
81+
"mb-3",
82+
"mb-32",
83+
"min-h-screen",
84+
"motion-reduce:transform-none",
85+
"opacity-50",
86+
"p-24",
87+
"p-8",
88+
"pb-6",
89+
"place-items-center",
90+
"pointer-events-none",
91+
"pt-8",
92+
"px-5",
93+
"py-4",
94+
"relative",
95+
"rounded-lg",
96+
"text-2xl",
97+
"text-[red]",
98+
"text-center",
99+
"text-sm",
100+
"top-0",
101+
"transition-colors",
102+
"transition-transform",
103+
"via-white",
104+
"w-full",
105+
"z-10"
106+
]

0 commit comments

Comments
 (0)