You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.8 KiB
62 lines
1.8 KiB
'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;
|
|
|