markupress 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +131 -2
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +48 -0
- package/dist/cli.js.map +1 -0
- package/dist/content.d.ts +18 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +129 -0
- package/dist/content.js.map +1 -0
- package/dist/controllers/shell.d.ts +4 -0
- package/dist/controllers/shell.d.ts.map +1 -0
- package/dist/controllers/shell.js +46 -0
- package/dist/controllers/shell.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/site.d.ts +38 -0
- package/dist/site.d.ts.map +1 -0
- package/dist/site.js +279 -0
- package/dist/site.js.map +1 -0
- package/dist/styles.d.ts +6 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +49 -0
- package/dist/styles.js.map +1 -0
- package/dist/theme.d.ts +2 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +35 -0
- package/dist/theme.js.map +1 -0
- package/dist/versions.d.ts +19 -0
- package/dist/versions.d.ts.map +1 -0
- package/dist/versions.js +125 -0
- package/dist/versions.js.map +1 -0
- package/package.json +61 -6
- package/styles/base.css +24 -0
package/dist/site.js
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
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
|
+
}
|
|
20
|
+
function inside(root, path) {
|
|
21
|
+
const part = relative(root, path);
|
|
22
|
+
return part === '' || (!isAbsolute(part) && part !== '..' && !part.startsWith('../') && !part.startsWith('..\\'));
|
|
23
|
+
}
|
|
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
|
+
async function versions(options, root) {
|
|
48
|
+
if (options.versions)
|
|
49
|
+
return options.versions;
|
|
50
|
+
const manifest = join(root, 'versioned_docs/versions.json');
|
|
51
|
+
const snapshots = await exists(manifest) ? JSON.parse(await readFile(manifest, 'utf8')) : [];
|
|
52
|
+
return [{ id: 'current', label: 'Current', directory: options.contentDir ?? 'docs' }, ...snapshots];
|
|
53
|
+
}
|
|
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
|
+
}
|
|
74
|
+
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;
|
|
195
|
+
}
|
|
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 } };
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
await rm(stage, { recursive: true, force: true });
|
|
203
|
+
}
|
|
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();
|
|
277
|
+
} };
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=site.js.map
|
package/dist/site.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"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"}
|
package/dist/styles.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAMA,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CA+BjH"}
|
package/dist/styles.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { pathToFileURL, fileURLToPath } from 'node:url';
|
|
4
|
+
import postcss from 'postcss';
|
|
5
|
+
import valueParser from 'postcss-value-parser';
|
|
6
|
+
/** CSS syntax is parsed by PostCSS; HTMLKit/Vite still compile and deliver the styles. */
|
|
7
|
+
export function stylesheet(css, file, rewrite) {
|
|
8
|
+
const root = postcss.parse(css, { from: file });
|
|
9
|
+
const dependencies = new Set();
|
|
10
|
+
const local = (value, imported = false) => {
|
|
11
|
+
if (/^(?:[A-Za-z][A-Za-z\d+.-]*:|\/|#)/.test(value) && !value.startsWith('file:'))
|
|
12
|
+
return value;
|
|
13
|
+
const clean = value.split(/[?#]/)[0];
|
|
14
|
+
let target;
|
|
15
|
+
if (value.startsWith('file:'))
|
|
16
|
+
target = fileURLToPath(value);
|
|
17
|
+
else if (imported && !value.startsWith('.')) {
|
|
18
|
+
try {
|
|
19
|
+
target = createRequire(pathToFileURL(file)).resolve(clean);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
target = resolve(dirname(file), clean);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else
|
|
26
|
+
target = resolve(dirname(file), clean);
|
|
27
|
+
dependencies.add(target);
|
|
28
|
+
return rewrite ? pathToFileURL(target).href + value.slice(clean.length) : value;
|
|
29
|
+
};
|
|
30
|
+
const transform = (value, imported) => {
|
|
31
|
+
const parsed = valueParser(value);
|
|
32
|
+
if (imported && parsed.nodes[0]?.type === 'string')
|
|
33
|
+
parsed.nodes[0].value = local(parsed.nodes[0].value, true);
|
|
34
|
+
parsed.walk(node => {
|
|
35
|
+
if (node.type === 'function' && node.value.toLowerCase() === 'url') {
|
|
36
|
+
const first = node.nodes[0];
|
|
37
|
+
if (first && (first.type === 'string' || first.type === 'word'))
|
|
38
|
+
first.value = local(first.value, imported);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
});
|
|
43
|
+
return parsed.toString();
|
|
44
|
+
};
|
|
45
|
+
root.walkAtRules('import', rule => { rule.params = transform(rule.params, true); });
|
|
46
|
+
root.walkDecls(declaration => { declaration.value = transform(declaration.value, false); });
|
|
47
|
+
return { css: root.toString(), files: [...dependencies] };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAE/C,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,IAAY,EAAE,OAAgB;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,QAAQ,GAAG,KAAK,EAAU,EAAE;QACxD,IAAI,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAChG,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC;QACtC,IAAI,MAAc,CAAC;QACnB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;aACxD,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC;gBAAC,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YACnE,MAAM,CAAC;gBAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;YAAC,CAAC;QACnD,CAAC;;YAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9C,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAClF,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,QAAiB,EAAU,EAAE;QAC7D,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/G,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjB,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gBACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;oBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC5G,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC;IACF,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;AAC5D,CAAC"}
|
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +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"}
|
package/dist/theme.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
}
|
|
35
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type DocumentationVersion, type MarkupressOptions } from './site.js';
|
|
2
|
+
export interface VersionLink {
|
|
3
|
+
readonly href: string;
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly current: 'page' | 'false';
|
|
6
|
+
readonly note: string;
|
|
7
|
+
}
|
|
8
|
+
/** URLs are projected from logical identity; renaming a route never changes the switch target. */
|
|
9
|
+
export declare function versionLinks(documents: readonly {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly version: string;
|
|
12
|
+
readonly pathname: string;
|
|
13
|
+
}[], versions: readonly {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly label?: string;
|
|
16
|
+
}[], id: string, selected: string, base: string): readonly VersionLink[];
|
|
17
|
+
/** Snapshot author content without overwriting an existing edition. The manifest preserves explicit ordering. */
|
|
18
|
+
export declare function snapshotVersion(id: string, options?: MarkupressOptions): Promise<DocumentationVersion>;
|
|
19
|
+
//# sourceMappingURL=versions.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/versions.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { cp, mkdir, readFile, realpath, rename, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve, join, relative, isAbsolute, dirname } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { buildApplication, createApplication } from '@nextwebwg/htmlkit';
|
|
5
|
+
import { prepareSite } from './site.js';
|
|
6
|
+
import { stylesheet } from './styles.js';
|
|
7
|
+
/** URLs are projected from logical identity; renaming a route never changes the switch target. */
|
|
8
|
+
export function versionLinks(documents, versions, id, selected, base) {
|
|
9
|
+
return versions.map(version => {
|
|
10
|
+
const target = documents.find(doc => doc.id === id && doc.version === version.id);
|
|
11
|
+
return { href: base + (target?.pathname ?? `/v/${version.id}/`).slice(1), label: version.label ?? version.id,
|
|
12
|
+
current: selected === version.id ? 'page' : 'false',
|
|
13
|
+
note: target ? '' : `This document is unavailable in ${version.label ?? version.id}; open its documentation home.` };
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/** Snapshot author content without overwriting an existing edition. The manifest preserves explicit ordering. */
|
|
17
|
+
export async function snapshotVersion(id, options = {}) {
|
|
18
|
+
if (!/^[A-Za-z0-9_-]+$/.test(id) || id === 'current')
|
|
19
|
+
throw new Error('Snapshot id must be a URL slug other than current.');
|
|
20
|
+
const root = resolve(options.root ?? process.cwd());
|
|
21
|
+
const canonicalRoot = await realpath(root);
|
|
22
|
+
const source = resolve(root, options.contentDir ?? 'docs');
|
|
23
|
+
const relation = relative(root, source);
|
|
24
|
+
if (isAbsolute(relation) || relation.startsWith('..'))
|
|
25
|
+
throw new Error('Snapshot contentDir must be inside the project.');
|
|
26
|
+
const snapshots = join(root, 'versioned_docs');
|
|
27
|
+
await mkdir(snapshots, { recursive: true });
|
|
28
|
+
const lock = join(snapshots, '.snapshot-lock');
|
|
29
|
+
try {
|
|
30
|
+
await mkdir(lock);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error.code === 'EEXIST')
|
|
34
|
+
throw new Error('Another snapshot owns versioned_docs/.snapshot-lock; finish or recover that operation first.');
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
const destination = join(snapshots, id);
|
|
38
|
+
let owned = false;
|
|
39
|
+
try {
|
|
40
|
+
const manifest = join(snapshots, 'versions.json');
|
|
41
|
+
let versions = [];
|
|
42
|
+
try {
|
|
43
|
+
versions = JSON.parse(await readFile(manifest, 'utf8'));
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (error.code !== 'ENOENT')
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
if (versions.some(version => version.id === id))
|
|
50
|
+
throw new Error(`Documentation version ${id} already exists.`);
|
|
51
|
+
try {
|
|
52
|
+
await mkdir(destination);
|
|
53
|
+
owned = true;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error.code === 'EEXIST')
|
|
57
|
+
throw new Error(`Documentation version ${id} already exists.`);
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
// Let HTMLKit/Vite identify the authored HTML, module, stylesheet and asset closure.
|
|
61
|
+
// Mirroring project-relative paths keeps imports valid without rewriting source code.
|
|
62
|
+
const prepared = await prepareSite({ ...options, versions: [{ id: 'current', directory: relation }], defaultVersion: 'current' });
|
|
63
|
+
const validation = join(destination, '.validation');
|
|
64
|
+
const built = await buildApplication({ ...prepared.application, outDir: validation });
|
|
65
|
+
const inputs = new Set([...built.browserInputs, ...prepared.sourceFiles]);
|
|
66
|
+
const application = await createApplication(prepared.application);
|
|
67
|
+
try {
|
|
68
|
+
for (const pathname of await application.entries()) {
|
|
69
|
+
for (const component of (await application.render(pathname)).components) {
|
|
70
|
+
const file = component.definition.source.file;
|
|
71
|
+
if (file)
|
|
72
|
+
inputs.add(file.startsWith('file:') ? fileURLToPath(file) : file);
|
|
73
|
+
for (const dependency of stylesheet(component.definition.css, fileURLToPath(file), false).files)
|
|
74
|
+
inputs.add(dependency);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await application.close();
|
|
80
|
+
}
|
|
81
|
+
const visited = new Set();
|
|
82
|
+
for (const input of inputs) {
|
|
83
|
+
if (!input.endsWith('.css') || input.endsWith('.htmlkit.css') || visited.has(input))
|
|
84
|
+
continue;
|
|
85
|
+
visited.add(input);
|
|
86
|
+
for (const dependency of stylesheet(await readFile(input, 'utf8'), input, false).files)
|
|
87
|
+
inputs.add(dependency);
|
|
88
|
+
}
|
|
89
|
+
const mirror = join(destination, '_source');
|
|
90
|
+
await cp(source, join(mirror, relation), { recursive: true, dereference: false });
|
|
91
|
+
for (const input of inputs) {
|
|
92
|
+
const file = input.split('?')[0];
|
|
93
|
+
if (file.endsWith('.htmlkit.css'))
|
|
94
|
+
continue; // HTMLKit's virtual inline stylesheet, not an authored file.
|
|
95
|
+
const path = relative(canonicalRoot, await realpath(file));
|
|
96
|
+
if (isAbsolute(path) || path.startsWith('..') || path.split(/[/\\]/).some(part => ['node_modules', '.markupress', 'versioned_docs'].includes(part)))
|
|
97
|
+
continue;
|
|
98
|
+
const target = join(mirror, path);
|
|
99
|
+
await mkdir(dirname(target), { recursive: true });
|
|
100
|
+
await cp(file, target);
|
|
101
|
+
}
|
|
102
|
+
let publicDir;
|
|
103
|
+
try {
|
|
104
|
+
await cp(join(root, 'public'), join(mirror, 'public'), { recursive: true, dereference: false });
|
|
105
|
+
publicDir = `versioned_docs/${id}/_source/public`;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (error.code !== 'ENOENT')
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
await rm(validation, { recursive: true, force: true });
|
|
112
|
+
const version = { id, label: id, directory: `versioned_docs/${id}/_source/${relation.replace(/\\/g, '/')}`, ...(publicDir ? { publicDir } : {}) };
|
|
113
|
+
const pending = join(snapshots, '.versions-pending.json');
|
|
114
|
+
await writeFile(pending, JSON.stringify([...versions, version], null, 2) + '\n');
|
|
115
|
+
await rename(pending, manifest);
|
|
116
|
+
owned = false;
|
|
117
|
+
return version;
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
if (owned)
|
|
121
|
+
await rm(destination, { recursive: true, force: true });
|
|
122
|
+
await rm(lock, { recursive: true, force: true });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../src/versions.ts"],"names":[],"mappings":"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"}
|