@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.
@@ -1,11 +1,15 @@
1
1
  // src/adapter/index.ts
2
- import path from "path";
2
+ import path2 from "path";
3
3
  import fs2 from "fs";
4
4
  import inspector from "inspector";
5
5
  import { fileURLToPath } from "url";
6
6
 
7
7
  // src/adapter/dev-server.ts
8
- import { createServer } from "vite";
8
+ import path from "path";
9
+ import {
10
+ createServer,
11
+ buildErrorMessage
12
+ } from "vite";
9
13
 
10
14
  // src/adapter/polyfill.ts
11
15
  import * as webStream from "stream/web";
@@ -114,6 +118,13 @@ function copyResponseHeaders(response, headers) {
114
118
  appendHeader(response, "set-cookie", setCookies);
115
119
  }
116
120
  }
121
+ function normalizeError(error) {
122
+ if (error.cause && !error.message) {
123
+ error.message = error.cause.message;
124
+ error.stack || (error.stack = error.cause.stack);
125
+ }
126
+ return error;
127
+ }
117
128
  function createMiddleware(fetch2, options) {
118
129
  const {
119
130
  origin = process.env.ORIGIN,
@@ -141,13 +152,14 @@ function createMiddleware(fetch2, options) {
141
152
  }
142
153
  }
143
154
  function onSignalAborted() {
155
+ const error = normalizeError(signal.reason);
144
156
  if (next) {
145
- next(signal.reason);
157
+ next(error);
146
158
  } else {
147
159
  if (!res.destroyed && res.socket) {
148
160
  res.socket.destroySoon();
149
161
  }
150
- console.error(signal.reason);
162
+ console.error(error);
151
163
  }
152
164
  }
153
165
  if (process.env.NODE_ENV !== "production" && globalThis.__marko_run_dev__ && ((_a = req.headers.accept) == null ? void 0 : _a.includes("text/html"))) {
@@ -158,7 +170,7 @@ function createMiddleware(fetch2, options) {
158
170
  signal.addEventListener("abort", sendError);
159
171
  }
160
172
  function sendError() {
161
- const { message, stack = "" } = signal.reason;
173
+ const { message, stack = "" } = normalizeError(signal.reason);
162
174
  ws.send(
163
175
  JSON.stringify({
164
176
  type: "error",
@@ -192,6 +204,7 @@ function createMiddleware(fetch2, options) {
192
204
  try {
193
205
  response = await fetch2(request, platform);
194
206
  } catch (err) {
207
+ normalizeError(err);
195
208
  if (next) {
196
209
  next(err);
197
210
  } else {
@@ -238,7 +251,7 @@ async function writeResponse(reader, res, controller) {
238
251
  }
239
252
  }
240
253
  var bodyConsumedErrorStream = new ReadableStream({
241
- start(controller) {
254
+ pull(controller) {
242
255
  controller.error(
243
256
  new Error(
244
257
  "The request body stream was already consumed by something before Marko Run."
@@ -247,9 +260,6 @@ var bodyConsumedErrorStream = new ReadableStream({
247
260
  }
248
261
  });
249
262
 
250
- // src/adapter/dev-server.ts
251
- import { inspect } from "util";
252
-
253
263
  // src/adapter/logger.ts
254
264
  import kleur from "kleur";
255
265
  import DraftLog from "draftlog";
@@ -444,130 +454,35 @@ function createAnimationManager(options = {}) {
444
454
  };
445
455
  }
446
456
 
447
- // src/adapter/dev-server.ts
448
- async function createViteDevServer(config2) {
449
- const devServer = await createServer({
450
- ...config2,
451
- appType: "custom",
452
- server: { ...config2 == null ? void 0 : config2.server, middlewareMode: true }
453
- });
454
- getDevGlobal().addDevServer(devServer);
455
- devServer.middlewares.use(logger_default());
456
- return devServer;
457
- }
458
- async function createDevServer(config2) {
459
- const devServer = await createViteDevServer(config2);
460
- const routerMiddleware = createMiddleware(
461
- (request, platform) => globalThis.__marko_run__.fetch(request, platform)
457
+ // src/adapter/utils.ts
458
+ import supporsColor from "supports-color";
459
+ import kleur2 from "kleur";
460
+ function stripAnsi(string) {
461
+ return string.replace(
462
+ /([\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><])/g,
463
+ ""
462
464
  );
463
- devServer.middlewares.use(async (req, res, next) => {
464
- function handleNext(err) {
465
- var _a;
466
- if (err) {
467
- if (err instanceof Error) {
468
- devServer.ssrFixStacktrace(err);
469
- }
470
- console.error(err);
471
- if (res.headersSent) {
472
- if (!res.destroyed) {
473
- (_a = res.socket) == null ? void 0 : _a.destroySoon();
474
- }
475
- } else {
476
- res.statusCode = 500;
477
- res.end(
478
- inspect(err).replace(
479
- /([\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><])/g,
480
- ""
481
- )
482
- );
483
- }
484
- } else {
485
- next == null ? void 0 : next();
486
- }
487
- }
488
- try {
489
- await devServer.ssrLoadModule("@marko/run/router");
490
- } catch (err) {
491
- return handleNext(err);
492
- }
493
- routerMiddleware(req, res, handleNext);
494
- });
495
- return devServer;
496
465
  }
497
- var ClientIdCookieName = "marko-run-client-id";
498
- function getClientId(req) {
499
- if (req.headers.cookie) {
500
- const cookie = req.headers.cookie.split(/;\s+/).find((c) => c.startsWith(ClientIdCookieName));
501
- if (cookie) {
502
- return cookie.slice(ClientIdCookieName.length + 1);
503
- }
504
- }
466
+ function cleanStack(stack) {
467
+ return stack.split(/\n/).filter((l) => /^\s*at/.test(l)).join("\n");
505
468
  }
506
- var devGlobal;
507
- function getDevGlobal() {
508
- if (!devGlobal) {
509
- let handleConnection2 = function(ws, req) {
510
- if (callbacks == null ? void 0 : callbacks.length) {
511
- const id = getClientId(req);
512
- const now = Date.now();
513
- const nextCallbacks = [];
514
- for (const entry of callbacks) {
515
- if (entry.id === id) {
516
- entry.callback(ws);
517
- } else if (entry.expires > now) {
518
- nextCallbacks.push(entry);
519
- }
520
- }
521
- callbacks = nextCallbacks;
522
- }
523
- };
524
- var handleConnection = handleConnection2;
525
- const devServers = /* @__PURE__ */ new Set();
526
- let callbacks = [];
527
- globalThis.__marko_run_dev__ = devGlobal = {
528
- devServers,
529
- addDevServer(devServer) {
530
- const originalClose = devServer.close;
531
- devServer.close = () => {
532
- devServers.delete(devServer);
533
- return originalClose.call(devServer);
534
- };
535
- devServers.add(devServer);
536
- devServer.ws.on("connection", handleConnection2);
537
- },
538
- clear() {
539
- callbacks = [];
540
- for (const devServer of devServers) {
541
- devServer.ws.off("connection", handleConnection2);
542
- devServer.close();
543
- }
544
- },
545
- onClient(res, callback) {
546
- const expires = Date.now() + 1e3;
547
- const id = Math.floor(Math.random() * expires).toString(36);
548
- callbacks.push({
549
- id,
550
- expires,
551
- callback
552
- });
553
- res.setHeader(
554
- "set-cookie",
555
- `${ClientIdCookieName}=${id}; Path=/; Max-Age=100; HttpOnly`
556
- );
557
- }
558
- };
559
- }
560
- return devGlobal;
469
+ function prepareError(err) {
470
+ var _a;
471
+ return {
472
+ message: stripAnsi(err.message),
473
+ stack: stripAnsi(cleanStack(err.stack || "")),
474
+ id: err.id,
475
+ frame: stripAnsi(err.frame || ""),
476
+ plugin: err.plugin,
477
+ pluginCode: (_a = err.pluginCode) == null ? void 0 : _a.toString(),
478
+ loc: err.loc
479
+ };
561
480
  }
562
-
563
- // src/adapter/utils.ts
564
- import supporsColor from "supports-color";
565
- import kleur2 from "kleur";
566
481
  function logInfoBox(address, explorer) {
567
482
  const color = !!supporsColor.stdout;
568
483
  let message = kleur2.bold("Marko Run");
569
484
  if (true) {
570
- message += ` v${"0.4.5"}`;
485
+ message += ` v${"0.4.6"}`;
571
486
  }
572
487
  message += "\n\n";
573
488
  message += kleur2.dim("Server listening at");
@@ -706,6 +621,137 @@ B\u2572 \u2572 GG\u203E\u203E\u203E\u203E O\u2571 \u2571 P\u2571 \u2571
706
621
  return { lines, width };
707
622
  }
708
623
 
624
+ // src/adapter/dev-server.ts
625
+ async function createViteDevServer(config2) {
626
+ const devServer = await createServer({
627
+ ...config2,
628
+ appType: "custom",
629
+ server: { ...config2 == null ? void 0 : config2.server, middlewareMode: true }
630
+ });
631
+ getDevGlobal().addDevServer(devServer);
632
+ devServer.middlewares.use(logger_default());
633
+ return devServer;
634
+ }
635
+ async function createDevServer(config2) {
636
+ const devServer = await createViteDevServer(config2);
637
+ const routerMiddleware = createMiddleware(
638
+ (request, platform) => globalThis.__marko_run__.fetch(request, platform)
639
+ );
640
+ devServer.middlewares.use(async (req, res, next) => {
641
+ try {
642
+ await devServer.ssrLoadModule("@marko/run/router");
643
+ } catch (err) {
644
+ return next(err);
645
+ }
646
+ routerMiddleware(req, res, next);
647
+ }).use(createErrorMiddleware(devServer));
648
+ return devServer;
649
+ }
650
+ var ClientIdCookieName = "marko-run-client-id";
651
+ function getClientId(req) {
652
+ if (req.headers.cookie) {
653
+ const cookie = req.headers.cookie.split(/;\s+/).find((c) => c.startsWith(ClientIdCookieName));
654
+ if (cookie) {
655
+ return cookie.slice(ClientIdCookieName.length + 1);
656
+ }
657
+ }
658
+ }
659
+ var devGlobal;
660
+ function getDevGlobal() {
661
+ if (!devGlobal) {
662
+ let handleConnection2 = function(ws, req) {
663
+ if (callbacks == null ? void 0 : callbacks.length) {
664
+ const id = getClientId(req);
665
+ const now = Date.now();
666
+ const nextCallbacks = [];
667
+ for (const entry of callbacks) {
668
+ if (entry.id === id) {
669
+ entry.callback(ws);
670
+ } else if (entry.expires > now) {
671
+ nextCallbacks.push(entry);
672
+ }
673
+ }
674
+ callbacks = nextCallbacks;
675
+ }
676
+ };
677
+ var handleConnection = handleConnection2;
678
+ const devServers = /* @__PURE__ */ new Set();
679
+ let callbacks = [];
680
+ globalThis.__marko_run_dev__ = devGlobal = {
681
+ devServers,
682
+ addDevServer(devServer) {
683
+ const originalClose = devServer.close;
684
+ devServer.close = () => {
685
+ devServers.delete(devServer);
686
+ return originalClose.call(devServer);
687
+ };
688
+ devServers.add(devServer);
689
+ devServer.ws.on("connection", handleConnection2);
690
+ },
691
+ clear() {
692
+ callbacks = [];
693
+ for (const devServer of devServers) {
694
+ devServer.ws.off("connection", handleConnection2);
695
+ devServer.close();
696
+ }
697
+ },
698
+ onClient(res, callback) {
699
+ const expires = Date.now() + 1e3;
700
+ const id = Math.floor(Math.random() * expires).toString(36);
701
+ callbacks.push({
702
+ id,
703
+ expires,
704
+ callback
705
+ });
706
+ res.setHeader(
707
+ "set-cookie",
708
+ `${ClientIdCookieName}=${id}; Path=/; Max-Age=100; HttpOnly`
709
+ );
710
+ }
711
+ };
712
+ }
713
+ return devGlobal;
714
+ }
715
+ function createErrorMiddleware(devServer) {
716
+ return function errorMiddleware(error, _req, res, _next) {
717
+ if (!error.id) {
718
+ devServer.config.logger.error(buildErrorMessage(error, [`\x1B[31;1mRequest failed with error: ${error.message}\x1B[0m`]));
719
+ }
720
+ res.statusCode = 500;
721
+ res.end(`
722
+ <!DOCTYPE html>
723
+ <html lang="en">
724
+ <head>
725
+ <meta charset="UTF-8" />
726
+ <title>Error</title>
727
+ <script type="module">
728
+ const error = ${JSON.stringify(prepareError(error)).replace(
729
+ /</g,
730
+ "\\u003c"
731
+ )}
732
+ try {
733
+ const { ErrorOverlay } = await import(${JSON.stringify(path.posix.join(devServer.config.base, "/@vite/client"))})
734
+ document.body.appendChild(new ErrorOverlay(error))
735
+ } catch {
736
+ const h = (tag, text) => {
737
+ const el = document.createElement(tag)
738
+ el.textContent = text
739
+ return el
740
+ }
741
+ document.body.appendChild(h('h1', 'Internal Server Error'))
742
+ document.body.appendChild(h('h2', error.message))
743
+ document.body.appendChild(h('pre', error.stack))
744
+ document.body.appendChild(h('p', '(Error overlay failed to load)'))
745
+ }
746
+ </script>
747
+ </head>
748
+ <body>
749
+ </body>
750
+ </html>
751
+ `);
752
+ };
753
+ }
754
+
709
755
  // src/vite/utils/server.ts
710
756
  import net from "net";
711
757
  import cp from "child_process";
@@ -878,9 +924,9 @@ var markoRunFilePrefix = "__marko-run__";
878
924
  var virtualFilePrefix = "virtual:marko-run";
879
925
 
880
926
  // src/adapter/index.ts
881
- var __dirname = path.dirname(fileURLToPath(import.meta.url));
882
- var defaultEntry = path.join(__dirname, "default-entry");
883
- var loadDevWorker = path.join(__dirname, "load-dev-worker.mjs");
927
+ var __dirname = path2.dirname(fileURLToPath(import.meta.url));
928
+ var defaultEntry = path2.join(__dirname, "default-entry");
929
+ var loadDevWorker = path2.join(__dirname, "load-dev-worker.mjs");
884
930
  function adapter() {
885
931
  return {
886
932
  name: "base-adapter",
@@ -931,9 +977,9 @@ function adapter() {
931
977
  }
932
978
  const devServer = await createDevServer(config2);
933
979
  envFile && await loadEnv(envFile);
934
- const inspect2 = getInspectOptions(options.args);
935
- if (inspect2) {
936
- inspector.open(inspect2.port, inspect2.host, inspect2.wait);
980
+ const inspect = getInspectOptions(options.args);
981
+ if (inspect) {
982
+ inspector.open(inspect.port, inspect.host, inspect.wait);
937
983
  }
938
984
  const listen = new Promise((resolve) => {
939
985
  const listener = devServer.middlewares.listen(port, () => {
@@ -978,8 +1024,8 @@ function adapter() {
978
1024
  return;
979
1025
  }
980
1026
  const promises = [];
981
- const cacheDir = path.resolve(__dirname, "../../.cache/explorer");
982
- const codeDir = path.join(cacheDir, "code");
1027
+ const cacheDir = path2.resolve(__dirname, "../../.cache/explorer");
1028
+ const codeDir = path2.join(cacheDir, "code");
983
1029
  if (fs2.existsSync(codeDir)) {
984
1030
  await fs2.promises.rm(codeDir, { recursive: true });
985
1031
  }
@@ -1001,7 +1047,7 @@ function adapter() {
1001
1047
  }
1002
1048
  if (fileName) {
1003
1049
  promises.push(
1004
- fs2.promises.writeFile(path.join(codeDir, fileName), code, {})
1050
+ fs2.promises.writeFile(path2.join(codeDir, fileName), code, {})
1005
1051
  );
1006
1052
  }
1007
1053
  }
@@ -1013,7 +1059,7 @@ function adapter() {
1013
1059
  }
1014
1060
  promises.push(
1015
1061
  fs2.promises.writeFile(
1016
- path.join(cacheDir, "data.json"),
1062
+ path2.join(cacheDir, "data.json"),
1017
1063
  JSON.stringify(data),
1018
1064
  {}
1019
1065
  )
@@ -1030,6 +1076,7 @@ async function startExplorer() {
1030
1076
  }
1031
1077
  export {
1032
1078
  createDevServer,
1079
+ createErrorMiddleware,
1033
1080
  createViteDevServer,
1034
1081
  adapter as default,
1035
1082
  getDevGlobal
@@ -147,6 +147,13 @@ function copyResponseHeaders(response, headers) {
147
147
  appendHeader(response, "set-cookie", setCookies);
148
148
  }
149
149
  }
150
+ function normalizeError(error) {
151
+ if (error.cause && !error.message) {
152
+ error.message = error.cause.message;
153
+ error.stack || (error.stack = error.cause.stack);
154
+ }
155
+ return error;
156
+ }
150
157
  function createMiddleware(fetch2, options) {
151
158
  const {
152
159
  origin = process.env.ORIGIN,
@@ -174,13 +181,14 @@ function createMiddleware(fetch2, options) {
174
181
  }
175
182
  }
176
183
  function onSignalAborted() {
184
+ const error = normalizeError(signal.reason);
177
185
  if (next) {
178
- next(signal.reason);
186
+ next(error);
179
187
  } else {
180
188
  if (!res.destroyed && res.socket) {
181
189
  res.socket.destroySoon();
182
190
  }
183
- console.error(signal.reason);
191
+ console.error(error);
184
192
  }
185
193
  }
186
194
  if (process.env.NODE_ENV !== "production" && globalThis.__marko_run_dev__ && ((_a = req.headers.accept) == null ? void 0 : _a.includes("text/html"))) {
@@ -191,7 +199,7 @@ function createMiddleware(fetch2, options) {
191
199
  signal.addEventListener("abort", sendError);
192
200
  }
193
201
  function sendError() {
194
- const { message, stack = "" } = signal.reason;
202
+ const { message, stack = "" } = normalizeError(signal.reason);
195
203
  ws.send(
196
204
  JSON.stringify({
197
205
  type: "error",
@@ -225,6 +233,7 @@ function createMiddleware(fetch2, options) {
225
233
  try {
226
234
  response = await fetch2(request, platform);
227
235
  } catch (err) {
236
+ normalizeError(err);
228
237
  if (next) {
229
238
  next(err);
230
239
  } else {
@@ -271,7 +280,7 @@ async function writeResponse(reader, res, controller) {
271
280
  }
272
281
  }
273
282
  var bodyConsumedErrorStream = new ReadableStream({
274
- start(controller) {
283
+ pull(controller) {
275
284
  controller.error(
276
285
  new Error(
277
286
  "The request body stream was already consumed by something before Marko Run."
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import type { Fetch, Platform } from "../runtime";
3
2
  import { IncomingMessage, ServerResponse } from "http";
4
3
  export interface NodePlatformInfo {
@@ -105,6 +105,13 @@ function copyResponseHeaders(response, headers) {
105
105
  appendHeader(response, "set-cookie", setCookies);
106
106
  }
107
107
  }
108
+ function normalizeError(error) {
109
+ if (error.cause && !error.message) {
110
+ error.message = error.cause.message;
111
+ error.stack || (error.stack = error.cause.stack);
112
+ }
113
+ return error;
114
+ }
108
115
  function createMiddleware(fetch2, options) {
109
116
  const {
110
117
  origin = process.env.ORIGIN,
@@ -132,13 +139,14 @@ function createMiddleware(fetch2, options) {
132
139
  }
133
140
  }
134
141
  function onSignalAborted() {
142
+ const error = normalizeError(signal.reason);
135
143
  if (next) {
136
- next(signal.reason);
144
+ next(error);
137
145
  } else {
138
146
  if (!res.destroyed && res.socket) {
139
147
  res.socket.destroySoon();
140
148
  }
141
- console.error(signal.reason);
149
+ console.error(error);
142
150
  }
143
151
  }
144
152
  if (process.env.NODE_ENV !== "production" && globalThis.__marko_run_dev__ && ((_a = req.headers.accept) == null ? void 0 : _a.includes("text/html"))) {
@@ -149,7 +157,7 @@ function createMiddleware(fetch2, options) {
149
157
  signal.addEventListener("abort", sendError);
150
158
  }
151
159
  function sendError() {
152
- const { message, stack = "" } = signal.reason;
160
+ const { message, stack = "" } = normalizeError(signal.reason);
153
161
  ws.send(
154
162
  JSON.stringify({
155
163
  type: "error",
@@ -183,6 +191,7 @@ function createMiddleware(fetch2, options) {
183
191
  try {
184
192
  response = await fetch2(request, platform);
185
193
  } catch (err) {
194
+ normalizeError(err);
186
195
  if (next) {
187
196
  next(err);
188
197
  } else {
@@ -229,7 +238,7 @@ async function writeResponse(reader, res, controller) {
229
238
  }
230
239
  }
231
240
  var bodyConsumedErrorStream = new ReadableStream({
232
- start(controller) {
241
+ pull(controller) {
233
242
  controller.error(
234
243
  new Error(
235
244
  "The request body stream was already consumed by something before Marko Run."
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { ServerResponse } from 'http';
3
2
  declare global {
4
3
  interface Headers {
@@ -1,3 +1,18 @@
1
+ import type { Rollup } from "vite";
2
+ type RollupError = Rollup.RollupError;
3
+ export declare function prepareError(err: Error | RollupError): {
4
+ message: string;
5
+ stack: string;
6
+ id: string | undefined;
7
+ frame: string;
8
+ plugin: string | undefined;
9
+ pluginCode: string | undefined;
10
+ loc: {
11
+ column: number;
12
+ file?: string;
13
+ line: number;
14
+ } | undefined;
15
+ };
1
16
  export declare function logInfoBox(address: string, explorer?: string): void;
2
17
  export declare function drawMarkoBox(message: string, options?: LogoOptions): string[];
3
18
  export interface LogoOptions {
@@ -8,3 +23,4 @@ export declare function drawMarkoLogo(options?: LogoOptions): {
8
23
  lines: string[];
9
24
  width: number;
10
25
  };
26
+ export {};