index.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
  2. function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
  3. function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
  4. function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
  5. function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
  6. /* global __resourceQuery, __webpack_hash__ */
  7. /// <reference types="webpack/module" />
  8. import webpackHotLog from "webpack/hot/log.js";
  9. import stripAnsi from "./utils/stripAnsi.js";
  10. import parseURL from "./utils/parseURL.js";
  11. import socket from "./socket.js";
  12. import { formatProblem, createOverlay } from "./overlay.js";
  13. import { log, logEnabledFeatures, setLogLevel } from "./utils/log.js";
  14. import sendMessage from "./utils/sendMessage.js";
  15. import reloadApp from "./utils/reloadApp.js";
  16. import createSocketURL from "./utils/createSocketURL.js";
  17. /**
  18. * @typedef {Object} OverlayOptions
  19. * @property {boolean | (error: Error) => boolean} [warnings]
  20. * @property {boolean | (error: Error) => boolean} [errors]
  21. * @property {boolean | (error: Error) => boolean} [runtimeErrors]
  22. * @property {string} [trustedTypesPolicyName]
  23. */
  24. /**
  25. * @typedef {Object} Options
  26. * @property {boolean} hot
  27. * @property {boolean} liveReload
  28. * @property {boolean} progress
  29. * @property {boolean | OverlayOptions} overlay
  30. * @property {string} [logging]
  31. * @property {number} [reconnect]
  32. */
  33. /**
  34. * @typedef {Object} Status
  35. * @property {boolean} isUnloading
  36. * @property {string} currentHash
  37. * @property {string} [previousHash]
  38. */
  39. /**
  40. * @param {boolean | { warnings?: boolean | string; errors?: boolean | string; runtimeErrors?: boolean | string; }} overlayOptions
  41. */
  42. var decodeOverlayOptions = function decodeOverlayOptions(overlayOptions) {
  43. if (typeof overlayOptions === "object") {
  44. ["warnings", "errors", "runtimeErrors"].forEach(function (property) {
  45. if (typeof overlayOptions[property] === "string") {
  46. var overlayFilterFunctionString = decodeURIComponent(overlayOptions[property]);
  47. // eslint-disable-next-line no-new-func
  48. var overlayFilterFunction = new Function("message", "var callback = ".concat(overlayFilterFunctionString, "\n return callback(message)"));
  49. overlayOptions[property] = overlayFilterFunction;
  50. }
  51. });
  52. }
  53. };
  54. /**
  55. * @type {Status}
  56. */
  57. var status = {
  58. isUnloading: false,
  59. // eslint-disable-next-line camelcase
  60. currentHash: __webpack_hash__
  61. };
  62. /** @type {Options} */
  63. var options = {
  64. hot: false,
  65. liveReload: false,
  66. progress: false,
  67. overlay: false
  68. };
  69. var parsedResourceQuery = parseURL(__resourceQuery);
  70. var enabledFeatures = {
  71. "Hot Module Replacement": false,
  72. "Live Reloading": false,
  73. Progress: false,
  74. Overlay: false
  75. };
  76. if (parsedResourceQuery.hot === "true") {
  77. options.hot = true;
  78. enabledFeatures["Hot Module Replacement"] = true;
  79. }
  80. if (parsedResourceQuery["live-reload"] === "true") {
  81. options.liveReload = true;
  82. enabledFeatures["Live Reloading"] = true;
  83. }
  84. if (parsedResourceQuery.progress === "true") {
  85. options.progress = true;
  86. enabledFeatures.Progress = true;
  87. }
  88. if (parsedResourceQuery.overlay) {
  89. try {
  90. options.overlay = JSON.parse(parsedResourceQuery.overlay);
  91. } catch (e) {
  92. log.error("Error parsing overlay options from resource query:", e);
  93. }
  94. // Fill in default "true" params for partially-specified objects.
  95. if (typeof options.overlay === "object") {
  96. options.overlay = _objectSpread({
  97. errors: true,
  98. warnings: true,
  99. runtimeErrors: true
  100. }, options.overlay);
  101. decodeOverlayOptions(options.overlay);
  102. }
  103. enabledFeatures.Overlay = true;
  104. }
  105. if (parsedResourceQuery.logging) {
  106. options.logging = parsedResourceQuery.logging;
  107. }
  108. if (typeof parsedResourceQuery.reconnect !== "undefined") {
  109. options.reconnect = Number(parsedResourceQuery.reconnect);
  110. }
  111. /**
  112. * @param {string} level
  113. */
  114. function setAllLogLevel(level) {
  115. // This is needed because the HMR logger operate separately from dev server logger
  116. webpackHotLog.setLogLevel(level === "verbose" || level === "log" ? "info" : level);
  117. setLogLevel(level);
  118. }
  119. if (options.logging) {
  120. setAllLogLevel(options.logging);
  121. }
  122. logEnabledFeatures(enabledFeatures);
  123. self.addEventListener("beforeunload", function () {
  124. status.isUnloading = true;
  125. });
  126. var overlay = typeof window !== "undefined" ? createOverlay(typeof options.overlay === "object" ? {
  127. trustedTypesPolicyName: options.overlay.trustedTypesPolicyName,
  128. catchRuntimeError: options.overlay.runtimeErrors
  129. } : {
  130. trustedTypesPolicyName: false,
  131. catchRuntimeError: options.overlay
  132. }) : {
  133. send: function send() {}
  134. };
  135. var onSocketMessage = {
  136. hot: function hot() {
  137. if (parsedResourceQuery.hot === "false") {
  138. return;
  139. }
  140. options.hot = true;
  141. },
  142. liveReload: function liveReload() {
  143. if (parsedResourceQuery["live-reload"] === "false") {
  144. return;
  145. }
  146. options.liveReload = true;
  147. },
  148. invalid: function invalid() {
  149. log.info("App updated. Recompiling...");
  150. // Fixes #1042. overlay doesn't clear if errors are fixed but warnings remain.
  151. if (options.overlay) {
  152. overlay.send({
  153. type: "DISMISS"
  154. });
  155. }
  156. sendMessage("Invalid");
  157. },
  158. /**
  159. * @param {string} hash
  160. */
  161. hash: function hash(_hash) {
  162. status.previousHash = status.currentHash;
  163. status.currentHash = _hash;
  164. },
  165. logging: setAllLogLevel,
  166. /**
  167. * @param {boolean} value
  168. */
  169. overlay: function overlay(value) {
  170. if (typeof document === "undefined") {
  171. return;
  172. }
  173. options.overlay = value;
  174. decodeOverlayOptions(options.overlay);
  175. },
  176. /**
  177. * @param {number} value
  178. */
  179. reconnect: function reconnect(value) {
  180. if (parsedResourceQuery.reconnect === "false") {
  181. return;
  182. }
  183. options.reconnect = value;
  184. },
  185. /**
  186. * @param {boolean} value
  187. */
  188. progress: function progress(value) {
  189. options.progress = value;
  190. },
  191. /**
  192. * @param {{ pluginName?: string, percent: number, msg: string }} data
  193. */
  194. "progress-update": function progressUpdate(data) {
  195. if (options.progress) {
  196. log.info("".concat(data.pluginName ? "[".concat(data.pluginName, "] ") : "").concat(data.percent, "% - ").concat(data.msg, "."));
  197. }
  198. sendMessage("Progress", data);
  199. },
  200. "still-ok": function stillOk() {
  201. log.info("Nothing changed.");
  202. if (options.overlay) {
  203. overlay.send({
  204. type: "DISMISS"
  205. });
  206. }
  207. sendMessage("StillOk");
  208. },
  209. ok: function ok() {
  210. sendMessage("Ok");
  211. if (options.overlay) {
  212. overlay.send({
  213. type: "DISMISS"
  214. });
  215. }
  216. reloadApp(options, status);
  217. },
  218. /**
  219. * @param {string} file
  220. */
  221. "static-changed": function staticChanged(file) {
  222. log.info("".concat(file ? "\"".concat(file, "\"") : "Content", " from static directory was changed. Reloading..."));
  223. self.location.reload();
  224. },
  225. /**
  226. * @param {Error[]} warnings
  227. * @param {any} params
  228. */
  229. warnings: function warnings(_warnings, params) {
  230. log.warn("Warnings while compiling.");
  231. var printableWarnings = _warnings.map(function (error) {
  232. var _formatProblem = formatProblem("warning", error),
  233. header = _formatProblem.header,
  234. body = _formatProblem.body;
  235. return "".concat(header, "\n").concat(stripAnsi(body));
  236. });
  237. sendMessage("Warnings", printableWarnings);
  238. for (var i = 0; i < printableWarnings.length; i++) {
  239. log.warn(printableWarnings[i]);
  240. }
  241. var overlayWarningsSetting = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.warnings;
  242. if (overlayWarningsSetting) {
  243. var warningsToDisplay = typeof overlayWarningsSetting === "function" ? _warnings.filter(overlayWarningsSetting) : _warnings;
  244. if (warningsToDisplay.length) {
  245. overlay.send({
  246. type: "BUILD_ERROR",
  247. level: "warning",
  248. messages: _warnings
  249. });
  250. }
  251. }
  252. if (params && params.preventReloading) {
  253. return;
  254. }
  255. reloadApp(options, status);
  256. },
  257. /**
  258. * @param {Error[]} errors
  259. */
  260. errors: function errors(_errors) {
  261. log.error("Errors while compiling. Reload prevented.");
  262. var printableErrors = _errors.map(function (error) {
  263. var _formatProblem2 = formatProblem("error", error),
  264. header = _formatProblem2.header,
  265. body = _formatProblem2.body;
  266. return "".concat(header, "\n").concat(stripAnsi(body));
  267. });
  268. sendMessage("Errors", printableErrors);
  269. for (var i = 0; i < printableErrors.length; i++) {
  270. log.error(printableErrors[i]);
  271. }
  272. var overlayErrorsSettings = typeof options.overlay === "boolean" ? options.overlay : options.overlay && options.overlay.errors;
  273. if (overlayErrorsSettings) {
  274. var errorsToDisplay = typeof overlayErrorsSettings === "function" ? _errors.filter(overlayErrorsSettings) : _errors;
  275. if (errorsToDisplay.length) {
  276. overlay.send({
  277. type: "BUILD_ERROR",
  278. level: "error",
  279. messages: _errors
  280. });
  281. }
  282. }
  283. },
  284. /**
  285. * @param {Error} error
  286. */
  287. error: function error(_error) {
  288. log.error(_error);
  289. },
  290. close: function close() {
  291. log.info("Disconnected!");
  292. if (options.overlay) {
  293. overlay.send({
  294. type: "DISMISS"
  295. });
  296. }
  297. sendMessage("Close");
  298. }
  299. };
  300. var socketURL = createSocketURL(parsedResourceQuery);
  301. socket(socketURL, onSocketMessage, options.reconnect);