index.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.startedDevelopmentServer = startedDevelopmentServer;
  6. exports.formatAmpMessages = formatAmpMessages;
  7. exports.ampValidation = ampValidation;
  8. exports.watchCompilers = watchCompilers;
  9. exports.reportTrigger = reportTrigger;
  10. var _chalk = _interopRequireDefault(require("next/dist/compiled/chalk"));
  11. var _stripAnsi = _interopRequireDefault(require("next/dist/compiled/strip-ansi"));
  12. var _textTable = _interopRequireDefault(require("next/dist/compiled/text-table"));
  13. var _unistore = _interopRequireDefault(require("next/dist/compiled/unistore"));
  14. var _formatWebpackMessages = _interopRequireDefault(require("../../client/dev/error-overlay/format-webpack-messages"));
  15. var _store = require("./store");
  16. var _constants = require("../../shared/lib/constants");
  17. function _interopRequireDefault(obj) {
  18. return obj && obj.__esModule ? obj : {
  19. default: obj
  20. };
  21. }
  22. function startedDevelopmentServer(appUrl, bindAddr) {
  23. _store.store.setState({
  24. appUrl,
  25. bindAddr
  26. });
  27. }
  28. let previousClient = null;
  29. let previousServer = null;
  30. let previousEdgeServer = null;
  31. function formatAmpMessages(amp) {
  32. let output = _chalk.default.bold("Amp Validation") + "\n\n";
  33. let messages = [];
  34. const chalkError = _chalk.default.red("error");
  35. function ampError(page, error) {
  36. messages.push([
  37. page,
  38. chalkError,
  39. error.message,
  40. error.specUrl || ""
  41. ]);
  42. }
  43. const chalkWarn = _chalk.default.yellow("warn");
  44. function ampWarn(page, warn) {
  45. messages.push([
  46. page,
  47. chalkWarn,
  48. warn.message,
  49. warn.specUrl || ""
  50. ]);
  51. }
  52. for(const page1 in amp){
  53. let { errors , warnings } = amp[page1];
  54. const devOnlyFilter = (err)=>err.code !== "DEV_MODE_ONLY";
  55. errors = errors.filter(devOnlyFilter);
  56. warnings = warnings.filter(devOnlyFilter);
  57. if (!(errors.length || warnings.length)) {
  58. continue;
  59. }
  60. if (errors.length) {
  61. ampError(page1, errors[0]);
  62. for(let index = 1; index < errors.length; ++index){
  63. ampError("", errors[index]);
  64. }
  65. }
  66. if (warnings.length) {
  67. ampWarn(errors.length ? "" : page1, warnings[0]);
  68. for(let index = 1; index < warnings.length; ++index){
  69. ampWarn("", warnings[index]);
  70. }
  71. }
  72. messages.push([
  73. "",
  74. "",
  75. "",
  76. ""
  77. ]);
  78. }
  79. if (!messages.length) {
  80. return "";
  81. }
  82. output += (0, _textTable).default(messages, {
  83. align: [
  84. "l",
  85. "l",
  86. "l",
  87. "l"
  88. ],
  89. stringLength (str) {
  90. return (0, _stripAnsi).default(str).length;
  91. }
  92. });
  93. return output;
  94. }
  95. const buildStore = (0, _unistore).default();
  96. let buildWasDone = false;
  97. let clientWasLoading = true;
  98. let serverWasLoading = true;
  99. let edgeServerWasLoading = false;
  100. buildStore.subscribe((state)=>{
  101. const { amp , client , server , edgeServer , trigger } = state;
  102. const { appUrl } = _store.store.getState();
  103. if (client.loading || server.loading || (edgeServer == null ? void 0 : edgeServer.loading)) {
  104. _store.store.setState({
  105. bootstrap: false,
  106. appUrl: appUrl,
  107. loading: true,
  108. trigger
  109. }, true);
  110. clientWasLoading = !buildWasDone && clientWasLoading || client.loading;
  111. serverWasLoading = !buildWasDone && serverWasLoading || server.loading;
  112. edgeServerWasLoading = !buildWasDone && edgeServerWasLoading || edgeServer.loading;
  113. buildWasDone = false;
  114. return;
  115. }
  116. buildWasDone = true;
  117. let partialState = {
  118. bootstrap: false,
  119. appUrl: appUrl,
  120. loading: false,
  121. typeChecking: false,
  122. partial: clientWasLoading && (serverWasLoading || edgeServerWasLoading) ? "client and server" : undefined,
  123. modules: (clientWasLoading ? client.modules : 0) + (serverWasLoading ? server.modules : 0) + (edgeServerWasLoading ? (edgeServer == null ? void 0 : edgeServer.modules) || 0 : 0),
  124. hasEdgeServer: !!edgeServer
  125. };
  126. if (client.errors && clientWasLoading) {
  127. // Show only client errors
  128. _store.store.setState({
  129. ...partialState,
  130. errors: client.errors,
  131. warnings: null
  132. }, true);
  133. } else if (server.errors && serverWasLoading) {
  134. _store.store.setState({
  135. ...partialState,
  136. errors: server.errors,
  137. warnings: null
  138. }, true);
  139. } else if (edgeServer.errors && edgeServerWasLoading) {
  140. _store.store.setState({
  141. ...partialState,
  142. errors: edgeServer.errors,
  143. warnings: null
  144. }, true);
  145. } else {
  146. // Show warnings from all of them
  147. const warnings = [
  148. ...client.warnings || [],
  149. ...server.warnings || [],
  150. ...edgeServer.warnings || [],
  151. ].concat(formatAmpMessages(amp) || []);
  152. _store.store.setState({
  153. ...partialState,
  154. errors: null,
  155. warnings: warnings.length === 0 ? null : warnings
  156. }, true);
  157. }
  158. });
  159. function ampValidation(page, errors, warnings) {
  160. const { amp } = buildStore.getState();
  161. if (!(errors.length || warnings.length)) {
  162. buildStore.setState({
  163. amp: Object.keys(amp).filter((k)=>k !== page).sort()// eslint-disable-next-line no-sequences
  164. .reduce((a, c)=>(a[c] = amp[c], a), {})
  165. });
  166. return;
  167. }
  168. const newAmp = {
  169. ...amp,
  170. [page]: {
  171. errors,
  172. warnings
  173. }
  174. };
  175. buildStore.setState({
  176. amp: Object.keys(newAmp).sort()// eslint-disable-next-line no-sequences
  177. .reduce((a, c)=>(a[c] = newAmp[c], a), {})
  178. });
  179. }
  180. function watchCompilers(client, server, edgeServer) {
  181. if (previousClient === client && previousServer === server && previousEdgeServer === edgeServer) {
  182. return;
  183. }
  184. buildStore.setState({
  185. client: {
  186. loading: true
  187. },
  188. server: {
  189. loading: true
  190. },
  191. edgeServer: {
  192. loading: true
  193. },
  194. trigger: "initial"
  195. });
  196. function tapCompiler(key, compiler, onEvent) {
  197. compiler.hooks.invalid.tap(`NextJsInvalid-${key}`, ()=>{
  198. onEvent({
  199. loading: true
  200. });
  201. });
  202. compiler.hooks.done.tap(`NextJsDone-${key}`, (stats)=>{
  203. buildStore.setState({
  204. amp: {}
  205. });
  206. const { errors , warnings } = (0, _formatWebpackMessages).default(stats.toJson({
  207. preset: "errors-warnings",
  208. moduleTrace: true
  209. }));
  210. const hasErrors = !!(errors == null ? void 0 : errors.length);
  211. const hasWarnings = !!(warnings == null ? void 0 : warnings.length);
  212. onEvent({
  213. loading: false,
  214. modules: stats.compilation.modules.size,
  215. errors: hasErrors ? errors : null,
  216. warnings: hasWarnings ? warnings : null
  217. });
  218. });
  219. }
  220. tapCompiler(_constants.COMPILER_NAMES.client, client, (status)=>{
  221. if (!status.loading && !buildStore.getState().server.loading && !buildStore.getState().edgeServer.loading) {
  222. buildStore.setState({
  223. client: status,
  224. trigger: undefined
  225. });
  226. } else {
  227. buildStore.setState({
  228. client: status
  229. });
  230. }
  231. });
  232. tapCompiler(_constants.COMPILER_NAMES.server, server, (status)=>{
  233. if (!status.loading && !buildStore.getState().client.loading && !buildStore.getState().edgeServer.loading) {
  234. buildStore.setState({
  235. server: status,
  236. trigger: undefined
  237. });
  238. } else {
  239. buildStore.setState({
  240. server: status
  241. });
  242. }
  243. });
  244. tapCompiler(_constants.COMPILER_NAMES.edgeServer, edgeServer, (status)=>{
  245. if (!status.loading && !buildStore.getState().client.loading && !buildStore.getState().server.loading) {
  246. buildStore.setState({
  247. edgeServer: status,
  248. trigger: undefined
  249. });
  250. } else {
  251. buildStore.setState({
  252. edgeServer: status
  253. });
  254. }
  255. });
  256. previousClient = client;
  257. previousServer = server;
  258. previousEdgeServer = edgeServer;
  259. }
  260. function reportTrigger(trigger) {
  261. buildStore.setState({
  262. trigger
  263. });
  264. }
  265. //# sourceMappingURL=index.js.map