@nextwebwg/htmlkit 1.0.0-alpha.28

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -0
  3. package/dist/application.d.ts +4 -0
  4. package/dist/application.d.ts.map +1 -0
  5. package/dist/application.js +188 -0
  6. package/dist/application.js.map +1 -0
  7. package/dist/browser.d.ts +7 -0
  8. package/dist/browser.d.ts.map +1 -0
  9. package/dist/browser.js +76 -0
  10. package/dist/browser.js.map +1 -0
  11. package/dist/build.d.ts +3 -0
  12. package/dist/build.d.ts.map +1 -0
  13. package/dist/build.js +154 -0
  14. package/dist/build.js.map +1 -0
  15. package/dist/bundle-worker.d.ts +2 -0
  16. package/dist/bundle-worker.d.ts.map +1 -0
  17. package/dist/bundle-worker.js +24 -0
  18. package/dist/bundle-worker.js.map +1 -0
  19. package/dist/bundle.d.ts +9 -0
  20. package/dist/bundle.d.ts.map +1 -0
  21. package/dist/bundle.js +23 -0
  22. package/dist/bundle.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +58 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +13 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +30 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/document.d.ts +5 -0
  32. package/dist/document.d.ts.map +1 -0
  33. package/dist/document.js +18 -0
  34. package/dist/document.js.map +1 -0
  35. package/dist/head.d.ts +5 -0
  36. package/dist/head.d.ts.map +1 -0
  37. package/dist/head.js +88 -0
  38. package/dist/head.js.map +1 -0
  39. package/dist/index.d.ts +10 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +8 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/resource.d.ts +14 -0
  44. package/dist/resource.d.ts.map +1 -0
  45. package/dist/resource.js +65 -0
  46. package/dist/resource.js.map +1 -0
  47. package/dist/routes.d.ts +9 -0
  48. package/dist/routes.d.ts.map +1 -0
  49. package/dist/routes.js +175 -0
  50. package/dist/routes.js.map +1 -0
  51. package/dist/serve.d.ts +4 -0
  52. package/dist/serve.d.ts.map +1 -0
  53. package/dist/serve.js +204 -0
  54. package/dist/serve.js.map +1 -0
  55. package/dist/types.d.ts +112 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +53 -0
