utils.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.getExportLazyStyleCode = getExportLazyStyleCode;
  6. exports.getExportStyleCode = getExportStyleCode;
  7. exports.getImportInsertBySelectorCode = getImportInsertBySelectorCode;
  8. exports.getImportInsertStyleElementCode = getImportInsertStyleElementCode;
  9. exports.getImportIsOldIECode = getImportIsOldIECode;
  10. exports.getImportLinkAPICode = getImportLinkAPICode;
  11. exports.getImportLinkContentCode = getImportLinkContentCode;
  12. exports.getImportStyleAPICode = getImportStyleAPICode;
  13. exports.getImportStyleContentCode = getImportStyleContentCode;
  14. exports.getImportStyleDomAPICode = getImportStyleDomAPICode;
  15. exports.getInsertOptionCode = getInsertOptionCode;
  16. exports.getLinkHmrCode = getLinkHmrCode;
  17. exports.getSetAttributesCode = getSetAttributesCode;
  18. exports.getStyleHmrCode = getStyleHmrCode;
  19. exports.getStyleTagTransformFn = getStyleTagTransformFn;
  20. exports.getStyleTagTransformFnCode = getStyleTagTransformFnCode;
  21. exports.getdomAPI = getdomAPI;
  22. exports.stringifyRequest = stringifyRequest;
  23. var _path = _interopRequireDefault(require("path"));
  24. var _isEqualLocals = _interopRequireDefault(require("./runtime/isEqualLocals"));
  25. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  26. const matchRelativePath = /^\.\.?[/\\]/;
  27. function isAbsolutePath(str) {
  28. return _path.default.posix.isAbsolute(str) || _path.default.win32.isAbsolute(str);
  29. }
  30. function isRelativePath(str) {
  31. return matchRelativePath.test(str);
  32. } // TODO simplify for the next major release
  33. function stringifyRequest(loaderContext, request) {
  34. if (typeof loaderContext.utils !== "undefined" && typeof loaderContext.utils.contextify === "function") {
  35. return JSON.stringify(loaderContext.utils.contextify(loaderContext.context, request));
  36. }
  37. const splitted = request.split("!");
  38. const {
  39. context
  40. } = loaderContext;
  41. return JSON.stringify(splitted.map(part => {
  42. // First, separate singlePath from query, because the query might contain paths again
  43. const splittedPart = part.match(/^(.*?)(\?.*)/);
  44. const query = splittedPart ? splittedPart[2] : "";
  45. let singlePath = splittedPart ? splittedPart[1] : part;
  46. if (isAbsolutePath(singlePath) && context) {
  47. singlePath = _path.default.relative(context, singlePath);
  48. if (isAbsolutePath(singlePath)) {
  49. // If singlePath still matches an absolute path, singlePath was on a different drive than context.
  50. // In this case, we leave the path platform-specific without replacing any separators.
  51. // @see https://github.com/webpack/loader-utils/pull/14
  52. return singlePath + query;
  53. }
  54. if (isRelativePath(singlePath) === false) {
  55. // Ensure that the relative path starts at least with ./ otherwise it would be a request into the modules directory (like node_modules).
  56. singlePath = `./${singlePath}`;
  57. }
  58. }
  59. return singlePath.replace(/\\/g, "/") + query;
  60. }).join("!"));
  61. }
  62. function getImportLinkAPICode(esModule, loaderContext) {
  63. const modulePath = stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/injectStylesIntoLinkTag.js")}`);
  64. return esModule ? `import API from ${modulePath};` : `var API = require(${modulePath});`;
  65. }
  66. function getImportLinkContentCode(esModule, loaderContext, request) {
  67. const modulePath = stringifyRequest(loaderContext, `!!${request}`);
  68. return esModule ? `import content from ${modulePath};` : `var content = require(${modulePath});`;
  69. }
  70. function getImportStyleAPICode(esModule, loaderContext) {
  71. const modulePath = stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/injectStylesIntoStyleTag.js")}`);
  72. return esModule ? `import API from ${modulePath};` : `var API = require(${modulePath});`;
  73. }
  74. function getImportStyleDomAPICode(esModule, loaderContext, isSingleton, isAuto) {
  75. const styleAPI = stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/styleDomAPI.js")}`);
  76. const singletonAPI = stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/singletonStyleDomAPI.js")}`);
  77. if (isAuto) {
  78. return esModule ? `import domAPI from ${styleAPI};
  79. import domAPISingleton from ${singletonAPI};` : `var domAPI = require(${styleAPI});
  80. var domAPISingleton = require(${singletonAPI});`;
  81. }
  82. return esModule ? `import domAPI from ${isSingleton ? singletonAPI : styleAPI};` : `var domAPI = require(${isSingleton ? singletonAPI : styleAPI});`;
  83. }
  84. function getImportStyleContentCode(esModule, loaderContext, request) {
  85. const modulePath = stringifyRequest(loaderContext, `!!${request}`);
  86. return esModule ? `import content, * as namedExport from ${modulePath};` : `var content = require(${modulePath});`;
  87. }
  88. function getImportInsertBySelectorCode(esModule, loaderContext, insertType, options) {
  89. if (insertType === "selector") {
  90. const modulePath = stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/insertBySelector.js")}`);
  91. return esModule ? `import insertFn from ${modulePath};` : `var insertFn = require(${modulePath});`;
  92. }
  93. if (insertType === "module-path") {
  94. const modulePath = stringifyRequest(loaderContext, `${options.insert}`);
  95. loaderContext.addBuildDependency(options.insert);
  96. return esModule ? `import insertFn from ${modulePath};` : `var insertFn = require(${modulePath});`;
  97. }
  98. return "";
  99. }
  100. function getInsertOptionCode(insertType, options) {
  101. if (insertType === "selector") {
  102. const insert = options.insert ? JSON.stringify(options.insert) : '"head"';
  103. return `
  104. options.insert = insertFn.bind(null, ${insert});
  105. `;
  106. }
  107. if (insertType === "module-path") {
  108. return `options.insert = insertFn;`;
  109. } // Todo remove "function" type for insert option in next major release, because code duplication occurs. Leave require.resolve()
  110. return `options.insert = ${options.insert.toString()};`;
  111. }
  112. function getImportInsertStyleElementCode(esModule, loaderContext) {
  113. const modulePath = stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/insertStyleElement.js")}`);
  114. return esModule ? `import insertStyleElement from ${modulePath};` : `var insertStyleElement = require(${modulePath});`;
  115. }
  116. function getStyleHmrCode(esModule, loaderContext, request, lazy) {
  117. const modulePath = stringifyRequest(loaderContext, `!!${request}`);
  118. return `
  119. if (module.hot) {
  120. if (!content.locals || module.hot.invalidate) {
  121. var isEqualLocals = ${_isEqualLocals.default.toString()};
  122. var isNamedExport = ${esModule ? "!content.locals" : false};
  123. var oldLocals = isNamedExport ? namedExport : content.locals;
  124. module.hot.accept(
  125. ${modulePath},
  126. function () {
  127. ${esModule ? `if (!isEqualLocals(oldLocals, isNamedExport ? namedExport : content.locals, isNamedExport)) {
  128. module.hot.invalidate();
  129. return;
  130. }
  131. oldLocals = isNamedExport ? namedExport : content.locals;
  132. ${lazy ? `if (update && refs > 0) {
  133. update(content);
  134. }` : `update(content);`}` : `content = require(${modulePath});
  135. content = content.__esModule ? content.default : content;
  136. ${lazy ? "" : `if (typeof content === 'string') {
  137. content = [[module.id, content, '']];
  138. }`}
  139. if (!isEqualLocals(oldLocals, content.locals)) {
  140. module.hot.invalidate();
  141. return;
  142. }
  143. oldLocals = content.locals;
  144. ${lazy ? `if (update && refs > 0) {
  145. update(content);
  146. }` : `update(content);`}`}
  147. }
  148. )
  149. }
  150. module.hot.dispose(function() {
  151. ${lazy ? `if (update) {
  152. update();
  153. }` : `update();`}
  154. });
  155. }
  156. `;
  157. }
  158. function getLinkHmrCode(esModule, loaderContext, request) {
  159. const modulePath = stringifyRequest(loaderContext, `!!${request}`);
  160. return `
  161. if (module.hot) {
  162. module.hot.accept(
  163. ${modulePath},
  164. function() {
  165. ${esModule ? "update(content);" : `content = require(${modulePath});
  166. content = content.__esModule ? content.default : content;
  167. update(content);`}
  168. }
  169. );
  170. module.hot.dispose(function() {
  171. update();
  172. });
  173. }`;
  174. }
  175. function getdomAPI(isAuto) {
  176. return isAuto ? "isOldIE() ? domAPISingleton : domAPI" : "domAPI";
  177. }
  178. function getImportIsOldIECode(esModule, loaderContext) {
  179. const modulePath = stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/isOldIE.js")}`);
  180. return esModule ? `import isOldIE from ${modulePath};` : `var isOldIE = require(${modulePath});`;
  181. }
  182. function getStyleTagTransformFnCode(esModule, loaderContext, options, isSingleton, styleTagTransformType) {
  183. if (isSingleton) {
  184. return "";
  185. }
  186. if (styleTagTransformType === "default") {
  187. const modulePath = stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/styleTagTransform.js")}`);
  188. return esModule ? `import styleTagTransformFn from ${modulePath};` : `var styleTagTransformFn = require(${modulePath});`;
  189. }
  190. if (styleTagTransformType === "module-path") {
  191. const modulePath = stringifyRequest(loaderContext, `${options.styleTagTransform}`);
  192. loaderContext.addBuildDependency(options.styleTagTransform);
  193. return esModule ? `import styleTagTransformFn from ${modulePath};` : `var styleTagTransformFn = require(${modulePath});`;
  194. }
  195. return "";
  196. }
  197. function getStyleTagTransformFn(options, isSingleton) {
  198. // Todo remove "function" type for styleTagTransform option in next major release, because code duplication occurs. Leave require.resolve()
  199. return isSingleton ? "" : typeof options.styleTagTransform === "function" ? `options.styleTagTransform = ${options.styleTagTransform.toString()}` : `options.styleTagTransform = styleTagTransformFn`;
  200. }
  201. function getExportStyleCode(esModule, loaderContext, request) {
  202. const modulePath = stringifyRequest(loaderContext, `!!${request}`);
  203. return esModule ? `export * from ${modulePath};
  204. export default content && content.locals ? content.locals : undefined;` : "module.exports = content && content.locals || {};";
  205. }
  206. function getExportLazyStyleCode(esModule, loaderContext, request) {
  207. const modulePath = stringifyRequest(loaderContext, `!!${request}`);
  208. return esModule ? `export * from ${modulePath};
  209. export default exported;` : "module.exports = exported;";
  210. }
  211. function getSetAttributesCode(esModule, loaderContext, options) {
  212. let modulePath;
  213. if (typeof options.attributes !== "undefined") {
  214. modulePath = options.attributes.nonce !== "undefined" ? stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/setAttributesWithAttributesAndNonce.js")}`) : stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/setAttributesWithAttributes.js")}`);
  215. } else {
  216. modulePath = stringifyRequest(loaderContext, `!${_path.default.join(__dirname, "runtime/setAttributesWithoutAttributes.js")}`);
  217. }
  218. return esModule ? `import setAttributes from ${modulePath};` : `var setAttributes = require(${modulePath});`;
  219. } // eslint-disable-next-line import/prefer-default-export