@threadlabs/markupkit 0.0.0-stage → 0.1.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
@@ -0,0 +1,127 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ import { bundleServer } from "./bundle.js";
6
+ import ts from "typescript-compiler";
7
+ function surface(file, source) {
8
+ if (/\.d\.[cm]?ts$/i.test(file))
9
+ return { provider: false, stars: [] };
10
+ // Use compiler erasure rather than mistaking an exported local type for a runtime value.
11
+ const emitted = ts.transpileModule(source, { fileName: file,
12
+ compilerOptions: { target: ts.ScriptTarget.ESNext, module: ts.ModuleKind.ESNext, jsx: ts.JsxEmit.Preserve } }).outputText;
13
+ const parsed = ts.createSourceFile(file, emitted, ts.ScriptTarget.Latest);
14
+ const names = new Set(["props", "create"]);
15
+ const binding = (name) => ts.isIdentifier(name) ? names.has(name.text)
16
+ : name.elements.some(element => ts.isBindingElement(element) && binding(element.name));
17
+ let provider = false;
18
+ const stars = [];
19
+ for (const statement of parsed.statements) {
20
+ if (ts.isExportDeclaration(statement)) {
21
+ const clause = statement.exportClause;
22
+ if (clause === undefined) {
23
+ if (statement.moduleSpecifier !== undefined && ts.isStringLiteral(statement.moduleSpecifier))
24
+ stars.push(statement.moduleSpecifier.text);
25
+ }
26
+ else if (ts.isNamedExports(clause))
27
+ provider ||= clause.elements.some(element => names.has(element.name.text));
28
+ else
29
+ provider ||= names.has(clause.name.text);
30
+ continue;
31
+ }
32
+ const modifiers = ts.canHaveModifiers(statement) ? ts.getModifiers(statement) : undefined;
33
+ if (!modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword) ||
34
+ modifiers.some(modifier => modifier.kind === ts.SyntaxKind.DefaultKeyword))
35
+ continue;
36
+ if (ts.isVariableStatement(statement))
37
+ provider ||= statement.declarationList.declarations.some(declaration => binding(declaration.name));
38
+ else if (ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement))
39
+ provider ||= statement.name !== undefined && names.has(statement.name.text);
40
+ }
41
+ return { provider, stars };
42
+ }
43
+ export function createProviderModules(root, host) {
44
+ const revision = randomUUID();
45
+ const abort = new AbortController();
46
+ const cache = new Map();
47
+ const surfaces = new Map();
48
+ const provider = async (file, seen = new Set()) => {
49
+ if (seen.has(file))
50
+ return false;
51
+ seen.add(file);
52
+ let parsed = surfaces.get(file);
53
+ if (parsed === undefined) {
54
+ host.watch(file);
55
+ parsed = readFile(file, { encoding: "utf8", signal: abort.signal }).then(source => surface(file, source));
56
+ surfaces.set(file, parsed);
57
+ }
58
+ const found = await parsed;
59
+ if (found.provider)
60
+ return true;
61
+ for (const specifier of found.stars) {
62
+ const resolved = await host.resolve(specifier, file);
63
+ if (resolved !== undefined && await provider(resolved, seen))
64
+ return true;
65
+ }
66
+ return false;
67
+ };
68
+ let temporary;
69
+ let batch = 0;
70
+ let closing;
71
+ return {
72
+ async resolve(components) {
73
+ abort.signal.throwIfAborted();
74
+ const missing = [...new Set(components.flatMap(component => component.module === undefined ? [] : [component.module]))].filter(file => !cache.has(file));
75
+ if (missing.length > 0) {
76
+ const id = batch++;
77
+ // Keep native package resolution rooted in the app; Vite excludes its cache from watching.
78
+ const directory = () => (temporary ??= (async () => {
79
+ await mkdir(host.cacheDir, { recursive: true });
80
+ const directory = await mkdtemp(join(host.cacheDir, "markupkit-providers-"));
81
+ try {
82
+ await writeFile(join(directory, "package.json"), '{"type":"module"}');
83
+ }
84
+ catch (error) {
85
+ await rm(directory, { recursive: true, force: true });
86
+ throw error;
87
+ }
88
+ return directory;
89
+ })()).then(path => join(path, String(id)));
90
+ const eligible = Promise.all(missing.map(file => provider(file)));
91
+ const bundled = (async () => {
92
+ const selected = (await eligible).flatMap((include, i) => include ? [[`provider-${i}`, missing[i]]] : []);
93
+ const result = selected.length === 0 ? undefined : await bundleServer({ root, outDir: await directory(), inputs: Object.fromEntries(selected) }, abort.signal);
94
+ for (const file of result?.inputs ?? [])
95
+ host.watch(file);
96
+ return result;
97
+ })();
98
+ for (const [i, file] of missing.entries())
99
+ cache.set(file, (async () => {
100
+ const result = await bundled;
101
+ const entry = result?.entries[`provider-${i}`];
102
+ if (entry === undefined || !entry.exports.some(name => name === "props" || name === "create"))
103
+ return undefined;
104
+ return { module: pathToFileURL(join(await directory(), entry.file)).href, source: `${revision}:${id}:${i}` };
105
+ })());
106
+ }
107
+ return Promise.all(components.map(async (component) => {
108
+ const provider = component.module === undefined ? undefined : await cache.get(component.module);
109
+ if (provider === undefined && component.server !== undefined)
110
+ throw new TypeError(`${component.server}: private readers require a common provider module.`);
111
+ const identity = createHash("sha256").update(`${component.definition.source.file}\0${component.definition.contract.tag}`).digest("hex").slice(0, 16);
112
+ return provider === undefined ? component : { ...component, binding: { ...provider, source: `${provider.source}:${identity}`,
113
+ ...component.client === undefined ? {} : { client: true }, ...component.privateReaderNames === undefined ? {} : { readers: component.privateReaderNames } } };
114
+ }));
115
+ },
116
+ close() {
117
+ return closing ??= (async () => {
118
+ abort.abort(new Error("MarkupKit provider modules are closed."));
119
+ await Promise.allSettled([...cache.values(), ...surfaces.values()]);
120
+ const directory = await temporary?.catch(() => undefined);
121
+ if (directory !== undefined)
122
+ await rm(directory, { recursive: true, force: true });
123
+ })();
124
+ },
125
+ };
126
+ }
127
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { MessagePort } from "node:worker_threads";
2
+ import type { BindingOperation, HydrationValue } from "@nextwebwg/html-next/bindings";
3
+ export interface ReadCodec {
4
+ encodeHydrationValue(value: unknown): HydrationValue;
5
+ decodeHydrationValue(value: unknown): unknown;
6
+ }
7
+ export interface ReadCall {
8
+ readonly kind: "read";
9
+ readonly id: number;
10
+ readonly tag: string;
11
+ readonly name: string;
12
+ readonly input: HydrationValue;
13
+ readonly sample: HydrationValue;
14
+ }
15
+ export interface ReadReply {
16
+ readonly id: number;
17
+ readonly value?: HydrationValue;
18
+ readonly error?: {
19
+ readonly name: string;
20
+ readonly message: string;
21
+ readonly status?: number;
22
+ };
23
+ }
24
+ export declare function sendRead(port: MessagePort, message: unknown): void;
25
+ /** One render's existing transferred port; no application-global request or value cache. */
26
+ export declare function readChannel(port: MessagePort, codec: ReadCodec): {
27
+ read(tag: string, name: string, input: unknown, operation: BindingOperation): Promise<unknown>;
28
+ close: () => void;
29
+ };
30
+ //# sourceMappingURL=read-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-channel.d.ts","sourceRoot":"","sources":["../src/read-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEtF,MAAM,WAAW,SAAS;IAAG,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAAC;IAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE;AAClI,MAAM,WAAW,QAAQ;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE;AACtL,MAAM,WAAW,SAAS;IAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;AACnL,wBAAgB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAGlE;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS;cAajD,MAAM,QAAQ,MAAM,SAAS,OAAO,aAAa,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;iBAT9E,IAAI;EA+BvB"}
@@ -0,0 +1,65 @@
1
+ export function sendRead(port, message) {
2
+ // oxlint-disable-next-line unicorn/require-post-message-target-origin -- Native Node MessagePort has no origin.
3
+ port.postMessage(message);
4
+ }
5
+ /** One render's existing transferred port; no application-global request or value cache. */
6
+ export function readChannel(port, codec) {
7
+ let next = 0;
8
+ let closed = false;
9
+ const pending = new Map();
10
+ const receive = (reply) => { pending.get(reply.id)?.accept(reply); };
11
+ const close = () => {
12
+ if (closed)
13
+ return;
14
+ closed = true;
15
+ port.off("message", receive);
16
+ for (const request of pending.values())
17
+ request.reject(new DOMException("The render's private read channel closed.", "AbortError"));
18
+ pending.clear();
19
+ };
20
+ port.on("message", receive);
21
+ port.once("close", close);
22
+ return {
23
+ read(tag, name, input, operation) {
24
+ if (closed || operation.signal.aborted)
25
+ return Promise.reject(operation.signal.reason ?? new DOMException("Private reads are closed.", "AbortError"));
26
+ const id = next++;
27
+ return new Promise((resolve, reject) => {
28
+ const done = (error, reply) => {
29
+ pending.delete(id);
30
+ operation.signal.removeEventListener("abort", abort);
31
+ if (error !== undefined)
32
+ reject(error);
33
+ else if (reply?.error !== undefined)
34
+ reject(Object.assign(new Error(reply.error.message), { name: reply.error.name }));
35
+ else {
36
+ try {
37
+ resolve(codec.decodeHydrationValue(reply.value));
38
+ }
39
+ catch (error) {
40
+ reject(error);
41
+ }
42
+ }
43
+ };
44
+ const abort = () => {
45
+ try {
46
+ if (!closed)
47
+ sendRead(port, { kind: "cancel", id });
48
+ }
49
+ catch { /* A closed peer needs no cancellation frame. */ }
50
+ done(operation.signal.reason ?? new DOMException("Private read aborted.", "AbortError"));
51
+ };
52
+ pending.set(id, { accept: reply => done(undefined, reply), reject: error => done(error) });
53
+ operation.signal.addEventListener("abort", abort, { once: true });
54
+ try {
55
+ sendRead(port, { kind: "read", id, tag, name, input: codec.encodeHydrationValue(input), sample: codec.encodeHydrationValue(operation.sample) });
56
+ }
57
+ catch (error) {
58
+ done(error);
59
+ }
60
+ });
61
+ },
62
+ close,
63
+ };
64
+ }
65
+ //# sourceMappingURL=read-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-channel.js","sourceRoot":"","sources":["../src/read-channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type ComponentDefinition } from "@nextwebwg/html-next";
2
+ interface ComponentMetadata {
3
+ readonly layout?: string;
4
+ readonly label?: string;
5
+ /** hk:order, the page's place among its neighbours, as a number-and-dot prefix gives it. */
6
+ readonly order?: string;
7
+ readonly hidden?: boolean;
8
+ /** hk:render: "server" renders the page on each request; "prerender", the default, at build time. */
9
+ readonly render?: "prerender" | "server";
10
+ /** Extra route patterns for a page, relative to its page directory's prefix. */
11
+ readonly aliases: readonly string[];
12
+ /** hk:redirect-from: old route paths, relative to its page directory's prefix, that redirect to the page. */
13
+ readonly redirectsFrom: readonly string[];
14
+ /** The text of a <title> without expressions. */
15
+ readonly title?: string;
16
+ }
17
+ /** Native HTML parsing determines resource nodes; HTML Next owns component syntax. */
18
+ export declare function applicationResource(source: string, file: string): {
19
+ definitions: ComponentDefinition[];
20
+ dependencies: readonly string[];
21
+ configuration: Map<string, string>;
22
+ components: Map<string, ComponentMetadata>;
23
+ };
24
+ export declare function pageDefinition(resource: ReturnType<typeof applicationResource>, file: string): ComponentDefinition;
25
+ /**
26
+ * A definition without its hk: settings, which MarkupKit reads as configuration, so the runtime never
27
+ * adds them to the document head.
28
+ */
29
+ export declare function withoutSettings(definition: ComponentDefinition): ComponentDefinition;
30
+ export {};
31
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIxF,UAAU,iBAAiB;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,qGAAqG;IACrG,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IACzC,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,6GAA6G;IAC7G,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAOD,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;EA4D/D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAQlH;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,mBAAmB,GAAG,mBAAmB,CAMpF"}
@@ -0,0 +1,117 @@
1
+ import { parseComponentResource } from "@nextwebwg/html-next";
2
+ import { parseFragment } from "parse5";
3
+ import { MarkupKitError } from "./config.js";
4
+ // MarkupKit metadata was spelled htmlkit:*; name the new spelling rather than ignore it.
5
+ function renamed(name, file) {
6
+ if (name?.startsWith("htmlkit:"))
7
+ throw new MarkupKitError(`MarkupKit metadata uses the hk: prefix; write ${"hk:" + name.slice(name.indexOf(":") + 1)} instead of ${name}.`, file);
8
+ }
9
+ /** Native HTML parsing determines resource nodes; HTML Next owns component syntax. */
10
+ export function applicationResource(source, file) {
11
+ const configuration = new Map();
12
+ const components = new Map();
13
+ const fragment = parseFragment(source);
14
+ for (const node of fragment.childNodes) {
15
+ if (!("tagName" in node) || !["meta", "title", "link"].includes(node.tagName))
16
+ continue;
17
+ const name = node.attrs.find(attribute => attribute.name === "name")?.value;
18
+ renamed(name, file);
19
+ if (node.tagName === "meta" && name === "hk:page") {
20
+ const content = node.attrs.find(attribute => attribute.name === "content")?.value;
21
+ if (!content || configuration.has(name))
22
+ throw new MarkupKitError(`Declare ${name} once with nonempty content.`, file);
23
+ configuration.set(name, content);
24
+ }
25
+ else if (node.tagName !== "link" || !node.attrs.find(attribute => attribute.name === "rel")?.value.toLowerCase().split(/\s+/).includes("component")) {
26
+ throw new MarkupKitError("Page and layout metadata belongs in its <template component>'s <defs>; only hk:page, which selects the file's page, is outside it.", file);
27
+ }
28
+ }
29
+ for (const node of fragment.childNodes) {
30
+ if (!("tagName" in node))
31
+ continue;
32
+ const tag = node.attrs.find(attribute => attribute.name === "component")?.value;
33
+ if (node.tagName !== "template" || tag === undefined)
34
+ continue;
35
+ const children = node.content.childNodes;
36
+ const configuration = {};
37
+ const aliases = [], redirectsFrom = [];
38
+ for (const child of children) {
39
+ if ("tagName" in child && ["meta", "title", "link"].includes(child.tagName)) {
40
+ throw new MarkupKitError(`<${child.tagName}> belongs in <${tag}>'s <defs>, where head content and hk: settings are declared.`, file);
41
+ }
42
+ }
43
+ const defs = children.find(child => "tagName" in child && child.tagName === "defs");
44
+ for (const child of defs !== undefined && "childNodes" in defs ? defs.childNodes : []) {
45
+ if (!("tagName" in child))
46
+ continue;
47
+ // A static <title> labels the page's folder in navigation trees when hk:label doesn't.
48
+ if (child.tagName === "title") {
49
+ const text = child.childNodes.map(text => "value" in text ? text.value : "").join("").trim();
50
+ if (text !== "" && !text.includes("{"))
51
+ configuration.title = text;
52
+ continue;
53
+ }
54
+ if (child.tagName !== "meta")
55
+ continue;
56
+ const name = child.attrs.find(attribute => attribute.name === "name")?.value;
57
+ renamed(name, file);
58
+ if (!name?.startsWith("hk:"))
59
+ continue;
60
+ const content = child.attrs.find(attribute => attribute.name === "content")?.value;
61
+ if (!content)
62
+ throw new MarkupKitError(`Declare ${name} with nonempty content.`, file);
63
+ if (name === "hk:alias") {
64
+ aliases.push(content);
65
+ continue;
66
+ }
67
+ if (name === "hk:redirect-from") {
68
+ redirectsFrom.push(content);
69
+ continue;
70
+ }
71
+ const key = { "hk:layout": "layout", "hk:label": "label", "hk:order": "order", "hk:navigation": "hidden", "hk:render": "render" }[name];
72
+ if (key === undefined)
73
+ throw new MarkupKitError(`Component configuration is hk:layout, hk:label, hk:order, hk:navigation, hk:render, hk:alias, or hk:redirect-from; hk:page belongs outside the carrier (${name}).`, file);
74
+ if (configuration[key] !== undefined)
75
+ throw new MarkupKitError(`Declare ${name} once per component.`, file);
76
+ if (key === "hidden" && content !== "hidden")
77
+ throw new MarkupKitError('hk:navigation accepts only content="hidden".', file);
78
+ if (key === "order" && !/^\d+$/.test(content))
79
+ throw new MarkupKitError("hk:order needs a whole number, such as content=\"3\".", file);
80
+ if (key === "render" && content !== "prerender" && content !== "server")
81
+ throw new MarkupKitError('hk:render accepts content="prerender" or content="server".', file);
82
+ if (key === "hidden")
83
+ configuration.hidden = true;
84
+ else if (key === "render")
85
+ configuration.render = content;
86
+ else
87
+ configuration[key] = content;
88
+ }
89
+ components.set(tag, { ...configuration, aliases, redirectsFrom });
90
+ }
91
+ // MarkupKit's own rules first, so their diagnostics name what MarkupKit expects.
92
+ const parsed = parseComponentResource(source, file);
93
+ return { definitions: parsed.definitions.map(withoutSettings), dependencies: parsed.dependencies, configuration, components };
94
+ }
95
+ export function pageDefinition(resource, file) {
96
+ const selected = resource.configuration.get("hk:page");
97
+ if (selected === undefined && resource.definitions.length !== 1) {
98
+ throw new MarkupKitError("Multiple components require <meta name=\"hk:page\" content=\"page-name\">.", file);
99
+ }
100
+ const definition = selected === undefined ? resource.definitions[0] : resource.definitions.find(value => value.contract.tag === selected);
101
+ if (definition === undefined)
102
+ throw new MarkupKitError(`Unknown page component ${selected}.`, file);
103
+ return definition;
104
+ }
105
+ /**
106
+ * A definition without its hk: settings, which MarkupKit reads as configuration, so the runtime never
107
+ * adds them to the document head.
108
+ */
109
+ export function withoutSettings(definition) {
110
+ const head = definition.head?.filter(declaration => declaration.kind !== "meta" ||
111
+ !declaration.attributes.some(attribute => attribute.kind === "literal" && attribute.name === "name" && attribute.value.startsWith("hk:")));
112
+ if (head === undefined || head.length === definition.head.length)
113
+ return definition;
114
+ const { head: _head, ...rest } = definition;
115
+ return Object.freeze(head.length === 0 ? rest : { ...rest, head: Object.freeze(head) });
116
+ }
117
+ //# 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,90 @@
1
+ import { applicationResource } from "./resource.js";
2
+ import type { ApplicationOptions, ApplicationRoute, EndpointRoute } from "./types.js";
3
+ /** The name of a [name], [...name] catch-all, or [[...name]] optional catch-all segment. */
4
+ export declare function parameter(segment: string): string | undefined;
5
+ /** How broadly a segment matches: 0 a literal, 1 [name], 2 [...name], 3 [[...name]]. A missing segment is -1. */
6
+ export declare function breadth(segment: string | undefined): number;
7
+ export declare function validSegment(value: unknown): value is string;
8
+ export declare const redirectStatuses: readonly number[];
9
+ /** A redirect's Location: an application path, under base, or an absolute http(s) URL. */
10
+ export declare function redirectLocation(base: string, to: unknown, source: string): string;
11
+ /** The redirects option by deployment pathname, each to its Location. */
12
+ export declare function redirectTable(base: string, redirects?: Readonly<Record<string, string>>): ReadonlyMap<string, string>;
13
+ type DiscoveryOptions = Pick<ApplicationOptions, "base" | "routes" | "fileRoutes" | "pages" | "layout" | "layouts" | "layoutDefaults" | "plugins">;
14
+ export declare function discoverRoutes(root?: string, options?: DiscoveryOptions): Promise<readonly ApplicationRoute[]>;
15
+ /**
16
+ * Routes plus what plugins produced: compiled page sources by component path, the files pages
17
+ * reference by deployment-relative path, and the files plugins watch.
18
+ */
19
+ export declare function discover(root: string, options: DiscoveryOptions): Promise<{
20
+ routes: ApplicationRoute[];
21
+ notFound?: ApplicationRoute;
22
+ error?: ApplicationRoute;
23
+ redirects: {
24
+ readonly from: string;
25
+ readonly to: string;
26
+ readonly component: string;
27
+ }[];
28
+ sources: Map<string, string>;
29
+ files: Map<string, string>;
30
+ watched: Set<string>;
31
+ resourceOf: (component: string) => Promise<{
32
+ source: string;
33
+ resource: ReturnType<typeof applicationResource>;
34
+ identity: string;
35
+ }>;
36
+ }>;
37
+ /**
38
+ * The request-time files: each app/api/**\/*.server.ts endpoint, which answers its folder path without
39
+ * a trailing slash (index.server.ts answers the folder's own), and app/middleware.server.ts.
40
+ */
41
+ export declare function discoverServerFiles(root: string): Promise<{
42
+ readonly endpoints: readonly EndpointRoute[];
43
+ readonly middleware?: string;
44
+ }>;
45
+ export declare function matchRoute<Route extends Pick<ApplicationRoute, "pattern" | "segments">>(routes: readonly Route[], pathname: string, base: string): {
46
+ route: Route;
47
+ params: Readonly<Record<string, string | readonly string[]>>;
48
+ } | undefined;
49
+ /** Shared declaration discovery for rendering and independent build targets; no application modules execute. */
50
+ export declare function discoverApplication(input?: ApplicationOptions): Promise<{
51
+ options: ApplicationOptions;
52
+ config: {
53
+ root: string;
54
+ base: string;
55
+ origin: string;
56
+ outDir: string;
57
+ prefetch: import("./types.js").PrefetchPolicy;
58
+ csp: false | import("./types.js").ContentSecurityPolicyOptions;
59
+ };
60
+ discovery: {
61
+ routes: ApplicationRoute[];
62
+ notFound?: ApplicationRoute;
63
+ error?: ApplicationRoute;
64
+ redirects: {
65
+ readonly from: string;
66
+ readonly to: string;
67
+ readonly component: string;
68
+ }[];
69
+ sources: Map<string, string>;
70
+ files: Map<string, string>;
71
+ watched: Set<string>;
72
+ resourceOf: (component: string) => Promise<{
73
+ source: string;
74
+ resource: ReturnType<typeof applicationResource>;
75
+ identity: string;
76
+ }>;
77
+ };
78
+ server: {
79
+ readonly endpoints: readonly EndpointRoute[];
80
+ readonly middleware?: string;
81
+ };
82
+ redirects: Map<string, string>;
83
+ pageRedirects: Map<string, {
84
+ readonly from: string;
85
+ readonly component: string;
86
+ }>;
87
+ canonicalOrigin: string;
88
+ }>;
89
+ export {};
90
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAkB,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAuD,MAAM,YAAY,CAAC;AAE3I,4FAA4F;AAC5F,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG7D;AACD,iHAAiH;AACjH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG3D;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE5D;AACD,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAA8B,CAAC;AAC7E,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlF;AACD,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAUzH;AACD,KAAK,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAAC,CAAC;AAEnJ,wBAAsB,cAAc,CAAC,IAAI,SAAgB,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAE/H;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB;;;;;uBA4KlC,MAAM;qBAAe,MAAM;4BAAsB,MAAM;;;;;4BAjCpD,MAAM;gBADU,MAAM;kBAAqB,UAAU,CAAC,OAAO,mBAAmB,CAAC;;;GAyJvH;AACD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+B/I;AAED,wBAAgB,UAAU,CAAC,KAAK,SAAS,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;cAgChJ;AAED,gHAAgH;AAChH,wBAAsB,mBAAmB,CAAC,KAAK,GAAE,kBAAuB;;;;;;;;;;;;;;;2BAhMpC,MAAM;yBAAe,MAAM;gCAAsB,MAAM;;;;;gCAjCpD,MAAM;oBADU,MAAM;sBAAqB,UAAU,CAAC,OAAO,mBAAmB,CAAC;;;;;4BA8JjC,SAAS,aAAa,EAAE;8BAAwB,MAAM;;;;uBA6EpF,MAAM;4BAAsB,MAAM;;;GAc1F"}