markupress 0.0.2 → 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 (48) hide show
  1. package/README.md +244 -10
  2. package/dist/cli.js +1 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/content.d.ts +42 -1
  5. package/dist/content.d.ts.map +1 -1
  6. package/dist/content.js +276 -23
  7. package/dist/content.js.map +1 -1
  8. package/dist/controllers/code.d.ts +7 -0
  9. package/dist/controllers/code.d.ts.map +1 -0
  10. package/dist/controllers/code.js +31 -0
  11. package/dist/controllers/code.js.map +1 -0
  12. package/dist/controllers/outline.d.ts +8 -0
  13. package/dist/controllers/outline.d.ts.map +1 -0
  14. package/dist/controllers/outline.js +45 -0
  15. package/dist/controllers/outline.js.map +1 -0
  16. package/dist/controllers/shell.d.ts +6 -1
  17. package/dist/controllers/shell.d.ts.map +1 -1
  18. package/dist/controllers/shell.js +19 -24
  19. package/dist/controllers/shell.js.map +1 -1
  20. package/dist/index.d.ts +6 -3
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/markdown.d.ts +24 -0
  25. package/dist/markdown.d.ts.map +1 -0
  26. package/dist/markdown.js +54 -0
  27. package/dist/markdown.js.map +1 -0
  28. package/dist/navigation.d.ts +51 -0
  29. package/dist/navigation.d.ts.map +1 -0
  30. package/dist/navigation.js +71 -0
  31. package/dist/navigation.js.map +1 -0
  32. package/dist/site.d.ts +47 -10
  33. package/dist/site.d.ts.map +1 -1
  34. package/dist/site.js +152 -262
  35. package/dist/site.js.map +1 -1
  36. package/dist/theme.d.ts +2 -1
  37. package/dist/theme.d.ts.map +1 -1
  38. package/dist/theme.js +4 -34
  39. package/dist/theme.js.map +1 -1
  40. package/dist/versions.d.ts.map +1 -1
  41. package/dist/versions.js +10 -5
  42. package/dist/versions.js.map +1 -1
  43. package/package.json +21 -12
  44. package/styles/base.css +1 -21
  45. package/styles/prose.css +14 -0
  46. package/theme/outline.html +11 -0
  47. package/theme/shell.html +66 -0
  48. package/theme/theme.css +52 -0
package/dist/site.js CHANGED
@@ -1,279 +1,169 @@
1
- import { watch } from 'node:fs';
2
- import { createHash } from 'node:crypto';
3
- import { cp, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, stat, writeFile } from 'node:fs/promises';
4
- import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';
5
- import { pathToFileURL } from 'node:url';
6
- import { buildApplication, devApplication, previewApplication } from '@nextwebwg/htmlkit';
7
- import { compileMarkdown } from './content.js';
8
- import { themeResource } from './theme.js';
9
- async function exists(path) {
10
- try {
11
- await stat(path);
12
- return true;
13
- }
14
- catch (error) {
15
- if (error.code === 'ENOENT')
16
- return false;
17
- throw error;
18
- }
19
- }
1
+ import { existsSync } from 'node:fs';
2
+ import { readFile, readdir } from 'node:fs/promises';
3
+ import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { buildApplication, devApplication, loadConfig, previewApplication } from '@nextwebwg/htmlkit';
6
+ import { markdown } from './markdown.js';
7
+ import { category, categoryFrontMatter, configuredSidebar, generatedSidebar, isIndex } from './navigation.js';
8
+ import { themeScript } from './theme.js';
9
+ import { versionLinks } from './versions.js';
20
10
  function inside(root, path) {
21
11
  const part = relative(root, path);
22
12
  return part === '' || (!isAbsolute(part) && part !== '..' && !part.startsWith('../') && !part.startsWith('..\\'));
23
13
  }
