Skip to content

Commit 553e8c3

Browse files
committed
fix: start of line not mangle bug
1 parent b5b5e91 commit 553e8c3

File tree

7 files changed

+119
-18
lines changed

7 files changed

+119
-18
lines changed

apps/vite-react/src/App.tsx

+70-16
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,84 @@
11
import { useState } from 'react'
22
import reactLogo from './assets/react.svg'
3-
import viteLogo from '/vite.svg'
3+
44
import './App.css'
55

66
function App() {
77
const [count, setCount] = useState(0)
88

99
return (
10-
<div className="App">
11-
<div className="flex justify-between">
12-
<a href="https://vitejs.dev" target="_blank">
13-
<img src={viteLogo} className="logo" alt="Vite logo" />
10+
<main className="flex min-h-screen flex-col items-center justify-between p-24">
11+
<div className="z-10 w-full max-w-5xl items-center justify-between font-mono text-sm lg:flex">
12+
<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">
13+
Get started by editing&nbsp;
14+
<code className="font-mono font-bold">pages/index.tsx</code>
15+
</p>
16+
<div className="fixed bottom-0 left-0 flex h-48 w-full items-end justify-center bg-gradient-to-t from-white via-white dark:from-black dark:via-black lg:static lg:h-auto lg:w-auto lg:bg-none">
17+
<a
18+
className="pointer-events-none flex place-items-center gap-2 p-8 lg:pointer-events-auto lg:p-0"
19+
href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app"
20+
target="_blank"
21+
rel="noopener noreferrer"
22+
>
23+
By <img src="/vite.svg" alt="Vercel Logo" className="dark:invert" width={100} height={24} />
24+
</a>
25+
</div>
26+
</div>
27+
28+
<div className="relative flex place-items-center before:absolute before:h-[300px] before:w-[480px] before:-translate-x-1/2 before:rounded-full before:bg-gradient-radial before:from-white before:to-transparent before:blur-2xl before:content-[''] after:absolute after:-z-20 after:h-[180px] after:w-[240px] after:translate-x-1/3 after:bg-gradient-conic after:from-sky-200 after:via-blue-200 after:blur-2xl after:content-[''] before:dark:bg-gradient-to-br before:dark:from-transparent before:dark:to-blue-700/10 after:dark:from-sky-900 after:dark:via-[#0141ff]/40 before:lg:h-[360px]">
29+
<img className="relative dark:drop-shadow-[0_0_0.3rem_#ffffff70] dark:invert" src={reactLogo} alt="Next.js Logo" width={180} height={37} />
30+
</div>
31+
32+
<div className="mb-32 grid text-center lg:mb-0 lg:grid-cols-4 lg:text-left">
33+
<a
34+
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app"
35+
className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
36+
target="_blank"
37+
rel="noopener noreferrer"
38+
>
39+
<h2 className={` mb-3 text-2xl font-semibold`}>
40+
Docs <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">-&gt;</span>
41+
</h2>
42+
<p className={` m-0 max-w-[30ch] text-sm opacity-50`}>Find in-depth information about Next.js features and API.</p>
1443
</a>
15-
<a href="https://reactjs.org" target="_blank">
16-
<img src={reactLogo} className="logo react" alt="React logo" />
44+
45+
<a
46+
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app"
47+
className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
48+
target="_blank"
49+
rel="noopener noreferrer"
50+
>
51+
<h2 className={` mb-3 text-2xl font-semibold`}>
52+
Learn <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">-&gt;</span>
53+
</h2>
54+
<p className={` m-0 max-w-[30ch] text-sm opacity-50`}>Learn about Next.js in an interactive course with&nbsp;quizzes!</p>
55+
</a>
56+
57+
<a
58+
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app"
59+
className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
60+
target="_blank"
61+
rel="noopener noreferrer"
62+
>
63+
<h2 className={` mb-3 text-2xl font-semibold`}>
64+
Templates <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">-&gt;</span>
65+
</h2>
66+
<p className={` m-0 max-w-[30ch] text-sm opacity-50`}>Discover and deploy boilerplate example Next.js&nbsp;projects.</p>
67+
</a>
68+
69+
<a
70+
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template-tw&utm_campaign=create-next-app"
71+
className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
72+
target="_blank"
73+
rel="noopener noreferrer"
74+
>
75+
<h2 className={` mb-3 text-2xl font-semibold`}>
76+
Deploy <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">-&gt;</span>
77+
</h2>
78+
<p className={` m-0 max-w-[30ch] text-sm opacity-50`}>Instantly deploy your Next.js site to a shareable URL with Vercel.</p>
1779
</a>
1880
</div>
19-
<h1 className="text-[#123456]">Vite + React</h1>
20-
<div className="card bg-[#123456]">
21-
<button onClick={() => setCount((count) => count + 1)}>count is {count}</button>
22-
<p>
23-
Edit <code>src/App.tsx</code> and save to test HMR
24-
</p>
25-
</div>
26-
<p className="read-the-docs">Click on the Vite and React logos to learn more</p>
27-
</div>
81+
</main>
2882
)
2983
}
3084

