'use strict'; const path = require('path'); const utils = require('loader-utils'); const matchModuleImport = /^~([^/]+|@[^/]+[/][^/]+)$/; /** * When libsass tries to resolve an import, it uses a special algorithm. * Since the sass-loader uses webpack to resolve the modules, we need to simulate that algorithm. This function * returns an array of import paths to try. The last entry in the array is always the original url * to enable straight-forward webpack.config aliases. * * @param {string} url * @returns {Array<string>} */ function importsToResolve(url) { const request = utils.urlToRequest(url); // Keep in mind: ext can also be something like '.datepicker' when the true extension is omitted and the filename contains a dot. // @see https://github.com/webpack-contrib/sass-loader/issues/167 const ext = path.extname(request); if (matchModuleImport.test(url)) { return [request, url]; } // libsass' import algorithm works like this: // In case there is a file extension... // - If the file is a CSS-file, do not include it all, but just link it via @import url(). // - The exact file name must match (no auto-resolving of '_'-modules). if (ext === '.css') { return []; } if (ext === '.scss' || ext === '.sass') { return [request, url]; } // In case there is no file extension... // - Prefer modules starting with '_'. // - File extension precedence: .scss, .sass, .css. const basename = path.basename(request); if (basename.charAt(0) === '_') { return [`${request}.scss`, `${request}.sass`, `${request}.css`, url]; } const dirname = path.dirname(request); return [ `${dirname}/_${basename}.scss`, `${dirname}/_${basename}.sass`, `${dirname}/_${basename}.css`, `${request}.scss`, `${request}.sass`, `${request}.css`, url, ]; } module.exports = importsToResolve;