summaryrefslogtreecommitdiff
path: root/packages/integrations/tailwind/src
diff options
context:
space:
mode:
authorGravatar Ben Holmes <hey@bholmes.dev> 2022-03-21 17:27:32 -0400
committerGravatar GitHub <noreply@github.com> 2022-03-21 17:27:32 -0400
commit5315c3f7bc0649f9788713f689f484e223bc0ca6 (patch)
treedd5f6d4299dc5217627c3d3a8c25340f1f1cd1e2 /packages/integrations/tailwind/src
parent981e2a839b5a0292513bf2009216250f2a8730eb (diff)
downloadastro-5315c3f7bc0649f9788713f689f484e223bc0ca6.tar.gz
astro-5315c3f7bc0649f9788713f689f484e223bc0ca6.tar.zst
astro-5315c3f7bc0649f9788713f689f484e223bc0ca6.zip
Feat: support tailwind config files (#2831)
* feat: support custom tailwind config files * fix: make config options optional * feat: use existing utilities to resolve config path * deps: add @proload/core to tailwind integration * deps: update pnpm lock * chore: clarify config docs * refactor: extract user config fetch to helper * refactor: rename function and function options * refactor: throw error on bad custom config path * deps: move @proload/core to regular deps * chore: add changeset * fix: apply astro preset when user config exists * fix: use resolveConfig to preserve defaults
Diffstat (limited to 'packages/integrations/tailwind/src')
-rw-r--r--packages/integrations/tailwind/src/index.ts60
1 files changed, 54 insertions, 6 deletions
diff --git a/packages/integrations/tailwind/src/index.ts b/packages/integrations/tailwind/src/index.ts
index 30905f9d1..bb5a4ade3 100644
--- a/packages/integrations/tailwind/src/index.ts
+++ b/packages/integrations/tailwind/src/index.ts
@@ -2,25 +2,73 @@ import type { AstroIntegration } from 'astro';
import { fileURLToPath } from 'url';
import path from 'path';
import tailwindPlugin from 'tailwindcss';
+import type { TailwindConfig } from 'tailwindcss/tailwind-config';
+import resolveConfig from 'tailwindcss/resolveConfig.js';
import autoprefixerPlugin from 'autoprefixer';
+import load from '@proload/core';
-function getDefaultTailwindConfig(srcUrl: URL) {
- return {
+function getDefaultTailwindConfig(srcUrl: URL): TailwindConfig {
+ return resolveConfig({
theme: {
extend: {},
},
plugins: [],
content: [path.join(fileURLToPath(srcUrl), `**`, `*.{astro,html,js,jsx,svelte,ts,tsx,vue}`)],
- };
+ });
+}
+
+async function getUserConfig(projectRoot: URL, configPath?: string) {
+ const resolvedProjectRoot = fileURLToPath(projectRoot);
+ let userConfigPath: string | undefined;
+
+ if (configPath) {
+ const configPathWithLeadingSlash = /^\.*\//.test(configPath) ? configPath : `./${configPath}`;
+ userConfigPath = fileURLToPath(new URL(configPathWithLeadingSlash, projectRoot));
+ }
+
+ return await load('tailwind', { mustExist: false, cwd: resolvedProjectRoot, filePath: userConfigPath });
}
-export default function (): AstroIntegration {
+type TailwindOptions =
+ | {
+ config?: {
+ /**
+ * Path to your tailwind config file
+ * @default 'tailwind.config.js'
+ */
+ path?: string;
+ /**
+ * Apply Astro's default Tailwind config as a preset
+ * This is recommended to enable Tailwind across all components and Astro files
+ * @default true
+ */
+ applyAstroPreset?: boolean;
+ };
+ }
+ | undefined;
+
+export default function tailwindIntegration(options: TailwindOptions): AstroIntegration {
+ const applyAstroConfigPreset = options?.config?.applyAstroPreset ?? true;
+ const customConfigPath = options?.config?.path;
return {
name: '@astrojs/tailwind',
hooks: {
- 'astro:config:setup': ({ config, injectScript }) => {
+ 'astro:config:setup': async ({ config, injectScript }) => {
// Inject the Tailwind postcss plugin
- config.styleOptions.postcss.plugins.push(tailwindPlugin(getDefaultTailwindConfig(config.src)));
+ const userConfig = await getUserConfig(config.projectRoot, customConfigPath);
+
+ if (customConfigPath && !userConfig?.value) {
+ throw new Error(`Could not find a Tailwind config at ${JSON.stringify(customConfigPath)}. Does the file exist?`);
+ }
+
+ const tailwindConfig: TailwindConfig = (userConfig?.value as TailwindConfig) ?? getDefaultTailwindConfig(config.src);
+ if (applyAstroConfigPreset && userConfig?.value) {
+ // apply Astro config as a preset to user config
+ // this avoids merging or applying nested spread operators ourselves
+ tailwindConfig.presets = [getDefaultTailwindConfig(config.src), ...(tailwindConfig.presets || [])];
+ }
+
+ config.styleOptions.postcss.plugins.push(tailwindPlugin(tailwindConfig));
config.styleOptions.postcss.plugins.push(autoprefixerPlugin);
// Inject the Tailwind base import