@@ -0,0 +1,65 @@
1
+ import { parseComponentResource } from "@nextwebwg/html-next";
2
+ import { parseFragment, serializeOuter } from "parse5";
3
+ import { HtmlKitError } from "./config.js";
4
+ /** Native HTML parsing determines resource nodes; HTML Next owns component syntax. */
5
+ export function applicationResource(source, file) {
6
+ const parsed = parseComponentResource(source, file);
7
+ const configuration = new Map();
8
+ const components = new Map();
9
+ const fragment = parseFragment(source);
10
+ for (const node of fragment.childNodes) {
11
+ if (!("tagName" in node) || !["meta", "title", "link"].includes(node.tagName))
12
+ continue;
13
+ const name = node.attrs.find(attribute => attribute.name === "name")?.value;
14
+ if (node.tagName === "meta" && name === "htmlkit:page") {
15
+ const content = node.attrs.find(attribute => attribute.name === "content")?.value;
16
+ if (!content || configuration.has(name))
17
+ throw new HtmlKitError(`Declare ${name} once with nonempty content.`, file);
18
+ configuration.set(name, content);
19
+ }
20
+ else if (node.tagName !== "link" || !node.attrs.find(attribute => attribute.name === "rel")?.value.toLowerCase().split(/\s+/).includes("component")) {
21
+ throw new HtmlKitError('Page and layout metadata belongs inside its owning <template component>; only htmlkit:page selects the file entry outside it.', file);
22
+ }
23
+ }
24
+ for (const node of fragment.childNodes) {
25
+ if (!("tagName" in node))
26
+ continue;
27
+ const tag = node.attrs.find(attribute => attribute.name === "component")?.value;
28
+ if (node.tagName !== "template" || tag === undefined)
29
+ continue;
30
+ const children = node.content.childNodes;
31
+ let layout;
32
+ const head = [];
33
+ for (const child of children) {
34
+ if (!("tagName" in child) || !["meta", "title", "link"].includes(child.tagName))
35
+ continue;
36
+ const name = child.attrs.find(attribute => attribute.name === "name")?.value;
37
+ if (child.tagName === "meta" && name?.startsWith("htmlkit:")) {
38
+ if (name !== "htmlkit:layout")
39
+ throw new HtmlKitError(`Only htmlkit:layout is component configuration; htmlkit:page belongs outside the carrier (${name}).`, file);
40
+ const content = child.attrs.find(attribute => attribute.name === "content")?.value;
41
+ if (!content || layout !== undefined)
42
+ throw new HtmlKitError("Declare htmlkit:layout once with nonempty content per component.", file);
43
+ layout = content;
44
+ }
45
+ else
46
+ head.push(serializeOuter(child));
47
+ }
48
+ const defs = children.find(child => "tagName" in child && child.tagName === "defs");
49
+ const propDeclarations = defs !== undefined && "childNodes" in defs ?
50
+ defs.childNodes.filter(child => "tagName" in child && child.tagName === "prop").map(child => serializeOuter(child)).join("") : "";
51
+ components.set(tag, { ...(layout === undefined ? {} : { layout }), head: head.join(""), propDeclarations });
52
+ }
53
+ return { definitions: parsed.definitions, dependencies: parsed.dependencies, configuration, components };
54
+ }
55
+ export function pageDefinition(resource, file) {
56
+ const selected = resource.configuration.get("htmlkit:page");
57
+ if (selected === undefined && resource.definitions.length !== 1) {
58
+ throw new HtmlKitError("Multiple components require <meta name=\"htmlkit:page\" content=\"page-name\">.", file);
59
+ }
60
+ const definition = selected === undefined ? resource.definitions[0] : resource.definitions.find(value => value.contract.tag === selected);
61
+ if (definition === undefined)
62
+ throw new HtmlKitError(`Unknown page component ${selected}.`, file);
63
+ return definition;
64
+ }
65
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ApplicationOptions, ApplicationRoute } from "./types.js";
2
+ export declare function parameter(segment: string): string | undefined;
3
+ export declare function validSegment(value: unknown): value is string;
4
+ export declare function discoverRoutes(root?: string, options?: Pick<ApplicationOptions, "routes" | "fileRoutes" | "layout" | "layoutDefaults">): Promise<readonly ApplicationRoute[]>;
5
+ export declare function matchRoute(routes: readonly ApplicationRoute[], pathname: string, base: string): {
6
+ route: ApplicationRoute;
7
+ params: Readonly<Record<string, string>>;
8
+ } | undefined;
9
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAA0B,MAAM,YAAY,CAAC;AAE/F,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAA+D;AAC7H,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE5D;AACD,wBAAsB,cAAc,CAAC,IAAI,SAAgB,EAAE,OAAO,GAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB,CAAM,GAAG,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAiG9L;AACD,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;cAyB7F"}
package/dist/routes.js ADDED
@@ -0,0 +1,175 @@
1
+ import { readFile, readdir, realpath, stat } from "node:fs/promises";
2
+ import { join, resolve } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { HtmlKitError } from "./config.js";
5
+ import { applicationResource, pageDefinition } from "./resource.js";
6
+ export function parameter(segment) { return /^\[([A-Za-z][A-Za-z0-9_]*)\]$/.exec(segment)?.[1]; }
7
+ export function validSegment(value) {
8
+ return typeof value === "string" && value.length > 0 && value !== "." && value !== ".." && !value.includes("/") && !/[\\\0?#]/.test(value);
9
+ }
10
+ export async function discoverRoutes(root = process.cwd(), options = {}) {
11
+ const routes = [];
12
+ const add = (input) => {
13
+ if (!/^\/(?:[^/]+\/)*$/.test(input.pattern))
14
+ throw new HtmlKitError("Route patterns require leading and trailing slashes.", input.component);
15
+ const segments = input.pattern.slice(1, -1).split("/").filter(Boolean);
16
+ if (segments[0] === "_htmlkit")
17
+ throw new HtmlKitError("_htmlkit is reserved for generated assets.", input.component);
18
+ if (segments.some(segment => parameter(segment) === undefined && !/^[A-Za-z0-9_-]+$/.test(segment))) {
19
+ throw new HtmlKitError("Route segments must be URL slugs or [named] parameters.", input.component);
20
+ }
21
+ const params = segments.flatMap(segment => parameter(segment) ?? []);
22
+ if (new Set(params).size !== params.length)
23
+ throw new HtmlKitError("Route parameter names must be unique.", input.component);
24
+ const absolute = (layer) => ({ component: resolve(root, layer.component),
25
+ ...(layer.server === undefined ? {} : { server: resolve(root, layer.server) }) });
26
+ routes.push({ ...absolute(input), pattern: input.pattern, segments, params, layouts: (input.layouts ?? []).map(absolute) });
27
+ };
28
+ const visit = async (directory, segments) => {
29
+ const files = await readdir(directory, { withFileTypes: true });
30
+ const names = new Set(files.filter(file => file.isFile()).map(file => file.name));
31
+ const layer = (name) => {
32
+ const servers = ["ts", "js"].filter(ext => names.has(`${name}.server.${ext}`));
33
+ if (servers.length > 1)
34
+ throw new HtmlKitError(`Choose one ${name}.server.ts or .js loader.`, directory);
35
+ return { component: join(directory, `${name}.html`), ...(servers[0] === undefined ? {} : { server: join(directory, `${name}.server.${servers[0]}`) }) };
36
+ };
37
+ for (const name of [...names].sort()) {
38
+ if (!name.endsWith(".html") || name.startsWith("_") || name.startsWith("."))
39
+ continue;
40
+ const stem = name.slice(0, -5);
41
+ const parts = stem === "index" ? segments : [...segments, stem];
42
+ add({ ...layer(stem), pattern: `/${parts.length === 0 ? "" : parts.join("/") + "/"}` });
43
+ }
44
+ for (const file of files.sort((a, b) => a.name.localeCompare(b.name))) {
45
+ if (!file.isDirectory() || file.name.startsWith(".") || file.name.startsWith("_"))
46
+ continue;
47
+ if (parameter(file.name) === undefined && !/^[A-Za-z0-9_-]+$/.test(file.name)) {
48
+ throw new HtmlKitError("Route directories must be URL slugs or [named] parameters.", join(directory, file.name));
49
+ }
50
+ await visit(join(directory, file.name), [...segments, file.name]);
51
+ }
52
+ };
53
+ if (options.fileRoutes !== false) {
54
+ const pages = resolve(root, "app/pages");
55
+ let present = true;
56
+ try {
57
+ await stat(pages);
58
+ }
59
+ catch (error) {
60
+ if (error.code !== "ENOENT")
61
+ throw error;
62
+ present = false;
63
+ }
64
+ if (present)
65
+ await visit(pages, []);
66
+ }
67
+ for (const route of options.routes ?? [])
68
+ add(route);
69
+ for (const prefix of Object.keys(options.layoutDefaults ?? {})) {
70
+ if (!/^\/(?:[^/]+\/)*$/.test(prefix))
71
+ throw new HtmlKitError("Layout defaults require route-directory prefixes with leading and trailing slashes.", prefix);
72
+ }
73
+ const patterns = new Map();
74
+ for (const route of routes) {
75
+ const normalized = route.segments.map(segment => parameter(segment) === undefined ? segment.toLowerCase() : "[]").join("/");
76
+ if (patterns.has(normalized))
77
+ throw new HtmlKitError(`Route conflict with ${patterns.get(normalized)}.`, route.component);
78
+ patterns.set(normalized, route.pattern);
79
+ }
80
+ const pageFiles = new Map();
81
+ const pageNames = new Map();
82
+ const discovered = [];
83
+ const layoutDefaults = Object.entries(options.layoutDefaults ?? {}).sort(([a], [b]) => b.length - a.length);
84
+ for (const route of routes) {
85
+ const identity = await realpath(route.component);
86
+ let resource = pageFiles.get(identity);
87
+ if (resource === undefined) {
88
+ // Read declarations only. Route discovery never executes loaders or controllers.
89
+ resource = applicationResource(await readFile(identity, "utf8"), pathToFileURL(identity).href);
90
+ pageFiles.set(identity, resource);
91
+ }
92
+ const pageName = pageDefinition(resource, route.component).contract.tag;
93
+ const previous = pageNames.get(pageName);
94
+ if (previous !== undefined && previous.identity !== identity) {
95
+ throw new HtmlKitError(`Duplicate page component <${pageName}>: ${previous.component} (${previous.pattern}) and ${route.component} (${route.pattern}).`, route.component);
96
+ }
97
+ pageNames.set(pageName, { component: route.component, pattern: route.pattern, identity });
98
+ const override = resource.components.get(pageName).layout;
99
+ const directory = layoutDefaults.find(([prefix]) => route.pattern.startsWith(prefix));
100
+ let selected = override ?? directory?.[1] ?? options.layout;
101
+ if (selected === undefined && route.layouts.length === 0) {
102
+ try {
103
+ await stat(resolve(root, "app/layouts/default.html"));
104
+ selected = "default";
105
+ }
106
+ catch (error) {
107
+ if (error.code !== "ENOENT")
108
+ throw error;
109
+ }
110
+ }
111
+ let layouts = route.layouts;
112
+ if (selected === false || selected === "none")
113
+ layouts = [];
114
+ else if (selected !== undefined) {
115
+ if (!/^[A-Za-z0-9_-]+$/.test(selected))
116
+ throw new HtmlKitError("Layout names must be filename slugs.", route.component);
117
+ const component = resolve(root, `app/layouts/${selected}.html`);
118
+ await stat(component);
119
+ const servers = [];
120
+ for (const extension of ["ts", "js"]) {
121
+ const candidate = resolve(root, `app/layouts/${selected}.server.${extension}`);
122
+ try {
123
+ await stat(candidate);
124
+ servers.push(candidate);
125
+ }
126
+ catch (error) {
127
+ if (error.code !== "ENOENT")
128
+ throw error;
129
+ }
130
+ }
131
+ if (servers.length > 1)
132
+ throw new HtmlKitError("Choose one layout .server.ts or .js loader.", component);
133
+ layouts = [{ component, ...(servers[0] === undefined ? {} : { server: servers[0] }) }];
134
+ }
135
+ discovered.push({ ...route, layouts, pageName });
136
+ }
137
+ return discovered;
138
+ }
139
+ export function matchRoute(routes, pathname, base) {
140
+ if (!pathname.startsWith(base))
141
+ return undefined;
142
+ let segments;
143
+ try {
144
+ segments = pathname.slice(base.length).replace(/\/$/, "").split("/").filter(Boolean).map(decodeURIComponent);
145
+ }
146
+ catch {
147
+ return undefined;
148
+ }
149
+ if (segments.some(segment => !validSegment(segment)))
150
+ return undefined;
151
+ // Literal segments precede parameters; never depend on filesystem order.
152
+ const sorted = [...routes].sort((a, b) => {
153
+ for (let i = 0; i < Math.min(a.segments.length, b.segments.length); i++) {
154
+ const difference = Number(parameter(a.segments[i]) !== undefined) - Number(parameter(b.segments[i]) !== undefined);
155
+ if (difference !== 0)
156
+ return difference;
157
+ }
158
+ return a.pattern.localeCompare(b.pattern);
159
+ });
160
+ for (const route of sorted) {
161
+ if (route.segments.length !== segments.length)
162
+ continue;
163
+ const params = {};
164
+ if (route.segments.every((segment, index) => {
165
+ const name = parameter(segment);
166
+ if (name === undefined)
167
+ return segment === segments[index];
168
+ params[name] = segments[index];
169
+ return true;
170
+ }))
171
+ return { route, params: Object.freeze(params) };
172
+ }
173
+ return undefined;
174
+ }
175
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ApplicationServer, ServerOptions } from "./types.js";
2
+ export declare function previewApplication(options?: ServerOptions): Promise<ApplicationServer>;
3
+ export declare function devApplication(options?: 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":"AAWA,OAAO,KAAK,EAAe,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA2BhF,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2ChG;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2D5F"}
package/dist/serve.js ADDED
@@ -0,0 +1,204 @@
1
+ import { createServer as createHTTPServer } from "node:http";
2
+ import { createHash } from "node:crypto";
3
+ import { readFile, realpath, stat } from "node:fs/promises";
4
+ import { extname, join, resolve } from "node:path";
5
+ import { createServer, isRunnableDevEnvironment } from "vite";
6
+ import { createApplication } from "./application.js";
7
+ import { browserPlugin, browserSource, stylesheetSources } from "./browser.js";
8
+ import { configure, HtmlKitError, within } from "./config.js";
9
+ import { documentHTML, escapeHTML } from "./document.js";
10
+ import { matchRoute } from "./routes.js";
11
+ const mime = { ".html": "text/html; charset=utf-8", ".js": "text/javascript; charset=utf-8",
12
+ ".css": "text/css; charset=utf-8", ".json": "application/json", ".svg": "image/svg+xml", ".png": "image/png", ".jpg": "image/jpeg",
13
+ ".webp": "image/webp", ".ico": "image/x-icon", ".woff": "font/woff", ".woff2": "font/woff2", ".txt": "text/plain; charset=utf-8" };
14
+ async function listen(server, options, base) {
15
+ const host = options.host ?? "127.0.0.1";
16
+ await new Promise((done, reject) => { server.once("error", reject); server.listen(options.port ?? 3000, host, done); });
17
+ const address = server.address();
18
+ if (address === null || typeof address === "string")
19
+ throw new HtmlKitError("Server did not obtain a TCP port.");
20
+ return { url: `http://${host.includes(":") ? `[${host}]` : host}:${address.port}${base}`,
21
+ close: () => new Promise((done, reject) => { server.close(error => error ? reject(error) : done()); server.closeIdleConnections(); }) };
22
+ }
23
+ function requestPath(request) {
24
+ const original = "originalUrl" in request && typeof request.originalUrl === "string" ? request.originalUrl : request.url;
25
+ return new URL(original ?? "/", "http://localhost").pathname;
26
+ }
27
+ function redirect(response, pathname) {
28
+ response.writeHead(308, { location: pathname + "/" });
29
+ response.end();
30
+ }
31
+ function methodAllowed(request, response) {
32
+ if (request.method === "GET" || request.method === "HEAD")
33
+ return true;
34
+ response.writeHead(405, { allow: "GET, HEAD" });
35
+ response.end();
36
+ return false;
37
+ }
38
+ export async function previewApplication(options = {}) {
39
+ const config = configure(options);
40
+ // Read deployment metadata, never loaders or page source. The same tree works on a static host.
41
+ const manifest = JSON.parse(await readFile(join(config.outDir, "_htmlkit/manifest.json"), "utf8"));
42
+ const base = manifest.base;
43
+ const output = await realpath(config.outDir);
44
+ const server = createHTTPServer((request, response) => {
45
+ void (async () => {
46
+ if (!methodAllowed(request, response))
47
+ return;
48
+ const pathname = requestPath(request);
49
+ if (pathname === base.slice(0, -1) && base !== "/") {
50
+ redirect(response, pathname);
51
+ return;
52
+ }
53
+ let file;
54
+ if (pathname.startsWith(base)) {
55
+ let decoded;
56
+ try {
57
+ decoded = decodeURIComponent(pathname.slice(base.length));
58
+ }
59
+ catch {
60
+ response.writeHead(400);
61
+ response.end();
62
+ return;
63
+ }
64
+ const candidate = resolve(output, decoded || ".");
65
+ if (!within(output, candidate)) {
66
+ response.writeHead(404);
67
+ response.end();
68
+ return;
69
+ }
70
+ try {
71
+ const canonical = await realpath(candidate);
72
+ if (within(output, canonical)) {
73
+ const info = await stat(canonical);
74
+ if (info.isDirectory()) {
75
+ if (!pathname.endsWith("/")) {
76
+ redirect(response, pathname);
77
+ return;
78
+ }
79
+ file = join(canonical, "index.html");
80
+ }
81
+ else
82
+ file = canonical;
83
+ }
84
+ }
85
+ catch (error) {
86
+ if (error.code !== "ENOENT")
87
+ throw error;
88
+ }
89
+ }
90
+ let body;
91
+ let status = 200;
92
+ if (file !== undefined) {
93
+ try {
94
+ file = await realpath(file);
95
+ if (!within(output, file))
96
+ file = undefined;
97
+ }
98
+ catch (error) {
99
+ if (error.code !== "ENOENT")
100
+ throw error;
101
+ file = undefined;
102
+ }
103
+ }
104
+ if (file === undefined) {
105
+ status = 404;
106
+ file = await realpath(join(output, "404.html"));
107
+ if (!within(output, file))
108
+ throw new HtmlKitError("Missing-page output escapes the deployment directory.");
109
+ }
110
+ body = await readFile(file);
111
+ response.writeHead(status, { "content-type": mime[extname(file ?? "404.html")] ?? "application/octet-stream", "content-length": body.length });
112
+ response.end(request.method === "HEAD" ? undefined : body);
113
+ })().catch(error => { response.writeHead(500, { "content-type": "text/plain" }); response.end(String(error)); });
114
+ });
115
+ return listen(server, options, base);
116
+ }
117
+ export async function devApplication(options = {}) {
118
+ const config = configure(options);
119
+ const sources = new Map();
120
+ let watchReady;
121
+ const watching = new Promise(done => { watchReady = done; });
122
+ const vite = await createServer({ root: config.root, configFile: false, appType: "custom", base: config.base,
123
+ mode: "development", plugins: [browserPlugin(sources), {
124
+ name: "htmlkit-watch-ready", configureServer(server) { server.watcher.once("ready", watchReady); },
125
+ }], optimizeDeps: { noDiscovery: true, include: [] },
126
+ server: { host: options.host ?? "127.0.0.1", port: options.port ?? 3000,
127
+ fs: { allow: [config.root, await realpath(config.root), await realpath(resolve(import.meta.dirname, "../../.."))] } },
128
+ logLevel: "silent" });
129
+ let application;
130
+ try {
131
+ application = await createApplication(options, vite);
132
+ }
133
+ catch (error) {
134
+ await vite.close();
135
+ throw error;
136
+ }
137
+ let dirty = false;
138
+ const change = () => {
139
+ dirty = true;
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
+ (/\.[A-Za-z0-9]+$/.test(pathname) && matchRoute(application.routes, pathname, config.base) === undefined)) {
152
+ next();
153
+ return;
154
+ }
155
+ void (async () => {
156
+ if (!methodAllowed(request, response))
157
+ return;
158
+ if (dirty) {
159
+ application = await createApplication(options, vite);
160
+ dirty = false;
161
+ sources.clear();
162
+ }
163
+ const page = await application.render(pathname);
164
+ if (page.status === 200 && !pathname.endsWith("/")) {
165
+ redirect(response, pathname);
166
+ return;
167
+ }
168
+ const graphId = createHash("sha256").update(page.components.map(component => component.definition.source.file).join("\0")).digest("hex").slice(0, 16);
169
+ const id = `virtual:htmlkit/${graphId}`;
170
+ sources.set(id, browserSource(page.components, config.base));
171
+ const styles = stylesheetSources(page.components);
172
+ for (const [id, css] of styles)
173
+ sources.set(id, css);
174
+ const assets = [...styles.keys()].map(id => `<link rel="stylesheet" href="${escapeHTML(config.base + "@fs/" + id)}">`).join("") +
175
+ `<script type="module" src="${escapeHTML(config.base + "@vite/client")}"></script>` +
176
+ `<script type="module" src="${escapeHTML(config.base + "@id/" + id)}"></script>`;
177
+ // Vite's HTML transformer applies its base to root-relative assets a second time.
178
+ // This document is already composed for its deployment URL; only modules use Vite.
179
+ const html = documentHTML(page.body, page.head, assets);
180
+ response.writeHead(page.status, { "content-type": "text/html; charset=utf-8" });
181
+ response.end(request.method === "HEAD" ? undefined : html);
182
+ })().catch(error => {
183
+ vite.ssrFixStacktrace(error instanceof Error ? error : new Error(String(error)));
184
+ response.writeHead(500, { "content-type": "text/html; charset=utf-8" });
185
+ response.end(documentHTML(`<main><h1>Application error</h1><pre>${escapeHTML(String(error))}</pre></main>`, { title: "Application error" }));
186
+ });
187
+ });
188
+ try {
189
+ await vite.listen();
190
+ await watching;
191
+ }
192
+ catch (error) {
193
+ await vite.close();
194
+ throw error;
195
+ }
196
+ const address = vite.httpServer?.address();
197
+ if (address === undefined || address === null || typeof address === "string") {
198
+ await vite.close();
199
+ throw new HtmlKitError("Dev server did not obtain a TCP port.");
200
+ }
201
+ const host = options.host ?? "127.0.0.1";
202
+ return { url: `http://${host.includes(":") ? `[${host}]` : host}:${address.port}${config.base}`, close: () => vite.close() };
203
+ }
204
+ //# 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,112 @@
1
+ import type { ComponentDefinition } from "@nextwebwg/html-next";
2
+ export interface ApplicationOptions {
3
+ readonly root?: string;
4
+ /** Absolute URL path prefix, for example /docs/. */
5
+ readonly base?: string;
6
+ /** Canonical origin used by static loaders; defaults to http://localhost. */
7
+ readonly origin?: string;
8
+ readonly outDir?: string;
9
+ /** Discover app/pages by default; disable for an entirely registered route table. */
10
+ readonly fileRoutes?: boolean;
11
+ /** Additional routes, using the same [param] pattern syntax as discovered pages. */
12
+ readonly routes?: readonly RouteInput[];
13
+ /** Named layout; default.html is automatic when present. false disables it. */
14
+ readonly layout?: string | false;
15
+ /** Route-directory defaults, overridden by page metadata; longest prefix wins. */
16
+ readonly layoutDefaults?: Readonly<Record<string, string | false>>;
17
+ }
18
+ export interface PageHead {
19
+ readonly title?: string;
20
+ readonly description?: string;
21
+ readonly lang?: string;
22
+ }
23
+ export interface RenderedHead extends PageHead {
24
+ /** Rendered native metadata, merged by identity; values are escaped on output. */
25
+ readonly elements?: readonly HeadElement[];
26
+ }
27
+ export interface HeadElement {
28
+ readonly tag: "meta" | "link";
29
+ readonly attributes: Readonly<Record<string, string>>;
30
+ }
31
+ export interface LoaderResult {
32
+ /** Values for this page/layout's declared props. These become public HTML. */
33
+ readonly props?: Readonly<Record<string, unknown>>;
34
+ /** Values for this page/layout's declared state. These become public HTML. */
35
+ readonly state?: Readonly<Record<string, unknown>>;
36
+ /** Server-only values merged into descendant loaders' parent data. */
37
+ readonly data?: Readonly<Record<string, unknown>>;
38
+ readonly head?: PageHead;
39
+ }
40
+ export interface LoadContext {
41
+ readonly phase: "prerender";
42
+ readonly url: URL;
43
+ readonly base: string;
44
+ readonly params: Readonly<Record<string, string>>;
45
+ readonly parent: Readonly<Record<string, unknown>>;
46
+ readonly fetch: typeof globalThis.fetch;
47
+ readonly signal: AbortSignal;
48
+ /** Unavailable during static generation; accessing it throws a diagnostic. */
49
+ readonly request: Request;
50
+ }
51
+ export interface ServerModule {
52
+ readonly load?: (context: LoadContext) => LoaderResult | Promise<LoaderResult>;
53
+ readonly entries?: () => readonly Readonly<Record<string, string>>[] | Promise<readonly Readonly<Record<string, string>>[]>;
54
+ }
55
+ export interface RouteLayer {
56
+ readonly component: string;
57
+ readonly server?: string;
58
+ }
59
+ export interface RouteInput extends RouteLayer {
60
+ readonly pattern: string;
61
+ readonly layouts?: readonly RouteLayer[];
62
+ }
63
+ export interface ApplicationRoute extends RouteLayer {
64
+ /** The selected component tag, independent of the route pattern and source file. */
65
+ readonly pageName: string;
66
+ readonly pattern: string;
67
+ readonly segments: readonly string[];
68
+ readonly params: readonly string[];
69
+ readonly layouts: readonly RouteLayer[];
70
+ }
71
+ export interface BrowserDefinition {
72
+ readonly definition: ComponentDefinition;
73
+ readonly controller?: string;
74
+ readonly styles: {
75
+ readonly css: string;
76
+ readonly stateNames: readonly string[];
77
+ };
78
+ }
79
+ export interface RenderedPage {
80
+ readonly status: 200 | 404;
81
+ readonly pathname: string;
82
+ readonly html: string;
83
+ readonly css: string;
84
+ readonly head: RenderedHead;
85
+ readonly body: string;
86
+ readonly components: readonly BrowserDefinition[];
87
+ }
88
+ export interface Application {
89
+ readonly root: string;
90
+ readonly base: string;
91
+ readonly outDir: string;
92
+ readonly routes: readonly ApplicationRoute[];
93
+ /** Enumerate the exact deployment URLs, diagnosing omitted dynamic entries. */
94
+ entries(): Promise<readonly string[]>;
95
+ /** Render a fresh declarative baseline without executing browser controllers. */
96
+ render(pathname: string, signal?: AbortSignal): Promise<RenderedPage>;
97
+ close(): Promise<void>;
98
+ }
99
+ export interface BuildResult {
100
+ readonly outDir: string;
101
+ readonly routes: readonly string[];
102
+ readonly browserInputs: readonly string[];
103
+ }
104
+ export interface ServerOptions extends ApplicationOptions {
105
+ readonly host?: string;
106
+ readonly port?: number;
107
+ }
108
+ export interface ApplicationServer {
109
+ readonly url: string;
110
+ close(): Promise<void>;
111
+ }
112
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}