24
- async function files(root) {
25
- const result = [];
26
- for (const entry of (await readdir(root, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
27
- if (entry.name.startsWith('.'))
28
- continue;
29
- if (entry.isSymbolicLink())
30
- throw new Error(`${join(root, entry.name)}: symbolic links are not supported in documentation content.`);
31
- if (entry.isDirectory())
32
- result.push(...await files(join(root, entry.name)));
33
- else if (entry.isFile() && entry.name.endsWith('.md'))
34
- result.push(join(root, entry.name));
35
- }
36
- return result;
37
- }
38
- function routePath(file) {
39
- const parts = file.replace(/\\/g, '/').replace(/\.md$/, '').split('/').map(part => part.replace(/^\d+-/, ''));
40
- if (parts.some(part => !/^[A-Za-z0-9_-]+$/.test(part)))
41
- throw new Error(`${file}: documentation filenames must be URL slugs with optional numeric prefixes.`);
42
- const id = parts.join('/');
43
- if (parts.at(-1) === 'index')
44
- parts.pop();
45
- return { id, pattern: '/' + (parts.length === 0 ? '' : parts.join('/') + '/') };
46
- }
47
14
  async function versions(options, root) {
48
15
  if (options.versions)
49
16
  return options.versions;
50
17
  const manifest = join(root, 'versioned_docs/versions.json');
51
- const snapshots = await exists(manifest) ? JSON.parse(await readFile(manifest, 'utf8')) : [];
18
+ const snapshots = existsSync(manifest) ? JSON.parse(await readFile(manifest, 'utf8')) : [];
52
19
  return [{ id: 'current', label: 'Current', directory: options.contentDir ?? 'docs' }, ...snapshots];
53
20
  }
54
- /** Compile author content into an owned HTMLKit application, preserving original import locations. */
55
- export async function prepareSite(options = {}) { return prepare(options, false); }
56
- async function prepare(options, live) {
57
- const root = resolve(options.root ?? process.cwd());
58
- const base = options.base ?? '/';
59
- if (!/^\/(?:[A-Za-z0-9_-]+\/)*$/.test(base))
60
- throw new Error('base requires an absolute path with a trailing slash.');
61
- const generated = join(root, '.markupress');
62
- if (await exists(generated)) {
63
- const marker = await readFile(join(generated, 'owner.json'), 'utf8').catch(() => 'null');
64
- if (JSON.parse(marker)?.product !== 'markupress')
65
- throw new Error(`${generated}: refusing to replace an unowned directory.`);
66
- }
67
- const editions = await versions(options, root);
68
- const ids = new Set();
69
- for (const version of editions) {
70
- if (!/^[A-Za-z0-9_-]+$/.test(version.id) || ids.has(version.id))
71
- throw new Error(`Duplicate or invalid documentation version: ${version.id}.`);
72
- ids.add(version.id);
73
- }
21
+ const shell = fileURLToPath(new URL('../theme/shell.html', import.meta.url));
22
+ const own = (path) => fileURLToPath(new URL(`../${path}`, import.meta.url));
23
+ // HTMLKit's css option is page-wide: Looma's :root tokens and its light/dark switch, and document defaults.
24
+ // A component's <style> is scoped to its own region, so these would never reach :root from the shell.
25
+ // theme.css also styles HTMLKit's built-in components, which no component's scoped style can reach.
26
+ const pageStyles = [...['tokens.css', 'theme-light.css', 'theme-dark.css'].map(file => fileURLToPath(import.meta.resolve(`@threadlabs/looma/${file}`))),
27
+ own('styles/base.css'), own('theme/theme.css')];
28
+ /**
29
+ * Versioned documentation as an HTMLKit plugin. Markdown pages come from the markdown plugin, and
30
+ * HTMLKit routes them: each version's directory serves /v/<id>/, and the default version's also
31
+ * serves the site root. Markupress keeps only the version catalog its switcher needs.
32
+ */
33
+ export function markupress(options = {}) {
74
34
  const defaultVersion = options.defaultVersion ?? 'current';
75
- if (!ids.has(defaultVersion))
76
- throw new Error(`Unknown defaultVersion: ${defaultVersion}.`);
77
- const documents = [];
78
- const bySource = new Map();
79
- const routes = new Map();
80
- const identities = new Map();
81
- for (const version of editions) {
82
- const content = resolve(root, version.directory);
83
- if (!inside(root, content))
84
- throw new Error(`Version ${version.id}: directory must be inside the project.`);
85
- if (!await exists(join(content, 'index.md')) && !await exists(join(content, '01-index.md'))) {
86
- const landing = (await files(content)).some(file => relative(content, file).replace(/^\d+-/, '') === 'index.md');
87
- if (!landing)
88
- throw new Error(`Version ${version.id}: a root index.md landing page is required.`);
89
- }
90
- for (const source of await files(content)) {
91
- const physical = relative(content, source).replace(/\\/g, '/');
92
- const path = routePath(physical);
93
- const text = await readFile(source, 'utf8');
94
- const info = compileMarkdown(text, { file: source, pageName: 'page-catalog' });
95
- const id = info.id ?? path.id;
96
- const identity = `${version.id}\0${id}`;
97
- const pathname = `/v/${version.id}${path.pattern}`;
98
- const pageName = 'page-doc-' + createHash('sha256').update(identity).digest('hex').slice(0, 20);
99
- const document = { id, version: version.id, source, pathname, label: info.label, pageName, physical, text, aliases: info.aliases, sidebarHidden: info.sidebarHidden };
100
- const previous = routes.get(pathname) ?? identities.get(identity);
101
- if (previous)
102
- throw new Error(`Documentation collision: ${previous.source} and ${source} (${pathname}, ${id}).`);
103
- routes.set(pathname, document);
104
- identities.set(identity, document);
105
- bySource.set(`${version.id}\0${source}`, document);
106
- documents.push(document);
107
- }
108
- }
109
- const stage = await mkdtemp(join(root, '.markupress-build-'));
110
- const sourceMap = new Map();
111
- const canonicalRoot = await realpath(root);
112
- try {
113
- const write = async (file, text) => { const destination = join(stage, file); await mkdir(dirname(destination), { recursive: true }); await writeFile(destination, text); };
114
- await write('owner.json', JSON.stringify({ product: 'markupress', version: 1 }));
115
- const assets = new Map();
116
- const extraRoutes = [];
117
- for (const doc of documents) {
118
- const resolveLink = (href, kind) => {
119
- if (/^(?:[A-Za-z][A-Za-z\d+.-]*:|#|\/\/)/.test(href) || href.startsWith(base + '_markupress/'))
120
- return href;
121
- if (href.startsWith('/') && kind === 'link')
122
- return href;
123
- const [path, suffix = ''] = href.split(/(?=[?#])/, 2);
124
- const edition = editions.find(version => version.id === doc.version);
125
- const original = path.startsWith('/') ? resolve(root, edition.publicDir ?? 'public', '.' + decodeURIComponent(path)) : resolve(dirname(doc.source), decodeURIComponent(path));
126
- if (path.endsWith('.md')) {
127
- const target = bySource.get(`${doc.version}\0${original}`) ?? documents.find(page => page.source === original);
128
- if (!target)
129
- throw new Error(`${doc.source}: missing document ${href}.`);
130
- return base + target.pathname.slice(1) + suffix;
131
- }
132
- if (kind === 'asset' || path.includes('.')) {
133
- if (!inside(root, original))
134
- throw new Error(`${doc.source}: asset ${href} escapes the project root.`);
135
- const name = createHash('sha256').update(relative(root, original)).digest('hex').slice(0, 16) + '-' + basename(original);
136
- assets.set(original, name);
137
- return base + '_markupress/assets/' + name + suffix;
138
- }
139
- return href;
140
- };
141
- const compiled = compileMarkdown(doc.text, { file: doc.source, pageName: doc.pageName, resolveLink });
142
- const component = `app/pages/v/${doc.version}/${doc.physical.replace(/\.md$/, '.html')}`;
143
- sourceMap.set(join(generated, component), doc.source);
144
- sourceMap.set(join(canonicalRoot, '.markupress', component), doc.source);
145
- await write(component, compiled.resource);
146
- if (doc.version === defaultVersion)
147
- extraRoutes.push({ pattern: doc.pathname.replace(`/v/${doc.version}`, '') || '/', component });
148
- for (const alias of doc.aliases) {
149
- if (!/^\/(?:[A-Za-z0-9_-]+\/)*$/.test(alias))
150
- throw new Error(`${doc.source}: alias must be a route path with leading and trailing slashes.`);
151
- extraRoutes.push({ pattern: `/v/${doc.version}${alias}`, component });
152
- }
153
- }
154
- for (const [source, name] of assets) {
155
- const target = join(stage, 'public/_markupress/assets', name);
156
- await mkdir(dirname(target), { recursive: true });
157
- await cp(source, target);
158
- }
159
- if (await exists(join(root, 'public')))
160
- await cp(join(root, 'public'), join(stage, 'public'), { recursive: true });
161
- const labels = Object.fromEntries(documents.map(doc => [doc.pageName, doc.label]));
162
- const canonicalAliases = Object.fromEntries(documents.flatMap(doc => doc.aliases.map(alias => [`/v/${doc.version}${alias}`, doc.pathname])));
163
- await write('app/layouts/default.html', themeResource(options.title ?? 'Documentation', base));
164
- await write('app/layouts/default.server.js', `import { versionLinks } from 'markupress';
165
- const labels = ${JSON.stringify(labels)};
166
- const aliases = ${JSON.stringify(canonicalAliases)};
167
- const visible = new Set(${JSON.stringify(documents.filter(doc => !doc.sidebarHidden).map(doc => base + doc.pathname.slice(1)))});
168
- const documents = ${JSON.stringify(documents.map(({ id, version, pathname }) => ({ id, version, pathname })))};
169
- const versions = ${JSON.stringify(editions)};
170
- export async function load({ navigation, url, base }) {
171
- const relative = '/' + url.pathname.slice(base.length);
172
- const selected = relative.match(/^\\/v\\/([^/]+)\\//)?.[1] ?? ${JSON.stringify(defaultVersion)};
173
- const requested = relative.startsWith('/v/') ? relative : '/v/' + selected + relative;
174
- const canonical = aliases[requested] ?? requested;
175
- const page = documents.find(doc => doc.pathname === canonical);
176
- return { props: {
177
- navigation: (await navigation({ from: '/v/' + selected + '/', current: base + canonical.slice(1) })).filter(item => visible.has(item.href)).map(item => ({ ...item, label: labels[item.pageName] ?? item.label })),
178
- versions: versionLinks(documents, versions, page?.id ?? 'index', selected, base)
179
- } };
180
- }`);
181
- const previous = await exists(generated);
182
- const backup = stage + '-previous';
183
- if (live && previous)
184
- await syncGenerated(stage, generated);
185
- else {
186
- if (previous)
187
- await rename(generated, backup);
188
- try {
189
- await rename(stage, generated);
190
- }
191
- catch (error) {
192
- if (previous)
193
- await rename(backup, generated);
194
- throw error;
35
+ let root = resolve(options.root ?? process.cwd());
36
+ let editions = [];
37
+ const editionOf = (file) => editions.find(edition => inside(resolve(root, edition.directory), file));
38
+ // Compiled documents by version and source file. HTMLKit recompiles every page when it rediscovers, so a
39
+ // deleted file's stale entry is filtered by existence rather than cleared.
40
+ const documents = new Map();
41
+ const current = () => [...documents.values()].filter(doc => existsSync(doc.source));
42
+ const pages = markdown({
43
+ // Each Markdown page component imports the prose styles, so they style that page's region and nothing else.
44
+ styles: [own('styles/prose.css')],
45
+ ...(options.lineNumbers === undefined ? {} : { lineNumbers: options.lineNumbers }),
46
+ publicDir: file => resolve(root, editionOf(file)?.publicDir ?? 'public'),
47
+ frontmatter(file) { const edition = editionOf(file); return edition && categoryFrontMatter(file, resolve(root, edition.directory)); },
48
+ onPage(page) {
49
+ const owners = editions.filter(edition => inside(resolve(root, edition.directory), page.file));
50
+ if (owners.length === 0 || page.href === undefined)
51
+ return;
52
+ // The page's URL is in the first version that serves its directory; others serve the same path.
53
+ const first = `/v/${owners[0].id}/`;
54
+ const path = page.href.slice(page.href.indexOf(first) + first.length);
55
+ const id = page.id ?? (path.slice(0, -1) || 'index');
56
+ for (const edition of owners) {
57
+ const twin = current().find(doc => doc.source !== page.file && doc.version === edition.id && doc.id === id);
58
+ if (twin)
59
+ throw new Error(`Documentation identity collision: ${twin.source} and ${page.file} (${id}).`);
60
+ documents.set(`${edition.id}\0${page.file}`, { id, version: edition.id, source: page.file, pathname: `/v/${edition.id}/${path}`,
61
+ aliases: page.aliases.map(alias => `/v/${edition.id}${alias}`), outline: page.outline,
62
+ page: { ...page.frontmatter, id, title: page.title, label: page.label } });
195
63
  }
196
- if (previous)
197
- await rm(backup, { recursive: true, force: true });
198
- }
199
- return { documents, sourceMap, sourceFiles: [...assets.keys()], application: { root: generated, base, outDir: resolve(root, options.outDir ?? 'site'), fileRoutes: true, routeOrdering: true, routes: extraRoutes } };
64
+ },
65
+ });
66
+ let layoutFile = shell;
67
+ async function load({ navigation, navigationTree, breadcrumbs, pager, url, base, propNames }) {
68
+ const path = '/' + url.pathname.slice(base.length);
69
+ const selected = /^\/v\/([^/]+)\//.exec(path)?.[1] ?? defaultVersion;
70
+ const requested = path.startsWith('/v/') ? path : `/v/${selected}${path}`;
71
+ const catalog = current();
72
+ const page = catalog.find(doc => doc.pathname === requested || doc.aliases.includes(requested));
73
+ // The default version also serves the root; its entries are marked current under /v/<id>/.
74
+ const within = { from: `/v/${selected}/`, current: base + (page?.pathname ?? requested).slice(1) };
75
+ const items = await navigation(within);
76
+ const data = { title: options.title ?? 'Documentation', home: base, navigation: items,
77
+ ...await chrome(items, navigationTree, catalog.filter(doc => doc.version === selected), selected, within.current, base),
78
+ versions: versionLinks(catalog, editions, page?.id ?? 'index', selected, base),
79
+ crumbs: await breadcrumbs(within), ...await pager(within), outline: page?.outline ?? [], page: page?.page ?? {} };
80
+ // HTMLKit rejects props a layout does not declare, so a layout receives the data its contract names, and
81
+ // nested folder layouts' loaders read all of it from parent.markupress.
82
+ return { props: Object.fromEntries(propNames.filter(name => name in data).map(name => [name, data[name]])), data: { markupress: data } };
200
83
  }
201
- finally {
202
- await rm(stage, { recursive: true, force: true });
84
+ /** The shell around the page: top navigation, logo, badge, the section's sidebar and the footer. */
85
+ async function chrome(items, navigationTree, pages, selected, current, base) {
86
+ const home = `${base}v/${selected}/`;
87
+ const href = (to) => /^(?:[A-Za-z][\w+.-]*:|\/\/|#)/.test(to) || !to.startsWith('/') ? to : home + to.slice(1);
88
+ const file = (path) => path.startsWith('/') ? base + path.slice(1) : path;
89
+ // A link is the page itself, or an ancestor section of it (aria-current="true").
90
+ const link = ({ label, href: to }) => {
91
+ const target = href(to), path = target.split('#')[0];
92
+ return { label, href: target, current: target === current ? 'page' : path !== home && path.endsWith('/') && current.startsWith(path) ? 'true' : 'false' };
93
+ };
94
+ // The section is the longest configured sidebar path holding the page, else its top-level folder, else the root.
95
+ const path = '/' + current.slice(home.length);
96
+ const top = /^\/([^/]+)\//.exec(path)?.[1];
97
+ const section = Object.keys(options.sidebar ?? {}).filter(key => key !== '/' && path.startsWith(key)).sort((a, b) => b.length - a.length)[0]
98
+ ?? (top !== undefined && items.some(item => item.href.startsWith(`${home}${top}/`) && item.href !== `${home}${top}/`) ? `/${top}/` : '/');
99
+ const explicit = options.sidebar?.[section];
100
+ // A _category's collapsed state is read on each render, so editing it applies in development.
101
+ const sources = new Map(pages.map(doc => [base + doc.pathname.slice(1), doc.source]));
102
+ const collapsed = (page) => { const source = sources.get(page); return source !== undefined && isIndex(source) && category(dirname(source)).collapsed === true; };
103
+ const logo = typeof options.logo === 'string' ? { light: options.logo, dark: options.logo } : options.logo;
104
+ const versions = editions.length > 1 ? editions.find(edition => edition.id === selected) : undefined;
105
+ return {
106
+ sidebar: explicit ? configuredSidebar(explicit, items, href, current)
107
+ : generatedSidebar(await navigationTree({ from: `/v/${selected}${section}`, current }), collapsed),
108
+ nav: (options.nav ?? []).map(item => {
109
+ if (!('items' in item))
110
+ return { ...link(item), items: [] };
111
+ const links = item.items.map(link);
112
+ return { label: item.label, href: '', current: links.some(entry => entry.current !== 'false') ? 'true' : 'false', items: links };
113
+ }),
114
+ logo: logo === undefined ? null : { light: file(logo.light), dark: file(logo.dark ?? logo.light) },
115
+ favicon: options.favicon === undefined ? null : file(options.favicon),
116
+ social: (options.social ?? []).map(entry => ({ label: entry.label, href: href(entry.href), icon: entry.icon === undefined ? '' : file(entry.icon) })),
117
+ badge: options.versionBadge ?? (versions ? versions.label ?? versions.id : ''),
118
+ footer: { columns: (options.footer?.columns ?? []).map(column => ({ title: column.title, items: column.items.map(link) })), copyright: options.footer?.copyright ?? '' },
119
+ };
203
120
  }
204
- }
205
- // Keep watched directory identities in development; replace only changed generated files.
206
- async function syncGenerated(source, target) {
207
- await mkdir(target, { recursive: true });
208
- const entries = await readdir(source, { withFileTypes: true });
209
- const names = new Set(entries.map(entry => entry.name));
210
- for (const name of await readdir(target))
211
- if (!names.has(name))
212
- await rm(join(target, name), { recursive: true, force: true });
213
- for (const entry of entries) {
214
- const from = join(source, entry.name), to = join(target, entry.name);
215
- if (entry.isDirectory())
216
- await syncGenerated(from, to);
217
- else if (!await exists(to) || !(await readFile(from)).equals(await readFile(to)))
218
- await cp(from, to);
219
- }
220
- }
221
- export async function buildSite(options = {}) {
222
- const prepared = await prepare(options, false);
223
- try {
224
- return await buildApplication(prepared.application);
225
- }
226
- catch (error) {
227
- let message = error instanceof Error ? error.message : String(error);
228
- for (const [compiled, authored] of prepared.sourceMap) {
229
- message = message.replaceAll(pathToFileURL(compiled).href, authored).replaceAll(compiled, authored);
230
- }
231
- throw new Error(message, { cause: error });
232
- }
233
- }
234
- export async function previewSite(options = {}) {
235
- return previewApplication({ root: resolve(options.root ?? process.cwd(), '.markupress'), outDir: resolve(options.root ?? process.cwd(), options.outDir ?? 'site'), ...(options.host === undefined ? {} : { host: options.host }), ...(options.port === undefined ? {} : { port: options.port }) });
236
- }
237
- export async function devSite(options = {}) {
238
- const prepared = await prepareSite(options);
239
- const liveRoutes = [...(prepared.application.routes ?? [])];
240
- const server = await devApplication({ ...prepared.application, routes: liveRoutes, ...(options.host === undefined ? {} : { host: options.host }), ...(options.port === undefined ? {} : { port: options.port }) });
241
- const root = resolve(options.root ?? process.cwd());
242
- let timer;
243
- let pending = Promise.resolve();
244
- let closed = false;
245
- const rebuild = () => {
246
- if (closed)
247
- return;
248
- if (timer)
249
- clearTimeout(timer);
250
- timer = setTimeout(() => {
251
- pending = pending.then(async () => {
252
- if (closed)
253
- return;
254
- const updated = await prepare(options, true);
255
- liveRoutes.splice(0, liveRoutes.length, ...(updated.application.routes ?? []));
256
- }).catch(error => { console.error(String(error)); });
257
- }, 75);
258
- };
259
- const watchers = [];
260
- try {
261
- for (const version of await versions(options, root))
262
- watchers.push(watch(resolve(root, version.directory), { recursive: true }, (_event, file) => { if (file?.endsWith('.md'))
263
- rebuild(); }));
264
- }
265
- catch (error) {
266
- watchers.forEach(watcher => watcher.close());
267
- await server.close();
268
- throw error;
269
- }
270
- return { url: server.url, async close() {
271
- closed = true;
272
- if (timer)
273
- clearTimeout(timer);
274
- watchers.forEach(watcher => watcher.close());
275
- await pending;
276
- await server.close();
121
+ return { ...pages, name: 'markupress', async config(htmlkit) {
122
+ root = resolve(htmlkit.root ?? root);
123
+ editions = await versions(options, root);
124
+ const ids = new Set();
125
+ for (const edition of editions) {
126
+ if (!/^[A-Za-z0-9_-]+$/.test(edition.id) || ids.has(edition.id))
127
+ throw new Error(`Duplicate or invalid documentation version: ${edition.id}.`);
128
+ ids.add(edition.id);
129
+ const content = resolve(root, edition.directory);
130
+ if (!inside(root, content))
131
+ throw new Error(`Version ${edition.id}: directory must be inside the project.`);
132
+ if (!(await readdir(content)).some(name => /^(?:\d+\.)?index\.md$/.test(name)))
133
+ throw new Error(`Version ${edition.id}: a root index.md landing page is required.`);
134
+ }
135
+ const home = editions.find(edition => edition.id === defaultVersion);
136
+ if (home === undefined)
137
+ throw new Error(`Unknown defaultVersion: ${defaultVersion}.`);
138
+ for (const key of Object.keys(options.sidebar ?? {}))
139
+ if (!/^\/(?:[^/]+\/)*$/.test(key))
140
+ throw new Error(`sidebar: ${key} must be a path such as / or /guide/.`);
141
+ // The shell is the layout of Markupress's own folders only, so a site's other pages keep theirs.
142
+ if (options.layout !== undefined)
143
+ layoutFile = resolve(root, options.layout);
144
+ const layout = { component: layoutFile, server: { load } };
145
+ return { headScript: themeScript, css: pageStyles,
146
+ pages: [...editions.map(edition => ({ dir: edition.directory, prefix: `/v/${edition.id}/`, layout })), { dir: home.directory, layout }] };
277
147
  } };
278
148
  }
149
+ /**
150
+ * HTMLKit options for a Markupress site, as the CLI runs it: the site's own HTMLKit options (its `htmlkit.config.ts`)
151
+ * with `markupress()` added after their plugins. Markupress's own `base` and `outDir`, when set, win over HTMLKit's.
152
+ */
153
+ export function siteOptions(options = {}, htmlkit = {}) {
154
+ const root = resolve(options.root ?? htmlkit.root ?? process.cwd());
155
+ // markupress() already holds the markdown() plugin's pages; a second copy of either would compile .md twice.
156
+ const listed = htmlkit.plugins?.find(plugin => plugin.name === 'markupress' || plugin.name === 'markdown');
157
+ if (listed)
158
+ throw new Error(`htmlkit.config: the markupress command adds markupress(), which includes markdown(); remove ${listed.name}() from its plugins.`);
159
+ return { ...htmlkit, root, base: options.base ?? htmlkit.base ?? '/', outDir: resolve(root, options.outDir ?? htmlkit.outDir ?? 'site'),
160
+ plugins: [...htmlkit.plugins ?? [], markupress({ ...options, root })],
161
+ ...(options.host === undefined ? {} : { host: options.host }), ...(options.port === undefined ? {} : { port: options.port }) };
162
+ }
163
+ // Each loads the site's htmlkit.config.ts or .js, as the htmlkit command would, so its plugins compose with Markupress.
164
+ const withConfig = async (options) => siteOptions(options, await loadConfig(resolve(options.root ?? process.cwd())));
165
+ export async function buildSite(options = {}) { return buildApplication(await withConfig(options)); }
166
+ export async function previewSite(options = {}) { return previewApplication(await withConfig(options)); }
167
+ /** HTMLKit's watcher recompiles Markdown and reloads open pages after each edit. */
168
+ export async function devSite(options = {}) { return devApplication(await withConfig(options)); }
279
169
  //# sourceMappingURL=site.js.map
package/dist/site.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"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"}
package/dist/theme.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export declare function themeResource(title: string, base: string): string;
1
+ /** The Markupress plugin sets this as HTMLKit's headScript, which runs before first paint, so a saved theme never shows the default first. */
2
+ export declare const themeScript = "{ let saved = null; try { saved = localStorage.getItem('markupress:theme'); } catch { /* Storage can be disabled. */ }\ndocument.documentElement.dataset.theme = saved === 'dark' || (saved === null && matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; }\n";
2
3
  //# sourceMappingURL=theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAgCjE"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,8IAA8I;AAC9I,eAAO,MAAM,WAAW,wRAEvB,CAAC"}
package/dist/theme.js CHANGED
@@ -1,35 +1,5 @@
1
- import { escapeHTML, literal } from './content.js';
2
- export function themeResource(title, base) {
3
- const controller = 'markupress/controllers/shell.js';
4
- title = literal(escapeHTML(title));
5
- return `<link rel="component" href="@nextwebwg/htmlkit/components/navigation.html">
6
- <link rel="component" href="@threadlabs/looma/components/ui-button/ui-button.html">
7
- <template component="markupress-shell" controller="${controller}">
8
- <title>${title}</title><defs>
9
- <prop name="navigation" type="list(object({ href: string, label: string, current: string, depth: number, pageName: string }))" required>Documentation links</prop>
10
- <prop name="versions" type="list(object({ href: string, label: string, current: string, note: string }))" required>Documentation versions</prop>
11
- <state name="menu" type="boolean" value="true"></state>
12
- <state name="dark" type="boolean" value="false"></state></defs>
13
- <div class="site"><a class="skip" href="#documentation-content">Skip to content</a>
14
- <header><a class="brand" href="${base}">${title}</a><div class="actions">
15
- <ui-button variant="ghost" tone="neutral" data-action="menu" from:aria-expanded="$menu" aria-controls="documentation-navigation">Navigation</ui-button>
16
- <ui-button variant="ghost" tone="neutral" data-action="theme" from:aria-pressed="$dark">Dark theme</ui-button></div></header>
17
- <div class="columns"><aside id="documentation-navigation" $if="$menu">
18
- <htmlkit-navigation from:items="$navigation" label="Documentation"></htmlkit-navigation>
19
- <nav class="versions" aria-label="Documentation versions"><strong>Versions</strong><ul><li $each="version of $versions"><a from:href="$version.href" from:aria-current="$version.current" $value="$version.label"></a><small $if="$version.note" $value="$version.note"></small></li></ul></nav>
20
- </aside><main id="documentation-content" tabindex="-1"><slot name="page"></slot></main></div></div>
21
- <style>
22
- @import "@threadlabs/looma/tokens.css";
23
- @import "@threadlabs/looma/theme-light.css";
24
- @import "@threadlabs/looma/theme-dark.css";
25
- @import "markupress/styles/base.css";
26
- :host { display: block; background: var(--ui-surface); color: var(--ui-text); font: 1rem/1.7 system-ui, sans-serif; min-height: 100vh; }
27
- header { display: flex; align-items: center; justify-content: space-between; gap: 1rem; border-bottom: 1px solid var(--ui-border, #8885); padding: 1rem max(1rem, calc((100vw - 80rem) / 2)); }
28
- .brand { color: inherit; font-size: 1.15rem; font-weight: 700; text-decoration: none; } .actions { display: flex; flex-wrap: wrap; gap: .5rem; }
29
- .columns { display: flex; gap: 3rem; max-width: 80rem; margin: auto; padding: 2rem 1.5rem; } aside { flex: 0 0 15rem; } main { min-width: 0; flex: 1; max-width: 65ch; } .versions { margin-top: 2rem; } nav ul { padding: 0; list-style: none; } nav li { margin: .4rem 0; } nav [data-depth="2"] { padding-left: .75rem; } nav [data-depth="3"] { padding-left: 1.5rem; }
30
- a { color: var(--ui-accent); text-underline-offset: .2em; } a[aria-current="page"] { font-weight: 700; } small { display: block; color: var(--ui-text-muted, inherit); line-height: 1.4; } :focus-visible { outline: 2px solid var(--ui-accent); outline-offset: 3px; }
31
- .skip { position: absolute; top: .5rem; left: 1rem; transform: translateY(-200%); padding: .5rem 1rem; background: var(--ui-surface); z-index: 1; } .skip:focus { transform: none; }
32
- @media (max-width: 640px) { header { align-items: flex-start; flex-direction: column; } .columns { display: block; padding: 1rem; } aside { margin-bottom: 2rem; } }
33
- </style></template>`;
34
- }
1
+ /** The Markupress plugin sets this as HTMLKit's headScript, which runs before first paint, so a saved theme never shows the default first. */
2
+ export const themeScript = `{ let saved = null; try { saved = localStorage.getItem('markupress:theme'); } catch { /* Storage can be disabled. */ }
3
+ document.documentElement.dataset.theme = saved === 'dark' || (saved === null && matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; }
4
+ `;
35
5
  //# sourceMappingURL=theme.js.map
package/dist/theme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY;IACvD,MAAM,UAAU,GAAG,iCAAiC,CAAC;IACrD,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,OAAO;;qDAE4C,UAAU;SACtD,KAAK;;;;;;iCAMmB,IAAI,KAAK,KAAK;;;;;;;;;;;;;;;;;;;oBAmB3B,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,8IAA8I;AAC9I,MAAM,CAAC,MAAM,WAAW,GAAG;;CAE1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../src/versions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG3F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AACD,kGAAkG;AAClG,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,QAAQ,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CAO1Q;AAED,iHAAiH;AACjH,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAuEhH"}
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../src/versions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG3F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AACD,kGAAkG;AAClG,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,QAAQ,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CAO1Q;AAED,iHAAiH;AACjH,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0EhH"}