Skip to content

Commit 85aa461

Browse files
Include simple config objects when extracting static plugins
1 parent b701ed6 commit 85aa461

File tree

3 files changed

+421
-85
lines changed

3 files changed

+421
-85
lines changed

packages/@tailwindcss-upgrade/src/migrate-js-config.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { resolveConfig, type ConfigFile } from '../../tailwindcss/src/compat/con
1414
import type { ThemeConfig } from '../../tailwindcss/src/compat/config/types'
1515
import { darkModePlugin } from '../../tailwindcss/src/compat/dark-mode'
1616
import type { DesignSystem } from '../../tailwindcss/src/design-system'
17-
import { findStaticPlugins } from './utils/extract-static-plugins'
17+
import { findStaticPlugins, type StaticPluginOptions } from './utils/extract-static-plugins'
1818
import { info } from './utils/renderer'
1919

2020
const __filename = fileURLToPath(import.meta.url)
@@ -46,7 +46,7 @@ export async function migrateJsConfig(
4646
}
4747

4848
let sources: { base: string; pattern: string }[] = []
49-
let plugins: { base: string; path: string }[] = []
49+
let plugins: { base: string; path: string; options: null | StaticPluginOptions }[] = []
5050
let cssConfigs: string[] = []
5151

5252
if ('darkMode' in unresolvedConfig) {
@@ -64,8 +64,8 @@ export async function migrateJsConfig(
6464

6565
let simplePlugins = findStaticPlugins(source)
6666
if (simplePlugins !== null) {
67-
for (let plugin of simplePlugins) {
68-
plugins.push({ base, path: plugin })
67+
for (let [path, options] of simplePlugins) {
68+
plugins.push({ base, path, options })
6969
}
7070
}
7171

packages/@tailwindcss-upgrade/src/utils/extract-static-plugins.test.ts

Lines changed: 194 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,35 +9,44 @@ describe('findStaticPlugins', () => {
99
expect(
1010
findStaticPlugins(js`
1111
import plugin1 from './plugin1'
12-
import * as plugin2 from './plugin2'
1312
1413
export default {
15-
plugins: [plugin1, plugin2, 'plugin3', require('./plugin4')]
14+
plugins: [plugin1, 'plugin2', require('./plugin3')]
1615
}
1716
`),
18-
).toEqual(['./plugin1', './plugin2', 'plugin3', './plugin4'])
17+
).toEqual([
18+
['./plugin1', null],
19+
['plugin2', null],
20+
['./plugin3', null],
21+
])
1922

2023
expect(
2124
findStaticPlugins(js`
2225
import plugin1 from './plugin1'
23-
import * as plugin2 from './plugin2'
2426
2527
export default {
26-
plugins: [plugin1, plugin2, 'plugin3', require('./plugin4')]
28+
plugins: [plugin1, 'plugin2', require('./plugin3')]
2729
} as any
2830
`),
29-
).toEqual(['./plugin1', './plugin2', 'plugin3', './plugin4'])
31+
).toEqual([
32+
['./plugin1', null],
33+
['plugin2', null],
34+
['./plugin3', null],
35+
])
3036

3137
expect(
3238
findStaticPlugins(js`
3339
import plugin1 from './plugin1'
34-
import * as plugin2 from './plugin2'
3540
3641
export default {
37-
plugins: [plugin1, plugin2, 'plugin3', require('./plugin4')]
42+
plugins: [plugin1, 'plugin2', require('./plugin3')]
3843
} satisfies any
3944
`),
40-
).toEqual(['./plugin1', './plugin2', 'plugin3', './plugin4'])
45+
).toEqual([
46+
['./plugin1', null],
47+
['plugin2', null],
48+
['./plugin3', null],
49+
])
4150

4251
expect(
4352
findStaticPlugins(js`
@@ -47,7 +56,11 @@ describe('findStaticPlugins', () => {
4756
plugins: [plugin1, 'plugin2', require('./plugin3')]
4857
} as any
4958
`),
50-
).toEqual(['./plugin1', 'plugin2', './plugin3'])
59+
).toEqual([
60+
['./plugin1', null],
61+
['plugin2', null],
62+
['./plugin3', null],
63+
])
5164

5265
expect(
5366
findStaticPlugins(js`
@@ -57,7 +70,11 @@ describe('findStaticPlugins', () => {
5770
plugins: [plugin1, 'plugin2', require('./plugin3')]
5871
} satisfies any
5972
`),
60-
).toEqual(['./plugin1', 'plugin2', './plugin3'])
73+
).toEqual([
74+
['./plugin1', null],
75+
['plugin2', null],
76+
['./plugin3', null],
77+
])
6178

6279
expect(
6380
findStaticPlugins(js`
@@ -67,68 +84,204 @@ describe('findStaticPlugins', () => {
6784
plugins: [plugin1, 'plugin2', require('./plugin3')]
6885
}
6986
`),
70-
).toEqual(['./plugin1', 'plugin2', './plugin3'])
87+
).toEqual([
88+
['./plugin1', null],
89+
['plugin2', null],
90+
['./plugin3', null],
91+
])
7192
})
7293

