Skip to content

Commit 5edf6c7

Browse files
Ensure clients pin the tailwindcss version (#15011)
We noticed that in the current alpha 34 release, the `package.json` file of the `@tailwindcss/node` package only defines `tailwindcss` as a dev dependency. This makes it very easy for version mismatches to happen when a v3 version (or an earlier v4 alpha for that matter) was installed in the same project: ```json { "name": "@tailwindcss/node", "version": "4.0.0-alpha.34", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { "type": "git", "url": "https://github.com/tailwindlabs/tailwindcss.git", "directory": "packages/@tailwindcss-node" }, "bugs": "https://github.com/tailwindlabs/tailwindcss/issues", "homepage": "https://tailwindcss.com", "files": [ "dist/" ], "publishConfig": { "provenance": true, "access": "public" }, "exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/index.mjs", "require": "./dist/index.js" }, "./require-cache": { "types": "./dist/require-cache.d.ts", "default": "./dist/require-cache.js" }, "./esm-cache-loader": { "types": "./dist/esm-cache.loader.d.mts", "default": "./dist/esm-cache.loader.mjs" } }, "devDependencies": { "tailwindcss": "4.0.0-alpha.34" }, "dependencies": { "enhanced-resolve": "^5.17.1", "jiti": "^2.0.0-beta.3" }, "scripts": { "build": "tsup-node", "dev": "pnpm run build -- --watch" } } ``` Furthermore, we were trying to fix issues where our integration test setup could not install `tailwindcss@3` because of how we did pnpm overrides. This PR fixes this by: - Ensuring every client that calls into `tailwindcss` core marks it as a version-pinned dependency. You are still required to install `tailwindcss` in your project along side a client (e.g. `@tailwindcss/vite`) but we now only use your installed version for importing the respective `.css` files. For the core logic, we are now requiring each package to use `tailwindcss` at the same version. This should help resolve issues like #14652 - We tried to eliminate the dependency on `tailwindcss` from the `@tailwindcss/upgrade` package. Unfortunately this is not possible to do right now because we need to load the CSS files from v4 to create the right environment. In a future version we could bundle the required CSS files with `@tailwidncss/upgrade` but it doesn't seem necessary for now. - We then changed our integration test overrides to only override the `tailwindcss` package that are dependencies of the known list of packages that we have `tailwindcss` dependencies on: `@tailwindcss/node` and `@tailwindcss/upgrade`. This ensures that we can install v3 of `tailwindcss` in the integration tests and it will work. Something we want to do for some upgrade tests. # Test plan Integration work again. Furthermore we added a quick setup with the CLI using the local tarballs and ensured it works: ```bash pnpm init pnpm install ../../tailwindcss/dist/tailwindcss-cli.tgz pnpm install ../../tailwindcss/dist/tailwindcss.tgz echo '@import "tailwindcss";' > index.css echo '<div class="underline"></div>' > index.html pnpm tailwindcss -i index.css -o out.css cat out.css ```
1 parent 2a6cd94 commit 5edf6c7

28 files changed

+56
-66
lines changed

integrations/upgrade/index.test.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ test(
88
'package.json': json`
99
{
1010
"dependencies": {
11+
"tailwindcss": "^3",
1112
"@tailwindcss/upgrade": "workspace:^"
12-
},
13-
"devDependencies": {
14-
"@tailwindcss/cli": "workspace:^"
1513
}
1614
}
1715
`,
@@ -53,6 +51,7 @@ test(
5351
'package.json': json`
5452
{
5553
"dependencies": {
54+
"tailwindcss": "^3",
5655
"@tailwindcss/upgrade": "workspace:^"
5756
},
5857
"devDependencies": {
@@ -166,6 +165,7 @@ test(
166165
'package.json': json`
167166
{
168167
"dependencies": {
168+
"tailwindcss": "^3",
169169
"@tailwindcss/upgrade": "workspace:^"
170170
}
171171
}
@@ -246,7 +246,7 @@ test(
246246
`,
247247
'tailwind.config.js': js`module.exports = {}`,
248248
'src/index.css': css`
249-
@import 'tailwindcss';
249+
@import 'tailwindcss/tailwind.css';
250250
251251
.a {
252252
@apply flex;
@@ -311,7 +311,7 @@ test(
311311
'package.json': json`
312312
{
313313
"dependencies": {
314-
"tailwindcss": "workspace:^",
314+
"tailwindcss": "^3",
315315
"@tailwindcss/upgrade": "workspace:^"
316316
}
317317
}
@@ -383,14 +383,14 @@ test(
383383
'package.json': json`
384384
{
385385
"dependencies": {
386-
"tailwindcss": "workspace:^",
386+
"tailwindcss": "^3",
387387
"@tailwindcss/upgrade": "workspace:^"
388388
}
389389
}
390390
`,
391391
'tailwind.config.js': js`module.exports = {}`,
392392
'src/index.css': css`
393-
@import 'tailwindcss';
393+
@import 'tailwindcss/tailwind.css';
394394
395395
@layer components {
396396
.btn {
@@ -460,7 +460,7 @@ test(
460460
'package.json': json`
461461
{
462462
"dependencies": {
463-
"tailwindcss": "workspace:^",
463+
"tailwindcss": "^3",
464464
"@tailwindcss/upgrade": "workspace:^"
465465
}
466466
}
@@ -907,6 +907,7 @@ test(
907907
'package.json': json`
908908
{
909909
"dependencies": {
910+
"tailwindcss": "^3",
910911
"@tailwindcss/upgrade": "workspace:^"
911912
}
912913
}

integrations/utils.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,14 @@ async function overwriteVersionsInPackageJson(content: string): Promise<string>
474474
json.pnpm ||= {}
475475
json.pnpm.overrides ||= {}
476476
for (let pkg of PUBLIC_PACKAGES) {
477-
json.pnpm.overrides[pkg] = resolveVersion(pkg)
477+
if (pkg === 'tailwindcss') {
478+
// We want to be explicit about the `tailwindcss` package so our tests can
479+
// also import v3 without conflicting v4 tarballs.
480+
json.pnpm.overrides['@tailwindcss/node>tailwindcss'] = resolveVersion(pkg)
481+
json.pnpm.overrides['@tailwindcss/upgrade>tailwindcss'] = resolveVersion(pkg)
482+
} else {
483+
json.pnpm.overrides[pkg] = resolveVersion(pkg)
484+
}
478485
}
479486

480487
return JSON.stringify(json, null, 2)

packages/@tailwindcss-cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,6 @@
3636
"lightningcss": "catalog:",
3737
"mri": "^1.2.0",
3838
"picocolors": "^1.1.1",
39-
"tailwindcss": "workspace:^"
39+
"tailwindcss": "workspace:*"
4040
}
4141
}

packages/@tailwindcss-node/package.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,9 @@
3636
"default": "./dist/esm-cache.loader.mjs"
3737
}
3838
},
39-
"devDependencies": {
40-
"tailwindcss": "workspace:^"
41-
},
4239
"dependencies": {
4340
"enhanced-resolve": "^5.17.1",
44-
"jiti": "^2.0.0-beta.3"
41+
"jiti": "^2.0.0-beta.3",
42+
"tailwindcss": "workspace:*"
4543
}
4644
}

packages/@tailwindcss-postcss/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"@tailwindcss/oxide": "workspace:^",
3636
"lightningcss": "catalog:",
3737
"postcss": "^8.4.41",
38-
"tailwindcss": "workspace:^"
38+
"tailwindcss": "workspace:*"
3939
},
4040
"devDependencies": {
4141
"@types/node": "catalog:",

packages/@tailwindcss-upgrade/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@
4040
"postcss-import": "^16.1.0",
4141
"postcss-selector-parser": "^7.0.0",
4242
"prettier": "^3.3.3",
43-
"tailwindcss": "workspace:^",
4443
"tree-sitter": "^0.22.0",
45-
"tree-sitter-typescript": "^0.23.0"
44+
"tree-sitter-typescript": "^0.23.0",
45+
"tailwindcss": "workspace:*"
4646
},
4747
"devDependencies": {
4848
"@types/braces": "^3.0.4",

packages/@tailwindcss-upgrade/src/codemods/migrate-at-apply.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { __unstable__loadDesignSystem } from '@tailwindcss/node'
22
import dedent from 'dedent'
33
import postcss from 'postcss'
4-
import type { Config } from 'tailwindcss'
54
import { expect, it } from 'vitest'
5+
import type { Config } from '../../../tailwindcss/src/compat/plugin-api'
66
import { migrateAtApply } from './migrate-at-apply'
77

88
const css = dedent

packages/@tailwindcss-upgrade/src/codemods/migrate-at-apply.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { AtRule, Plugin } from 'postcss'
2-
import type { Config } from 'tailwindcss'
2+
import type { Config } from '../../../tailwindcss/src/compat/plugin-api'
33
import type { DesignSystem } from '../../../tailwindcss/src/design-system'
44
import { segment } from '../../../tailwindcss/src/utils/segment'
55
import { migrateCandidate } from '../template/migrate'

packages/@tailwindcss-upgrade/src/codemods/migrate-border-compatibility.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import dedent from 'dedent'
22
import postcss, { type Plugin, type Root } from 'postcss'
3-
import type { Config } from 'tailwindcss'
43
import { keyPathToCssProperty } from '../../../tailwindcss/src/compat/apply-config-to-theme'
4+
import type { Config } from '../../../tailwindcss/src/compat/plugin-api'
55
import type { DesignSystem } from '../../../tailwindcss/src/design-system'
66
import { toKeyPath } from '../../../tailwindcss/src/utils/to-key-path'
77
import * as ValueParser from '../../../tailwindcss/src/value-parser'

packages/@tailwindcss-upgrade/src/codemods/migrate-media-screen.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { type Plugin, type Root } from 'postcss'
2-
import type { Config } from 'tailwindcss'
32
import { resolveConfig } from '../../../tailwindcss/src/compat/config/resolve-config'
3+
import type { Config } from '../../../tailwindcss/src/compat/plugin-api'
44
import { buildMediaQuery } from '../../../tailwindcss/src/compat/screens-config'
55
import type { DesignSystem } from '../../../tailwindcss/src/design-system'
66
import { DefaultMap } from '../../../tailwindcss/src/utils/default-map'

0 commit comments

Comments
 (0)