The recommended shareable SCSS config for Stylelint
npx @tessl/cli install tessl/npm-stylelint-config-recommended-scss@16.0.0stylelint-config-recommended-scss is a shareable configuration for Stylelint that provides comprehensive SCSS linting rules. It extends the base stylelint-config-recommended configuration and bundles the stylelint-scss plugin pack with postcss-scss custom syntax to enable complete linting of SCSS code, checking for possible errors and enforcing best practices.
npm install --save-dev stylelint-config-recommended-scssThis package exports a single configuration object that is used by Stylelint's configuration system:
// The package exports the configuration object directly
const config = require('stylelint-config-recommended-scss');For ES modules (CommonJS interop):
import config from 'stylelint-config-recommended-scss';Set your .stylelintrc.json config to extend this package:
{
"extends": "stylelint-config-recommended-scss"
}Extend with custom rules:
{
"extends": "stylelint-config-recommended-scss",
"rules": {
"scss/at-if-no-null": null
}
}stylelint-config-recommended-scss is built around several key components that work together to provide comprehensive SCSS linting:
stylelint-config-recommended and adapts its rules for SCSS compatibility by selectively disabling conflicting rulespostcss-scss to enable proper parsing of SCSS syntax features like variables, mixins, and nested rulesstylelint-scss plugin pack to provide SCSS-specific linting rulesThe package exports a complete Stylelint configuration object that includes extends, plugins, custom syntax, and rules.
/**
* Main export: Complete Stylelint configuration object
* @type {StylelintConfig}
*/
const config: StylelintConfig;
interface StylelintConfig {
/** Base configurations to extend */
extends: string[];
/** PostCSS custom syntax for parsing SCSS */
customSyntax: object;
/** Stylelint plugins to load */
plugins: string[];
/** Linting rules configuration */
rules: StylelintRules;
}
interface StylelintRules {
// Core Stylelint rules (modified for SCSS compatibility)
'annotation-no-unknown': null;
'at-rule-descriptor-no-unknown': null;
'at-rule-descriptor-value-no-unknown': null;
'at-rule-no-unknown': null;
'at-rule-prelude-no-invalid': null;
'color-no-invalid-hex': boolean;
'comment-no-empty': null;
'declaration-property-value-no-unknown': null;
'function-linear-gradient-no-nonstandard-direction': boolean;
'function-no-unknown': null;
'media-feature-name-value-no-unknown': null;
'media-query-no-invalid': null;
'no-invalid-position-at-import-rule': [boolean, { ignoreAtRules: string[] }];
'string-no-newline': boolean;
'unit-no-unknown': boolean;
// SCSS-specific rules (from stylelint-scss plugin)
'scss/at-extend-no-missing-placeholder': boolean;
'scss/at-if-no-null': boolean;
'scss/at-rule-no-unknown': boolean;
'scss/comment-no-empty': boolean;
'scss/declaration-nested-properties-no-divided-groups': boolean;
'scss/dollar-variable-no-missing-interpolation': boolean;
'scss/function-quote-no-quoted-strings-inside': boolean;
'scss/function-unquote-no-unquoted-strings-inside': boolean;
'scss/load-no-partial-leading-underscore': boolean;
'scss/load-partial-extension': 'never';
'scss/no-duplicate-mixins': boolean;
'scss/no-global-function-names': boolean;
'scss/operator-no-newline-after': boolean;
'scss/operator-no-newline-before': boolean;
'scss/operator-no-unspaced': boolean;
}Specifies base configurations to extend.
extends: ['stylelint-config-recommended']The configuration extends stylelint-config-recommended and adapts its rules for SCSS compatibility.
Configures PostCSS custom syntax for parsing SCSS files.
customSyntax: postcssScssUses postcss-scss package to enable proper SCSS syntax parsing.
Specifies Stylelint plugins to load.
plugins: ['stylelint-scss']Bundles the stylelint-scss plugin pack for SCSS-specific linting rules.
Contains the complete rules configuration with 25 total rules.
rules: {
// Core rules disabled for SCSS compatibility (10 rules)
'annotation-no-unknown': null,
'at-rule-descriptor-no-unknown': null,
'at-rule-descriptor-value-no-unknown': null,
'at-rule-no-unknown': null,
'at-rule-prelude-no-invalid': null,
'comment-no-empty': null,
'declaration-property-value-no-unknown': null,
'function-no-unknown': null,
'media-feature-name-value-no-unknown': null,
'media-query-no-invalid': null,
// Core rules enabled (5 rules)
'color-no-invalid-hex': true,
'function-linear-gradient-no-nonstandard-direction': true,
'no-invalid-position-at-import-rule': [true, { ignoreAtRules: ['use', 'forward'] }],
'string-no-newline': true,
'unit-no-unknown': true,
// SCSS-specific error detection rules (15 rules)
'scss/at-extend-no-missing-placeholder': true,
'scss/at-if-no-null': true,
'scss/at-rule-no-unknown': true,
'scss/comment-no-empty': true,
'scss/declaration-nested-properties-no-divided-groups': true,
'scss/dollar-variable-no-missing-interpolation': true,
'scss/function-quote-no-quoted-strings-inside': true,
'scss/function-unquote-no-unquoted-strings-inside': true,
'scss/load-no-partial-leading-underscore': true,
'scss/load-partial-extension': 'never',
'scss/no-duplicate-mixins': true,
'scss/no-global-function-names': true,
'scss/operator-no-newline-after': true,
'scss/operator-no-newline-before': true,
'scss/operator-no-unspaced': true
}The configuration automatically handles these dependencies:
interface Dependencies {
/** Runtime dependencies bundled with the config */
dependencies: {
'postcss-scss': '^4.0.9';
'stylelint-config-recommended': '^17.0.0';
'stylelint-scss': '^6.12.1';
};
/** Required peer dependencies */
peerDependencies: {
'postcss': '^8.3.3'; // optional
'stylelint': '^16.23.1'; // required
};
}# Run Stylelint with the config
npx stylelint "**/*.scss" --config-extends stylelint-config-recommended-scssimport stylelint from 'stylelint';
import config from 'stylelint-config-recommended-scss';
const result = await stylelint.lint({
code: scssCode,
config: config
});{
"extends": "stylelint-config-recommended-scss",
"rules": {
"scss/at-if-no-null": null
}
}{
"scripts": {
"lint:scss": "stylelint '**/*.scss'",
"lint:scss:fix": "stylelint '**/*.scss' --fix"
}
}