@threadlabs/markupkit 0.0.0-stage → 0.2.0

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.
Files changed (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -2
  3. package/components/breadcrumbs.html +9 -0
  4. package/components/nav.html +51 -0
  5. package/components/pager.html +13 -0
  6. package/dist/application.d.ts +31 -0
  7. package/dist/application.d.ts.map +1 -0
  8. package/dist/application.js +488 -0
  9. package/dist/application.js.map +1 -0
  10. package/dist/browser.d.ts +13 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +151 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/build.d.ts +5 -0
  15. package/dist/build.d.ts.map +1 -0
  16. package/dist/build.js +351 -0
  17. package/dist/build.js.map +1 -0
  18. package/dist/bundle-worker.d.ts +2 -0
  19. package/dist/bundle-worker.d.ts.map +1 -0
  20. package/dist/bundle-worker.js +48 -0
  21. package/dist/bundle-worker.js.map +1 -0
  22. package/dist/bundle.d.ts +23 -0
  23. package/dist/bundle.d.ts.map +1 -0
  24. package/dist/bundle.js +34 -0
  25. package/dist/bundle.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +68 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/client.d.ts +40 -0
  31. package/dist/client.d.ts.map +1 -0
  32. package/dist/client.js +447 -0
  33. package/dist/client.js.map +1 -0
  34. package/dist/component-module.d.ts +20 -0
  35. package/dist/component-module.d.ts.map +1 -0
  36. package/dist/component-module.js +82 -0
  37. package/dist/component-module.js.map +1 -0
  38. package/dist/config.d.ts +36 -0
  39. package/dist/config.d.ts.map +1 -0
  40. package/dist/config.js +111 -0
  41. package/dist/config.js.map +1 -0
  42. package/dist/csp.d.ts +23 -0
  43. package/dist/csp.d.ts.map +1 -0
  44. package/dist/csp.js +91 -0
  45. package/dist/csp.js.map +1 -0
  46. package/dist/description.d.ts +45 -0
  47. package/dist/description.d.ts.map +1 -0
  48. package/dist/description.js +28 -0
  49. package/dist/description.js.map +1 -0
  50. package/dist/document.d.ts +48 -0
  51. package/dist/document.d.ts.map +1 -0
  52. package/dist/document.js +65 -0
  53. package/dist/document.js.map +1 -0
  54. package/dist/index.d.ts +13 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +9 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/links.d.ts +8 -0
  59. package/dist/links.d.ts.map +1 -0
  60. package/dist/links.js +90 -0
  61. package/dist/links.js.map +1 -0
  62. package/dist/private-api.d.ts +12 -0
  63. package/dist/private-api.d.ts.map +1 -0
  64. package/dist/private-api.js +158 -0
  65. package/dist/private-api.js.map +1 -0
  66. package/dist/private-client.d.ts +11 -0
  67. package/dist/private-client.d.ts.map +1 -0
  68. package/dist/private-client.js +18 -0
  69. package/dist/private-client.js.map +1 -0
  70. package/dist/private-readers.d.ts +26 -0
  71. package/dist/private-readers.d.ts.map +1 -0
  72. package/dist/private-readers.js +107 -0
  73. package/dist/private-readers.js.map +1 -0
  74. package/dist/provider-preparation.d.ts +20 -0
  75. package/dist/provider-preparation.d.ts.map +1 -0
  76. package/dist/provider-preparation.js +82 -0
  77. package/dist/provider-preparation.js.map +1 -0
  78. package/dist/providers.d.ts +14 -0
  79. package/dist/providers.d.ts.map +1 -0
  80. package/dist/providers.js +127 -0
  81. package/dist/providers.js.map +1 -0
  82. package/dist/read-channel.d.ts +30 -0
  83. package/dist/read-channel.d.ts.map +1 -0
  84. package/dist/read-channel.js +65 -0
  85. package/dist/read-channel.js.map +1 -0
  86. package/dist/resource.d.ts +31 -0
  87. package/dist/resource.d.ts.map +1 -0
  88. package/dist/resource.js +117 -0
  89. package/dist/resource.js.map +1 -0
  90. package/dist/routes.d.ts +90 -0
  91. package/dist/routes.d.ts.map +1 -0
  92. package/dist/routes.js +536 -0
  93. package/dist/routes.js.map +1 -0
  94. package/dist/serve.d.ts +4 -0
  95. package/dist/serve.d.ts.map +1 -0
  96. package/dist/serve.js +221 -0
  97. package/dist/serve.js.map +1 -0
  98. package/dist/server.d.ts +211 -0
  99. package/dist/server.d.ts.map +1 -0
  100. package/dist/server.js +734 -0
  101. package/dist/server.js.map +1 -0
  102. package/dist/types.d.ts +504 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +2 -0
  105. package/dist/types.js.map +1 -0
  106. package/package.json +80 -4
package/dist/serve.js ADDED
@@ -0,0 +1,221 @@
1
+ import { createServer as createHTTPServer } from "node:http";
2
+ import { createHash } from "node:crypto";
3
+ import { readFile, realpath } from "node:fs/promises";
4
+ import { dirname, extname, join, resolve } from "node:path";
5
+ import { createServer, isRunnableDevEnvironment, normalizePath } from "vite";
6
+ import { createApplication } from "./application.js";
7
+ import { readManifest } from "./build.js";
8
+ import { browserPlugin, browserSources, stylesheetSources } from "./browser.js";
9
+ import { configure, globalStylesheets, MarkupKitError, rootAlias, runHook, withPlugins, within } from "./config.js";
10
+ import { developmentPolicyOptions } from "./csp.js";
11
+ import { authoredHead, documentHTML, escapeHTML } from "./document.js";
12
+ import { matchRoute } from "./routes.js";
13
+ import { listen, mime, nodeRequest, outputPath, sendResponse } from "./server.js";
14
+ function requestPath(request) {
15
+ const original = "originalUrl" in request && typeof request.originalUrl === "string" ? request.originalUrl : request.url;
16
+ return new URL(original ?? "/", "http://localhost").pathname;
17
+ }
18
+ function methodAllowed(request, response) {
19
+ if (request.method === "GET" || request.method === "HEAD")
20
+ return true;
21
+ response.writeHead(405, { allow: "GET, HEAD" });
22
+ response.end();
23
+ return false;
24
+ }
25
+ export async function previewApplication(input = {}) {
26
+ const options = await withPlugins(input);
27
+ const config = configure(options);
28
+ // Read deployment metadata, never loaders or page source. The same tree works on a static host.
29
+ const { base, files } = await readManifest(config.outDir);
30
+ const output = await realpath(config.outDir);
31
+ const types = new Map(files.map(file => [file.pathname, file.type]));
32
+ const server = createHTTPServer((request, response) => {
33
+ void (async () => {
34
+ if (!methodAllowed(request, response))
35
+ return;
36
+ const pathname = requestPath(request);
37
+ const found = await outputPath(output, base, pathname);
38
+ if (found === "slash") {
39
+ response.writeHead(308, { location: pathname + "/" });
40
+ response.end();
41
+ return;
42
+ }
43
+ if (found === "invalid") {
44
+ response.writeHead(400);
45
+ response.end();
46
+ return;
47
+ }
48
+ // The request server's code is never a file to serve.
49
+ let file = found === undefined || within(join(output, "_markupkit/server"), found.file) ? undefined : found.file;
50
+ let status = 200;
51
+ if (file === undefined) {
52
+ status = 404;
53
+ file = await realpath(join(output, "404.html"));
54
+ if (!within(output, file))
55
+ throw new MarkupKitError("Missing-page output escapes the deployment directory.");
56
+ }
57
+ const body = await readFile(file);
58
+ response.writeHead(status, { "content-type": (status === 200 ? types.get(pathname) : undefined) ?? mime[extname(file)] ?? "application/octet-stream", "content-length": body.length });
59
+ response.end(request.method === "HEAD" ? undefined : body);
60
+ })().catch(error => { response.writeHead(500, { "content-type": "text/plain" }); response.end(String(error)); });
61
+ });
62
+ return listen(server, options, base);
63
+ }
64
+ /**
65
+ * The development pages' Content Security Policy reporter, which runs before the page's own module: it
66
+ * reports each violation in the console and, through Vite's HMR channel, in the terminal, with the
67
+ * csp option line that would allow it.
68
+ */
69
+ const policyReporter = `addEventListener("securitypolicyviolation", event => {
70
+ const policy = event.originalPolicy.split(";").map(directive => directive.trim().split(/\\s+/)[0]);
71
+ const directive = [event.effectiveDirective, event.effectiveDirective.replace(/-(?:elem|attr)$/, ""), "default-src"].find(name => policy.includes(name)) ?? event.effectiveDirective;
72
+ const blocked = event.blockedURI;
73
+ const url = URL.parse(blocked);
74
+ const source = blocked === "inline" ? "'unsafe-inline'" : blocked === "eval" ? "'unsafe-eval'" : blocked === "wasm-eval" ? "'wasm-unsafe-eval'"
75
+ : url === null ? blocked : url.origin === "null" ? url.protocol : url.origin;
76
+ const report = { page: location.pathname, blocked, directive, line: "csp: { " + JSON.stringify(directive) + ": [" + JSON.stringify(source) + "] }",
77
+ blocks: event.disposition === "enforce" };
78
+ console.warn("MarkupKit: " + report.page + (report.blocks ? " blocked " : " would block ") + blocked + " under " + directive + ". To allow it, add to markupkit.config.ts: " + report.line);
79
+ import.meta.hot?.send("markupkit:csp", report);
80
+ });
81
+ `;
82
+ export async function devApplication(input = {}) {
83
+ const options = await withPlugins(input);
84
+ const config = configure(options);
85
+ // ponytail: any ws: socket rather than Vite's own, whose port is chosen when it listens.
86
+ const csp = developmentPolicyOptions(config.csp, "ws:");
87
+ // Once, before Vite watches, so generated files don't trigger a reload; edits don't rerun it.
88
+ await runHook(options, "buildStart", { command: "dev", root: config.root, base: config.base });
89
+ const sources = new Map();
90
+ // Vite refuses to serve a Windows 8.3 short name such as RUNNER~1, so page-wide stylesheets go by their real paths.
91
+ const css = await Promise.all(globalStylesheets(options, config.root).map(file => realpath(file).catch(() => file)));
92
+ let watchReady;
93
+ const watching = new Promise(done => { watchReady = done; });
94
+ let application;
95
+ let refreshing;
96
+ const vite = await createServer({ root: config.root, configFile: false, appType: "custom", base: config.base, resolve: { alias: rootAlias(config.root) },
97
+ mode: "development", plugins: [browserPlugin(sources), {
98
+ name: "markupkit-watch-ready", configureServer(server) { server.watcher.once("ready", watchReady); },
99
+ async closeBundle() { await refreshing?.catch(() => { }); await application?.close(); },
100
+ }], optimizeDeps: { noDiscovery: true, include: [] },
101
+ server: { host: options.host ?? "127.0.0.1", port: options.port ?? 3000,
102
+ // Page-wide stylesheets may live outside the root, as a plugin's own stylesheet does.
103
+ fs: { allow: [config.root, await realpath(config.root), await realpath(resolve(import.meta.dirname, "../../..")), ...css.map(file => dirname(file))] } },
104
+ logLevel: "silent" });
105
+ // Browser modules and stylesheets for each served page, as Vite virtual modules.
106
+ const assets = (page) => {
107
+ const graphId = createHash("sha256").update(page.components.map(component => component.definition.source.file).join("\0")).digest("hex").slice(0, 16);
108
+ const id = `virtual:markupkit/${graphId}`;
109
+ for (const [module, source] of browserSources(page.components, { base: config.base, prefetch: config.prefetch }, id, css))
110
+ sources.set(module, source);
111
+ const styles = stylesheetSources(page.components);
112
+ for (const [id, css] of styles)
113
+ sources.set(id, css);
114
+ // Vite's HTML transformer applies its base to root-relative assets a second time.
115
+ // This document is already composed for its deployment URL; only modules use Vite.
116
+ // Page-wide stylesheets first, so component styles follow them in the cascade.
117
+ return { styles: [...css.map(normalizePath), ...styles.keys()].map(id => config.base + "@fs/" + id),
118
+ modules: [config.base + "@vite/client", ...csp === false ? [] : [config.base + "@id/" + reporter], config.base + "@id/" + id] };
119
+ };
120
+ const reporter = "virtual:markupkit/csp-report";
121
+ if (csp !== false) {
122
+ sources.set(reporter, policyReporter);
123
+ vite.ws.on("markupkit:csp", (report) => {
124
+ console.warn(`MarkupKit: ${report.page} ${report.blocks ? "blocked" : "would block"} ${report.blocked} under ${report.directive}. To allow it, add to markupkit.config.ts: ${report.line}`);
125
+ });
126
+ }
127
+ try {
128
+ application = await createApplication(options, vite, assets, csp);
129
+ }
130
+ catch (error) {
131
+ await vite.close();
132
+ throw error;
133
+ }
134
+ // What page plugins read, wherever it lives, joins the watched root.
135
+ vite.watcher.add([...application.watchFiles]);
136
+ let revision = 0;
137
+ let current = 0;
138
+ const change = () => {
139
+ revision += 1;
140
+ // ModuleGraph also owns loader dependencies and transitive controller imports.
141
+ vite.moduleGraph.invalidateAll();
142
+ const environment = vite.environments.ssr;
143
+ if (environment !== undefined && isRunnableDevEnvironment(environment))
144
+ environment.runner.clearCache();
145
+ vite.ws.send({ type: "full-reload" });
146
+ };
147
+ vite.watcher.on("add", change).on("unlink", change).on("change", change);
148
+ vite.middlewares.use((request, response, next) => {
149
+ const pathname = requestPath(request);
150
+ if (!pathname.startsWith(config.base) || pathname.slice(config.base.length).startsWith("@")) {
151
+ next();
152
+ return;
153
+ }
154
+ const payload = pathname.startsWith(config.base + "_markupkit/pages/");
155
+ void (async () => {
156
+ if (current !== revision) {
157
+ refreshing ??= (async () => {
158
+ while (current !== revision) {
159
+ const wanted = revision;
160
+ const next = await createApplication(options, vite, assets, csp);
161
+ const previous = application;
162
+ application = next;
163
+ vite.watcher.add([...application.watchFiles]);
164
+ current = wanted;
165
+ sources.clear();
166
+ if (csp !== false)
167
+ sources.set(reporter, policyReporter);
168
+ await previous.close();
169
+ }
170
+ })().finally(() => { refreshing = undefined; });
171
+ await refreshing;
172
+ }
173
+ let file;
174
+ try {
175
+ file = application.files.get(decodeURIComponent(pathname.slice(config.base.length)));
176
+ }
177
+ catch { /* Not a served file. */ }
178
+ // Other files, such as public/ and the application's modules, are Vite's to serve.
179
+ if (file === undefined && !payload && /\.[A-Za-z0-9]+$/.test(pathname) && !application.generated.has(pathname) && matchRoute(application.routes, pathname, config.base) === undefined &&
180
+ matchRoute(application.endpoints, pathname, config.base) === undefined) {
181
+ next();
182
+ return;
183
+ }
184
+ if (file !== undefined) {
185
+ if (!methodAllowed(request, response))
186
+ return;
187
+ const body = await readFile(file);
188
+ response.writeHead(200, { "content-type": mime[extname(file)] ?? "application/octet-stream", "content-length": body.length });
189
+ response.end(request.method === "HEAD" ? undefined : body);
190
+ return;
191
+ }
192
+ // Middleware, endpoints, and pages come from the runtime-neutral handler; this adapts Node's request and response.
193
+ await sendResponse(await application.fetch(nodeRequest(request, response)), response);
194
+ })().catch(error => {
195
+ vite.ssrFixStacktrace(error instanceof Error ? error : new Error(String(error)));
196
+ if (response.headersSent) {
197
+ response.end();
198
+ return;
199
+ }
200
+ response.writeHead(500, { "content-type": "text/html; charset=utf-8" });
201
+ response.end(documentHTML(`<main><h1>Application error</h1><pre>${escapeHTML(String(error))}</pre></main>`, { html: authoredHead + "<title>Application error</title>" }));
202
+ });
203
+ });
204
+ try {
205
+ await vite.listen();
206
+ await watching;
207
+ }
208
+ catch (error) {
209
+ await vite.close();
210
+ throw error;
211
+ }
212
+ const address = vite.httpServer?.address();
213
+ if (address === undefined || address === null || typeof address === "string") {
214
+ await vite.close();
215
+ throw new MarkupKitError("Dev server did not obtain a TCP port.");
216
+ }
217
+ const host = options.host ?? "127.0.0.1";
218
+ let closing;
219
+ return { url: `http://${host.includes(":") ? `[${host}]` : host}:${address.port}${config.base}`, close: () => closing ??= vite.close() };
220
+ }
221
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ import { type IncomingMessage, type Server, type ServerResponse } from "node:http";
2
+ import { type ComponentDefinition } from "@nextwebwg/html-next";
3
+ import { type ServerRenderer } from "@nextwebwg/html-next/server";
4
+ import { MarkupKitError } from "./config.js";
5
+ import { type PageAssets } from "./document.js";
6
+ import { type ProviderModule } from "./provider-preparation.js";
7
+ import { type ServerReaders } from "./private-readers.js";
8
+ import type { ApplicationRoute, ApplicationServer, EndpointModule, EndpointRoute, ManifestFile, ManifestRedirect, Middleware, NavigationItem, NavigationNode, NavigationQuery, PageAction, PagerLinks, RedirectStatus, RenderedHead, RenderedLayer, RouteParam, ServerApplication, ServerModule, StartOptions, RenderedPolicy } from "./types.js";
9
+ export { setRenderWorkers } from "@nextwebwg/html-next/server";
10
+ export type { ApplicationServer, EndpointContext, EndpointHandler, EndpointModule, Middleware, ServerApplication, StartOptions } from "./types.js";
11
+ /** A route as navigation and matching read it, without its source files. */
12
+ export type NavigationRoute = Omit<ApplicationRoute, "component" | "server" | "layouts">;
13
+ type Params = Readonly<Record<string, RouteParam>>;
14
+ /** navigation(), navigationTree(), breadcrumbs(), and pager() over routes and each concrete page URL's route. */
15
+ export declare function createNavigation(base: string, routes: readonly NavigationRoute[], concrete: () => Promise<ReadonlyMap<string, NavigationRoute>>): {
16
+ navigation: (query?: NavigationQuery) => Promise<readonly NavigationItem[]>;
17
+ navigationTree: (query?: NavigationQuery) => Promise<readonly NavigationNode[]>;
18
+ breadcrumbs: (query?: NavigationQuery) => Promise<readonly NavigationItem[]>;
19
+ pager: (query?: NavigationQuery) => Promise<PagerLinks>;
20
+ };
21
+ export type Navigation = ReturnType<typeof createNavigation>;
22
+ /** A private read is a fresh request operation, never a retained server component instance. */
23
+ export declare function requestReadContext(request: Request, url: URL, base: string, params: Params, services: unknown): {
24
+ phase: "request";
25
+ request: Request;
26
+ url: URL;
27
+ base: string;
28
+ params: Readonly<Record<string, RouteParam>>;
29
+ services: unknown;
30
+ signal: AbortSignal;
31
+ cookies: ReadonlyMap<string, string>;
32
+ fetch: typeof fetch;
33
+ };
34
+ /** A page or layout, ready to render: its component and loader. */
35
+ export interface RenderLayer {
36
+ readonly definition: ComponentDefinition;
37
+ readonly module: () => Promise<ServerModule>;
38
+ /** What diagnostics name: the loader file, or the component when a plugin supplies the loader module. */
39
+ readonly origin: string;
40
+ }
41
+ export interface RenderInput {
42
+ readonly base: string;
43
+ readonly route: NavigationRoute;
44
+ readonly params: Params;
45
+ readonly url: URL;
46
+ /** The request a server-rendered page answers; prerendering has none. */
47
+ readonly request?: Request;
48
+ readonly signal: AbortSignal;
49
+ readonly layers: readonly RenderLayer[];
50
+ /** Every component the layers use, for HTML Next's renderer. */
51
+ readonly definitions: readonly ComponentDefinition[];
52
+ readonly providers?: Readonly<Record<string, ProviderModule>>;
53
+ readonly clientModules?: readonly string[];
54
+ readonly privateReaders?: Readonly<Record<string, () => Promise<ServerReaders>>>;
55
+ readonly services?: unknown;
56
+ readonly render?: ServerRenderer["render"];
57
+ readonly scripts: readonly string[];
58
+ /** The site's Content Security Policy, unless csp is false. */
59
+ readonly policy?: RenderedPolicy;
60
+ readonly navigation: Navigation;
61
+ /** What starts an alias page's canonical link: the configured origin, or "" without one. */
62
+ readonly canonicalOrigin: string;
63
+ /** For the error page: the failure, whose fields it takes as the props it declares. */
64
+ readonly failure?: Failure;
65
+ /** For a POST, the page's action that pageAction() found, which runs before the loaders. */
66
+ readonly action?: PageAction;
67
+ }
68
+ /** What app/error.html receives: the status and its standard reason phrase, never the error itself. */
69
+ export interface Failure {
70
+ readonly status: 500;
71
+ readonly message: string;
72
+ }
73
+ export declare const serverFailure: Failure;
74
+ /** The page for a failure without app/error.html, or when it fails too. */
75
+ export declare function failurePage({ status, message }: Failure, scripts: readonly string[], policy?: RenderedPolicy): {
76
+ status: 500;
77
+ head: RenderedHead;
78
+ body: string;
79
+ html: string;
80
+ };
81
+ export type Rendered = {
82
+ readonly kind: "page";
83
+ readonly status: number;
84
+ readonly headers: Headers;
85
+ readonly body: string;
86
+ readonly css: string;
87
+ readonly head: RenderedHead;
88
+ readonly layers: readonly RenderedLayer[];
89
+ readonly prepared?: boolean;
90
+ } | {
91
+ readonly kind: "redirect";
92
+ readonly status: RedirectStatus;
93
+ readonly location: string;
94
+ readonly headers: Headers;
95
+ } | {
96
+ readonly kind: "notFound";
97
+ readonly headers: Headers;
98
+ };
99
+ /** Run the layers' loaders, outermost first, and render their invocations through HTML Next. */
100
+ export declare function renderRoute(input: RenderInput): Promise<Rendered>;
101
+ /** A page's answer: a redirect with its redirect page, its document, or for a payload request its payload (404 when it has none). */
102
+ export declare function pageResponse(page: {
103
+ readonly status: number;
104
+ readonly location?: string;
105
+ readonly body: string;
106
+ readonly head: RenderedHead;
107
+ readonly layers: readonly RenderedLayer[];
108
+ readonly headers?: Headers;
109
+ readonly prepared?: boolean;
110
+ }, request: Request, payload: boolean, assets?: PageAssets): Response;
111
+ /** How an application answers requests: its routes and endpoints, and how it answers a page. */
112
+ export interface Pipeline<Route extends NavigationRoute> {
113
+ readonly base: string;
114
+ /** Redirects by deployment pathname with a trailing slash. */
115
+ readonly redirects: ReadonlyMap<string, {
116
+ readonly location: string;
117
+ readonly status: RedirectStatus;
118
+ }>;
119
+ /** Plugins' generated files by deployment pathname, which answer before redirects and pages. */
120
+ readonly files?: ReadonlyMap<string, {
121
+ readonly contents: string | Uint8Array;
122
+ readonly type: string;
123
+ readonly headers?: Readonly<Record<string, string>>;
124
+ }>;
125
+ readonly routes: readonly Route[];
126
+ readonly endpoints: readonly EndpointRoute[];
127
+ endpoint(route: EndpointRoute): Promise<EndpointModule>;
128
+ readonly middleware?: () => Promise<Middleware>;
129
+ readonly read?: (request: Request) => Promise<Response>;
130
+ /** A matched page's document or payload. */
131
+ page(route: Route, params: Params, request: Request, payload: boolean): Promise<Response>;
132
+ /** A path no page or endpoint answers. */
133
+ notFound(request: Request, payload: boolean): Promise<Response>;
134
+ }
135
+ /** Answer a request: its payload URL becomes the page's, then middleware, then redirects, endpoints, and pages. */
136
+ export declare function respond<Route extends NavigationRoute>(app: Pipeline<Route>, request: Request): Promise<Response>;
137
+ /** The action a page's POST names, `?/name` or `default`, or the answer that refuses it: 405 for a page without actions, 404 for an unknown name. */
138
+ export declare function pageAction(module: ServerModule, url: URL): PageAction | Response;
139
+ /** The build error for actions on a page that prerenders. */
140
+ export declare function prerenderedActions(pattern: string, origin: string): MarkupKitError;
141
+ /** A build's request server data, which the build writes into _markupkit/server/entry.js. */
142
+ export interface ServerData {
143
+ readonly readers?: Readonly<Record<string, {
144
+ readonly definition: ComponentDefinition;
145
+ readonly common: string;
146
+ readonly server: string;
147
+ }>>;
148
+ readonly version: 2 | 3;
149
+ readonly base: string;
150
+ readonly redirects: readonly ManifestRedirect[];
151
+ /** Plugins' generated files, whose media types their files' extensions may not give. */
152
+ readonly files?: readonly ManifestFile[];
153
+ readonly routes: readonly NavigationRoute[];
154
+ /** Each concrete page URL and its route's index, for navigation. */
155
+ readonly catalog: readonly (readonly [string, number])[];
156
+ readonly scripts: readonly string[];
157
+ /** The site's Content Security Policy, unless csp is false. */
158
+ readonly policy?: RenderedPolicy;
159
+ /** What starts an alias page's canonical link: the configured origin, or "" without one. */
160
+ readonly canonicalOrigin: string;
161
+ /** Each server-rendered route, by its index in routes. */
162
+ readonly pages: Readonly<Record<string, ServerPage>>;
163
+ /** app/error.html, which answers a failed request, when anything renders on request. */
164
+ readonly error?: ServerPage & {
165
+ readonly route: NavigationRoute;
166
+ };
167
+ readonly endpoints: readonly (EndpointRoute & {
168
+ readonly module: string;
169
+ })[];
170
+ readonly middleware?: string;
171
+ }
172
+ /** A route the server renders: each layer's component and loader module, every component they use, and their browser delivery. */
173
+ export interface ServerPage {
174
+ readonly clientModules?: readonly string[];
175
+ readonly providers?: Readonly<Record<string, ProviderModule>>;
176
+ readonly layers: readonly {
177
+ readonly definition: ComponentDefinition;
178
+ readonly module?: string;
179
+ readonly origin: string;
180
+ }[];
181
+ readonly definitions: readonly ComponentDefinition[];
182
+ readonly assets: PageAssets;
183
+ }
184
+ export declare const mime: Readonly<Record<string, string>>;
185
+ /**
186
+ * What a path names in a build's output: a file, a directory's index.html (page), a directory without its
187
+ * trailing slash ("slash"), an undecodable path ("invalid"), or nothing. Nothing outside the output resolves.
188
+ */
189
+ export declare function outputPath(output: string, base: string, pathname: string): Promise<{
190
+ readonly file: string;
191
+ readonly page: boolean;
192
+ } | "slash" | "invalid" | undefined>;
193
+ /**
194
+ * The application a build's server entry exports: data and module loaders the build wrote, and the
195
+ * output directory two levels above the entry. Prerendered pages and assets come from the output's files.
196
+ */
197
+ export declare function serverApplication(entry: string, data: ServerData, modules: Readonly<Record<string, () => Promise<unknown>>>, options?: {
198
+ readonly renderWorkers?: number;
199
+ readonly services?: unknown;
200
+ }): Promise<ServerApplication>;
201
+ /** A native Request for a Node request: its method, URL, headers, and body, aborted when the response closes. */
202
+ export declare function nodeRequest(incoming: IncomingMessage, outgoing: ServerResponse): Request;
203
+ /** Write a Response to a Node response, streaming its body. */
204
+ export declare function sendResponse(response: Response, outgoing: ServerResponse): Promise<void>;
205
+ export declare function listen(server: Server, options: {
206
+ readonly host?: string;
207
+ readonly port?: number;
208
+ }, base: string): Promise<ApplicationServer>;
209
+ /** Serve a build's server entry on Node: `markupkit start`. */
210
+ export declare function startApplication(options?: StartOptions): Promise<ApplicationServer>;
211
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}