Skip to content

Commit 75e14f4

Browse files
committed
feat(@angular-devkit/build-angular): provide partial custom postcss configuration support
The `browser` builder now supports providing a custom postcss configuration similar to the functionality available in the `@angular/build:application` builder. A postcss configuration file named either `postcss.config.json` or `.postcssrc.json` will be discovered in order from the project root or workspace root. Only plugins can be configured via the file. All other fields will be ignored. Additionally the plugins will be placed after any internal build system plugins but before `autoprefixer`. When using a custom postcss configuration, the automatic tailwind integration will be disabled. The Tailwind postcss plugin should be added to the configuration file in this scenario.
1 parent 20e23f1 commit 75e14f4

File tree

3 files changed

+43
-60
lines changed

3 files changed

+43
-60
lines changed

packages/angular/build/src/private.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,8 @@ export { type BundleStats, generateBuildStatsTable } from './utils/stats-table';
8484
export { getSupportedBrowsers } from './utils/supported-browsers';
8585
export { assertCompatibleAngularVersion } from './utils/version';
8686
export { findTests, getTestEntrypoints } from './builders/karma/find-tests';
87+
export {
88+
findTailwindConfiguration,
89+
generateSearchDirectories,
90+
loadPostcssConfiguration,
91+
} from './utils/postcss-configuration';

packages/angular_devkit/build_angular/src/tools/webpack/configs/styles.ts

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@
66
* found in the LICENSE file at https://angular.dev/license
77
*/
88

9-
import { SassWorkerImplementation } from '@angular/build/private';
9+
import {
10+
SassWorkerImplementation,
11+
findTailwindConfiguration,
12+
generateSearchDirectories,
13+
loadPostcssConfiguration,
14+
} from '@angular/build/private';
1015
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
1116
import * as path from 'node:path';
1217
import { fileURLToPath, pathToFileURL } from 'node:url';
1318
import type { FileImporter } from 'sass';
1419
import type { Configuration, LoaderContext, RuleSetUseItem } from 'webpack';
1520
import { WebpackConfigOptions } from '../../../utils/build-options';
16-
import { findTailwindConfigurationFile } from '../../../utils/tailwind';
1721
import {
1822
AnyComponentStyleBudgetChecker,
1923
PostcssCliResources,
@@ -75,25 +79,39 @@ export async function getStylesConfig(wco: WebpackConfigOptions): Promise<Config
7579

7680
const extraPostcssPlugins: import('postcss').Plugin[] = [];
7781

78-
// Attempt to setup Tailwind CSS
79-
// Only load Tailwind CSS plugin if configuration file was found.
80-
// This acts as a guard to ensure the project actually wants to use Tailwind CSS.
81-
// The package may be unknowningly present due to a third-party transitive package dependency.
82-
const tailwindConfigPath = await findTailwindConfigurationFile(root, projectRoot);
83-
if (tailwindConfigPath) {
84-
let tailwindPackagePath;
85-
try {
86-
tailwindPackagePath = require.resolve('tailwindcss', { paths: [root] });
87-
} catch {
88-
const relativeTailwindConfigPath = path.relative(root, tailwindConfigPath);
89-
logger.warn(
90-
`Tailwind CSS configuration file found (${relativeTailwindConfigPath})` +
91-
` but the 'tailwindcss' package is not installed.` +
92-
` To enable Tailwind CSS, please install the 'tailwindcss' package.`,
93-
);
82+
const searchDirectories = await generateSearchDirectories([projectRoot, root]);
83+
const postcssConfig = await loadPostcssConfiguration(searchDirectories);
84+
85+
if (postcssConfig) {
86+
for (const [pluginName, pluginOptions] of postcssConfig.plugins) {
87+
const { default: plugin } = await import(pluginName);
88+
if (typeof plugin !== 'function' || plugin.postcss !== true) {
89+
throw new Error(`Attempted to load invalid Postcss plugin: "${pluginName}"`);
90+
}
91+
92+
extraPostcssPlugins.push(plugin(pluginOptions));
9493
}
95-
if (tailwindPackagePath) {
96-
extraPostcssPlugins.push(require(tailwindPackagePath)({ config: tailwindConfigPath }));
94+
} else {
95+
// Attempt to setup Tailwind CSS
96+
// Only load Tailwind CSS plugin if configuration file was found.
97+
// This acts as a guard to ensure the project actually wants to use Tailwind CSS.
98+
// The package may be unknowningly present due to a third-party transitive package dependency.
99+
const tailwindConfigPath = findTailwindConfiguration(searchDirectories);
100+
if (tailwindConfigPath) {
101+
let tailwindPackagePath;
102+
try {
103+
tailwindPackagePath = require.resolve('tailwindcss', { paths: [root] });
104+
} catch {
105+
const relativeTailwindConfigPath = path.relative(root, tailwindConfigPath);
106+
logger.warn(
107+
`Tailwind CSS configuration file found (${relativeTailwindConfigPath})` +
108+
` but the 'tailwindcss' package is not installed.` +
109+
` To enable Tailwind CSS, please install the 'tailwindcss' package.`,
110+
);
111+
}
112+
if (tailwindPackagePath) {
113+
extraPostcssPlugins.push(require(tailwindPackagePath)({ config: tailwindConfigPath }));
114+
}
97115
}
98116
}
99117

packages/angular_devkit/build_angular/src/utils/tailwind.ts

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)