@marko/run 0.0.1-beta8 → 0.0.1-beta9

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.
@@ -36,187 +36,6 @@ var import_url = require("url");
36
36
 
37
37
  // src/adapter/dev-server.ts
38
38
  var import_vite = require("vite");
39
-
40
- // src/adapter/polyfill.ts
41
- var import_web = require("stream/web");
42
- var import_crypto = require("crypto");
43
- var import_undici = require("undici");
44
- var globals = {
45
- crypto: import_crypto.webcrypto,
46
- fetch: import_undici.fetch,
47
- Response: import_undici.Response,
48
- Request: import_undici.Request,
49
- Headers: import_undici.Headers,
50
- ReadableStream: import_web.ReadableStream,
51
- TransformStream: import_web.TransformStream,
52
- WritableStream: import_web.WritableStream,
53
- FormData: import_undici.FormData,
54
- File: import_undici.File
55
- };
56
- function installPolyfills() {
57
- for (const name in globals) {
58
- Object.defineProperty(globalThis, name, {
59
- enumerable: true,
60
- configurable: true,
61
- writable: true,
62
- value: globals[name]
63
- });
64
- }
65
- }
66
-
67
- // src/adapter/middleware.ts
68
- installPolyfills();
69
- function getForwardedHeader(req, name) {
70
- const value = req.headers["x-forwarded-" + name];
71
- if (value) {
72
- if (typeof value === "string") {
73
- const index = value.indexOf(",");
74
- return index < 0 ? value : value.slice(0, index);
75
- }
76
- return value[0];
77
- }
78
- }
79
- function getOrigin(req, protocol, host, trustProxy) {
80
- var _a;
81
- protocol ?? (protocol = req.protocol || trustProxy && getForwardedHeader(req, "proto") || ((_a = req.socket) == null ? void 0 : _a.encrypted) && "https" || "http");
82
- host ?? (host = trustProxy && getForwardedHeader(req, "host") || req.headers.host);
83
- if (!host) {
84
- if (process.env.NODE_ENV !== "production") {
85
- host = "localhost";
86
- console.warn(
87
- `Could not automatically determine the origin host, using 'localhost'. Use the 'origin' option or the 'ORIGIN' environment variable to set the origin explicitly.`
88
- );
89
- } else {
90
- throw new Error(
91
- `Could not automatically determine the origin host. Use the 'origin' option or the 'ORIGIN' environment variable to set the origin explicitly.`
92
- );
93
- }
94
- }
95
- return `${protocol}://${host}`;
96
- }
97
- function createMiddleware(fetch2, options = {}) {
98
- const { trustProxy = process.env.TRUST_PROXY === "1", devServer } = options;
99
- let { origin = process.env.ORIGIN } = options;
100
- let protocol;
101
- let host;
102
- if (origin) {
103
- ({ protocol, host } = new URL(origin));
104
- protocol = protocol.slice(0, -1);
105
- }
106
- return async (req, res, next) => {
107
- origin ?? (origin = getOrigin(req, protocol, host, trustProxy));
108
- const url = new URL(req.url, origin);
109
- const ip = req.ip || trustProxy && getForwardedHeader(req, "for") || req.socket.remoteAddress || "";
110
- const headers = req.headers;
111
- const body = req.method === "GET" || req.method === "HEAD" ? void 0 : req.socket ? req : new ReadableStream({
112
- start(controller) {
113
- req.on("data", (chunk) => controller.enqueue(chunk));
114
- req.on("end", () => controller.close());
115
- req.on("error", (err) => controller.error(err));
116
- }
117
- });
118
- const request = new Request(url, {
119
- method: req.method,
120
- headers,
121
- body,
122
- duplex: "half"
123
- });
124
- const response = await fetch2(request, {
125
- ip,
126
- request: req,
127
- response: res,
128
- setCookie(cookie) {
129
- res.appendHeader("set-cookie", cookie);
130
- }
131
- });
132
- if (!response) {
133
- if (next) {
134
- next();
135
- } else {
136
- res.statusCode = 404;
137
- res.setHeader("content-length", "0");
138
- res.end();
139
- return;
140
- }
141
- return;
142
- }
143
- res.statusCode = response.status;
144
- for (const [key, value] of response.headers) {
145
- if (key === "set-cookie") {
146
- let sepIndex = value.indexOf(",") + 1;
147
- if (!sepIndex) {
148
- res.setHeader(key, value);
149
- } else {
150
- let index = 0;
151
- do {
152
- res.appendHeader(key, value.slice(index, sepIndex - 1));
153
- index = sepIndex;
154
- sepIndex = value.indexOf(",", sepIndex) + 1;
155
- } while (sepIndex);
156
- res.appendHeader(key, value.slice(index));
157
- }
158
- } else {
159
- res.setHeader(key, value);
160
- }
161
- }
162
- if (!response.body) {
163
- if (!response.headers.has("content-length")) {
164
- res.setHeader("content-length", "0");
165
- }
166
- res.end();
167
- return;
168
- }
169
- const reader = response.body.getReader();
170
- if (res.destroyed) {
171
- reader.cancel();
172
- return;
173
- }
174
- res.on("close", cancel);
175
- res.on("error", cancel);
176
- write();
177
- function cancel(error) {
178
- res.off("close", cancel);
179
- res.off("error", cancel);
180
- reader.cancel(error).catch(() => {
181
- });
182
- if (error) {
183
- if (process.env.NODE_ENV !== "production" && devServer) {
184
- res.end();
185
- devServer.ws.send({
186
- type: "error",
187
- err: { message: error.message, stack: error.stack || "" }
188
- });
189
- } else {
190
- res.destroy(error);
191
- }
192
- }
193
- }
194
- async function write() {
195
- try {
196
- while (true) {
197
- const { done, value } = await reader.read();
198
- if (done) {
199
- res.end();
200
- return;
201
- } else if (!res.write(value)) {
202
- res.once("drain", write);
203
- return;
204
- } else if (res.flush) {
205
- res.flush();
206
- }
207
- }
208
- } catch (err) {
209
- const error = err instanceof Error ? err : new Error("Error while writing to node response", {
210
- cause: err
211
- });
212
- cancel(error);
213
- }
214
- }
215
- };
216
- }
217
-
218
- // src/adapter/dev-server.ts
219
- var fixedErrors = /* @__PURE__ */ new WeakSet();
220
39
  function createViteDevMiddleware(devServer, load, factory) {
221
40
  let value;
222
41
  let middleware;
@@ -231,10 +50,7 @@ function createViteDevMiddleware(devServer, load, factory) {
231
50
  } catch (err) {
232
51
  res.statusCode = 500;
233
52
  if (err instanceof Error) {
234
- if (!fixedErrors.has(err)) {
235
- fixedErrors.add(err);
236
- devServer.ssrFixStacktrace(err);
237
- }
53
+ devServer.ssrFixStacktrace(err);
238
54
  res.end(err.stack);
239
55
  } else {
240
56
  res.end();
@@ -252,6 +68,9 @@ async function createDevServer(configFile) {
252
68
  conditions: ["worker"]
253
69
  }
254
70
  });
71
+ const { createMiddleware } = await devServer.ssrLoadModule(
72
+ "@marko/run/adapter/middleware"
73
+ );
255
74
  const middleware = createViteDevMiddleware(
256
75
  devServer,
257
76
  async () => await devServer.ssrLoadModule("@marko/run/router"),
@@ -4,187 +4,6 @@ import { fileURLToPath } from "url";
4
4
 
5
5
  // src/adapter/dev-server.ts
6
6
  import { createServer } from "vite";
7
-
8
- // src/adapter/polyfill.ts
9
- import { ReadableStream as ReadableStream2, TransformStream, WritableStream } from "stream/web";
10
- import { webcrypto as crypto } from "crypto";
11
- import { fetch, Response, Request as Request2, Headers, FormData, File } from "undici";
12
- var globals = {
13
- crypto,
14
- fetch,
15
- Response,
16
- Request: Request2,
17
- Headers,
18
- ReadableStream: ReadableStream2,
19
- TransformStream,
20
- WritableStream,
21
- FormData,
22
- File
23
- };
24
- function installPolyfills() {
25
- for (const name in globals) {
26
- Object.defineProperty(globalThis, name, {
27
- enumerable: true,
28
- configurable: true,
29
- writable: true,
30
- value: globals[name]
31
- });
32
- }
33
- }
34
-
35
- // src/adapter/middleware.ts
36
- installPolyfills();
37
- function getForwardedHeader(req, name) {
38
- const value = req.headers["x-forwarded-" + name];
39
- if (value) {
40
- if (typeof value === "string") {
41
- const index = value.indexOf(",");
42
- return index < 0 ? value : value.slice(0, index);
43
- }
44
- return value[0];
45
- }
46
- }
47
- function getOrigin(req, protocol, host, trustProxy) {
48
- var _a;
49
- protocol ?? (protocol = req.protocol || trustProxy && getForwardedHeader(req, "proto") || ((_a = req.socket) == null ? void 0 : _a.encrypted) && "https" || "http");
50
- host ?? (host = trustProxy && getForwardedHeader(req, "host") || req.headers.host);
51
- if (!host) {
52
- if (process.env.NODE_ENV !== "production") {
53
- host = "localhost";
54
- console.warn(
55
- `Could not automatically determine the origin host, using 'localhost'. Use the 'origin' option or the 'ORIGIN' environment variable to set the origin explicitly.`
56
- );
57
- } else {
58
- throw new Error(
59
- `Could not automatically determine the origin host. Use the 'origin' option or the 'ORIGIN' environment variable to set the origin explicitly.`
60
- );
61
- }
62
- }
63
- return `${protocol}://${host}`;
64
- }
65
- function createMiddleware(fetch2, options = {}) {
66
- const { trustProxy = process.env.TRUST_PROXY === "1", devServer } = options;
67
- let { origin = process.env.ORIGIN } = options;
68
- let protocol;
69
- let host;
70
- if (origin) {
71
- ({ protocol, host } = new URL(origin));
72
- protocol = protocol.slice(0, -1);
73
- }
74
- return async (req, res, next) => {
75
- origin ?? (origin = getOrigin(req, protocol, host, trustProxy));
76
- const url = new URL(req.url, origin);
77
- const ip = req.ip || trustProxy && getForwardedHeader(req, "for") || req.socket.remoteAddress || "";
78
- const headers = req.headers;
79
- const body = req.method === "GET" || req.method === "HEAD" ? void 0 : req.socket ? req : new ReadableStream({
80
- start(controller) {
81
- req.on("data", (chunk) => controller.enqueue(chunk));
82
- req.on("end", () => controller.close());
83
- req.on("error", (err) => controller.error(err));
84
- }
85
- });
86
- const request = new Request(url, {
87
- method: req.method,
88
- headers,
89
- body,
90
- duplex: "half"
91
- });
92
- const response = await fetch2(request, {
93
- ip,
94
- request: req,
95
- response: res,
96
- setCookie(cookie) {
97
- res.appendHeader("set-cookie", cookie);
98
- }
99
- });
100
- if (!response) {
101
- if (next) {
102
- next();
103
- } else {
104
- res.statusCode = 404;
105
- res.setHeader("content-length", "0");
106
- res.end();
107
- return;
108
- }
109
- return;
110
- }
111
- res.statusCode = response.status;
112
- for (const [key, value] of response.headers) {
113
- if (key === "set-cookie") {
114
- let sepIndex = value.indexOf(",") + 1;
115
- if (!sepIndex) {
116
- res.setHeader(key, value);
117
- } else {
118
- let index = 0;
119
- do {
120
- res.appendHeader(key, value.slice(index, sepIndex - 1));
121
- index = sepIndex;
122
- sepIndex = value.indexOf(",", sepIndex) + 1;
123
- } while (sepIndex);
124
- res.appendHeader(key, value.slice(index));
125
- }
126
- } else {
127
- res.setHeader(key, value);
128
- }
129
- }
130
- if (!response.body) {
131
- if (!response.headers.has("content-length")) {
132
- res.setHeader("content-length", "0");
133
- }
134
- res.end();
135
- return;
136
- }
137
- const reader = response.body.getReader();
138
- if (res.destroyed) {
139
- reader.cancel();
140
- return;
141
- }
142
- res.on("close", cancel);
143
- res.on("error", cancel);
144
- write();
145
- function cancel(error) {
146
- res.off("close", cancel);
147
- res.off("error", cancel);
148
- reader.cancel(error).catch(() => {
149
- });
150
- if (error) {
151
- if (process.env.NODE_ENV !== "production" && devServer) {
152
- res.end();
153
- devServer.ws.send({
154
- type: "error",
155
- err: { message: error.message, stack: error.stack || "" }
156
- });
157
- } else {
158
- res.destroy(error);
159
- }
160
- }
161
- }
162
- async function write() {
163
- try {
164
- while (true) {
165
- const { done, value } = await reader.read();
166
- if (done) {
167
- res.end();
168
- return;
169
- } else if (!res.write(value)) {
170
- res.once("drain", write);
171
- return;
172
- } else if (res.flush) {
173
- res.flush();
174
- }
175
- }
176
- } catch (err) {
177
- const error = err instanceof Error ? err : new Error("Error while writing to node response", {
178
- cause: err
179
- });
180
- cancel(error);
181
- }
182
- }
183
- };
184
- }
185
-
186
- // src/adapter/dev-server.ts
187
- var fixedErrors = /* @__PURE__ */ new WeakSet();
188
7
  function createViteDevMiddleware(devServer, load, factory) {
189
8
  let value;
190
9
  let middleware;
@@ -199,10 +18,7 @@ function createViteDevMiddleware(devServer, load, factory) {
199
18
  } catch (err) {
200
19
  res.statusCode = 500;
201
20
  if (err instanceof Error) {
202
- if (!fixedErrors.has(err)) {
203
- fixedErrors.add(err);
204
- devServer.ssrFixStacktrace(err);
205
- }
21
+ devServer.ssrFixStacktrace(err);
206
22
  res.end(err.stack);
207
23
  } else {
208
24
  res.end();
@@ -220,6 +36,9 @@ async function createDevServer(configFile) {
220
36
  conditions: ["worker"]
221
37
  }
222
38
  });
39
+ const { createMiddleware } = await devServer.ssrLoadModule(
40
+ "@marko/run/adapter/middleware"
41
+ );
223
42
  const middleware = createViteDevMiddleware(
224
43
  devServer,
225
44
  async () => await devServer.ssrLoadModule("@marko/run/router"),
@@ -29,6 +29,7 @@ module.exports = __toCommonJS(middleware_exports);
29
29
  var import_web = require("stream/web");
30
30
  var import_crypto = require("crypto");
31
31
  var import_undici = require("undici");
32
+ var import_http = require("http");
32
33
  var globals = {
33
34
  crypto: import_crypto.webcrypto,
34
35
  fetch: import_undici.fetch,
@@ -41,14 +42,41 @@ var globals = {
41
42
  FormData: import_undici.FormData,
42
43
  File: import_undici.File
43
44
  };
45
+ if (typeof import_http.OutgoingMessage.prototype.appendHeader !== "function") {
46
+ const messageHeaders = /* @__PURE__ */ new WeakMap();
47
+ import_http.OutgoingMessage.prototype.appendHeader = function(name, value) {
48
+ let headers = messageHeaders.get(this);
49
+ if (!headers) {
50
+ headers = /* @__PURE__ */ new Map();
51
+ messageHeaders.set(this, headers);
52
+ }
53
+ const key = name.toLowerCase();
54
+ let existing = headers.get(key);
55
+ if (existing) {
56
+ if (Array.isArray(existing)) {
57
+ existing.push(value);
58
+ } else {
59
+ existing = [existing, value];
60
+ }
61
+ this.setHeader(name, existing);
62
+ headers.set(key, existing);
63
+ } else {
64
+ this.setHeader(name, value);
65
+ headers.set(key, value);
66
+ }
67
+ return this;
68
+ };
69
+ }
44
70
  function installPolyfills() {
45
71
  for (const name in globals) {
46
- Object.defineProperty(globalThis, name, {
47
- enumerable: true,
48
- configurable: true,
49
- writable: true,
50
- value: globals[name]
51
- });
72
+ if (!(name in globalThis)) {
73
+ Object.defineProperty(globalThis, name, {
74
+ enumerable: true,
75
+ configurable: true,
76
+ writable: true,
77
+ value: globals[name]
78
+ });
79
+ }
52
80
  }
53
81
  }
54
82
 
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import type { Fetch } from "../runtime";
2
3
  import type { IncomingMessage, ServerResponse } from "http";
3
4
  import type { ViteDevServer } from "vite";
@@ -11,9 +12,6 @@ declare module "http" {
11
12
  ip?: string;
12
13
  protocol?: string;
13
14
  }
14
- interface ServerResponse {
15
- appendHeader(key: string, value: string | string[]): this;
16
- }
17
15
  }
18
16
  export interface NodePlatformInfo {
19
17
  ip: string;
@@ -2,6 +2,7 @@
2
2
  import { ReadableStream as ReadableStream2, TransformStream, WritableStream } from "stream/web";
3
3
  import { webcrypto as crypto } from "crypto";
4
4
  import { fetch, Response, Request as Request2, Headers, FormData, File } from "undici";
5
+ import { OutgoingMessage } from "http";
5
6
  var globals = {
6
7
  crypto,
7
8
  fetch,
@@ -14,14 +15,41 @@ var globals = {
14
15
  FormData,
15
16
  File
16
17
  };
18
+ if (typeof OutgoingMessage.prototype.appendHeader !== "function") {
19
+ const messageHeaders = /* @__PURE__ */ new WeakMap();
20
+ OutgoingMessage.prototype.appendHeader = function(name, value) {
21
+ let headers = messageHeaders.get(this);
22
+ if (!headers) {
23
+ headers = /* @__PURE__ */ new Map();
24
+ messageHeaders.set(this, headers);
25
+ }
26
+ const key = name.toLowerCase();
27
+ let existing = headers.get(key);
28
+ if (existing) {
29
+ if (Array.isArray(existing)) {
30
+ existing.push(value);
31
+ } else {
32
+ existing = [existing, value];
33
+ }
34
+ this.setHeader(name, existing);
35
+ headers.set(key, existing);
36
+ } else {
37
+ this.setHeader(name, value);
38
+ headers.set(key, value);
39
+ }
40
+ return this;
41
+ };
42
+ }
17
43
  function installPolyfills() {
18
44
  for (const name in globals) {
19
- Object.defineProperty(globalThis, name, {
20
- enumerable: true,
21
- configurable: true,
22
- writable: true,
23
- value: globals[name]
24
- });
45
+ if (!(name in globalThis)) {
46
+ Object.defineProperty(globalThis, name, {
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true,
50
+ value: globals[name]
51
+ });
52
+ }
25
53
  }
26
54
  }
27
55
 
@@ -1 +1,6 @@
1
+ declare module 'http' {
2
+ interface OutgoingMessage {
3
+ appendHeader(this: OutgoingMessage, name: string, value: string): this;
4
+ }
5
+ }
1
6
  export declare function installPolyfills(): void;
@@ -1,7 +1,7 @@
1
1
  import { defineConfig } from "vite";
2
2
  import marko from "@marko/run/vite";
3
- import staticAdapter from "@marko/run/adapter";
3
+ import nodeAdapter from "@marko/run/adapter";
4
4
 
5
5
  export default defineConfig({
6
- plugins: [marko({ adapter: staticAdapter() })]
6
+ plugins: [marko({ adapter: nodeAdapter() })]
7
7
  });
@@ -98,7 +98,7 @@ var defaultPort = +process.env.PORT || 3e3;
98
98
  var defaultConfigFileBases = ["serve.config", "vite.config"];
99
99
  var defaultConfigFileExts = [".js", ".cjs", ".mjs", ".ts", ".mts"];
100
100
  var prog = sade("marko-run").version("0.0.1").option("-c, --config", `Provide path to a Vite config file (by default looks for a file starting with ${defaultConfigFileBases.join(" or ")} with one of these extensions: ${defaultConfigFileExts.join(", ")})`).option("-e, --env", "Provide path to a dotenv file");
101
- prog.command("serve [entry]").describe("Start a production-like server for already-built app files").option("-o, --output", "Directory to serve files from, and write asset files to if `--build` (default: )").option("-p, --port", "Port the server should listen on (defaults: `$PORT` env variable or 3000)").option("-f, --file", "Output file to start").action(async (entry, opts) => {
101
+ prog.command("preview [entry]").describe("Start a production-like server for already-built app files").option("-o, --output", "Directory to serve files from, and write asset files to if `--build` (default: )").option("-p, --port", "Port the server should listen on (defaults: `$PORT` env variable or 3000)").option("-f, --file", "Output file to start").action(async (entry, opts) => {
102
102
  const config2 = await getViteConfig(cwd, opts.config);
103
103
  await build(entry, config2, opts.output, false, opts.env);
104
104
  await preview(opts.entry, config2, opts.port, opts.output, opts.env);
@@ -1,21 +1,21 @@
1
- import type { HandlerLike, ParamsObject, Route, RouteContext } from "./types";
1
+ import type { HandlerLike, ParamsObject, Route as AnyRoute, Context as AnyContext } from "./types";
2
2
  declare global {
3
3
  namespace Marko {
4
- interface Global extends MarkoRun.CurrentContext {
4
+ interface Global extends MarkoRun.Context {
5
5
  }
6
6
  interface Out {
7
7
  global: Global;
8
8
  }
9
9
  }
10
10
  namespace MarkoRun {
11
- const NotHandled: symbol;
12
- const NotMatched: symbol;
13
- interface CurrentRoute extends Route {
11
+ const NotHandled: unique symbol;
12
+ const NotMatched: unique symbol;
13
+ interface Route extends AnyRoute {
14
14
  }
15
- interface CurrentContext extends RouteContext<CurrentRoute> {
15
+ interface Context extends AnyContext<Route> {
16
16
  }
17
- type Handler<Params extends ParamsObject = {}, Meta = unknown> = HandlerLike<Route<Params, Meta, string>>;
17
+ type Handler<Params extends ParamsObject = {}, Meta = unknown> = HandlerLike<AnyRoute<Params, Meta, string>>;
18
18
  function route<Params extends ParamsObject = {}, Meta = unknown>(handler: Handler<Params, Meta>): typeof handler;
19
19
  }
20
20
  }
21
- export type { Fetch, HandlerLike, InputObject, Invoke, Match, NextFunction, PathTemplate, Route, RouteContext, RouteContextExtensions, RouteHandler, RouteWithHandler, RuntimeModule, ValidateHref, ValidatePath, } from "./types";
21
+ export type { Fetch, HandlerLike, InputObject, Invoke, Match, NextFunction, PathTemplate, Route, Context, ContextExtensions, RouteHandler, RouteWithHandler, RuntimeModule, ValidateHref, ValidatePath, } from "./types";
@@ -28,9 +28,17 @@ __export(internal_exports, {
28
28
  noContent: () => noContent,
29
29
  normalize: () => normalize,
30
30
  notHandled: () => notHandled,
31
- notMatched: () => notMatched
31
+ notMatched: () => notMatched,
32
+ pageResponse: () => pageResponse
32
33
  });
33
34
  module.exports = __toCommonJS(internal_exports);
35
+ var pageResponseInit = {
36
+ status: 200,
37
+ headers: { "content-type": "text/html;charset=UTF-8" }
38
+ };
39
+ function pageResponse(template, input) {
40
+ return new Response(template.stream(input), pageResponseInit);
41
+ }
34
42
  var NotHandled = Symbol();
35
43
  var NotMatched = Symbol();
36
44
  globalThis.MarkoRun ?? (globalThis.MarkoRun = {
@@ -147,5 +155,6 @@ function notMatched() {
147
155
  noContent,
148
156
  normalize,
149
157
  notHandled,
150
- notMatched
158
+ notMatched,
159
+ pageResponse
151
160
  });
@@ -1,8 +1,9 @@
1
- import type { InputObject, NextFunction, Route, RouteContext, RouteHandler } from "./types";
2
- export declare const NotHandled: unique symbol;
3
- export declare const NotMatched: unique symbol;
4
- export declare function createInput(context: RouteContext): (data: InputObject) => InputObject;
5
- export declare function call(handler: RouteHandler<Route>, next: NextFunction, context: RouteContext): Promise<Response>;
1
+ import type { InputObject, NextFunction, Route, Context, RouteHandler } from "./types";
2
+ export declare function pageResponse(template: any, input: Record<PropertyKey, unknown>): Response;
3
+ export declare const NotHandled: typeof MarkoRun.NotHandled;
4
+ export declare const NotMatched: typeof MarkoRun.NotMatched;
5
+ export declare function createInput(context: Context): (data: InputObject) => InputObject;
6
+ export declare function call(handler: RouteHandler<Route>, next: NextFunction, context: Context): Promise<Response>;
6
7
  export declare function compose(handlers: RouteHandler[]): RouteHandler;
7
8
  export declare function normalize(obj: RouteHandler | RouteHandler[] | Promise<RouteHandler | RouteHandler[]>): RouteHandler;
8
9
  export declare function noContent(): Response;
@@ -1,4 +1,11 @@
1
1
  // src/runtime/internal.ts
2
+ var pageResponseInit = {
3
+ status: 200,
4
+ headers: { "content-type": "text/html;charset=UTF-8" }
5
+ };
6
+ function pageResponse(template, input) {
7
+ return new Response(template.stream(input), pageResponseInit);
8
+ }
2
9
  var NotHandled = Symbol();
3
10
  var NotMatched = Symbol();
4
11
  globalThis.MarkoRun ?? (globalThis.MarkoRun = {
@@ -114,5 +121,6 @@ export {
114
121
  noContent,
115
122
  normalize,
116
123
  notHandled,
117
- notMatched
124
+ notMatched,
125
+ pageResponse
118
126
  };