90 lines
2.3 KiB
JavaScript
90 lines
2.3 KiB
JavaScript
|
/*
|
||
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
|
Author Tobias Koppers @sokra
|
||
|
*/
|
||
|
var path = require('path');
|
||
|
|
||
|
var loaderUtils = require("loader-utils");
|
||
|
var validateOptions = require('schema-utils');
|
||
|
|
||
|
module.exports = function () {};
|
||
|
|
||
|
module.exports.pitch = function (request) {
|
||
|
if (this.cacheable) this.cacheable();
|
||
|
|
||
|
var options = loaderUtils.getOptions(this) || {};
|
||
|
|
||
|
validateOptions(require('./options.json'), options, 'Style Loader (Useable)');
|
||
|
|
||
|
options.hmr = typeof options.hmr === 'undefined' ? true : options.hmr;
|
||
|
|
||
|
// The variable is needed, because the function should be inlined.
|
||
|
// If is just stored it in options, JSON.stringify will quote
|
||
|
// the function and it would be just a string at runtime
|
||
|
var insertInto;
|
||
|
|
||
|
if (typeof options.insertInto === "function") {
|
||
|
insertInto = options.insertInto.toString();
|
||
|
}
|
||
|
|
||
|
// We need to check if it a string, or variable will be "undefined"
|
||
|
// and the loader crashes
|
||
|
if (typeof options.insertInto === "string") {
|
||
|
insertInto = '"' + options.insertInto + '"';
|
||
|
}
|
||
|
|
||
|
var hmr = [
|
||
|
// Hot Module Replacement
|
||
|
"if(module.hot) {",
|
||
|
" var lastRefs = module.hot.data && module.hot.data.refs || 0;",
|
||
|
"",
|
||
|
" if(lastRefs) {",
|
||
|
" exports.ref();",
|
||
|
" if(!content.locals) {",
|
||
|
" refs = lastRefs;",
|
||
|
" }",
|
||
|
" }",
|
||
|
"",
|
||
|
" if(!content.locals) {",
|
||
|
" module.hot.accept();",
|
||
|
" }",
|
||
|
"",
|
||
|
" module.hot.dispose(function(data) {",
|
||
|
" data.refs = content.locals ? 0 : refs;",
|
||
|
"",
|
||
|
" if(dispose) {",
|
||
|
" dispose();",
|
||
|
" }",
|
||
|
" });",
|
||
|
"}"
|
||
|
].join("\n");
|
||
|
|
||
|
return [
|
||
|
"var refs = 0;",
|
||
|
"var dispose;",
|
||
|
"var content = require(" + loaderUtils.stringifyRequest(this, "!!" + request) + ");",
|
||
|
"var options = " + JSON.stringify(options) + ";",
|
||
|
"options.insertInto = " + insertInto + ";",
|
||
|
"",
|
||
|
"if(typeof content === 'string') content = [[module.id, content, '']];",
|
||
|
// Export CSS Modules
|
||
|
"if(content.locals) exports.locals = content.locals;",
|
||
|
"",
|
||
|
"exports.use = exports.ref = function() {",
|
||
|
" if(!(refs++)) {",
|
||
|
" dispose = require(" + loaderUtils.stringifyRequest(this, "!" + path.join(__dirname, "lib", "addStyles.js")) + ")(content, options);",
|
||
|
" }",
|
||
|
"",
|
||
|
" return exports;",
|
||
|
"};",
|
||
|
"",
|
||
|
"exports.unuse = exports.unref = function() {",
|
||
|
" if(refs > 0 && !(--refs)) {",
|
||
|
" dispose();",
|
||
|
" dispose = null;",
|
||
|
" }",
|
||
|
"};",
|
||
|
options.hmr ? hmr : ""
|
||
|
].join("\n");
|
||
|
};
|