@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.
- package/LICENSE +21 -0
- package/README.md +62 -2
- package/components/breadcrumbs.html +9 -0
- package/components/nav.html +51 -0
- package/components/pager.html +13 -0
- package/dist/application.d.ts +31 -0
- package/dist/application.d.ts.map +1 -0
- package/dist/application.js +488 -0
- package/dist/application.js.map +1 -0
- package/dist/browser.d.ts +13 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +151 -0
- package/dist/browser.js.map +1 -0
- package/dist/build.d.ts +5 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +351 -0
- package/dist/build.js.map +1 -0
- package/dist/bundle-worker.d.ts +2 -0
- package/dist/bundle-worker.d.ts.map +1 -0
- package/dist/bundle-worker.js +48 -0
- package/dist/bundle-worker.js.map +1 -0
- package/dist/bundle.d.ts +23 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +34 -0
- package/dist/bundle.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +68 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +40 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +447 -0
- package/dist/client.js.map +1 -0
- package/dist/component-module.d.ts +20 -0
- package/dist/component-module.d.ts.map +1 -0
- package/dist/component-module.js +82 -0
- package/dist/component-module.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +111 -0
- package/dist/config.js.map +1 -0
- package/dist/csp.d.ts +23 -0
- package/dist/csp.d.ts.map +1 -0
- package/dist/csp.js +91 -0
- package/dist/csp.js.map +1 -0
- package/dist/description.d.ts +45 -0
- package/dist/description.d.ts.map +1 -0
- package/dist/description.js +28 -0
- package/dist/description.js.map +1 -0
- package/dist/document.d.ts +48 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +65 -0
- package/dist/document.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/links.d.ts +8 -0
- package/dist/links.d.ts.map +1 -0
- package/dist/links.js +90 -0
- package/dist/links.js.map +1 -0
- package/dist/private-api.d.ts +12 -0
- package/dist/private-api.d.ts.map +1 -0
- package/dist/private-api.js +158 -0
- package/dist/private-api.js.map +1 -0
- package/dist/private-client.d.ts +11 -0
- package/dist/private-client.d.ts.map +1 -0
- package/dist/private-client.js +18 -0
- package/dist/private-client.js.map +1 -0
- package/dist/private-readers.d.ts +26 -0
- package/dist/private-readers.d.ts.map +1 -0
- package/dist/private-readers.js +107 -0
- package/dist/private-readers.js.map +1 -0
- package/dist/provider-preparation.d.ts +20 -0
- package/dist/provider-preparation.d.ts.map +1 -0
- package/dist/provider-preparation.js +82 -0
- package/dist/provider-preparation.js.map +1 -0
- package/dist/providers.d.ts +14 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +127 -0
- package/dist/providers.js.map +1 -0
- package/dist/read-channel.d.ts +30 -0
- package/dist/read-channel.d.ts.map +1 -0
- package/dist/read-channel.js +65 -0
- package/dist/read-channel.js.map +1 -0
- package/dist/resource.d.ts +31 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/resource.js +117 -0
- package/dist/resource.js.map +1 -0
- package/dist/routes.d.ts +90 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +536 -0
- package/dist/routes.js.map +1 -0
- package/dist/serve.d.ts +4 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +221 -0
- package/dist/serve.js.map +1 -0
- package/dist/server.d.ts +211 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +734 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +504 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +80 -4
package/dist/routes.js
ADDED
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, realpathSync, statSync } from "node:fs";
|
|
3
|
+
import { readFile, readdir, realpath, stat } from "node:fs/promises";
|
|
4
|
+
import { basename, join, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
import { configure, withPlugins, MarkupKitError, pluginLayouts, within } from "./config.js";
|
|
7
|
+
import { applicationResource, pageDefinition } from "./resource.js";
|
|
8
|
+
/** The name of a [name], [...name] catch-all, or [[...name]] optional catch-all segment. */
|
|
9
|
+
export function parameter(segment) {
|
|
10
|
+
const match = /^\[(?:\.\.\.)?([A-Za-z][A-Za-z0-9_]*)\]$|^\[\[\.\.\.([A-Za-z][A-Za-z0-9_]*)\]\]$/.exec(segment);
|
|
11
|
+
return match?.[1] ?? match?.[2];
|
|
12
|
+
}
|
|
13
|
+
/** How broadly a segment matches: 0 a literal, 1 [name], 2 [...name], 3 [[...name]]. A missing segment is -1. */
|
|
14
|
+
export function breadth(segment) {
|
|
15
|
+
if (segment === undefined)
|
|
16
|
+
return -1;
|
|
17
|
+
return parameter(segment) === undefined ? 0 : segment.startsWith("[[") ? 3 : segment.startsWith("[...") ? 2 : 1;
|
|
18
|
+
}
|
|
19
|
+
export function validSegment(value) {
|
|
20
|
+
return typeof value === "string" && value.length > 0 && value !== "." && value !== ".." && !value.includes("/") && !/[\\\0?#]/.test(value);
|
|
21
|
+
}
|
|
22
|
+
export const redirectStatuses = [301, 302, 303, 307, 308];
|
|
23
|
+
/** A redirect's Location: an application path, under base, or an absolute http(s) URL. */
|
|
24
|
+
export function redirectLocation(base, to, source) {
|
|
25
|
+
if (typeof to === "string" && /^\/(?![/\\])/.test(to))
|
|
26
|
+
return base + to.slice(1);
|
|
27
|
+
try {
|
|
28
|
+
if (typeof to === "string" && /^https?:$/.test(new URL(to).protocol))
|
|
29
|
+
return new URL(to).href;
|
|
30
|
+
}
|
|
31
|
+
catch { /* Reported below. */ }
|
|
32
|
+
throw new MarkupKitError(`Redirect target ${String(to)} must be an application path starting with / or an http(s) URL.`, source);
|
|
33
|
+
}
|
|
34
|
+
/** The redirects option by deployment pathname, each to its Location. */
|
|
35
|
+
export function redirectTable(base, redirects = {}) {
|
|
36
|
+
const table = new Map();
|
|
37
|
+
for (const [from, to] of Object.entries(redirects)) {
|
|
38
|
+
const segments = from.slice(1, -1).split("/").filter(Boolean);
|
|
39
|
+
if (!/^\/(?:[^/]+\/)*$/.test(from) || segments[0] === "_markupkit" || !segments.every(validSegment)) {
|
|
40
|
+
throw new MarkupKitError("Redirects need application paths with leading and trailing slashes, outside _markupkit.", from);
|
|
41
|
+
}
|
|
42
|
+
table.set(new URL(base + from.slice(1), "http://localhost").pathname, redirectLocation(base, to, from));
|
|
43
|
+
}
|
|
44
|
+
return table;
|
|
45
|
+
}
|
|
46
|
+
export async function discoverRoutes(root = process.cwd(), options = {}) {
|
|
47
|
+
return (await discover(root, options)).routes;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Routes plus what plugins produced: compiled page sources by component path, the files pages
|
|
51
|
+
* reference by deployment-relative path, and the files plugins watch.
|
|
52
|
+
*/
|
|
53
|
+
export async function discover(root, options) {
|
|
54
|
+
const base = options.base ?? "/";
|
|
55
|
+
const watched = new Set();
|
|
56
|
+
const watch = (file) => { watched.add(resolve(file)); };
|
|
57
|
+
const compilers = new Map();
|
|
58
|
+
for (const plugin of options.plugins ?? []) {
|
|
59
|
+
for (const extension of plugin.pages?.extensions ?? []) {
|
|
60
|
+
if (!/^\.[A-Za-z0-9]+$/.test(extension) || extension === ".html" || compilers.has(extension)) {
|
|
61
|
+
throw new MarkupKitError(`Page extension ${extension} must be a unique .name other than .html.`, plugin.name);
|
|
62
|
+
}
|
|
63
|
+
compilers.set(extension, plugin.pages);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const pageExtension = (name) => [".html", ...compilers.keys()].find(extension => name.endsWith(extension) && name.length > extension.length);
|
|
67
|
+
// Each route remembers its page directory's prefix, which page aliases are relative to.
|
|
68
|
+
// folderLayouts are the _layout.html files from the page directory down to the page, outermost first.
|
|
69
|
+
const routes = [];
|
|
70
|
+
const add = (input, prefix, order, directoryLayout, folderLayouts = [], groups = []) => {
|
|
71
|
+
if (!/^\/(?:[^/]+\/)*$/.test(input.pattern))
|
|
72
|
+
throw new MarkupKitError("Route patterns require leading and trailing slashes.", input.component);
|
|
73
|
+
const segments = input.pattern.slice(1, -1).split("/").filter(Boolean);
|
|
74
|
+
if (segments[0] === "_markupkit")
|
|
75
|
+
throw new MarkupKitError("_markupkit is reserved for generated assets.", input.component);
|
|
76
|
+
if (segments.some(segment => parameter(segment) === undefined && !/^[A-Za-z0-9_-]+$/.test(segment))) {
|
|
77
|
+
throw new MarkupKitError("Route segments must be URL slugs or [named] parameters.", input.component);
|
|
78
|
+
}
|
|
79
|
+
if (segments.slice(0, -1).some(segment => breadth(segment) > 1))
|
|
80
|
+
throw new MarkupKitError("A [...catch-all] parameter must be the last route segment.", input.component);
|
|
81
|
+
const params = segments.flatMap(segment => parameter(segment) ?? []);
|
|
82
|
+
if (new Set(params).size !== params.length)
|
|
83
|
+
throw new MarkupKitError("Route parameter names must be unique.", input.component);
|
|
84
|
+
const absolute = (layer) => ({ component: resolve(root, layer.component),
|
|
85
|
+
...(layer.server === undefined ? {} : { server: typeof layer.server === "string" ? resolve(root, layer.server) : layer.server }) });
|
|
86
|
+
routes.push({ ...absolute(input), pattern: input.pattern, segments, params, layouts: (input.layouts ?? []).map(absolute), prefix, folderLayouts,
|
|
87
|
+
...(directoryLayout === undefined ? {} : { directoryLayout }), ...(groups.length === 0 ? {} : { groups }),
|
|
88
|
+
...(order === undefined ? {} : { order }), ...(input.canonical === undefined ? {} : { canonical: input.canonical }),
|
|
89
|
+
...(input.aliasOf === undefined ? {} : { aliasOf: input.aliasOf }),
|
|
90
|
+
...(input.notFound ? { notFound: true } : {}), ...(input.error ? { error: true } : {}), ...(input.index ? { index: true } : {}) });
|
|
91
|
+
};
|
|
92
|
+
// A number and a dot ("01.guide") order a file or directory and stay out of its URL. Route
|
|
93
|
+
// segments cannot contain dots, so the prefix is never part of a name.
|
|
94
|
+
const ordered = (name, source) => {
|
|
95
|
+
const prefix = /^(\d+)\.(.*)$/.exec(name);
|
|
96
|
+
if (prefix?.[2] === "")
|
|
97
|
+
throw new MarkupKitError("Ordering prefix leaves an empty route segment.", source);
|
|
98
|
+
return { slug: prefix?.[2] ?? name, rank: prefix?.[1] ?? null };
|
|
99
|
+
};
|
|
100
|
+
const visit = async (directory, prefix, segments, order, directoryLayout, outer, groups) => {
|
|
101
|
+
const files = await readdir(directory, { withFileTypes: true });
|
|
102
|
+
// As in public/, a page or page folder is a regular file or folder, so the URL tree is the file tree.
|
|
103
|
+
for (const file of files) {
|
|
104
|
+
if (!file.isSymbolicLink() || file.name.startsWith("_") || file.name.startsWith("."))
|
|
105
|
+
continue;
|
|
106
|
+
const path = join(directory, file.name);
|
|
107
|
+
if (pageExtension(file.name) !== undefined || await stat(path).then(info => info.isDirectory(), () => false)) {
|
|
108
|
+
throw new MarkupKitError("Pages and page folders must not be symbolic links; add the target's folder to the pages option.", path);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const names = new Set(files.filter(file => file.isFile()).map(file => file.name));
|
|
112
|
+
const prefixDepth = prefix.split("/").filter(Boolean).length;
|
|
113
|
+
const layer = (name, stem) => {
|
|
114
|
+
const servers = ["ts", "js"].filter(ext => names.has(`${stem}.server.${ext}`));
|
|
115
|
+
if (servers.length > 1)
|
|
116
|
+
throw new MarkupKitError(`Choose one ${stem}.server.ts or .js loader.`, directory);
|
|
117
|
+
return { component: join(directory, name), ...(servers[0] === undefined ? {} : { server: join(directory, `${stem}.server.${servers[0]}`) }) };
|
|
118
|
+
};
|
|
119
|
+
// A folder's _layout.html wraps its pages and its subfolders' pages, inside its parents' layouts.
|
|
120
|
+
const folderLayouts = names.has("_layout.html") ? [...outer, layer("_layout.html", "_layout")] : outer;
|
|
121
|
+
for (const name of [...names].sort()) {
|
|
122
|
+
const extension = pageExtension(name);
|
|
123
|
+
if (extension === undefined || name.startsWith("_") || name.startsWith("."))
|
|
124
|
+
continue;
|
|
125
|
+
const stem = name.slice(0, -extension.length);
|
|
126
|
+
const { slug, rank } = ordered(stem, join(directory, name));
|
|
127
|
+
const parts = slug === "index" ? segments : [...segments, slug];
|
|
128
|
+
// A 404 page at the root of a page directory is never a route: at the / prefix it is the
|
|
129
|
+
// not-found page, and at any other prefix the site's not-found page serves those URLs too.
|
|
130
|
+
const notFound = slug === "404" && parts.length === prefixDepth + 1;
|
|
131
|
+
if (notFound && prefix !== "/")
|
|
132
|
+
continue;
|
|
133
|
+
add({ ...layer(name, stem), pattern: `/${parts.length === 0 ? "" : parts.join("/") + "/"}`, ...(notFound ? { notFound: true } : {}), ...(slug === "index" ? { index: true } : {}) }, prefix, slug === "index" ? order : [...order, rank], directoryLayout, folderLayouts, groups);
|
|
134
|
+
}
|
|
135
|
+
for (const file of files.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
136
|
+
if (!file.isDirectory() || file.name.startsWith(".") || file.name.startsWith("_"))
|
|
137
|
+
continue;
|
|
138
|
+
const { slug, rank } = ordered(file.name, join(directory, file.name));
|
|
139
|
+
// A (group) folder orders and labels its pages and adds no URL segment.
|
|
140
|
+
const label = /^\(([^()]*)\)$/.exec(slug)?.[1];
|
|
141
|
+
if (label !== undefined) {
|
|
142
|
+
if (label.trim() === "")
|
|
143
|
+
throw new MarkupKitError("A route group needs a label inside its parentheses.", join(directory, file.name));
|
|
144
|
+
await visit(join(directory, file.name), prefix, segments, order, directoryLayout, folderLayouts, [...groups, { label, order: rank, depth: segments.length }]);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (parameter(slug) === undefined && !/^[A-Za-z0-9_-]+$/.test(slug)) {
|
|
148
|
+
throw new MarkupKitError("Route directories must be URL slugs, [named] parameters, or (groups).", join(directory, file.name));
|
|
149
|
+
}
|
|
150
|
+
await visit(join(directory, file.name), prefix, [...segments, slug], [...order, rank], directoryLayout, folderLayouts, groups);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
if (options.fileRoutes !== false) {
|
|
154
|
+
const directories = options.pages ?? [{ dir: "app/pages", optional: true }];
|
|
155
|
+
// A directory has one own prefix; any further mount of it is an alias of those pages.
|
|
156
|
+
const own = new Map();
|
|
157
|
+
for (const { dir, prefix = "/", alias } of directories) {
|
|
158
|
+
if (alias === true)
|
|
159
|
+
continue;
|
|
160
|
+
const previous = own.get(resolve(root, dir));
|
|
161
|
+
if (previous !== undefined) {
|
|
162
|
+
throw new MarkupKitError(`Page directory ${dir} is served at ${previous} and ${prefix}; mark the further one alias: true, so its pages name the first as canonical.`, resolve(root, dir));
|
|
163
|
+
}
|
|
164
|
+
own.set(resolve(root, dir), prefix);
|
|
165
|
+
}
|
|
166
|
+
for (const { dir, prefix = "/", layout, optional, alias } of directories) {
|
|
167
|
+
if (!/^\/(?:[A-Za-z0-9_-]+\/)*$/.test(prefix))
|
|
168
|
+
throw new MarkupKitError("Page directory prefixes need leading and trailing slashes around URL slugs.", dir);
|
|
169
|
+
const directory = resolve(root, dir);
|
|
170
|
+
if (!within(root, directory))
|
|
171
|
+
throw new MarkupKitError("Page directories must be inside the application root.", directory);
|
|
172
|
+
let present = true;
|
|
173
|
+
try {
|
|
174
|
+
await stat(directory);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (error.code !== "ENOENT")
|
|
178
|
+
throw error;
|
|
179
|
+
present = false;
|
|
180
|
+
}
|
|
181
|
+
// app/pages is optional; a configured directory must exist.
|
|
182
|
+
if (!present && !optional)
|
|
183
|
+
throw new MarkupKitError("Page directory does not exist.", directory);
|
|
184
|
+
const segments = prefix.split("/").filter(Boolean);
|
|
185
|
+
const primary = own.get(directory);
|
|
186
|
+
if (alias === true && primary === undefined)
|
|
187
|
+
throw new MarkupKitError(`The alias page directory ${dir} at ${prefix} needs an entry that serves ${dir} itself.`, directory);
|
|
188
|
+
const first = routes.length;
|
|
189
|
+
if (present)
|
|
190
|
+
await visit(directory, prefix, segments, segments.map(() => null), layout, [], []);
|
|
191
|
+
if (alias === true)
|
|
192
|
+
for (let i = first; i < routes.length; i++)
|
|
193
|
+
routes[i] = { ...routes[i], aliasOf: primary + routes[i].pattern.slice(prefix.length) };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
for (const route of options.routes ?? [])
|
|
197
|
+
add(route, "/");
|
|
198
|
+
// app/error.html renders failures through the site's layout. Like the not-found page, it is no route.
|
|
199
|
+
const errorPage = resolve(root, "app/error.html");
|
|
200
|
+
if (existsSync(errorPage)) {
|
|
201
|
+
if (["ts", "js"].some(extension => existsSync(resolve(root, `app/error.server.${extension}`)))) {
|
|
202
|
+
throw new MarkupKitError("app/error.html has no loader: it receives status and message as props.", errorPage);
|
|
203
|
+
}
|
|
204
|
+
add({ component: errorPage, pattern: "/", error: true }, "/");
|
|
205
|
+
}
|
|
206
|
+
// A plugin page links to another page's first static URL, and serves the files it references.
|
|
207
|
+
const pageURLs = new Map();
|
|
208
|
+
for (const route of routes)
|
|
209
|
+
if (route.params.length === 0 && !route.notFound && !route.error && !pageURLs.has(route.component))
|
|
210
|
+
pageURLs.set(route.component, base + route.pattern.slice(1));
|
|
211
|
+
const realRoot = await realpath(root);
|
|
212
|
+
const sources = new Map();
|
|
213
|
+
const files = new Map();
|
|
214
|
+
const resources = new Map();
|
|
215
|
+
const resourceOf = async (component) => {
|
|
216
|
+
const identity = await realpath(component);
|
|
217
|
+
const retained = resources.get(identity);
|
|
218
|
+
if (retained !== undefined)
|
|
219
|
+
return { identity, ...retained };
|
|
220
|
+
// Read declarations only. Route discovery never executes loaders or controllers.
|
|
221
|
+
let text = await readFile(identity, "utf8");
|
|
222
|
+
const compiler = compilers.get(pageExtension(component) ?? ".html");
|
|
223
|
+
if (compiler !== undefined) {
|
|
224
|
+
text = await compiler.compile(text, { file: component, watch,
|
|
225
|
+
href: target => pageURLs.get(resolve(target)),
|
|
226
|
+
asset(file) {
|
|
227
|
+
const absolute = resolve(file);
|
|
228
|
+
let real;
|
|
229
|
+
// The native resolver, as for the root: on Windows the JS one keeps 8.3 short names (RUNNER~1).
|
|
230
|
+
try {
|
|
231
|
+
real = realpathSync.native(absolute);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
throw new MarkupKitError(`Missing asset ${file}.`, component);
|
|
235
|
+
}
|
|
236
|
+
if (!within(realRoot, real) || !statSync(real).isFile())
|
|
237
|
+
throw new MarkupKitError(`Asset ${file} must be a file inside the application root.`, component);
|
|
238
|
+
// Never publish what a stray reference could name: dotfiles and dot folders (.env, .git) or keys.
|
|
239
|
+
if (relative(realRoot, real).split(sep).some(part => part.startsWith(".")) || /\.(?:pem|crt|key)$/i.test(real)) {
|
|
240
|
+
throw new MarkupKitError(`Asset ${file} is private: dotfiles, dot folders, keys, and certificates are never published.`, component);
|
|
241
|
+
}
|
|
242
|
+
const name = `_markupkit/files/${createHash("sha256").update(relative(realRoot, real)).digest("hex").slice(0, 16)}-${basename(real)}`;
|
|
243
|
+
files.set(name, real);
|
|
244
|
+
return base + name.split("/").map(encodeURIComponent).join("/");
|
|
245
|
+
} });
|
|
246
|
+
sources.set(component, text);
|
|
247
|
+
}
|
|
248
|
+
const resource = applicationResource(text, pathToFileURL(identity).href);
|
|
249
|
+
const snapshot = { source: text, resource };
|
|
250
|
+
resources.set(identity, snapshot);
|
|
251
|
+
return { identity, ...snapshot };
|
|
252
|
+
};
|
|
253
|
+
// Page aliases are further routes for the same page, relative to its page directory, as its redirects
|
|
254
|
+
// from old paths are. The loop also reaches the aliases it appends, which it skips.
|
|
255
|
+
const redirects = [];
|
|
256
|
+
for (const route of routes) {
|
|
257
|
+
if (route.canonical !== undefined || route.notFound || route.error)
|
|
258
|
+
continue;
|
|
259
|
+
const { resource } = await resourceOf(route.component);
|
|
260
|
+
const metadata = resource.components.get(pageDefinition(resource, route.component).contract.tag);
|
|
261
|
+
for (const from of metadata.redirectsFrom) {
|
|
262
|
+
if (!/^\/(?:[^/]+\/)*$/.test(from) || !from.slice(1, -1).split("/").filter(Boolean).every(validSegment)) {
|
|
263
|
+
throw new MarkupKitError("mk:redirect-from needs a route path with leading and trailing slashes.", route.component);
|
|
264
|
+
}
|
|
265
|
+
if (route.params.length > 0)
|
|
266
|
+
throw new MarkupKitError(`mk:redirect-from redirects to one URL, and ${route.pattern} has parameters.`, route.component);
|
|
267
|
+
redirects.push({ from: route.prefix + from.slice(1), to: route.pattern, component: route.component });
|
|
268
|
+
}
|
|
269
|
+
for (const alias of metadata.aliases) {
|
|
270
|
+
if (!/^\/(?:[^/]+\/)*$/.test(alias))
|
|
271
|
+
throw new MarkupKitError("mk:alias needs a route path with leading and trailing slashes.", route.component);
|
|
272
|
+
add({ component: route.component, ...(route.server === undefined ? {} : { server: route.server }), layouts: route.layouts,
|
|
273
|
+
pattern: route.prefix + alias.slice(1), canonical: route.pattern, ...(route.aliasOf === undefined ? {} : { aliasOf: route.aliasOf }) }, route.prefix, undefined, route.directoryLayout, route.folderLayouts);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
for (const prefix of Object.keys(options.layoutDefaults ?? {})) {
|
|
277
|
+
if (!/^\/(?:[^/]+\/)*$/.test(prefix))
|
|
278
|
+
throw new MarkupKitError("Layout defaults require route-directory prefixes with leading and trailing slashes.", prefix);
|
|
279
|
+
}
|
|
280
|
+
const patterns = new Map();
|
|
281
|
+
for (const route of routes) {
|
|
282
|
+
if (route.error)
|
|
283
|
+
continue;
|
|
284
|
+
const normalized = route.segments.map(segment => ["", "[]", "[...]", "[[...]]"][breadth(segment)] || segment.toLowerCase()).join("/");
|
|
285
|
+
if (patterns.has(normalized))
|
|
286
|
+
throw new MarkupKitError(`Route conflict: ${patterns.get(normalized)} and ${route.component} (${route.pattern}).`, route.component);
|
|
287
|
+
patterns.set(normalized, `${route.component} (${route.pattern})`);
|
|
288
|
+
}
|
|
289
|
+
const redirected = new Map();
|
|
290
|
+
for (const { from, component } of redirects) {
|
|
291
|
+
const page = routes.find(route => !route.error && !route.notFound && route.pattern.toLowerCase() === from.toLowerCase());
|
|
292
|
+
if (page !== undefined)
|
|
293
|
+
throw new MarkupKitError(`mk:redirect-from ${from} is ${page.component === component ? "this page's own URL" : `the URL of ${page.component}`}.`, component);
|
|
294
|
+
const other = redirected.get(from);
|
|
295
|
+
if (other !== undefined)
|
|
296
|
+
throw new MarkupKitError(`mk:redirect-from ${from} is declared by ${other} and ${component}.`, component);
|
|
297
|
+
redirected.set(from, component);
|
|
298
|
+
}
|
|
299
|
+
const pageNames = new Map();
|
|
300
|
+
const discovered = [];
|
|
301
|
+
let notFound;
|
|
302
|
+
let error;
|
|
303
|
+
const folderOrders = [];
|
|
304
|
+
const layoutDefaults = Object.entries(options.layoutDefaults ?? {}).sort(([a], [b]) => b.length - a.length);
|
|
305
|
+
// A layout name is the site's layouts entry, then its app/layouts/<name>.html (the name itself),
|
|
306
|
+
// then a plugin's entry, so a site overrides a plugin's layout with a file of the same name.
|
|
307
|
+
const named = async (name) => {
|
|
308
|
+
if (options.layouts !== undefined && Object.hasOwn(options.layouts, name))
|
|
309
|
+
return options.layouts[name];
|
|
310
|
+
try {
|
|
311
|
+
await stat(resolve(root, `app/layouts/${name}.html`));
|
|
312
|
+
return name;
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
if (error.code !== "ENOENT")
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
const plugins = options[pluginLayouts];
|
|
319
|
+
return plugins !== undefined && Object.hasOwn(plugins, name) ? plugins[name] : undefined;
|
|
320
|
+
};
|
|
321
|
+
for (const { prefix: _prefix, directoryLayout, folderLayouts, notFound: isNotFound, error: isError, index, ...route } of routes) {
|
|
322
|
+
const { identity, resource } = await resourceOf(route.component);
|
|
323
|
+
const pageName = pageDefinition(resource, route.component).contract.tag;
|
|
324
|
+
const previous = pageNames.get(pageName);
|
|
325
|
+
if (previous !== undefined && previous.identity !== identity) {
|
|
326
|
+
throw new MarkupKitError(`Duplicate page component <${pageName}>: ${previous.component} (${previous.pattern}) and ${route.component} (${route.pattern}).`, route.component);
|
|
327
|
+
}
|
|
328
|
+
pageNames.set(pageName, { component: route.component, pattern: route.pattern, identity });
|
|
329
|
+
const metadata = resource.components.get(pageName);
|
|
330
|
+
// An alias is a further URL for its page, so it takes the layout of the page's own URL.
|
|
331
|
+
const directory = layoutDefaults.find(([prefix]) => (route.canonical ?? route.pattern).startsWith(prefix));
|
|
332
|
+
let selected = metadata.layout ?? directoryLayout ?? directory?.[1] ?? options.layout;
|
|
333
|
+
if (selected === undefined && route.layouts.length === 0 && await named("default") !== undefined)
|
|
334
|
+
selected = "default";
|
|
335
|
+
if (typeof selected === "string" && selected !== "none") {
|
|
336
|
+
if (!/^[A-Za-z0-9_-]+$/.test(selected))
|
|
337
|
+
throw new MarkupKitError("Layout names must be filename slugs.", route.component);
|
|
338
|
+
const found = await named(selected);
|
|
339
|
+
if (found === undefined) {
|
|
340
|
+
throw new MarkupKitError(`Layout ${selected} needs ${resolve(root, `app/layouts/${selected}.html`)} or a layouts entry named ${selected}.`, route.component);
|
|
341
|
+
}
|
|
342
|
+
if (typeof found === "object")
|
|
343
|
+
selected = found;
|
|
344
|
+
}
|
|
345
|
+
let layouts = route.layouts;
|
|
346
|
+
if (selected === false || selected === "none")
|
|
347
|
+
layouts = [];
|
|
348
|
+
else if (typeof selected === "object") {
|
|
349
|
+
layouts = [{ component: resolve(root, selected.component),
|
|
350
|
+
...(selected.server === undefined ? {} : { server: typeof selected.server === "string" ? resolve(root, selected.server) : selected.server }) }];
|
|
351
|
+
}
|
|
352
|
+
else if (selected !== undefined) {
|
|
353
|
+
const component = resolve(root, `app/layouts/${selected}.html`);
|
|
354
|
+
const servers = [];
|
|
355
|
+
for (const extension of ["ts", "js"]) {
|
|
356
|
+
const candidate = resolve(root, `app/layouts/${selected}.server.${extension}`);
|
|
357
|
+
try {
|
|
358
|
+
await stat(candidate);
|
|
359
|
+
servers.push(candidate);
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
if (error.code !== "ENOENT")
|
|
363
|
+
throw error;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
if (servers.length > 1)
|
|
367
|
+
throw new MarkupKitError("Choose one layout .server.ts or .js loader.", component);
|
|
368
|
+
layouts = [{ component, ...(servers[0] === undefined ? {} : { server: servers[0] }) }];
|
|
369
|
+
}
|
|
370
|
+
// The selected layout is outermost and folder layouts nest inside it; none drops them all.
|
|
371
|
+
if (selected !== false && selected !== "none")
|
|
372
|
+
layouts = [...layouts, ...folderLayouts];
|
|
373
|
+
// mk:order takes the place of the number-and-dot prefix on the page's own last segment.
|
|
374
|
+
// mk:order takes the place of the number-and-dot prefix on the page's own last segment; on a
|
|
375
|
+
// folder's index page, that segment is the folder's, so it orders the folder (below).
|
|
376
|
+
let order = route.order;
|
|
377
|
+
if (metadata.order !== undefined && route.canonical === undefined && !isNotFound && !isError) {
|
|
378
|
+
if (route.segments.length === 0)
|
|
379
|
+
throw new MarkupKitError("mk:order on the site's home page has no folder to order; it orders a page among its folder's pages.", route.component);
|
|
380
|
+
order = [...route.segments.slice(0, -1).map((_, i) => route.order?.[i] ?? null), metadata.order];
|
|
381
|
+
if (index)
|
|
382
|
+
folderOrders.push({ segments: route.segments, rank: metadata.order });
|
|
383
|
+
}
|
|
384
|
+
// A static <title> labels the page's folder in navigation trees when mk:label doesn't.
|
|
385
|
+
const title = metadata.title;
|
|
386
|
+
// The not-found page is prerendered as 404.html, and the error page renders as a build would; neither takes mk:render.
|
|
387
|
+
if ((isNotFound || isError) && metadata.render !== undefined)
|
|
388
|
+
throw new MarkupKitError(`The ${isNotFound ? "not-found" : "error"} page takes no mk:render.`, route.component);
|
|
389
|
+
const discoveredRoute = { ...route, layouts, pageName, ...(order === undefined ? {} : { order }), ...(metadata.label === undefined ? {} : { label: metadata.label }),
|
|
390
|
+
...(title ? { title } : {}), ...(metadata.hidden ? { hidden: true } : {}), ...(metadata.render === "server" ? { render: "server" } : {}) };
|
|
391
|
+
if (isNotFound)
|
|
392
|
+
notFound = discoveredRoute;
|
|
393
|
+
else if (isError)
|
|
394
|
+
error = discoveredRoute;
|
|
395
|
+
else
|
|
396
|
+
discovered.push(discoveredRoute);
|
|
397
|
+
}
|
|
398
|
+
// Every page in a folder whose index page sets mk:order takes that rank for the folder's segment.
|
|
399
|
+
for (const { segments, rank } of folderOrders) {
|
|
400
|
+
for (const [i, route] of discovered.entries()) {
|
|
401
|
+
if (route.canonical !== undefined || route.segments.length < segments.length || segments.some((segment, j) => route.segments[j] !== segment))
|
|
402
|
+
continue;
|
|
403
|
+
const order = route.segments.map((_, j) => route.order?.[j] ?? null);
|
|
404
|
+
order[segments.length - 1] = rank;
|
|
405
|
+
discovered[i] = { ...route, order };
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return { routes: discovered, ...(notFound === undefined ? {} : { notFound }), ...(error === undefined ? {} : { error }), redirects, sources, files, watched, resourceOf };
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* The request-time files: each app/api/**\/*.server.ts endpoint, which answers its folder path without
|
|
412
|
+
* a trailing slash (index.server.ts answers the folder's own), and app/middleware.server.ts.
|
|
413
|
+
*/
|
|
414
|
+
export async function discoverServerFiles(root) {
|
|
415
|
+
const endpoints = [];
|
|
416
|
+
const patterns = new Map();
|
|
417
|
+
const visit = async (directory, segments) => {
|
|
418
|
+
let files;
|
|
419
|
+
try {
|
|
420
|
+
files = await readdir(directory, { withFileTypes: true });
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
if (error.code === "ENOENT")
|
|
424
|
+
return;
|
|
425
|
+
throw error;
|
|
426
|
+
}
|
|
427
|
+
for (const file of files.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
428
|
+
if (file.name.startsWith(".") || file.name.startsWith("_"))
|
|
429
|
+
continue;
|
|
430
|
+
const path = join(directory, file.name);
|
|
431
|
+
const stem = file.isDirectory() ? file.name : /^(.+)\.server\.(?:ts|js)$/.exec(file.name)?.[1];
|
|
432
|
+
if (stem === undefined || !file.isDirectory() && !file.isFile())
|
|
433
|
+
continue;
|
|
434
|
+
// Endpoint URLs are not pages, so a segment may name a file, as feed.xml does.
|
|
435
|
+
if (stem !== "index" && parameter(stem) === undefined && !/^[A-Za-z0-9_-][A-Za-z0-9._-]*$/.test(stem)) {
|
|
436
|
+
throw new MarkupKitError("Endpoint files and folders must be URL segments or [named] parameters.", path);
|
|
437
|
+
}
|
|
438
|
+
if (file.isDirectory()) {
|
|
439
|
+
await visit(path, [...segments, stem]);
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
const parts = stem === "index" ? segments : [...segments, stem];
|
|
443
|
+
if (parts.slice(0, -1).some(segment => breadth(segment) > 1))
|
|
444
|
+
throw new MarkupKitError("A [...catch-all] parameter must be the last route segment.", path);
|
|
445
|
+
const params = parts.flatMap(segment => parameter(segment) ?? []);
|
|
446
|
+
if (new Set(params).size !== params.length)
|
|
447
|
+
throw new MarkupKitError("Route parameter names must be unique.", path);
|
|
448
|
+
const normalized = parts.map(segment => ["", "[]", "[...]", "[[...]]"][breadth(segment)] || segment.toLowerCase()).join("/");
|
|
449
|
+
if (patterns.has(normalized))
|
|
450
|
+
throw new MarkupKitError(`Endpoint conflict: ${patterns.get(normalized)} and ${path}.`, path);
|
|
451
|
+
patterns.set(normalized, path);
|
|
452
|
+
endpoints.push({ pattern: `/${parts.join("/")}`, segments: parts, params, file: path });
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
await visit(resolve(root, "app/api"), ["api"]);
|
|
456
|
+
const middleware = ["ts", "js"].map(extension => resolve(root, `app/middleware.server.${extension}`)).filter(file => { try {
|
|
457
|
+
return statSync(file).isFile();
|
|
458
|
+
}
|
|
459
|
+
catch {
|
|
460
|
+
return false;
|
|
461
|
+
} });
|
|
462
|
+
if (middleware.length > 1)
|
|
463
|
+
throw new MarkupKitError("Choose one app/middleware.server.ts or .js.", resolve(root, "app"));
|
|
464
|
+
return { endpoints, ...(middleware[0] === undefined ? {} : { middleware: middleware[0] }) };
|
|
465
|
+
}
|
|
466
|
+
export function matchRoute(routes, pathname, base) {
|
|
467
|
+
if (!pathname.startsWith(base))
|
|
468
|
+
return undefined;
|
|
469
|
+
let segments;
|
|
470
|
+
try {
|
|
471
|
+
segments = pathname.slice(base.length).replace(/\/$/, "").split("/").filter(Boolean).map(decodeURIComponent);
|
|
472
|
+
}
|
|
473
|
+
catch {
|
|
474
|
+
return undefined;
|
|
475
|
+
}
|
|
476
|
+
if (segments.some(segment => !validSegment(segment)))
|
|
477
|
+
return undefined;
|
|
478
|
+
// Segment by segment, a literal precedes [name], which precedes [...name], which precedes
|
|
479
|
+
// [[...name]]; never depend on filesystem order.
|
|
480
|
+
const sorted = [...routes].sort((a, b) => {
|
|
481
|
+
for (let i = 0; i < Math.max(a.segments.length, b.segments.length); i++) {
|
|
482
|
+
const difference = breadth(a.segments[i]) - breadth(b.segments[i]);
|
|
483
|
+
if (difference !== 0)
|
|
484
|
+
return difference;
|
|
485
|
+
}
|
|
486
|
+
return a.pattern.localeCompare(b.pattern);
|
|
487
|
+
});
|
|
488
|
+
for (const route of sorted) {
|
|
489
|
+
// A catch-all takes the remaining segments: at least one, or any number for [[...name]].
|
|
490
|
+
const rest = Math.max(0, breadth(route.segments.at(-1)) - 1);
|
|
491
|
+
const fixed = rest === 0 ? route.segments.length : route.segments.length - 1;
|
|
492
|
+
if (rest === 0 ? segments.length !== fixed : segments.length < fixed + 2 - rest)
|
|
493
|
+
continue;
|
|
494
|
+
const params = {};
|
|
495
|
+
if (route.segments.slice(0, fixed).every((segment, index) => {
|
|
496
|
+
const name = parameter(segment);
|
|
497
|
+
if (name === undefined)
|
|
498
|
+
return segment === segments[index];
|
|
499
|
+
params[name] = segments[index];
|
|
500
|
+
return true;
|
|
501
|
+
})) {
|
|
502
|
+
if (rest > 0)
|
|
503
|
+
params[parameter(route.segments.at(-1))] = Object.freeze(segments.slice(fixed));
|
|
504
|
+
return { route, params: Object.freeze(params) };
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return undefined;
|
|
508
|
+
}
|
|
509
|
+
/** Shared declaration discovery for rendering and independent build targets; no application modules execute. */
|
|
510
|
+
export async function discoverApplication(input = {}) {
|
|
511
|
+
const options = await withPlugins(input);
|
|
512
|
+
const config = configure(options);
|
|
513
|
+
const option = redirectTable(config.base, options.redirects);
|
|
514
|
+
const discovery = await discover(config.root, { ...options, base: config.base });
|
|
515
|
+
const { routes, redirects: declared } = discovery;
|
|
516
|
+
// Pages' mk:redirect-from entries join the redirects option's, rediscovered with the pages.
|
|
517
|
+
const redirects = new Map(option);
|
|
518
|
+
// Each page redirect's deployment path, for the declaring page's diagnostics.
|
|
519
|
+
const pageRedirects = new Map();
|
|
520
|
+
for (const { from, to, component } of declared) {
|
|
521
|
+
const path = new URL(config.base + from.slice(1), "http://localhost").pathname;
|
|
522
|
+
if (option.has(path))
|
|
523
|
+
throw new MarkupKitError(`mk:redirect-from ${from} is also a key of the redirects option.`, component);
|
|
524
|
+
redirects.set(path, config.base + to.slice(1));
|
|
525
|
+
pageRedirects.set(path, { from, component });
|
|
526
|
+
}
|
|
527
|
+
// Alias pages name their own URL canonical, absolute when the site sets its origin.
|
|
528
|
+
const canonicalOrigin = options.origin === undefined ? "" : config.origin;
|
|
529
|
+
const server = await discoverServerFiles(config.root);
|
|
530
|
+
// A dynamic page's entries are checked the same way when they are listed.
|
|
531
|
+
const shadowed = routes.find(route => route.params.length === 0 && redirects.has(config.base + route.pattern.slice(1)));
|
|
532
|
+
if (shadowed !== undefined)
|
|
533
|
+
throw new MarkupKitError(`The redirects option also redirects ${shadowed.pattern}, which is this page's URL.`, shadowed.component);
|
|
534
|
+
return { options, config, discovery, server, redirects, pageRedirects, canonicalOrigin };
|
|
535
|
+
}
|
|
536
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/serve.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ApplicationServer, ServerOptions } from "./types.js";
|
|
2
|
+
export declare function previewApplication(input?: ServerOptions): Promise<ApplicationServer>;
|
|
3
|
+
export declare function devApplication(input?: ServerOptions): Promise<ApplicationServer>;
|
|
4
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAe,iBAAiB,EAAgB,aAAa,EAAE,MAAM,YAAY,CAAC;AAW9F,wBAAsB,kBAAkB,CAAC,KAAK,GAAE,aAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0B9F;AAqBD,wBAAsB,cAAc,CAAC,KAAK,GAAE,aAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2G1F"}
|