Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions packages/@tailwindcss-upgrade/src/migrate-js-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { resolveConfig, type ConfigFile } from '../../tailwindcss/src/compat/con
import type { ThemeConfig } from '../../tailwindcss/src/compat/config/types'
import { darkModePlugin } from '../../tailwindcss/src/compat/dark-mode'
import type { DesignSystem } from '../../tailwindcss/src/design-system'
import { findStaticPlugins } from './utils/extract-static-plugins'
import { findStaticPlugins, type StaticPluginOptions } from './utils/extract-static-plugins'
import { info } from './utils/renderer'

const __filename = fileURLToPath(import.meta.url)
Expand Down Expand Up @@ -46,7 +46,7 @@ export async function migrateJsConfig(
}

let sources: { base: string; pattern: string }[] = []
let plugins: { base: string; path: string }[] = []
let plugins: { base: string; path: string; options: null | StaticPluginOptions }[] = []
let cssConfigs: string[] = []

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

let simplePlugins = findStaticPlugins(source)
if (simplePlugins !== null) {
for (let plugin of simplePlugins) {
plugins.push({ base, path: plugin })
for (let [path, options] of simplePlugins) {
plugins.push({ base, path, options })
}
}

Expand Down
235 changes: 194 additions & 41 deletions packages/@tailwindcss-upgrade/src/utils/extract-static-plugins.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,44 @@ describe('findStaticPlugins', () => {
expect(
findStaticPlugins(js`
import plugin1 from './plugin1'
import * as plugin2 from './plugin2'

export default {
plugins: [plugin1, plugin2, 'plugin3', require('./plugin4')]
plugins: [plugin1, 'plugin2', require('./plugin3')]
}
`),
).toEqual(['./plugin1', './plugin2', 'plugin3', './plugin4'])
).toEqual([
['./plugin1', null],
['plugin2', null],
['./plugin3', null],
])

expect(
findStaticPlugins(js`
import plugin1 from './plugin1'
import * as plugin2 from './plugin2'

export default {
plugins: [plugin1, plugin2, 'plugin3', require('./plugin4')]
plugins: [plugin1, 'plugin2', require('./plugin3')]
} as any
`),
).toEqual(['./plugin1', './plugin2', 'plugin3', './plugin4'])
).toEqual([
['./plugin1', null],
['plugin2', null],
['./plugin3', null],
])

expect(
findStaticPlugins(js`
import plugin1 from './plugin1'
import * as plugin2 from './plugin2'

export default {
plugins: [plugin1, plugin2, 'plugin3', require('./plugin4')]
plugins: [plugin1, 'plugin2', require('./plugin3')]
} satisfies any
`),
).toEqual(['./plugin1', './plugin2', 'plugin3', './plugin4'])
).toEqual([
['./plugin1', null],
['plugin2', null],
['./plugin3', null],
])

expect(
findStaticPlugins(js`
Expand All @@ -47,7 +56,11 @@ describe('findStaticPlugins', () => {
plugins: [plugin1, 'plugin2', require('./plugin3')]
} as any
`),
).toEqual(['./plugin1', 'plugin2', './plugin3'])
).toEqual([
['./plugin1', null],
['plugin2', null],
['./plugin3', null],
])

expect(
findStaticPlugins(js`
Expand All @@ -57,7 +70,11 @@ describe('findStaticPlugins', () => {
plugins: [plugin1, 'plugin2', require('./plugin3')]
} satisfies any
`),
).toEqual(['./plugin1', 'plugin2', './plugin3'])
).toEqual([
['./plugin1', null],
['plugin2', null],
['./plugin3', null],
])

expect(
findStaticPlugins(js`
Expand All @@ -67,68 +84,204 @@ describe('findStaticPlugins', () => {
plugins: [plugin1, 'plugin2', require('./plugin3')]
}
`),
).toEqual(['./plugin1', 'plugin2', './plugin3'])
).toEqual([
['./plugin1', null],
['plugin2', null],
['./plugin3', null],
])
})

