@marko/run 0.4.4 → 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
@@ -86,11 +88,9 @@ function getSetCookie_platform(headers) {
86
88
  var inExpiresDateRgs = /Expires\s*=\s*(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*$/i;
87
89
  function getSetCookie_fallback(headers) {
88
90
  const value = headers.get("set-cookie");
89
- if (!value)
90
- return void 0;
91
+ if (!value) return void 0;
91
92
  let sepIndex = value.indexOf(",") + 1;
92
- if (!sepIndex)
93
- return value;
93
+ if (!sepIndex) return value;
94
94
  let index = 0;
95
95
  let setCookie = void 0;
96
96
  let setCookies = void 0;
@@ -105,8 +105,7 @@ function getSetCookie_fallback(headers) {
105
105
  setCookie = valuePart;
106
106
  }
107
107
  index = sepIndex;
108
- while (value.charCodeAt(index) === 32)
109
- index++;
108
+ while (value.charCodeAt(index) === 32) index++;
110
109
  }
111
110
  sepIndex = value.indexOf(",", sepIndex) + 1;
112
111
  } while (sepIndex);
@@ -160,6 +159,13 @@ function copyResponseHeaders(response, headers) {
160
159
  appendHeader(response, "set-cookie", setCookies);
161
160
  }
162
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
+ }
163
169
  function createMiddleware(fetch2, options) {
164
170
  const {
165
171
  origin = process.env.ORIGIN,
@@ -187,13 +193,14 @@ function createMiddleware(fetch2, options) {
187
193
  }
188
194
  }
189
195
  function onSignalAborted() {
196
+ const error = normalizeError(signal.reason);
190
197
  if (next) {
191
- next(signal.reason);
198
+ next(error);
192
199
  } else {
193
200
  if (!res.destroyed && res.socket) {
194
201
  res.socket.destroySoon();
195
202
  }
196
- console.error(signal.reason);
203
+ console.error(error);
197
204
  }
198
205
  }
199
206
  if (process.env.NODE_ENV !== "production" && globalThis.__marko_run_dev__ && ((_a = req.headers.accept) == null ? void 0 : _a.includes("text/html"))) {
@@ -204,7 +211,7 @@ function createMiddleware(fetch2, options) {
204
211
  signal.addEventListener("abort", sendError);
205
212
  }
206
213
  function sendError() {
207
- const { message, stack = "" } = signal.reason;
214
+ const { message, stack = "" } = normalizeError(signal.reason);
208
215
  ws.send(
209
216
  JSON.stringify({
210
217
  type: "error",
@@ -238,6 +245,7 @@ function createMiddleware(fetch2, options) {
238
245
  try {
239
246
  response = await fetch2(request, platform);
240
247
  } catch (err) {
248
+ normalizeError(err);
241
249
  if (next) {
242
250
  next(err);
243
251
  } else {
@@ -284,7 +292,7 @@ async function writeResponse(reader, res, controller) {
284
292
  }
285
293
  }
286
294
  var bodyConsumedErrorStream = new ReadableStream({
287
- start(controller) {
295
+ pull(controller) {
288
296
  controller.error(
289
297
  new Error(
290
298
  "The request body stream was already consumed by something before Marko Run."
@@ -293,9 +301,6 @@ var bodyConsumedErrorStream = new ReadableStream({
293
301
  }
294
302
  });
295
303
 
296
- // src/adapter/dev-server.ts
297
- var import_util = require("util");
298
-
299
304
  // src/adapter/logger.ts
300
305
  var import_kleur = __toESM(require("kleur"), 1);
301
306
  var import_draftlog = __toESM(require("draftlog"), 1);
@@ -490,130 +495,35 @@ function createAnimationManager(options = {}) {
490
495
  };
491
496
  }
492
497
 
493
- // src/adapter/dev-server.ts
494
- async function createViteDevServer(config2) {
495
- const devServer = await (0, import_vite.createServer)({
496
- ...config2,
497
- appType: "custom",
498
- server: { ...config2 == null ? void 0 : config2.server, middlewareMode: true }
499
- });
500
- getDevGlobal().addDevServer(devServer);
501
- devServer.middlewares.use(logger_default());
502
- return devServer;
503
- }
504
- async function createDevServer(config2) {
505
- const devServer = await createViteDevServer(config2);
506
- const routerMiddleware = createMiddleware(
507
- (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
+ ""
508
505
  );
509
- devServer.middlewares.use(async (req, res, next) => {
510
- function handleNext(err) {
511
- var _a;
512
- if (err) {
513
- if (err instanceof Error) {
514
- devServer.ssrFixStacktrace(err);
515
- }
516
- console.error(err);
517
- if (res.headersSent) {
518
- if (!res.destroyed) {
519
- (_a = res.socket) == null ? void 0 : _a.destroySoon();
520
- }
521
- } else {
522
- res.statusCode = 500;
523
- res.end(
524
- (0, import_util.inspect)(err).replace(
525
- /([\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><])/g,
526
- ""
527
- )
528
- );
529
- }
530
- } else {
531
- next == null ? void 0 : next();
532
- }
533
- }
534
- try {
535
- await devServer.ssrLoadModule("@marko/run/router");
536
- } catch (err) {
537
- return handleNext(err);
538
- }
539
- routerMiddleware(req, res, handleNext);
540
- });
541
- return devServer;
542
506
  }
543
- var ClientIdCookieName = "marko-run-client-id";
544
- function getClientId(req) {
545
- if (req.headers.cookie) {
546
- const cookie = req.headers.cookie.split(/;\s+/).find((c) => c.startsWith(ClientIdCookieName));
547
- if (cookie) {
548
- return cookie.slice(ClientIdCookieName.length + 1);
549
- }
550
- }
507
+ function cleanStack(stack) {
508
+ return stack.split(/\n/).filter((l) => /^\s*at/.test(l)).join("\n");
551
509
  }
552
- var devGlobal;
553
- function getDevGlobal() {
554
- if (!devGlobal) {
555
- let handleConnection2 = function(ws, req) {
556
- if (callbacks == null ? void 0 : callbacks.length) {
557
- const id = getClientId(req);
558
- const now = Date.now();
559
- const nextCallbacks = [];
560
- for (const entry of callbacks) {
561
- if (entry.id === id) {
562
- entry.callback(ws);
563
- } else if (entry.expires > now) {
564
- nextCallbacks.push(entry);
565
- }
566
- }
567
- callbacks = nextCallbacks;
568
- }
569
- };
570
- var handleConnection = handleConnection2;
571
- const devServers = /* @__PURE__ */ new Set();
572
- let callbacks = [];
573
- globalThis.__marko_run_dev__ = devGlobal = {
574
- devServers,
575
- addDevServer(devServer) {
576
- const originalClose = devServer.close;
577
- devServer.close = () => {
578
- devServers.delete(devServer);
579
- return originalClose.call(devServer);
580
- };
581
- devServers.add(devServer);
582
- devServer.ws.on("connection", handleConnection2);
583
- },
584
- clear() {
585
- callbacks = [];
586
- for (const devServer of devServers) {
587
- devServer.ws.off("connection", handleConnection2);
588
- devServer.close();
589
- }
590
- },
591
- onClient(res, callback) {
592
- const expires = Date.now() + 1e3;
593
- const id = Math.floor(Math.random() * expires).toString(36);
594
- callbacks.push({
595
- id,
596
- expires,
597
- callback
598
- });
599
- res.setHeader(
600
- "set-cookie",
601
- `${ClientIdCookieName}=${id}; Path=/; Max-Age=100; HttpOnly`
602
- );
603
- }
604
- };
605
- }
606
- 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
+ };
607
521
  }
608
-
609
- // src/adapter/utils.ts
610
- var import_supports_color = __toESM(require("supports-color"), 1);
611
- var import_kleur2 = __toESM(require("kleur"), 1);
612
522
  function logInfoBox(address, explorer) {
613
523
  const color = !!import_supports_color.default.stdout;
614
524
  let message = import_kleur2.default.bold("Marko Run");
615
525
  if (true) {
616
- message += ` v${"0.4.4"}`;
526
+ message += ` v${"0.4.6"}`;
617
527
  }
618
528
  message += "\n\n";
619
529
  message += import_kleur2.default.dim("Server listening at");
@@ -721,8 +631,7 @@ B\u2572 \u2572 GG\u203E\u203E\u203E\u203E O\u2571 \u2571 P\u2571 \u2571
721
631
  lineWidth = 0;
722
632
  }
723
633
  } else if (/[A-Z]/.test(char)) {
724
- while (source[i + 1] === char)
725
- i++;
634
+ while (source[i + 1] === char) i++;
726
635
  if (color) {
727
636
  line += colorEscapeCodes[char];
728
637
  }
@@ -753,6 +662,137 @@ B\u2572 \u2572 GG\u203E\u203E\u203E\u203E O\u2571 \u2571 P\u2571 \u2571
753
662
  return { lines, width };
754
663
  }
755
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
+
756
796
  // src/vite/utils/server.ts
757
797
  var import_net = __toESM(require("net"), 1);
758
798
  var import_child_process = __toESM(require("child_process"), 1);
@@ -925,9 +965,9 @@ var markoRunFilePrefix = "__marko-run__";
925
965
  var virtualFilePrefix = "virtual:marko-run";
926
966
 
927
967
  // src/adapter/index.ts
928
- var __dirname = import_path.default.dirname((0, import_url2.fileURLToPath)(__importMetaURL));
929
- var defaultEntry = import_path.default.join(__dirname, "default-entry");
930
- 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");
931
971
  function adapter() {
932
972
  return {
933
973
  name: "base-adapter",
@@ -978,9 +1018,9 @@ function adapter() {
978
1018
  }
979
1019
  const devServer = await createDevServer(config2);
980
1020
  envFile && await loadEnv(envFile);
981
- const inspect2 = getInspectOptions(options.args);
982
- if (inspect2) {
983
- 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);
984
1024
  }
985
1025
  const listen = new Promise((resolve) => {
986
1026
  const listener = devServer.middlewares.listen(port, () => {
@@ -1025,8 +1065,8 @@ function adapter() {
1025
1065
  return;
1026
1066
  }
1027
1067
  const promises = [];
1028
- const cacheDir = import_path.default.resolve(__dirname, "../../.cache/explorer");
1029
- 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");
1030
1070
  if (import_fs2.default.existsSync(codeDir)) {
1031
1071
  await import_fs2.default.promises.rm(codeDir, { recursive: true });
1032
1072
  }
@@ -1048,7 +1088,7 @@ function adapter() {
1048
1088
  }
1049
1089
  if (fileName) {
1050
1090
  promises.push(
1051
- 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, {})
1052
1092
  );
1053
1093
  }
1054
1094
  }
@@ -1060,7 +1100,7 @@ function adapter() {
1060
1100
  }
1061
1101
  promises.push(
1062
1102
  import_fs2.default.promises.writeFile(
1063
- import_path.default.join(cacheDir, "data.json"),
1103
+ import_path2.default.join(cacheDir, "data.json"),
1064
1104
  JSON.stringify(data),
1065
1105
  {}
1066
1106
  )
@@ -1078,6 +1118,7 @@ async function startExplorer() {
1078
1118
  // Annotate the CommonJS export names for ESM import in node:
1079
1119
  0 && (module.exports = {
1080
1120
  createDevServer,
1121
+ createErrorMiddleware,
1081
1122
  createViteDevServer,
1082
1123
  getDevGlobal
1083
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;