import { isAbsolute, join } from 'node:path'; import process from 'node:process'; import createStylelint from './createStylelint.mjs'; import { isString } from './utils/validateTypes.mjs'; import lintSource from './lintSource.mjs'; /** @import {Config as StylelintConfig, PostcssPluginOptions} from 'stylelint' */ /** * @type {import('postcss').PluginCreator} */ export default function postcssPlugin(options = {}) { const [cwd, tailoredOptions] = isConfig(options) ? [process.cwd(), { config: options }] : [('cwd' in options && isString(options.cwd) && options.cwd) || process.cwd(), options]; const stylelint = createStylelint(tailoredOptions); return { postcssPlugin: 'stylelint', /** * @param {import('postcss').Root} root * @param {import('postcss').Helpers} helpers * @returns {Promise} */ async Once(root, { result }) { let filePath = root.source && root.source.input.file; if (filePath && !isAbsolute(filePath)) { filePath = join(cwd, filePath); } await lintSource(stylelint, { filePath, existingPostcssResult: result, }); }, }; } postcssPlugin.postcss = true; /** * @param {PostcssPluginOptions} options * @returns {options is StylelintConfig} */ function isConfig(options) { return 'rules' in options; }