index.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /*!
  2. Stencil Dev Server v4.20.0 | MIT Licensed | https://stenciljs.com
  3. */
  4. "use strict";
  5. var __create = Object.create;
  6. var __defProp = Object.defineProperty;
  7. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  8. var __getOwnPropNames = Object.getOwnPropertyNames;
  9. var __getProtoOf = Object.getPrototypeOf;
  10. var __hasOwnProp = Object.prototype.hasOwnProperty;
  11. var __export = (target, all) => {
  12. for (var name in all)
  13. __defProp(target, name, { get: all[name], enumerable: true });
  14. };
  15. var __copyProps = (to, from, except, desc) => {
  16. if (from && typeof from === "object" || typeof from === "function") {
  17. for (let key of __getOwnPropNames(from))
  18. if (!__hasOwnProp.call(to, key) && key !== except)
  19. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  20. }
  21. return to;
  22. };
  23. var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  24. // If the importer is in node compatibility mode or this is not an ESM
  25. // file that has been converted to a CommonJS file using a Babel-
  26. // compatible transform (i.e. "__esModule" has not been set), then set
  27. // "default" to the CommonJS "module.exports" for node compatibility.
  28. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  29. mod
  30. ));
  31. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  32. // build/dev-server/index.js
  33. var dev_server_exports = {};
  34. __export(dev_server_exports, {
  35. start: () => start
  36. });
  37. module.exports = __toCommonJS(dev_server_exports);
  38. var import_path2 = __toESM(require("path"));
  39. // build/dev-server/server-worker-main.js
  40. var import_child_process = require("child_process");
  41. var import_path = __toESM(require("path"));
  42. function initServerProcessWorkerProxy(sendToMain) {
  43. const workerPath = require.resolve(import_path.default.join(__dirname, "server-worker-thread.js"));
  44. const filteredExecArgs = process.execArgv.filter((v) => !/^--(debug|inspect)/.test(v));
  45. const forkOpts = {
  46. execArgv: filteredExecArgs,
  47. env: process.env,
  48. cwd: process.cwd(),
  49. stdio: ["pipe", "pipe", "pipe", "ipc"]
  50. };
  51. let serverProcess = (0, import_child_process.fork)(workerPath, [], forkOpts);
  52. const receiveFromMain = (msg) => {
  53. if (serverProcess) {
  54. serverProcess.send(msg);
  55. } else if (msg.closeServer) {
  56. sendToMain({ serverClosed: true });
  57. }
  58. };
  59. serverProcess.on("message", (msg) => {
  60. if (msg.serverClosed && serverProcess) {
  61. serverProcess.kill("SIGINT");
  62. serverProcess = null;
  63. }
  64. sendToMain(msg);
  65. });
  66. serverProcess.stdout.on("data", (data) => {
  67. console.log(`dev server: ${data}`);
  68. });
  69. serverProcess.stderr.on("data", (data) => {
  70. sendToMain({ error: { message: "stderr: " + data } });
  71. });
  72. return receiveFromMain;
  73. }
  74. // build/dev-server/index.js
  75. function start(stencilDevServerConfig, logger, watcher) {
  76. return new Promise(async (resolve, reject) => {
  77. try {
  78. const devServerConfig = {
  79. devServerDir: __dirname,
  80. ...stencilDevServerConfig
  81. };
  82. if (!import_path2.default.isAbsolute(devServerConfig.root)) {
  83. devServerConfig.root = import_path2.default.join(process.cwd(), devServerConfig.root);
  84. }
  85. let initServerProcess;
  86. if (stencilDevServerConfig.worker === true || stencilDevServerConfig.worker === void 0) {
  87. initServerProcess = initServerProcessWorkerProxy;
  88. } else {
  89. const devServerProcess = (await import("./server-process.js")).default;
  90. initServerProcess = devServerProcess.initServerProcess;
  91. }
  92. startServer(devServerConfig, logger, watcher, initServerProcess, resolve, reject);
  93. } catch (e) {
  94. reject(e);
  95. }
  96. });
  97. }
  98. function startServer(devServerConfig, logger, watcher, initServerProcess, resolve, reject) {
  99. var _a;
  100. const timespan = logger.createTimeSpan(`starting dev server`, true);
  101. const startupTimeout = logger.getLevel() !== "debug" || devServerConfig.startupTimeout !== 0 ? setTimeout(() => {
  102. reject(`dev server startup timeout`);
  103. }, (_a = devServerConfig.startupTimeout) !== null && _a !== void 0 ? _a : 15e3) : null;
  104. let isActivelyBuilding = false;
  105. let lastBuildResults = null;
  106. let devServer = null;
  107. let removeWatcher = null;
  108. let closeResolve = null;
  109. let hasStarted = false;
  110. let browserUrl = "";
  111. let sendToWorker = null;
  112. const closePromise = new Promise((resolve2) => closeResolve = resolve2);
  113. const close = async () => {
  114. clearTimeout(startupTimeout);
  115. isActivelyBuilding = false;
  116. if (removeWatcher) {
  117. removeWatcher();
  118. }
  119. if (devServer) {
  120. devServer = null;
  121. }
  122. if (sendToWorker) {
  123. sendToWorker({
  124. closeServer: true
  125. });
  126. sendToWorker = null;
  127. }
  128. return closePromise;
  129. };
  130. const emit = async (eventName, data) => {
  131. if (sendToWorker) {
  132. if (eventName === "buildFinish") {
  133. isActivelyBuilding = false;
  134. lastBuildResults = { ...data };
  135. sendToWorker({ buildResults: { ...lastBuildResults }, isActivelyBuilding });
  136. } else if (eventName === "buildLog") {
  137. sendToWorker({
  138. buildLog: { ...data }
  139. });
  140. } else if (eventName === "buildStart") {
  141. isActivelyBuilding = true;
  142. }
  143. }
  144. };
  145. const serverStarted = (msg) => {
  146. hasStarted = true;
  147. clearTimeout(startupTimeout);
  148. devServerConfig = msg.serverStarted;
  149. devServer = {
  150. address: devServerConfig.address,
  151. basePath: devServerConfig.basePath,
  152. browserUrl: devServerConfig.browserUrl,
  153. protocol: devServerConfig.protocol,
  154. port: devServerConfig.port,
  155. root: devServerConfig.root,
  156. emit,
  157. close
  158. };
  159. browserUrl = devServerConfig.browserUrl;
  160. timespan.finish(`dev server started: ${browserUrl}`);
  161. resolve(devServer);
  162. };
  163. const requestLog = (msg) => {
  164. if (devServerConfig.logRequests) {
  165. if (msg.requestLog.status >= 500) {
  166. logger.info(logger.red(`${msg.requestLog.method} ${msg.requestLog.url} (${msg.requestLog.status})`));
  167. } else if (msg.requestLog.status >= 400) {
  168. logger.info(logger.dim(logger.red(`${msg.requestLog.method} ${msg.requestLog.url} (${msg.requestLog.status})`)));
  169. } else if (msg.requestLog.status >= 300) {
  170. logger.info(logger.dim(logger.magenta(`${msg.requestLog.method} ${msg.requestLog.url} (${msg.requestLog.status})`)));
  171. } else {
  172. logger.info(logger.dim(`${logger.cyan(msg.requestLog.method)} ${msg.requestLog.url}`));
  173. }
  174. }
  175. };
  176. const serverError = async (msg) => {
  177. if (hasStarted) {
  178. logger.error(msg.error.message + " " + msg.error.stack);
  179. } else {
  180. await close();
  181. reject(msg.error.message);
  182. }
  183. };
  184. const requestBuildResults = () => {
  185. if (sendToWorker) {
  186. if (lastBuildResults != null) {
  187. const msg = {
  188. buildResults: { ...lastBuildResults },
  189. isActivelyBuilding
  190. };
  191. delete msg.buildResults.hmr;
  192. sendToWorker(msg);
  193. } else {
  194. sendToWorker({
  195. isActivelyBuilding: true
  196. });
  197. }
  198. }
  199. };
  200. const compilerRequest = async (compilerRequestPath) => {
  201. if (watcher && watcher.request && sendToWorker) {
  202. const compilerRequestResults = await watcher.request({ path: compilerRequestPath });
  203. sendToWorker({ compilerRequestResults });
  204. }
  205. };
  206. const receiveFromWorker = (msg) => {
  207. try {
  208. if (msg.serverStarted) {
  209. serverStarted(msg);
  210. } else if (msg.serverClosed) {
  211. logger.debug(`dev server closed: ${browserUrl}`);
  212. closeResolve();
  213. } else if (msg.requestBuildResults) {
  214. requestBuildResults();
  215. } else if (msg.compilerRequestPath) {
  216. compilerRequest(msg.compilerRequestPath);
  217. } else if (msg.requestLog) {
  218. requestLog(msg);
  219. } else if (msg.error) {
  220. serverError(msg);
  221. } else {
  222. logger.debug(`server msg not handled: ${JSON.stringify(msg)}`);
  223. }
  224. } catch (e) {
  225. logger.error("receiveFromWorker: " + e);
  226. }
  227. };
  228. try {
  229. if (watcher) {
  230. removeWatcher = watcher.on(emit);
  231. }
  232. sendToWorker = initServerProcess(receiveFromWorker);
  233. sendToWorker({
  234. startServer: devServerConfig
  235. });
  236. } catch (e) {
  237. close();
  238. reject(e);
  239. }
  240. }
  241. // Annotate the CommonJS export names for ESM import in node:
  242. 0 && (module.exports = {
  243. start
  244. });