-
-
Notifications
You must be signed in to change notification settings - Fork 431
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move option normalization code into dedicated module
- Loading branch information
Showing
2 changed files
with
89 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
"use strict"; | ||
|
||
const os = require("os"); | ||
const utils = require("loader-utils"); | ||
const assign = require("object-assign"); | ||
const path = require("path"); | ||
const proxyCustomImporters = require("./proxyCustomImporters"); | ||
|
||
/** | ||
* Derives the sass options from the loader context and normalizes its values with sane defaults. | ||
* | ||
* @param {LoaderContext} loaderContext | ||
* @param {string} content | ||
* @param {Function} webpackImporter | ||
* @returns {Object} | ||
*/ | ||
function normalizeOptions(loaderContext, content, webpackImporter) { | ||
const options = getLoaderOptions(loaderContext); | ||
const resourcePath = loaderContext.resourcePath; | ||
|
||
options.data = options.data ? (options.data + os.EOL + content) : content; | ||
|
||
// opt.outputStyle | ||
if (!options.outputStyle && loaderContext.minimize) { | ||
options.outputStyle = "compressed"; | ||
} | ||
|
||
// opt.sourceMap | ||
// Not using the `this.sourceMap` flag because css source maps are different | ||
// @see https://github.com/webpack/css-loader/pull/40 | ||
if (options.sourceMap) { | ||
// deliberately overriding the sourceMap option | ||
// this value is (currently) ignored by libsass when using the data input instead of file input | ||
// however, it is still necessary for correct relative paths in result.map.sources. | ||
options.sourceMap = loaderContext.options.context + "/sass.map"; | ||
options.omitSourceMapUrl = true; | ||
|
||
// If sourceMapContents option is not set, set it to true otherwise maps will be empty/null | ||
// when exported by webpack-extract-text-plugin. | ||
if ("sourceMapContents" in options === false) { | ||
options.sourceMapContents = true; | ||
} | ||
} | ||
|
||
// indentedSyntax is a boolean flag. | ||
const ext = path.extname(resourcePath); | ||
|
||
// If we are compiling sass and indentedSyntax isn't set, automatically set it. | ||
if (ext && ext.toLowerCase() === ".sass" && "indentedSyntax" in options === false) { | ||
options.indentedSyntax = true; | ||
} else { | ||
options.indentedSyntax = Boolean(options.indentedSyntax); | ||
} | ||
|
||
// Allow passing custom importers to `node-sass`. Accepts `Function` or an array of `Function`s. | ||
options.importer = options.importer ? proxyCustomImporters(options.importer, resourcePath) : []; | ||
options.importer.push(webpackImporter); | ||
|
||
// `node-sass` uses `includePaths` to resolve `@import` paths. Append the currently processed file. | ||
options.includePaths = options.includePaths ? [].concat(options.includePaths) : []; | ||
options.includePaths.push(path.dirname(resourcePath)); | ||
|
||
return options; | ||
} | ||
|
||
/** | ||
* Check the loader query and webpack config for loader options. If an option is defined in both places, | ||
* the loader query takes precedence. | ||
* | ||
* @param {LoaderContext} loaderContext | ||
* @returns {Object} | ||
*/ | ||
function getLoaderOptions(loaderContext) { | ||
const query = utils.parseQuery(loaderContext.query); | ||
const configKey = query.config || "sassLoader"; | ||
const config = loaderContext.options[configKey] || {}; | ||
|
||
delete query.config; | ||
|
||
return assign({}, config, query); | ||
} | ||
|
||
module.exports = normalizeOptions; |