test('bails out on inline plugins', () => {
test('can extract plugin options', () => {
expect(
findStaticPlugins(js`
import plugin1 from './plugin1'
import plugin1 from './plugin1'
import plugin2 from './plugin2'

export default {
plugins: [plugin1, () => {} ]
}
export default {
plugins: [
plugin1({
foo: 'bar',
}),
plugin2(),
require('./plugin3')({
foo: 'bar',
}),
]
}
`),
).toEqual(null)
).toEqual([
['./plugin1', { foo: 'bar' }],
['./plugin2', null],
['./plugin3', { foo: 'bar' }],
])
})

test('can extract all supported data types', () => {
expect(
findStaticPlugins(js`
let plugin1 = () => {}
import plugin from 'plugin'

export default {
plugins: [plugin1]
}
export default {
plugins: [
plugin({
'is-arr-mixed': [null, true, false, 1234567, 1.35, 'foo', 'bar', 'true'],
'is-arr': ['foo', 'bar'],
'is-null': null,
'is-true': true,
'is-false': false,
'is-int': 1234567,
'is-float': 1.35,
'is-sci': 1.35e-5,
'is-str-null': 'null',
'is-str-true': 'true',
'is-str-false': 'false',
'is-str-int': '1234567',
'is-str-float': '1.35',
'is-str-sci': '1.35e-5',
}),
]
}
`),
).toEqual([
[
'plugin',
{
'is-arr-mixed': [null, true, false, 1234567, 1.35, 'foo', 'bar', 'true'],
'is-arr': ['foo', 'bar'],
'is-null': null,
'is-true': true,
'is-false': false,
'is-int': 1234567,
'is-float': 1.35,
'is-sci': 1.35e-5,
'is-str-null': 'null',
'is-str-true': 'true',
'is-str-false': 'false',
'is-str-int': '1234567',
'is-str-float': '1.35',
'is-str-sci': '1.35e-5',
},
],
])
})

test('bails out on import * as import', () => {
expect(
findStaticPlugins(js`
import * as plugin from './plugin'

export default {
plugins: [plugin]
}
`),
).toEqual(null)
})

test('bails out on inline plugins', () => {
expect(
findStaticPlugins(js`
import plugin1 from './plugin1'

export default {
plugins: [plugin1, () => {} ]
}
`),
).toEqual(null)

expect(
findStaticPlugins(js`
let plugin1 = () => {}

export default {
plugins: [plugin1]
}
`),
).toEqual(null)
})

test('bails out on non `require` calls', () => {
expect(
findStaticPlugins(js`
export default {
plugins: [frequire('./plugin1')]
}
`),
export default {
plugins: [load('./plugin1')]
}
`),
).toEqual(null)
})

test('bails out on named imports for plugins', () => {
expect(
findStaticPlugins(js`
import {plugin1} from './plugin1'
import {plugin1} from './plugin1'

export default {
plugins: [plugin1]
}
`),
export default {
plugins: [plugin1]
}
`),
).toEqual(null)
})

test('bails for plugins with options', () => {
test('bails on invalid plugin options', () => {
expect(
findStaticPlugins(js`
import plugin1 from './plugin1'
import plugin from './plugin'

export default {
plugins: [
plugin({ foo }),
]
}
`),
).toEqual(null)

expect(
findStaticPlugins(js`
import plugin from './plugin'

export default {
plugins: [
plugin({ foo: { bar: 2 } }),
]
}
`),
).toEqual(null)

expect(
findStaticPlugins(js`
import plugin from './plugin'

export default {
plugins: [
plugin({ foo: ${'`bar${""}`'} }),
]
}
`),
).toEqual(null)

expect(
findStaticPlugins(js`
import plugin from './plugin'

const OPTIONS = { foo: 1 }

export default {
plugins: [plugin1({foo:'bar'})]
plugins: [
plugin(OPTIONS),
]
}
`),
).toEqual(null)

expect(
findStaticPlugins(js`
import plugin from './plugin'

let something = 1

export default {
plugins: [require('@tailwindcss/typography')({foo:'bar'})]
plugins: [
plugin({ foo: something }),
]
}
`),
).toEqual(null)
Expand All @@ -137,16 +290,16 @@ describe('findStaticPlugins', () => {
test('returns no plugins if none are exported', () => {
expect(
findStaticPlugins(js`
export default {
plugins: []
}
`),
export default {
plugins: []
}
`),
).toEqual([])

expect(
findStaticPlugins(js`
export default {}
`),
export default {}
`),
).toEqual([])
})
})
Expand Down
Loading