mirror of
https://github.com/tailwindlabs/tailwindcss.git
synced 2025-12-08 21:36:08 +00:00
Closes #15012 We do not have replacements for these plugins _just yet_. In order to increase compatibility with setups that rely on some of these legacy plugins, this PR bundles `@tailwindcss/forms`, `@tailwindcss/typography`, and `@tailwindcss/aspect-ratio` (after https://github.com/tailwindlabs/tailwindcss/pull/15029) with the standalone build now. In comparison to v3, this omits the `@tailwindcss/container-queries` plugin since is not a first-party feature of Tailwind CSS v4. ## Test Plan Added an integration test. I also tested this by running the standalone binary in a temporary folder with as simple input css: ```css @import "tailwindcss"; @plugin "@tailwindcss/typography"; ```
75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import fs from 'node:fs'
|
|
import { createRequire } from 'node:module'
|
|
import packageJson from 'tailwindcss/package.json'
|
|
|
|
import indexCss from 'tailwindcss/index.css' with { type: 'file' }
|
|
import preflightCss from 'tailwindcss/preflight.css' with { type: 'file' }
|
|
import themeCss from 'tailwindcss/theme.css' with { type: 'file' }
|
|
import utilitiesCss from 'tailwindcss/utilities.css' with { type: 'file' }
|
|
|
|
const localResolve = createRequire(import.meta.url).resolve
|
|
|
|
globalThis.__tw_resolve = (id, baseDir) => {
|
|
let isEmbeddedFileBase = baseDir === '/$bunfs/root' || baseDir?.includes(':/~BUN/root')
|
|
const likelyEmbeddedFile =
|
|
id === 'tailwindcss' ||
|
|
id.startsWith('tailwindcss/') ||
|
|
id.startsWith('@tailwindcss/') ||
|
|
isEmbeddedFileBase
|
|
|
|
if (!likelyEmbeddedFile) {
|
|
return false
|
|
}
|
|
|
|
id = id.startsWith('tailwindcss/')
|
|
? id.slice(12)
|
|
: isEmbeddedFileBase && id.startsWith('./')
|
|
? id.slice(2)
|
|
: id
|
|
|
|
switch (id) {
|
|
case 'index':
|
|
case 'index.css':
|
|
case 'tailwindcss':
|
|
return localResolve(indexCss)
|
|
case 'theme':
|
|
case 'theme.css':
|
|
return localResolve(themeCss)
|
|
case 'preflight':
|
|
case 'preflight.css':
|
|
return localResolve(preflightCss)
|
|
case 'utilities':
|
|
case 'utilities.css':
|
|
return localResolve(utilitiesCss)
|
|
case '@tailwindcss/forms':
|
|
case '@tailwindcss/typography':
|
|
case '@tailwindcss/aspect-ratio':
|
|
return id
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
globalThis.__tw_load = async (id) => {
|
|
if (id.endsWith('@tailwindcss/forms')) {
|
|
return require('@tailwindcss/forms')
|
|
} else if (id.endsWith('@tailwindcss/typography')) {
|
|
return require('@tailwindcss/typography')
|
|
} else if (id.endsWith('@tailwindcss/aspect-ratio')) {
|
|
return require('@tailwindcss/aspect-ratio')
|
|
} else {
|
|
return undefined
|
|
}
|
|
}
|
|
globalThis.__tw_version = packageJson.version
|
|
globalThis.__tw_readFile = async (path, encoding) => {
|
|
// When reading a file from the `$bunfs`, we need to use the synchronous
|
|
// `readFileSync` API
|
|
let isEmbeddedFileBase = path.includes('/$bunfs/root') || path.includes(':/~BUN/root')
|
|
if (!isEmbeddedFileBase) {
|
|
return
|
|
}
|
|
return fs.readFileSync(path, encoding)
|
|
}
|
|
|
|
await import('../../@tailwindcss-cli/src/index.ts')
|