packages/unplugin-tailwindcss-mangle/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
mangle tailwindcss utilities plugin
44

5-
> Now Support `vite` and `webpack`
5+
> Now Support `vite` and `webpack`(Experiment!)
66
77
- [unplugin-tailwindcss-mangle](#unplugin-tailwindcss-mangle)
88
- [Features](#features)

packages/unplugin-tailwindcss-mangle/src/js/index.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ function getDefaultExportFromNamespaceIfPresent(n: any) {
1313
const generate = getDefaultExportFromNamespaceIfPresent(_generate) as typeof _generate
1414
const traverse = getDefaultExportFromNamespaceIfPresent(_traverse) as typeof _traverse
1515

16+
export function makeRegex(str: string) {
17+
return new RegExp('(?<=^|[\\s"])' + escapeStringRegexp(str), 'g')
18+
}
19+
1620
export function handleValue(str: string, node: StringLiteral | TemplateElement, options: IHandlerOptions) {
1721
const set = options.runtimeSet
1822
const clsGen = options.classGenerator
@@ -27,7 +31,7 @@ export function handleValue(str: string, node: StringLiteral | TemplateElement,
2731
}
2832

2933
if (!ignoreFlag) {
30-
rawStr = rawStr.replace(new RegExp('(?<="|\\s)' + escapeStringRegexp(v), 'g'), clsGen.generateClassName(v).name)
34+
rawStr = rawStr.replace(makeRegex(v), clsGen.generateClassName(v).name)
3135
}
3236
}
3337
}

packages/unplugin-tailwindcss-mangle/test/__snapshots__/js.test.ts.snap

+6
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,9 @@ exports[`js handler common TemplateElement 1`] = `
66
"const counter = 0;
77
element.innerHTML = \`<div class="tw-a tw-b">count is \${counter}</div>\`;"
88
`;
9+
10+
exports[`js handler z-10 not transform 1`] = `
11+
"{
12+
className: "tw-a tw-b tw-c tw-d tw-e tw-f tw-g tw-h";
13+
}"
14+
`;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`regex z-10 regex 1`] = `
4+
[
5+
[
6+
"z-10",
7+
],
8+
]
9+
`;

packages/unplugin-tailwindcss-mangle/test/js.test.ts

+17
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,21 @@ describe('js handler', () => {
2828
}).code
2929
expect(code).toMatchSnapshot()
3030
})
31+
32+
it('z-10 not transform', () => {
33+
const classGenerator = new ClassGenerator()
34+
const runtimeSet = new Set<string>()
35+
const arr = 'z-10 w-full max-w-5xl items-center justify-between font-mono text-sm lg:flex'.split(' ')
36+
for (let i = 0; i < arr.length; i++) {
37+
const element = arr[i]
38+
runtimeSet.add(element)
39+
}
40+
41+
const testCase = `{ className: "z-10 w-full max-w-5xl items-center justify-between font-mono text-sm lg:flex" }`
42+
const code = jsHandler(testCase, {
43+
classGenerator,
44+
runtimeSet
45+
}).code
46+
expect(code).toMatchSnapshot()
47+
})
3148
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// import { escapeStringRegexp } from '../src/utils'
2+
import { makeRegex } from '../src/js/index'
3+
describe('regex', () => {
4+
it('z-10 regex', () => {
5+
const testCase = 'z-10 w-full max-w-5xl items-center justify-between font-mono text-sm lg:flex'
6+
const regex = makeRegex('z-10')
7+
const arr = Array.from(testCase.matchAll(regex))
8+
expect(arr.length).toBe(1)
9+
expect(arr).toMatchSnapshot()
10+
})
11+
})

0 commit comments

Comments
 (0)