@marko/run 0.4.5 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var adapter_exports = {};
32
32
  __export(adapter_exports, {
33
33
  createDevServer: () => createDevServer,
34
+ createErrorMiddleware: () => createErrorMiddleware,
34
35
  createViteDevServer: () => createViteDevServer,
35
36
  default: () => adapter,
36
37
  getDevGlobal: () => getDevGlobal
@@ -42,12 +43,13 @@ var import_url = require("url");
42
43
  var __importMetaURL = (0, import_url.pathToFileURL)(__filename);
43
44
 
44
45
  // src/adapter/index.ts
45
- var import_path = __toESM(require("path"), 1);
46
+ var import_path2 = __toESM(require("path"), 1);
46
47
  var import_fs2 = __toESM(require("fs"), 1);
47
48
  var import_inspector2 = __toESM(require("inspector"), 1);
48
49
  var import_url2 = require("url");
49
50
 
50
51
  // src/adapter/dev-server.ts
52
+ var import_path = __toESM(require("path"), 1);
51
53
  var import_vite = require("vite");
52
54
 
53
55
  // src/adapter/polyfill.ts
@@ -157,6 +159,13 @@ function copyResponseHeaders(response, headers) {
157
159
  appendHeader(response, "set-cookie", setCookies);
158
160
  }
159
161
  }
162
+ function normalizeError(error) {
163
+ if (error.cause && !error.message) {
164
+ error.message = error.cause.message;
165
+ error.stack || (error.stack = error.cause.stack);
166
+ }
167
+ return error;
168
+ }
160
169
  function createMiddleware(fetch2, options) {
161
170
  const {
162
171
  origin = process.env.ORIGIN,
@@ -184,13 +193,14 @@ function createMiddleware(fetch2, options) {
184
193
  }
185
194
  }
186
195
  function onSignalAborted() {
196
+ const error = normalizeError(signal.reason);
187
197
  if (next) {
188
- next(signal.reason);
198
+ next(error);
189
199
  } else {
190
200
  if (!res.destroyed && res.socket) {
191
201
  res.socket.destroySoon();
192
202
  }
193
- console.error(signal.reason);
203
+ console.error(error);
194
204
  }
195
205
  }
196
206
  if (process.env.NODE_ENV !== "production" && globalThis.__marko_run_dev__ && ((_a = req.headers.accept) == null ? void 0 : _a.includes("text/html"))) {
@@ -201,7 +211,7 @@ function createMiddleware(fetch2, options) {
201
211
  signal.addEventListener("abort", sendError);
202
212
  }
203
213
  function sendError() {
204
- const { message, stack = "" } = signal.reason;
214
+ const { message, stack = "" } = normalizeError(signal.reason);
205
215
  ws.send(
206
216
  JSON.stringify({
207
217
  type: "error",
@@ -235,6 +245,7 @@ function createMiddleware(fetch2, options) {
235
245
  try {
236
246
  response = await fetch2(request, platform);
237
247
  } catch (err) {
248
+ normalizeError(err);
238
249
  if (next) {
239
250
  next(err);
240
251
  } else {
@@ -281,7 +292,7 @@ async function writeResponse(reader, res, controller) {
281
292
  }
282
293
  }
283
294
  var bodyConsumedErrorStream = new ReadableStream({
284
- start(controller) {
295
+ pull(controller) {
285
296
  controller.error(
286
297
  new Error(
287
298
  "The request body stream was already consumed by something before Marko Run."
@@ -290,9 +301,6 @@ var bodyConsumedErrorStream = new ReadableStream({
290
301
  }
291
302
  });
292
303
 
293
- // src/adapter/dev-server.ts
294
- var import_util = require("util");
295
-
296
304
  // src/adapter/logger.ts
297
305
  var import_kleur = __toESM(require("kleur"), 1);
298
306
  var import_draftlog = __toESM(require("draftlog"), 1);
@@ -487,130 +495,35 @@ function createAnimationManager(options = {}) {
487
495
  };
488
496
  }
489
497
 
490
- // src/adapter/dev-server.ts
491
- async function createViteDevServer(config2) {
492
- const devServer = await (0, import_vite.createServer)({
493
- ...config2,
494
- appType: "custom",
495
- server: { ...config2 == null ? void 0 : config2.server, middlewareMode: true }
496
- });
497
- getDevGlobal().addDevServer(devServer);
498
- devServer.middlewares.use(logger_default());
499
- return devServer;
500
- }
501
- async function createDevServer(config2) {
502
- const devServer = await createViteDevServer(config2);
503
- const routerMiddleware = createMiddleware(
504
- (request, platform) => globalThis.__marko_run__.fetch(request, platform)
498
+ // src/adapter/utils.ts
499
+ var import_supports_color = __toESM(require("supports-color"), 1);
500
+ var import_kleur2 = __toESM(require("kleur"), 1);
501
+ function stripAnsi(string) {
502
+ return string.replace(
503
+ /([\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><])/g,
504
+ ""
505
505
  );
506
- devServer.middlewares.use(async (req, res, next) => {
507
- function handleNext(err) {
508
- var _a;
509
- if (err) {
510
- if (err instanceof Error) {
511
- devServer.ssrFixStacktrace(err);
512
- }
513
- console.error(err);
514
- if (res.headersSent) {
515
- if (!res.destroyed) {
516
- (_a = res.socket) == null ? void 0 : _a.destroySoon();
517
- }
518
- } else {
519
- res.statusCode = 500;
520
- res.end(
521
- (0, import_util.inspect)(err).replace(
522
- /([\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><])/g,
523
- ""
524
- )
525
- );
526
- }
527
- } else {
528
- next == null ? void 0 : next();
529
- }
530
- }
531
- try {
532
- await devServer.ssrLoadModule("@marko/run/router");
533
- } catch (err) {
534
- return handleNext(err);
535
- }
536
- routerMiddleware(req, res, handleNext);
537
- });
538
- return devServer;
539
506
  }
540
- var ClientIdCookieName = "marko-run-client-id";
541
- function getClientId(req) {
542
- if (req.headers.cookie) {
543
- const cookie = req.headers.cookie.split(/;\s+/).find((c) => c.startsWith(ClientIdCookieName));
544
- if (cookie) {
545
- return cookie.slice(ClientIdCookieName.length + 1);
546
- }
547
- }
507
+ function cleanStack(stack) {
508
+ return stack.split(/\n/).filter((l) => /^\s*at/.test(l)).join("\n");
548
509
  }
549
- var devGlobal;
550
- function getDevGlobal() {
551
- if (!devGlobal) {
552
- let handleConnection2 = function(ws, req) {
553
- if (callbacks == null ? void 0 : callbacks.length) {
554
- const id = getClientId(req);
555
- const now = Date.now();
556
- const nextCallbacks = [];
557
- for (const entry of callbacks) {
558
- if (entry.id === id) {
559
- entry.callback(ws);
560
- } else if (entry.expires > now) {
561
- nextCallbacks.push(entry);
562
- }
563
- }
564
- callbacks = nextCallbacks;
565
- }
566
- };
567
- var handleConnection = handleConnection2;
568
- const devServers = /* @__PURE__ */ new Set();
569
- let callbacks = [];
570
- globalThis.__marko_run_dev__ = devGlobal = {
571
- devServers,
572
- addDevServer(devServer) {
573
- const originalClose = devServer.close;
574
- devServer.close = () => {
575
- devServers.delete(devServer);
576
- return originalClose.call(devServer);
577
- };
578
- devServers.add(devServer);
579
- devServer.ws.on("connection", handleConnection2);
580
- },
581
- clear() {
582
- callbacks = [];
583
- for (const devServer of devServers) {
584
- devServer.ws.off("connection", handleConnection2);
585
- devServer.close();
586
- }
587
- },
588
- onClient(res, callback) {
589
- const expires = Date.now() + 1e3;
590
- const id = Math.floor(Math.random() * expires).toString(36);
591
- callbacks.push({
592
- id,
593
- expires,
594
- callback
595
- });
596
- res.setHeader(
597
- "set-cookie",
598
- `${ClientIdCookieName}=${id}; Path=/; Max-Age=100; HttpOnly`
599
- );
600
- }
601
- };
602
- }
603
- return devGlobal;
510
+ function prepareError(err) {
511
+ var _a;
512
+ return {
513
+ message: stripAnsi(err.message),
514
+ stack: stripAnsi(cleanStack(err.stack || "")),
515
+ id: err.id,
516
+ frame: stripAnsi(err.frame || ""),
517
+ plugin: err.plugin,
518
+ pluginCode: (_a = err.pluginCode) == null ? void 0 : _a.toString(),
519
+ loc: err.loc
520
+ };
604
521
  }
605
-
606
- // src/adapter/utils.ts
607
- var import_supports_color = __toESM(require("supports-color"), 1);
608
- var import_kleur2 = __toESM(require("kleur"), 1);
609
522
  function logInfoBox(address, explorer) {
610
523
  const color = !!import_supports_color.default.stdout;
611
524
  let message = import_kleur2.default.bold("Marko Run");
612
525
  if (true) {
613
- message += ` v${"0.4.5"}`;
526
+ message += ` v${"0.4.6"}`;
614
527
  }
615
528
  message += "\n\n";
616
529
  message += import_kleur2.default.dim("Server listening at");
@@ -749,6 +662,137 @@ B\u2572 \u2572 GG\u203E\u203E\u203E\u203E O\u2571 \u2571 P\u2571 \u2571
749
662
  return { lines, width };
750
663
  }
751
664
 
665
+ // src/adapter/dev-server.ts
666
+ async function createViteDevServer(config2) {
667
+ const devServer = await (0, import_vite.createServer)({
668
+ ...config2,
669
+ appType: "custom",
670
+ server: { ...config2 == null ? void 0 : config2.server, middlewareMode: true }
671
+ });
672
+ getDevGlobal().addDevServer(devServer);
673
+ devServer.middlewares.use(logger_default());
674
+ return devServer;
675
+ }
676
+ async function createDevServer(config2) {
677
+ const devServer = await createViteDevServer(config2);
678
+ const routerMiddleware = createMiddleware(
679
+ (request, platform) => globalThis.__marko_run__.fetch(request, platform)
680
+ );
681
+ devServer.middlewares.use(async (req, res, next) => {
682
+ try {
683
+ await devServer.ssrLoadModule("@marko/run/router");
684
+ } catch (err) {
685
+ return next(err);
686
+ }
687
+ routerMiddleware(req, res, next);
688
+ }).use(createErrorMiddleware(devServer));
689
+ return devServer;
690
+ }
691
+ var ClientIdCookieName = "marko-run-client-id";
692
+ function getClientId(req) {
693
+ if (req.headers.cookie) {
694
+ const cookie = req.headers.cookie.split(/;\s+/).find((c) => c.startsWith(ClientIdCookieName));
695
+ if (cookie) {
696
+ return cookie.slice(ClientIdCookieName.length + 1);
697
+ }
698
+ }
699
+ }
700
+ var devGlobal;
701
+ function getDevGlobal() {
702
+ if (!devGlobal) {
703
+ let handleConnection2 = function(ws, req) {
704
+ if (callbacks == null ? void 0 : callbacks.length) {
705
+ const id = getClientId(req);
706
+ const now = Date.now();
707
+ const nextCallbacks = [];
708
+ for (const entry of callbacks) {
709
+ if (entry.id === id) {
710
+ entry.callback(ws);
711
+ } else if (entry.expires > now) {
712
+ nextCallbacks.push(entry);
713
+ }
714
+ }
715
+ callbacks = nextCallbacks;
716
+ }
717
+ };
718
+ var handleConnection = handleConnection2;
719
+ const devServers = /* @__PURE__ */ new Set();
720
+ let callbacks = [];
721
+ globalThis.__marko_run_dev__ = devGlobal = {
722
+ devServers,
723
+ addDevServer(devServer) {
724
+ const originalClose = devServer.close;
725
+ devServer.close = () => {
726
+ devServers.delete(devServer);
727
+ return originalClose.call(devServer);
728
+ };
729
+ devServers.add(devServer);
730
+ devServer.ws.on("connection", handleConnection2);
731
+ },
732
+ clear() {
733
+ callbacks = [];
734
+ for (const devServer of devServers) {
735
+ devServer.ws.off("connection", handleConnection2);
736
+ devServer.close();
737
+ }
738
+ },
739
+ onClient(res, callback) {
740
+ const expires = Date.now() + 1e3;
741
+ const id = Math.floor(Math.random() * expires).toString(36);
742
+ callbacks.push({
743
+ id,
744
+ expires,
745
+ callback
746
+ });
747
+ res.setHeader(
748
+ "set-cookie",
749
+ `${ClientIdCookieName}=${id}; Path=/; Max-Age=100; HttpOnly`
750
+ );
751
+ }
752
+ };
753
+ }
754
+ return devGlobal;
755
+ }
756
+ function createErrorMiddleware(devServer) {
757
+ return function errorMiddleware(error, _req, res, _next) {
758
+ if (!error.id) {
759
+ devServer.config.logger.error((0, import_vite.buildErrorMessage)(error, [`\x1B[31;1mRequest failed with error: ${error.message}\x1B[0m`]));
760
+ }
761
+ res.statusCode = 500;
762
+ res.end(`
763
+ <!DOCTYPE html>
764
+ <html lang="en">
765
+ <head>
766
+ <meta charset="UTF-8" />
767
+ <title>Error</title>
768
+ <script type="module">
769
+ const error = ${JSON.stringify(prepareError(error)).replace(
770
+ /</g,
771
+ "\\u003c"
772
+ )}
773
+ try {
774
+ const { ErrorOverlay } = await import(${JSON.stringify(import_path.default.posix.join(devServer.config.base, "/@vite/client"))})
775
+ document.body.appendChild(new ErrorOverlay(error))
776
+ } catch {
777
+ const h = (tag, text) => {
778
+ const el = document.createElement(tag)
779
+ el.textContent = text
780
+ return el
781
+ }
782
+ document.body.appendChild(h('h1', 'Internal Server Error'))
783
+ document.body.appendChild(h('h2', error.message))
784
+ document.body.appendChild(h('pre', error.stack))
785
+ document.body.appendChild(h('p', '(Error overlay failed to load)'))
786
+ }
787
+ </script>
788
+ </head>
789
+ <body>
790
+ </body>
791
+ </html>
792
+ `);
793
+ };
794
+ }
795
+
752
796
  // src/vite/utils/server.ts
753
797
  var import_net = __toESM(require("net"), 1);
754
798
  var import_child_process = __toESM(require("child_process"), 1);
@@ -921,9 +965,9 @@ var markoRunFilePrefix = "__marko-run__";
921
965
  var virtualFilePrefix = "virtual:marko-run";
922
966
 
923
967
  // src/adapter/index.ts
924
- var __dirname = import_path.default.dirname((0, import_url2.fileURLToPath)(__importMetaURL));
925
- var defaultEntry = import_path.default.join(__dirname, "default-entry");
926
- var loadDevWorker = import_path.default.join(__dirname, "load-dev-worker.mjs");
968
+ var __dirname = import_path2.default.dirname((0, import_url2.fileURLToPath)(__importMetaURL));
969
+ var defaultEntry = import_path2.default.join(__dirname, "default-entry");
970
+ var loadDevWorker = import_path2.default.join(__dirname, "load-dev-worker.mjs");
927
971
  function adapter() {
928
972
  return {
929
973
  name: "base-adapter",
@@ -974,9 +1018,9 @@ function adapter() {
974
1018
  }
975
1019
  const devServer = await createDevServer(config2);
976
1020
  envFile && await loadEnv(envFile);
977
- const inspect2 = getInspectOptions(options.args);
978
- if (inspect2) {
979
- import_inspector2.default.open(inspect2.port, inspect2.host, inspect2.wait);
1021
+ const inspect = getInspectOptions(options.args);
1022
+ if (inspect) {
1023
+ import_inspector2.default.open(inspect.port, inspect.host, inspect.wait);
980
1024
  }
981
1025
  const listen = new Promise((resolve) => {
982
1026
  const listener = devServer.middlewares.listen(port, () => {
@@ -1021,8 +1065,8 @@ function adapter() {
1021
1065
  return;
1022
1066
  }
1023
1067
  const promises = [];
1024
- const cacheDir = import_path.default.resolve(__dirname, "../../.cache/explorer");
1025
- const codeDir = import_path.default.join(cacheDir, "code");
1068
+ const cacheDir = import_path2.default.resolve(__dirname, "../../.cache/explorer");
1069
+ const codeDir = import_path2.default.join(cacheDir, "code");
1026
1070
  if (import_fs2.default.existsSync(codeDir)) {
1027
1071
  await import_fs2.default.promises.rm(codeDir, { recursive: true });
1028
1072
  }
@@ -1044,7 +1088,7 @@ function adapter() {
1044
1088
  }
1045
1089
  if (fileName) {
1046
1090
  promises.push(
1047
- import_fs2.default.promises.writeFile(import_path.default.join(codeDir, fileName), code, {})
1091
+ import_fs2.default.promises.writeFile(import_path2.default.join(codeDir, fileName), code, {})
1048
1092
  );
1049
1093
  }
1050
1094
  }
@@ -1056,7 +1100,7 @@ function adapter() {
1056
1100
  }
1057
1101
  promises.push(
1058
1102
  import_fs2.default.promises.writeFile(
1059
- import_path.default.join(cacheDir, "data.json"),
1103
+ import_path2.default.join(cacheDir, "data.json"),
1060
1104
  JSON.stringify(data),
1061
1105
  {}
1062
1106
  )
@@ -1074,6 +1118,7 @@ async function startExplorer() {
1074
1118
  // Annotate the CommonJS export names for ESM import in node:
1075
1119
  0 && (module.exports = {
1076
1120
  createDevServer,
1121
+ createErrorMiddleware,
1077
1122
  createViteDevServer,
1078
1123
  getDevGlobal
1079
1124
  });
@@ -1,7 +1,7 @@
1
1
  import type { Adapter } from "../vite";
2
2
  import { type MarkoRunDev } from "./dev-server";
3
3
  import { type SpawnedServer } from "../vite/utils/server";
4
- export { getDevGlobal, createDevServer, createViteDevServer, type MarkoRunDev, } from "./dev-server";
4
+ export { getDevGlobal, createDevServer, createViteDevServer, createErrorMiddleware, type MarkoRunDev, } from "./dev-server";
5
5
  export type { Adapter, SpawnedServer };
6
6
  export type { NodePlatformInfo } from "./middleware";
7
7
  export type MarkoRunDevAccessor = () => MarkoRunDev;