|
|
- /*
- 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')
-
- 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) {",
- // When the styles change, update the <style> tags
- " module.hot.accept(" + loaderUtils.stringifyRequest(this, "!!" + request) + ", function() {",
- " var newContent = require(" + loaderUtils.stringifyRequest(this, "!!" + request) + ");",
- "",
- " if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];",
- "",
- " var locals = (function(a, b) {",
- " var key, idx = 0;",
- "",
- " for(key in a) {",
- " if(!b || a[key] !== b[key]) return false;",
- " idx++;",
- " }",
- "",
- " for(key in b) idx--;",
- "",
- " return idx === 0;",
- " }(content.locals, newContent.locals));",
- "",
- // This error is caught and not shown and causes a full reload
- " if(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');",
- "",
- " update(newContent);",
- " });",
- "",
- // When the module is disposed, remove the <style> tags
- " module.hot.dispose(function() { update(); });",
- "}"
- ].join("\n");
-
- return [
- // Style Loader
- // Adds CSS to the DOM by adding a <style> tag
- "",
- // Load styles
- "var content = require(" + loaderUtils.stringifyRequest(this, "!!" + request) + ");",
- "",
- "if(typeof content === 'string') content = [[module.id, content, '']];",
- "",
- // Transform styles",
- "var transform;",
- "var insertInto;",
- "",
- options.transform ? "transform = require(" + loaderUtils.stringifyRequest(this, "!" + path.resolve(options.transform)) + ");" : "",
- "",
- "var options = " + JSON.stringify(options),
- "",
- "options.transform = transform",
- "options.insertInto = " + insertInto + ";",
- "",
- // Add styles to the DOM
- "var update = require(" + loaderUtils.stringifyRequest(this, "!" + path.join(__dirname, "lib", "addStyles.js")) + ")(content, options);",
- "",
- "if(content.locals) module.exports = content.locals;",
- "",
- options.hmr ? hmr : ""
- ].join("\n");
- };
|