/* eslint-disable @typescript-eslint/no-var-requires */ /* eslint-env node */ const path = require('path'); const loaderUtils = require('loader-utils'); const fileCache = {}; const isProduction = process.argv.some((arg) => arg === '-p'); const rootPath = path.resolve('./src'); module.exports = ({ webpack: loader }) => ({ syntax: 'postcss-scss', plugins: { 'postcss-import': { addModulesDirectories: ['./src'], resolve: ((defaultResolve) => (url, basedir, importOptions) => defaultResolve( // mainly to remove '~' from request loaderUtils.urlToRequest(url), basedir, importOptions, ))(require('postcss-import/lib/resolve-id')), load: ((defaultLoad) => (filename, importOptions) => { if (/\.font.(js|json)$/.test(filename)) { // separately process calls to font loader // e.g. `@import '~app/icons.font.json';` if (!fileCache[filename] || !isProduction) { // do not execute loader on the same file twice // this is an overcome for a bug with ExtractTextPlugin, for isProduction === true // when @imported files may be processed multiple times fileCache[filename] = new Promise((resolve, reject) => loader.loadModule(filename, (err, source) => { if (err) { reject(err); return; } resolve(loader.exec(source, rootPath)); }), ); } return fileCache[filename]; } return defaultLoad(filename, importOptions); })(require('postcss-import/lib/load-content')), }, // TODO: for some reason cssnano strips out @mixin declarations // cssnano: { // /** // * TODO: cssnano options // */ // // autoprefixer: { // // add: true, // // remove: true, // // browsers: ['last 2 versions'] // // }, // // safe: true, // // // отключаем минификацию цветов, что бы она не ломала такие выражения: // // // composes: black from '~./buttons.scss'; // // colormin: false, // // discardComments: { // // removeAll: true // // } // preset: 'default' // } }, });