73-
test('bails out on inline plugins', () => {
94+
test('can extract plugin options', () => {
7495
expect(
7596
findStaticPlugins(js`
76-
import plugin1 from './plugin1'
97+
import plugin1 from './plugin1'
98+
import plugin2 from './plugin2'
7799
78-
export default {
79-
plugins: [plugin1, () => {} ]
80-
}
100+
export default {
101+
plugins: [
102+
plugin1({
103+
foo: 'bar',
104+
}),
105+
plugin2(),
106+
require('./plugin3')({
107+
foo: 'bar',
108+
}),
109+
]
110+
}
81111
`),
82-
).toEqual(null)
112+
).toEqual([
113+
['./plugin1', { foo: 'bar' }],
114+
['./plugin2', null],
115+
['./plugin3', { foo: 'bar' }],
116+
])
117+
})
83118

119+
test('can extract all supported data types', () => {
84120
expect(
85121
findStaticPlugins(js`
86-
let plugin1 = () => {}
122+
import plugin from 'plugin'
87123
88-
export default {
89-
plugins: [plugin1]
90-
}
124+
export default {
125+
plugins: [
126+
plugin({
127+
'is-arr-mixed': [null, true, false, 1234567, 1.35, 'foo', 'bar', 'true'],
128+
'is-arr': ['foo', 'bar'],
129+
'is-null': null,
130+
'is-true': true,
131+
'is-false': false,
132+
'is-int': 1234567,
133+
'is-float': 1.35,
134+
'is-sci': 1.35e-5,
135+
'is-str-null': 'null',
136+
'is-str-true': 'true',
137+
'is-str-false': 'false',
138+
'is-str-int': '1234567',
139+
'is-str-float': '1.35',
140+
'is-str-sci': '1.35e-5',
141+
}),
142+
]
143+
}
91144
`),
145+
).toEqual([
146+
[
147+
'plugin',
148+
{
149+
'is-arr-mixed': [null, true, false, 1234567, 1.35, 'foo', 'bar', 'true'],
150+
'is-arr': ['foo', 'bar'],
151+
'is-null': null,
152+
'is-true': true,
153+
'is-false': false,
154+
'is-int': 1234567,
155+
'is-float': 1.35,
156+
'is-sci': 1.35e-5,
157+
'is-str-null': 'null',
158+
'is-str-true': 'true',
159+
'is-str-false': 'false',
160+
'is-str-int': '1234567',
161+
'is-str-float': '1.35',
162+
'is-str-sci': '1.35e-5',
163+
},
164+
],
165+
])
166+
})
167+
168+
test('bails out on import * as import', () => {
169+
expect(
170+
findStaticPlugins(js`
171+
import * as plugin from './plugin'
172+
173+
export default {
174+
plugins: [plugin]
175+
}
176+
`),
177+
).toEqual(null)
178+
})
179+
180+
test('bails out on inline plugins', () => {
181+
expect(
182+
findStaticPlugins(js`
183+
import plugin1 from './plugin1'
184+
185+
export default {
186+
plugins: [plugin1, () => {} ]
187+
}
188+
`),
189+
).toEqual(null)
190+
191+
expect(
192+
findStaticPlugins(js`
193+
let plugin1 = () => {}
194+
195+
export default {
196+
plugins: [plugin1]
197+
}
198+
`),
92199
).toEqual(null)
93200
})
94201

95202
test('bails out on non `require` calls', () => {
96203
expect(
97204
findStaticPlugins(js`
98-
export default {
99-
plugins: [frequire('./plugin1')]
100-
}
101-
`),
205+
export default {
206+
plugins: [falserequire('./plugin1')]
207+
}
208+
`),
102209
).toEqual(null)
103210
})
104211

105212
test('bails out on named imports for plugins', () => {
106213
expect(
107214
findStaticPlugins(js`
108-
import {plugin1} from './plugin1'
215+
import {plugin1} from './plugin1'
109216
110-
export default {
111-
plugins: [plugin1]
112-
}
113-
`),
217+
export default {
218+
plugins: [plugin1]
219+
}
220+
`),
114221
).toEqual(null)
115222
})
116223

117-
test('bails for plugins with options', () => {
224+
test('bails on invalid plugin options', () => {
118225
expect(
119226
findStaticPlugins(js`
120-
import plugin1 from './plugin1'
227+
import plugin from './plugin'
228+
229+
export default {
230+
plugins: [
231+
plugin({ foo }),
232+
]
233+
}
234+
`),
235+
).toEqual(null)
236+
237+
expect(
238+
findStaticPlugins(js`
239+
import plugin from './plugin'
240+
241+
export default {
242+
plugins: [
243+
plugin({ foo: { bar: 2 } }),
244+
]
245+
}
246+
`),
247+
).toEqual(null)
248+
249+
expect(
250+
findStaticPlugins(js`
251+
import plugin from './plugin'
252+
253+
export default {
254+
plugins: [
255+
plugin({ foo: ${'`bar${""}`'} }),
256+
]
257+
}
258+
`),
259+
).toEqual(null)
260+
261+
expect(
262+
findStaticPlugins(js`
263+
import plugin from './plugin'
264+
265+
const OPTIONS = { foo: 1 }
121266
122267
export default {
123-
plugins: [plugin1({foo:'bar'})]
268+
plugins: [
269+
plugin(OPTIONS),
270+
]
124271
}
125272
`),
126273
).toEqual(null)
127274

128275
expect(
129276
findStaticPlugins(js`
277+
import plugin from './plugin'
278+
279+
let something = 1
280+
130281
export default {
131-
plugins: [require('@tailwindcss/typography')({foo:'bar'})]
282+
plugins: [
283+
plugin({ foo: something }),
284+
]
132285
}
133286
`),
134287
).toEqual(null)
@@ -137,16 +290,16 @@ describe('findStaticPlugins', () => {
137290
test('returns no plugins if none are exported', () => {
138291
expect(
139292
findStaticPlugins(js`
140-
export default {
141-
plugins: []
142-
}
143-
`),
293+
export default {
294+
plugins: []
295+
}
296+
`),
144297
).toEqual([])
145298

146299
expect(
147300
findStaticPlugins(js`
148-
export default {}
149-
`),
301+
export default {}
302+
`),
150303
).toEqual([])
151304
})
152305
})

0 commit comments

Comments
 (0)