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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Allow multiples of `.25` in `aspect-*` fractions ([#19688](https://github.com/tailwindlabs/tailwindcss/pull/19688))
- Ensure changes to external files listed via `@source` trigger a full page reload when using `@tailwindcss/vite` ([#19670](https://github.com/tailwindlabs/tailwindcss/pull/19670))
- Improve performance Oxide scanner in bigger projects ([#19632](https://github.com/tailwindlabs/tailwindcss/pull/19632))
- Ensure import aliases in Astro v5 work without crashing ([#19677](https://github.com/tailwindlabs/tailwindcss/issues/19677))

### Deprecated

Expand Down
72 changes: 71 additions & 1 deletion integrations/vite/astro.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { candidate, fetchStyles, html, js, json, retryAssertion, test, ts } from '../utils'
import { candidate, css, fetchStyles, html, js, json, retryAssertion, test, ts } from '../utils'

test(
'dev mode',
Expand Down Expand Up @@ -129,3 +129,73 @@ test(
await fs.expectFileToContain(files[0][0], [candidate`underline`, candidate`overline`])
},
)

// https://github.com/tailwindlabs/tailwindcss/issues/19677
test(
'import aliases should work in <style> blocks',
{
fs: {
'package.json': json`
{
"type": "module",
"dependencies": {
"astro": "^5",
"@tailwindcss/vite": "workspace:^",
"tailwindcss": "workspace:^"
}
}
`,
'astro.config.mjs': ts`
import tailwindcss from '@tailwindcss/vite'
import { defineConfig } from 'astro/config'

// https://astro.build/config
export default defineConfig({
vite: { plugins: [tailwindcss()] },
})
`,
'tsconfig.json': json`
{
"extends": "astro/tsconfigs/strict",
"include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"],
"compilerOptions": {
"paths": {
"@styles/*": ["./src/styles/*"]
}
}
}
`,
// prettier-ignore
'src/pages/index.astro': html`
---
import '@styles/global.css'
---

<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>Astro</title>
<style>
@reference "@styles/global.css";
</style>
</head>
<body>
<h1 class="underline">Astro</h1>
</body>
</html>
`,
'src/styles/global.css': css`@import 'tailwindcss';`,
},
},
async ({ fs, exec, expect }) => {
await exec('pnpm astro build')

let files = await fs.glob('dist/**/*.css')
expect(files).toHaveLength(1)

await fs.expectFileToContain(files[0][0], [candidate`underline`])
},
)
40 changes: 37 additions & 3 deletions packages/@tailwindcss-vite/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@ import { Scanner } from '@tailwindcss/oxide'
import { realpathSync } from 'node:fs'
import fs from 'node:fs/promises'
import path from 'node:path'
import type { Environment, Plugin, ResolvedConfig, ViteDevServer } from 'vite'
import type {
Environment,
InternalResolveOptions,
Plugin,
ResolvedConfig,
ViteDevServer,
} from 'vite'
import * as vite from 'vite'

const DEBUG = env.DEBUG
Expand Down Expand Up @@ -59,8 +65,36 @@ export default function tailwindcss(opts: PluginOptions = {}): Plugin[] {
customCssResolver = (id: string, base: string) => cssResolver(id, base, true, isSSR)
customJsResolver = (id: string, base: string) => jsResolver(id, base, true, isSSR)
} else {
type ResolveIdFn = (
environment: Environment,
id: string,
importer?: string,
aliasOnly?: boolean,
) => Promise<string | undefined>

// There are cases where Environment API is available,
// but `createResolver` is still overriden (for example astro v5)
//
// Copied as-is from vite, because this function is not a part of public API
//
// TODO: Remove this function and pre-environment code when Vite < 7 is no longer supported
function createBackCompatIdResolver(
config: ResolvedConfig,
options?: Partial<InternalResolveOptions>,
): ResolveIdFn {
const compatResolve = config.createResolver(options)
let resolve: ResolveIdFn
return async (environment, id, importer, aliasOnly) => {
if (environment.name === 'client' || environment.name === 'ssr') {
return compatResolve(id, importer, aliasOnly, environment.name === 'ssr')
}
resolve ??= vite.createIdResolver(config, options)
return resolve(environment, id, importer, aliasOnly)
}
}

// Newer Vite versions
let cssResolver = vite.createIdResolver(env.config, {
let cssResolver = createBackCompatIdResolver(env.config, {
...env.config.resolve,
extensions: ['.css'],
mainFields: ['style'],
Expand All @@ -69,7 +103,7 @@ export default function tailwindcss(opts: PluginOptions = {}): Plugin[] {
preferRelative: true,
})

let jsResolver = vite.createIdResolver(env.config, env.config.resolve)
let jsResolver = createBackCompatIdResolver(env.config, env.config.resolve)

customCssResolver = (id: string, base: string) => cssResolver(env, id, base, true)
customJsResolver = (id: string, base: string) => jsResolver(env, id, base, true)
Expand Down