// NOTICE: This file is generated by Rollup. To modify it, // please instead edit the ESM counterpart and rebuild with Rollup (npm run build). 'use strict'; const promises = require('node:fs/promises'); const postcss = require('postcss'); const dynamicImport = require('./utils/dynamicImport.cjs'); const getModulePath = require('./utils/getModulePath.cjs'); const normalizeFixMode = require('./utils/normalizeFixMode.cjs'); /** @import {Result, Syntax} from 'postcss' */ /** @import {CustomSyntax, GetPostcssOptions, InternalApi as StylelintInternalApi} from 'stylelint' */ const postcssProcessor = postcss(); /** * @param {StylelintInternalApi} stylelint * @param {GetPostcssOptions} options * * @returns {Promise} */ async function getPostcssResult(stylelint, { customSyntax, filePath, code } = {}) { const cached = filePath ? stylelint._postcssResultCache.get(filePath) : undefined; if (cached) { return cached; } const fix = normalizeFixMode(stylelint._options.fix); const syntax = await (customSyntax ? getCustomSyntax(customSyntax, stylelint._options.configBasedir) : cssSyntax(fix === 'lax')); const postcssOptions = { from: filePath, syntax, }; /** @type {string | undefined} */ let getCode; if (code !== undefined) { getCode = code; } else if (filePath) { getCode = await promises.readFile(filePath, 'utf8'); } if (getCode === undefined) { throw new Error('code or filePath required'); } const postcssResult = await postcssProcessor.process(getCode, postcssOptions).async(); if (filePath) { stylelint._postcssResultCache.set(filePath, postcssResult); } return postcssResult; } /** * @param {CustomSyntax} customSyntax * @param {string | undefined} basedir * @returns {Promise} */ async function getCustomSyntax(customSyntax, basedir) { if (typeof customSyntax === 'string') { const customSyntaxLookup = basedir ? getModulePath(basedir, customSyntax) : customSyntax; let resolved; try { resolved = await dynamicImport(customSyntaxLookup); resolved = resolved.default ?? resolved; } catch (error) { if ( error && typeof error === 'object' && 'code' in error && // TODO: Remove 'MODULE_NOT_FOUND' when we drop the CommonJS support. // See https://nodejs.org/api/errors.html#module_not_found (error.code === 'MODULE_NOT_FOUND' || error.code === 'ERR_MODULE_NOT_FOUND') && 'message' in error && typeof error.message === 'string' && error.message.includes(customSyntax) ) { throw new Error( `Cannot resolve custom syntax module "${customSyntax}". Check that module "${customSyntax}" is available and spelled correctly.\n\nCaused by: ${error}`, ); } throw error; } /* * PostCSS allows for syntaxes that only contain a parser, however, * it then expects the syntax to be set as the `parse` option. */ if (!resolved.parse) { resolved = { parse: resolved, stringify: postcss.stringify, }; } return resolved; } if (typeof customSyntax === 'object') { if (typeof customSyntax.parse === 'function') { return { ...customSyntax }; } throw new TypeError( 'An object provided to the "customSyntax" option must have a "parse" property. Ensure the "parse" property exists and its value is a function.', ); } throw new Error('Custom syntax must be a string or a Syntax object'); } /** * @param {boolean} fix * @returns {Promise} */ async function cssSyntax(fix) { const parse = await (fix ? import('postcss-safe-parser').then((m) => m.default) : postcss.parse); return { parse, stringify: postcss.stringify }; } module.exports = getPostcssResult;