Safe defaults for cssnano which require minimal configuration
npx @tessl/cli install tessl/npm-cssnano-preset-default@7.0.0cssnano-preset-default provides safe defaults for cssnano which require minimal configuration. This preset includes only transforms that make no assumptions about your CSS other than what is passed in, ensuring predictable output across different use cases. It orchestrates 25+ PostCSS plugins to perform various optimizations including color minification, gradient compression, selector normalization, whitespace trimming, duplicate removal, and SVG optimization.
npm install cssnano-preset-default (bundled with cssnano by default)const defaultPreset = require('cssnano-preset-default');TypeScript/ES modules (using default import):
import defaultPreset from 'cssnano-preset-default';const defaultPreset = require('cssnano-preset-default');
// Basic usage with default configuration
const preset = defaultPreset();
// Returns: { plugins: [[plugin, options], ...] }
// Usage with custom options
const customPreset = defaultPreset({
discardComments: { removeAll: true },
colormin: false, // Disable color minification
overrideBrowserslist: ['> 1%', 'last 2 versions']
});
// Usage with cssnano
const postcss = require('postcss');
const cssnano = require('cssnano');
const result = await postcss([
cssnano({
preset: defaultPreset({
discardComments: { removeAll: true }
})
})
]).process(css, { from: undefined });The preset is built around several key components:
configurePlugins function to merge default options with user optionsfalse or using exclude: trueThe main function that creates and configures the preset with optional customization.
/**
* Safe defaults for cssnano which require minimal configuration
* @param opts - Configuration options for the preset
* @returns Preset object with configured plugins array
*/
function defaultPreset(
opts?: Options & AutoprefixerOptions & BrowserslistOptions
): {
plugins: [import('postcss').PluginCreator<any>, Options[keyof Options]][];
};Usage Examples:
// Default configuration
const preset = defaultPreset();
// Disable specific plugins
const minimalPreset = defaultPreset({
discardComments: false,
colormin: false
});
// Configure specific plugins
const customPreset = defaultPreset({
discardComments: { removeAll: true },
normalizeCharset: { add: true },
cssDeclarationSorter: { order: 'alphabetical' }
});
// Browserslist integration
const modernPreset = defaultPreset({
overrideBrowserslist: ['last 1 chrome version', 'last 1 firefox version'],
env: 'production'
});Configuration interface for all included plugins.
interface Options {
/** CSS declaration sorting configuration */
cssDeclarationSorter?: SimpleOptions<{
order?: ("alphabetical" | "concentric-css" | "smacss") | ((propertyNameA: string, propertyNameB: string) => -1 | 0 | 1) | undefined;
keepOverrides?: boolean;
}>;
/** Comment removal configuration */
discardComments?: SimpleOptions<{
remove?: (comment: string) => boolean;
removeAll?: boolean;
removeAllButFirst?: boolean;
}>;
/** Initial value reduction configuration */
reduceInitial?: SimpleOptions<{
ignore?: string[];
}>;
/** Gradient minification (no options) */
minifyGradients?: SimpleOptions<void>;
/** SVG optimization configuration */
svgo?: SimpleOptions<{
plugins?: any[];
js2svg?: any;
}>;
/** Transform reduction (no options) */
reduceTransforms?: SimpleOptions<void>;
/** Value conversion configuration */
convertValues?: SimpleOptions<{
length?: boolean;
time?: boolean;
angle?: boolean;
precision?: number;
}>;
/** Calc() reduction configuration */
calc?: SimpleOptions<{
precision?: number;
preserve?: string[];
warnWhenCannotResolve?: boolean;
}>;
/** Color minification configuration */
colormin?: SimpleOptions<{
legacy?: boolean;
}>;
/** Ordered values (no options) */
orderedValues?: SimpleOptions<void>;
/** Selector minification configuration */
minifySelectors?: SimpleOptions<{
sort?: boolean;
}>;
/** Parameter minification configuration */
minifyParams?: SimpleOptions<{
removeQuotes?: boolean;
}>;
/** Charset normalization configuration */
normalizeCharset?: SimpleOptions<{
add?: boolean;
}>;
/** Font value minification configuration */
minifyFontValues?: SimpleOptions<{
removeAfterKeyword?: boolean;
removeDuplicates?: boolean;
removeQuotes?: boolean;
}>;
/** URL normalization (no options) */
normalizeUrl?: SimpleOptions<void>;
/** Longhand merging (no options) */
mergeLonghand?: SimpleOptions<void>;
/** Duplicate removal (no options) */
discardDuplicates?: SimpleOptions<void>;
/** Overridden rule removal (no options) */
discardOverridden?: SimpleOptions<void>;
/** Repeat style normalization (no options) */
normalizeRepeatStyle?: SimpleOptions<void>;
/** Rule merging configuration */
mergeRules?: SimpleOptions<{
exclude?: RegExp[];
}>;
/** Empty rule removal (no options) */
discardEmpty?: SimpleOptions<void>;
/** Unique selectors (no options) */
uniqueSelectors?: SimpleOptions<void>;
/** String normalization configuration */
normalizeString?: SimpleOptions<{
preferredQuote?: "single" | "double";
}>;
/** Position normalization (no options) */
normalizePositions?: SimpleOptions<void>;
/** Whitespace normalization (no options) */
normalizeWhitespace?: SimpleOptions<void>;
/** Unicode normalization configuration */
normalizeUnicode?: SimpleOptions<{
unicode?: boolean;
}>;
/** Display value normalization (no options) */
normalizeDisplayValues?: SimpleOptions<void>;
/** Timing function normalization (no options) */
normalizeTimingFunctions?: SimpleOptions<void>;
/** Raw cache (no options) */
rawCache?: SimpleOptions<void>;
}Options for browser-specific optimizations.
/** Browserslist override options */
interface AutoprefixerOptions {
/** Override browserslist configuration */
overrideBrowserslist?: string | string[];
}
/** Browserslist configuration options */
interface BrowserslistOptions {
/** Custom usage statistics */
stats?: any;
/** Path for browserslist config lookup */
path?: string;
/** Environment for browserslist */
env?: string;
}/** Base type for plugin options that can be disabled or excluded */
type SimpleOptions<OptionsExtends extends object | void = void> =
| false
| (OptionsExtends & { exclude?: true });
/** PostCSS plugin creator type from postcss package */
type PluginCreator<T> = import('postcss').PluginCreator<T>;
/** Plugin configuration tuple */
type PluginConfig = [PluginCreator<any>, Options[keyof Options]];
/** Preset return type */
interface PresetResult {
plugins: PluginConfig[];
}
/** Autoprefixer integration options */
interface AutoprefixerOptions {
overrideBrowserslist?: string | string[];
}
/** Browserslist configuration options */
interface BrowserslistOptions {
stats?: any;
path?: string;
env?: string;
}The preset executes plugins in the following optimized order:
{
"cssnano": {
"preset": [
"default",
{
"discardComments": {"removeAll": true},
"colormin": false
}
]
}
}const defaultPreset = require('cssnano-preset-default');
module.exports = defaultPreset({
discardComments: {
remove: (comment) => comment[0] === '@'
},
normalizeCharset: { add: false },
overrideBrowserslist: ['> 1%', 'last 2 versions']
});const postcss = require('postcss');
const cssnano = require('cssnano');
const defaultPreset = require('cssnano-preset-default');
// With PostCSS directly
const result = await postcss([
cssnano({
preset: defaultPreset({
discardComments: { removeAll: true }
})
})
]).process(css, { from: undefined });
// With cssnano directly
const result = await cssnano.process(css, {
preset: defaultPreset({
colormin: { legacy: true }
})
});The preset applies the following default configurations to specific plugins:
overrideBrowserslist, stats, env, and path optionsfalse - Preserves length units by default for safetytrue - Preserves declaration order for CSS cascade correctnesstrue - Enables selector sorting for better compressionfalse - Does not automatically add charset declarationspreset-default configuration for SVG optimizationAll plugins that support browserslist integration automatically receive shared properties (overrideBrowserslist, stats, env, path) when provided to the preset.