Blame view

node_modules/style-loader/index.js 2.9 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  /*
  	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");
  };