typerighter 0.44.0 → 0.44.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.
Files changed (32) hide show
  1. package/dist/{app-Cs3OppHS.js → app-D0bX_TJ8.js} +334 -334
  2. package/dist/builtin-components.json +95 -0
  3. package/dist/{cli-BcvGlMzh.js → cli-DBv4APAX.js} +5 -5
  4. package/dist/cli.js +1 -1
  5. package/dist/client/theme-default.js +814 -788
  6. package/dist/client.js +1 -1
  7. package/dist/index.js +2 -2
  8. package/dist/{init-DCe3DWKz.js → init-DKr1vEJD.js} +204 -190
  9. package/dist/{jsonld-DZsAYYxx.js → jsonld-CRHOaFMj.js} +15 -15
  10. package/dist/node/build/builtin-contract.d.ts +3 -0
  11. package/dist/node/build/builtin-contract.d.ts.map +1 -0
  12. package/dist/node/cli/init.d.ts.map +1 -1
  13. package/dist/node/lib/components.d.ts +9 -7
  14. package/dist/node/lib/components.d.ts.map +1 -1
  15. package/dist/node/lib/prop-schema.d.ts +17 -0
  16. package/dist/node/lib/prop-schema.d.ts.map +1 -0
  17. package/dist/node/plugin/vite/subplugins/component-contract.d.ts.map +1 -1
  18. package/dist/prerenderWorker.js +2 -2
  19. package/dist/{renderMath-BAZXLnOu.js → renderMath-C59kPnxc.js} +1 -1
  20. package/dist/rolldown-runtime-B0aSnxlc.js +20 -0
  21. package/dist/shared/types/json-schema.d.ts +12 -3
  22. package/dist/shared/types/json-schema.d.ts.map +1 -1
  23. package/dist/shared/utils/format.d.ts +1 -0
  24. package/dist/shared/utils/format.d.ts.map +1 -1
  25. package/dist/{shared-kjMIXu1H.js → shared-C5ERr4vS.js} +66 -56
  26. package/dist/shared.js +1 -1
  27. package/dist/typerighter.css +1 -1
  28. package/dist/vite-KKwvSM8g.js +1718 -0
  29. package/dist/vite.js +1 -1
  30. package/package.json +3 -3
  31. package/dist/rolldown-runtime-CEFd7nDs.js +0 -30
  32. package/dist/vite-DrX11EH5.js +0 -127331
@@ -0,0 +1,1718 @@
1
+ import { D as e, E as t, F as n, H as r, K as i, L as a, P as o, Q as s, R as c, V as l, Y as u, Z as d, _ as f, b as p, c as m, d as h, et as g, g as _, h as v, i as y, p as b, tt as x, v as S, w as C, y as w, z as T } from "./shared-C5ERr4vS.js";
2
+ import { a as E, i as D, n as O, o as ee, r as te, s as ne, t as re } from "./jsonld-CRHOaFMj.js";
3
+ import { t as ie } from "./temml-D47Z4xZ2.js";
4
+ import { a as ae, i as oe, n as se, r as ce } from "./context-CSvoDxVt.js";
5
+ import { t as le } from "./es-ClqUVRJn.js";
6
+ import k, { resolve as A } from "node:path";
7
+ import j from "picocolors";
8
+ import ue from "@tailwindcss/vite";
9
+ import de from "@vitejs/plugin-vue";
10
+ import { build as fe, normalizePath as M } from "vite";
11
+ import N, { readdir as pe } from "node:fs/promises";
12
+ import { fileURLToPath as me } from "node:url";
13
+ import he from "node:os";
14
+ import { Worker as ge } from "node:worker_threads";
15
+ import P, { createReadStream as _e, existsSync as ve, globSync as ye, readFileSync as be, statSync as xe } from "node:fs";
16
+ import { createRequire as Se } from "node:module";
17
+ import { createChecker as Ce, createCheckerByJson as we } from "vue-component-meta";
18
+ import { createHighlighter as Te, guessEmbeddedLanguages as Ee, isSpecialLang as De } from "shiki";
19
+ //#region src/node/lib/worker-pool/index.ts
20
+ var Oe = class {
21
+ workers = [];
22
+ queue = [];
23
+ destroyed = !1;
24
+ startupError;
25
+ constructor(e) {
26
+ let t = e.concurrency ?? Math.max(1, Math.floor(he.cpus().length / 2));
27
+ for (let n = 0; n < t; n++) {
28
+ let t = new ge(e.filename, { workerData: e.workerData }), n = { worker: t };
29
+ this.workers.push(n), t.on("message", (e) => {
30
+ let t = n.pending;
31
+ n.pending = void 0, e.error === void 0 ? t?.resolve(e.result) : t?.reject(Error(e.error)), this.dispatch(n);
32
+ }), t.on("error", (e) => {
33
+ let t = n.pending;
34
+ n.pending = void 0, t?.reject(e), this.destroyAll(e);
35
+ });
36
+ }
37
+ }
38
+ run(e) {
39
+ return this.destroyed ? Promise.reject(this.startupError ?? /* @__PURE__ */ Error("Worker pool is destroyed")) : new Promise((t, n) => {
40
+ let r = {
41
+ task: e,
42
+ resolve: t,
43
+ reject: n
44
+ }, i = this.workers.find((e) => e.pending === void 0);
45
+ i ? (i.pending = r, i.worker.postMessage(r.task)) : this.queue.push(r);
46
+ });
47
+ }
48
+ async destroy() {
49
+ this.destroyed = !0, this.rejectAll(/* @__PURE__ */ Error("Worker pool is destroyed")), await Promise.all(this.workers.map((e) => e.worker.terminate()));
50
+ }
51
+ dispatch(e) {
52
+ let t = this.queue.shift();
53
+ t !== void 0 && (e.pending = t, e.worker.postMessage(t.task));
54
+ }
55
+ rejectAll(e) {
56
+ for (let t of this.queue) t.reject(e);
57
+ this.queue.length = 0;
58
+ for (let t of this.workers) t.pending &&= (t.pending.reject(e), void 0);
59
+ }
60
+ destroyAll(e) {
61
+ this.destroyed || (this.startupError = e instanceof Error ? e : Error(String(e)), this.destroyed = !0, this.rejectAll(e), Promise.all(this.workers.map((e) => e.worker.terminate())).catch(() => {}));
62
+ }
63
+ };
64
+ //#endregion
65
+ //#region src/node/build/seo/sitemap.ts
66
+ function ke(e, t, n, r) {
67
+ let i = n ?? "";
68
+ return `<?xml version="1.0" encoding="UTF-8"?>
69
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
70
+ ${e.map((e) => {
71
+ let n = m(i + t + o(e)), a = r?.get(e);
72
+ return ` <url><loc>${n}</loc>${a === void 0 ? "" : `<lastmod>${y(a)}</lastmod>`}</url>`;
73
+ }).join("\n")}
74
+ </urlset>
75
+ `;
76
+ }
77
+ function Ae(e, t) {
78
+ return `User-agent: *
79
+ Allow: /
80
+
81
+ Sitemap: ${e}${t}sitemap.xml
82
+ `;
83
+ }
84
+ //#endregion
85
+ //#region src/node/build/seo/feed.ts
86
+ function je(e, t, n, r, i, a) {
87
+ let o = [...e].filter((e) => e.fileMetadata.mtime > 0).sort((e, t) => t.fileMetadata.mtime - e.fileMetadata.mtime).slice(0, 50).map((e) => {
88
+ let r = l(e.filepath), i = `${n}${t}${r}`, a = new Date(e.fileMetadata.mtime).toUTCString(), o = m(e.label ?? r), s = e.excerpt === void 0 ? "" : `<![CDATA[${e.excerpt}]]>`;
89
+ return ` <item>
90
+ <title>${o}</title>
91
+ <link>${m(i)}</link>
92
+ <guid>${m(i)}</guid>
93
+ <pubDate>${a}</pubDate>
94
+ <description>${s}</description>
95
+ </item>`;
96
+ }).join("\n");
97
+ return `<?xml version="1.0" encoding="UTF-8"?>
98
+ <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
99
+ <channel>
100
+ <title>${m(r)}</title>
101
+ <link>${m(n + t)}</link>
102
+ <description>${m(i)}</description>
103
+ <language>${a}</language>
104
+ <atom:link href="${m(n + t)}feed.xml" rel="self" type="application/rss+xml"/>
105
+ ${o}
106
+ </channel>
107
+ </rss>
108
+ `;
109
+ }
110
+ //#endregion
111
+ //#region src/node/build/fonts.ts
112
+ function Me(e) {
113
+ let t = k.basename(e);
114
+ return t.endsWith(".woff2") && t.includes("-latin-") && !t.includes("-latin-ext-");
115
+ }
116
+ //#endregion
117
+ //#region src/node/build/prerender.ts
118
+ var Ne = 64;
119
+ async function Pe(e) {
120
+ let { clientEntry: t, cssFiles: n, fontFiles: r } = await Le(e.clientOutDir), i = [n.map((t) => ` <link rel="stylesheet" href="${e.base}${t}">`).join("\n"), r.map((t) => ` <link rel="preload" as="font" type="font/woff2" crossorigin href="${e.base}${t}">`).join("\n")].filter(Boolean).join("\n") || void 0;
121
+ e.pagePaths.length >= Ne ? await Fe(e, t, i) : await Ie(e, t, i);
122
+ }
123
+ async function Fe(e, t, n) {
124
+ let r = new Oe({
125
+ filename: k.resolve(me(import.meta.url), "../prerenderWorker.js"),
126
+ workerData: {
127
+ ssrEntryPath: e.ssrEntryPath,
128
+ base: e.base,
129
+ origin: e.origin,
130
+ lang: e.lang,
131
+ siteTitle: e.siteTitle,
132
+ author: e.author,
133
+ clientEntry: t,
134
+ headExtra: n
135
+ }
136
+ }), i = 0, a = e.pagePaths.length;
137
+ try {
138
+ await Promise.all(e.pagePaths.map(async (t) => {
139
+ let n = await r.run(t), o = k.join(e.outDir, n.fileName);
140
+ await N.mkdir(k.dirname(o), { recursive: !0 }), await N.writeFile(o, n.html), i++, e.progress?.update(i, a);
141
+ }));
142
+ } finally {
143
+ await r.destroy();
144
+ }
145
+ }
146
+ async function Ie(e, t, n) {
147
+ let r = await (await import(e.ssrEntryPath)).createRenderer(), i = e.pagePaths.length, a = 0;
148
+ for (let s of e.pagePaths) {
149
+ let c = await r(s), l = ee(c.pageData), u = E(c.pageData), d = te(c.pageData), f = e.base + o(s), p = [re({
150
+ title: l,
151
+ description: u,
152
+ canonicalUrl: f,
153
+ author: e.author,
154
+ dateModified: d
155
+ }), O(s, l)].filter((e) => e !== void 0), m = ne({
156
+ title: l,
157
+ description: u,
158
+ siteTitle: e.siteTitle,
159
+ author: e.author,
160
+ base: e.base,
161
+ origin: e.origin,
162
+ lang: e.lang,
163
+ entryScript: t,
164
+ canonicalUrl: f,
165
+ ogImagePath: D(c.pageData),
166
+ jsonLdBlocks: p,
167
+ headExtra: n,
168
+ appContent: c.html
169
+ }), h = s === "/" ? "index.html" : `${o(s)}.html`, g = k.join(e.outDir, h);
170
+ await N.mkdir(k.dirname(g), { recursive: !0 }), await N.writeFile(g, m), a++, e.progress?.update(a, i);
171
+ }
172
+ }
173
+ async function Le(e) {
174
+ let t = k.join(e, ".vite", "manifest.json"), n = await N.readFile(t, "utf-8"), r = JSON.parse(n), i = "", a = [], o = [];
175
+ for (let e of Object.values(r)) e.isEntry ? (i = e.file, e.css && a.push(...e.css)) : Me(e.file) && o.push(e.file);
176
+ return {
177
+ clientEntry: i,
178
+ cssFiles: a,
179
+ fontFiles: o
180
+ };
181
+ }
182
+ //#endregion
183
+ //#region src/node/lib/codegen/app-entry.ts
184
+ function Re(e, t) {
185
+ let { rootDir: n = ".", userComponents: r = [] } = e, i = r.map((e) => `import ${e.name} from ${JSON.stringify(e.absolutePath)};`).join("\n"), a = r.map((e) => `app.component(${JSON.stringify(e.name)}, ${e.name});`).join("\n"), o = JSON.stringify({
186
+ title: e.siteTitle,
187
+ description: e.siteDescription,
188
+ basePath: e.basePath ?? "/",
189
+ origin: e.origin,
190
+ lang: e.lang,
191
+ repo: e.repo,
192
+ author: e.author,
193
+ license: e.license,
194
+ rootDir: n,
195
+ nav: e.nav
196
+ });
197
+ return `
198
+ ${[i, "import 'typerighter/style.css';"].filter(Boolean).join("\n")}
199
+ import 'typerighter/fonts.css';
200
+ import('typerighter/math.css');
201
+ import { createTypedownApp } from 'typerighter/client';
202
+ import { TdDirectoryIndex, TdGlossaryIndex } from 'typerighter/client/theme-default';
203
+ import { isIndexUrl, getDirectoryFromPageUrl, getParentUrl, path } from 'typerighter/shared';
204
+ import { h } from 'vue';
205
+ import theme from '${t.theme}';
206
+ import { pages as initialPages } from '${t.pages}';
207
+ import initialSiteData from '${t.siteData}';
208
+ let pages = initialPages;
209
+ const contentExts = ${JSON.stringify(d)};
210
+
211
+ function findPage(base) {
212
+ for (const ext of contentExts) {
213
+ const key = base + ext;
214
+ if (pages[key]) return pages[key];
215
+ }
216
+ }
217
+
218
+ async function loadPageModule(pagePath) {
219
+ const loader = findPage(path.join('/', '${n}', pagePath));
220
+ if (loader) return loader();
221
+
222
+ if (isIndexUrl(pagePath)) {
223
+ const dirPath = getDirectoryFromPageUrl(pagePath);
224
+ const dir = siteData.value.directoryListings[dirPath];
225
+ if (dir) return {
226
+ default: { name: 'DirectoryIndex', render() { return h(TdDirectoryIndex); } },
227
+ pageData: { frontmatter: {}, headings: [], title: dir.title },
228
+ };
229
+ }
230
+
231
+ return undefined;
232
+ }
233
+
234
+ const { app, router, searchIndex: searchIndexRef, siteData } = await createTypedownApp(loadPageModule, theme, ${o}, initialSiteData);
235
+ ${a}
236
+ app.mount('#app');
237
+
238
+ // Load search index in the background after the app is mounted
239
+ import('${t.searchIndex}').then((m) => { searchIndexRef.value = m.default; });
240
+
241
+ // Accept HMR so modules update without a full page reload
242
+ if (import.meta.hot) {
243
+ import.meta.hot.accept('${t.pages}', (m) => {
244
+ if (!m) return;
245
+ const base = path.join('/', '${n}', router.route.path);
246
+ const hadPage = !!findPage(base);
247
+ pages = m.pages;
248
+ const hasPage = !!findPage(base);
249
+ // Current page was removed (deleted or renamed away)
250
+ if (hadPage && !hasPage) router.go(getParentUrl(router.route.path));
251
+ // A real page appeared where a directory index was shown
252
+ if (!hadPage && hasPage) router.go(router.route.path);
253
+ });
254
+
255
+ import.meta.hot.accept('${t.searchIndex}', (m) => {
256
+ if (m) searchIndexRef.value = m.default;
257
+ });
258
+
259
+ import.meta.hot.accept('${t.siteData}', (m) => {
260
+ if (m) siteData.value = m.default;
261
+ });
262
+
263
+ // Update route.data directly when content changes - Vue SFC setup only re-runs on script block changes
264
+ import.meta.hot.on('${t.pageDataEvent}', ({ filepath, pageData }) => {
265
+ const eventBase = path.join('/', '${n}', path.stripExtension(filepath));
266
+ const routeBase = path.join('/', '${n}', router.route.path);
267
+ if (eventBase === routeBase) {
268
+ router.route.data = pageData;
269
+ }
270
+ });
271
+ }
272
+ `;
273
+ }
274
+ //#endregion
275
+ //#region src/node/lib/codegen/theme.ts
276
+ var F = "typerighter/client/theme-default";
277
+ function ze(e, t) {
278
+ let n = e?.notFound ? `import CustomNotFound from ${JSON.stringify(t ? k.resolve(t, e.notFound) : e.notFound)};` : "", r = e?.notFound ? ", NotFound: CustomNotFound" : "";
279
+ if (e?.component) {
280
+ let i = t ? k.resolve(t, e.component) : e.component;
281
+ return [
282
+ `import CustomLayout from ${JSON.stringify(i)};`,
283
+ n,
284
+ `export default { Layout: CustomLayout${r} };`
285
+ ].filter(Boolean).join("\n");
286
+ }
287
+ let a = Object.entries(e?.slots ?? {});
288
+ if (0 < a.length) {
289
+ let e = a.map(([e, t]) => `${JSON.stringify(i(e))}: () => h(resolveComponent(${JSON.stringify(t)}))`).join(", ");
290
+ return [
291
+ `import DefaultTheme from ${JSON.stringify(F)};`,
292
+ "import { h, resolveComponent } from 'vue';",
293
+ n,
294
+ `export default { Layout: { render() { return h(DefaultTheme.Layout, null, { ${e} }); } }${r} };`
295
+ ].filter(Boolean).join("\n");
296
+ }
297
+ return n ? [
298
+ `import DefaultTheme from ${JSON.stringify(F)};`,
299
+ n,
300
+ `export default { ...DefaultTheme${r} };`
301
+ ].join("\n") : `export { default } from ${JSON.stringify(F)};`;
302
+ }
303
+ //#endregion
304
+ //#region src/node/lib/components.ts
305
+ function Be(e) {
306
+ let t = k.join(e, "tsconfig.json");
307
+ if (P.existsSync(t)) return Ce(t);
308
+ let n = Ve(e);
309
+ return we(e, { compilerOptions: {
310
+ strict: !1,
311
+ jsx: "preserve",
312
+ jsxImportSource: "vue",
313
+ ...n && { paths: n }
314
+ } });
315
+ }
316
+ async function I(e, t) {
317
+ let n = [];
318
+ for (let r of e) if (r.kind === "dir") {
319
+ let e = k.resolve(t, r.path), i;
320
+ try {
321
+ i = await pe(e, { withFileTypes: !0 });
322
+ } catch {
323
+ continue;
324
+ }
325
+ for (let t of i) if (t.isFile() && t.name.endsWith(".vue")) n.push({
326
+ name: t.name.slice(0, -4),
327
+ absolutePath: k.join(e, t.name)
328
+ });
329
+ else if (t.isDirectory()) {
330
+ let r = k.join(e, t.name, "index.vue");
331
+ P.existsSync(r) && n.push({
332
+ name: t.name,
333
+ absolutePath: r
334
+ });
335
+ }
336
+ } else n.push({
337
+ name: r.name,
338
+ absolutePath: k.resolve(t, r.source)
339
+ });
340
+ return n;
341
+ }
342
+ function Ve(e) {
343
+ try {
344
+ let t = Se(k.join(e, "package.json")), n = k.dirname(t.resolve("vue/package.json"));
345
+ return {
346
+ vue: [n],
347
+ "vue/*": [k.join(n, "*")]
348
+ };
349
+ } catch {
350
+ return;
351
+ }
352
+ }
353
+ //#endregion
354
+ //#region src/node/lib/progress.ts
355
+ var L = [
356
+ "◐",
357
+ "◓",
358
+ "◑",
359
+ "◒"
360
+ ], R = class {
361
+ logger;
362
+ label;
363
+ start;
364
+ spinnerInterval;
365
+ constructor(e, t) {
366
+ if (this.logger = e, this.label = t, this.start = performance.now(), process.stdout.isTTY) {
367
+ let e = 0;
368
+ process.stdout.write(j.cyan(`${L[0]} ${t}`)), this.spinnerInterval = setInterval(() => {
369
+ e = (e + 1) % L.length, process.stdout.write(`\r${j.cyan(`${L[e]} ${this.label}`)}`);
370
+ }, 120).unref();
371
+ } else this.logger.start(t);
372
+ }
373
+ update(e, t) {
374
+ if (!process.stdout.isTTY) return;
375
+ let n = Math.round(e / t * 100);
376
+ this.stopSpinner(), process.stdout.write(`\r ${this.label} ${e}/${t} (${n}%)`);
377
+ }
378
+ done(e) {
379
+ this.stopSpinner(), process.stdout.isTTY && process.stdout.write("\r\x1B[K");
380
+ let t = Math.round(performance.now() - this.start);
381
+ this.logger.success(`${e} (${He(t)})`);
382
+ }
383
+ stopSpinner() {
384
+ this.spinnerInterval &&= (clearInterval(this.spinnerInterval), void 0);
385
+ }
386
+ };
387
+ function He(e) {
388
+ return e < 1e3 ? `${Math.round(e)}ms` : `${(e / 1e3).toFixed(1)}s`;
389
+ }
390
+ //#endregion
391
+ //#region src/node/build/index.ts
392
+ async function Ue(e, t = {}) {
393
+ let { root: n, logger: r } = e, i = k.resolve(n, t.outDir ?? "dist"), a = k.join(i, ".client"), o = k.join(i, ".server");
394
+ await N.rm(i, {
395
+ recursive: !0,
396
+ force: !0
397
+ });
398
+ let s = await e.getTdContext(), [c, u, d] = await Promise.all([
399
+ s.getConfig(),
400
+ s.listFiles(),
401
+ s.listSidebar()
402
+ ]), f = c.origin ?? void 0, p = c.author ?? void 0, m = c.license ?? void 0, h = c.repo ?? void 0, g = t.base ?? c.basePath ?? "/", _ = g.endsWith("/") ? g : g + "/", y = d.map((e) => ({
403
+ ...e,
404
+ header: {}
405
+ })), b = v(y), x = JSON.stringify({
406
+ title: c.siteTitle,
407
+ description: c.siteDescription,
408
+ basePath: _,
409
+ origin: f,
410
+ lang: c.lang,
411
+ rootDir: c.rootDir,
412
+ repo: h,
413
+ author: p,
414
+ license: m,
415
+ nav: c.nav
416
+ }), S = JSON.stringify({
417
+ ready: !0,
418
+ contentTree: b
419
+ }), C = k.join(n, "node_modules", ".typerighter");
420
+ await N.mkdir(C, { recursive: !0 });
421
+ let w = k.join(C, "client-entry.js"), T = k.join(C, "ssr-entry.js"), E = k.join(C, "theme.js"), D = await I(c.components, n), O = ze(c.layout ?? void 0, n);
422
+ await Promise.all([
423
+ N.writeFile(w, Re({
424
+ rootDir: c.rootDir,
425
+ basePath: _,
426
+ origin: f,
427
+ lang: c.lang,
428
+ siteTitle: c.siteTitle,
429
+ siteDescription: c.siteDescription,
430
+ repo: h,
431
+ author: p,
432
+ license: m,
433
+ nav: c.nav,
434
+ userComponents: D
435
+ }, {
436
+ theme: J,
437
+ pages: W,
438
+ siteData: K,
439
+ searchIndex: q,
440
+ pageDataEvent: Y
441
+ })),
442
+ N.writeFile(T, We({
443
+ rootDir: c.rootDir,
444
+ siteConfig: x,
445
+ siteData: S,
446
+ themeModulePath: E,
447
+ userComponents: D
448
+ })),
449
+ N.writeFile(E, O)
450
+ ]);
451
+ try {
452
+ let s = yn({ context: e }), m = e.createViteLogger(), h = new R(r, "Building client bundle...");
453
+ await fe({
454
+ ...t.viteConfig,
455
+ root: n,
456
+ base: _,
457
+ plugins: s,
458
+ customLogger: m,
459
+ logLevel: "silent",
460
+ build: {
461
+ ...t.viteConfig?.build,
462
+ outDir: a,
463
+ manifest: !0,
464
+ emptyOutDir: !0,
465
+ rollupOptions: {
466
+ ...t.viteConfig?.build?.rollupOptions,
467
+ input: w
468
+ }
469
+ }
470
+ });
471
+ let g = await N.readdir(k.join(a, "assets")).catch(() => []);
472
+ h.done(`Client bundle (${g.length} chunks)`);
473
+ let v = new R(r, "Building SSR bundle...");
474
+ await fe({
475
+ ...t.viteConfig,
476
+ root: n,
477
+ base: _,
478
+ plugins: s,
479
+ customLogger: m,
480
+ logLevel: "silent",
481
+ build: {
482
+ ...t.viteConfig?.build,
483
+ outDir: o,
484
+ ssr: T,
485
+ emptyOutDir: !0
486
+ }
487
+ }), v.done("SSR bundle");
488
+ let y = u.map((e) => {
489
+ let t = l(e);
490
+ return t === "index" ? "/" : `/${t}`;
491
+ });
492
+ y.push("/"), Ke(b.entries, "", y);
493
+ let x = new R(r, "Pre-rendering pages...");
494
+ await Pe({
495
+ ssrEntryPath: k.join(o, "ssr-entry.js"),
496
+ clientOutDir: a,
497
+ outDir: i,
498
+ base: _,
499
+ origin: f,
500
+ lang: c.lang,
501
+ pagePaths: y,
502
+ siteTitle: c.siteTitle,
503
+ author: p,
504
+ progress: x
505
+ }), x.done(`Pre-rendered ${y.length} pages`);
506
+ let S = /* @__PURE__ */ new Map();
507
+ for (let e of d) {
508
+ let t = l(e.filepath), n = t === "index" ? "/" : `/${t}`;
509
+ S.set(n, e.fileMetadata.mtime);
510
+ }
511
+ let C = ke(y, _, f, S), E = [N.writeFile(k.join(i, "sitemap.xml"), C)];
512
+ f !== void 0 && (E.push(N.writeFile(k.join(i, "robots.txt"), Ae(f, _))), E.push(N.writeFile(k.join(i, "feed.xml"), je(d, _, f, c.siteTitle, c.siteDescription, c.lang)))), await Promise.all(E);
513
+ let D = k.join(a, "assets"), O = k.join(i, "assets");
514
+ await N.cp(D, O, { recursive: !0 }).catch(() => {}), await Ge(k.join(n, c.rootDir), i);
515
+ let ee = k.join(n, c.publicDir);
516
+ await N.cp(ee, i, { recursive: !0 }).catch(() => {});
517
+ } finally {
518
+ await Promise.all([
519
+ N.rm(C, {
520
+ recursive: !0,
521
+ force: !0
522
+ }),
523
+ N.rm(a, {
524
+ recursive: !0,
525
+ force: !0
526
+ }),
527
+ N.rm(o, {
528
+ recursive: !0,
529
+ force: !0
530
+ })
531
+ ]);
532
+ }
533
+ r.log(`\nBuild complete. Output: ${i}`);
534
+ }
535
+ function We(e) {
536
+ let t = `/${e.rootDir}/${s}`, n = JSON.parse(e.siteConfig), r = JSON.parse(e.siteData), i = r.contentTree ?? { entries: [] }, a = _(i.entries ?? [], n.title ?? ""), o = JSON.stringify({
537
+ ...r,
538
+ directoryListings: a
539
+ }), c = e.userComponents ?? [], l = c.map((e) => `import ${e.name} from ${JSON.stringify(e.absolutePath)};`).join("\n"), u = c.map((e) => `app.component(${JSON.stringify(e.name)}, ${e.name});`).join("\n");
540
+ return `
541
+ ${[l, "import { createTypedownApp } from 'typerighter/client';"].filter(Boolean).join("\n")}
542
+ import { TdDirectoryIndex, TdGlossaryIndex } from 'typerighter/client/theme-default';
543
+ import { isIndexUrl, getDirectoryFromPageUrl } from 'typerighter/shared';
544
+ import { renderToString } from 'vue/server-renderer';
545
+ import { h } from 'vue';
546
+ import theme from ${JSON.stringify(e.themeModulePath)};
547
+
548
+ const pages = import.meta.glob('${t}', { eager: true });
549
+ const contentExts = ${JSON.stringify(d)};
550
+ const siteData = ${o};
551
+
552
+ function findPage(base) {
553
+ for (const ext of contentExts) {
554
+ const key = base + ext;
555
+ if (pages[key]) return pages[key];
556
+ }
557
+ }
558
+
559
+ function loadPageModule(pagePath) {
560
+ const base = ('/${e.rootDir}/' + pagePath).replace(/\\/+/g, '/').replace(/\\/$/, '');
561
+ const page = findPage(base);
562
+ if (page) return Promise.resolve(page);
563
+
564
+ if (isIndexUrl(pagePath)) {
565
+ const dirPath = getDirectoryFromPageUrl(pagePath);
566
+ const dir = siteData.directoryListings[dirPath];
567
+ if (dir) return Promise.resolve({
568
+ default: { name: 'DirectoryIndex', render() { return h(TdDirectoryIndex); } },
569
+ pageData: { frontmatter: {}, headings: [], title: dir.title },
570
+ });
571
+ }
572
+
573
+ return Promise.resolve(undefined);
574
+ }
575
+
576
+ export async function createRenderer() {
577
+ const { app, router } = await createTypedownApp(loadPageModule, theme, ${e.siteConfig}, siteData);
578
+ ${u}
579
+ return async function render(url) {
580
+ await router.go(url, { replace: true });
581
+ const html = await renderToString(app);
582
+ return { html, pageData: router.route.data };
583
+ };
584
+ }
585
+ `;
586
+ }
587
+ async function Ge(e, t) {
588
+ let n = (await N.readdir(e, {
589
+ recursive: !0,
590
+ withFileTypes: !0
591
+ })).filter((e) => e.isFile() && !c(e.name)).map(async (n) => {
592
+ let r = k.join(n.parentPath, n.name), i = k.relative(e, r), a = k.join(t, i);
593
+ return N.mkdir(k.dirname(a), { recursive: !0 }).then(() => N.copyFile(r, a));
594
+ });
595
+ await Promise.all(n);
596
+ }
597
+ function Ke(e, t, n) {
598
+ for (let r of e) {
599
+ if (r.kind !== "dir") continue;
600
+ let e = `${t}/${r.node.name}`;
601
+ f(r.node) || n.push(C(e)), Ke(r.node.entries, e, n);
602
+ }
603
+ }
604
+ //#endregion
605
+ //#region ../../node_modules/.pnpm/@shikijs+transformers@4.4.3/node_modules/@shikijs/transformers/dist/index.mjs
606
+ var qe = /(\s+\/\/)/, Je = /(?:\/\/|["'#]|;{1,2}|%{1,2}|--)(\s*)$/, Ye = /(?:\/\/|#|;{1,2}|%{1,2}|--)(\s*)$/, Xe = [
607
+ [/^(<!--)(.+)(-->)$/, !1],
608
+ [/^(\/\*)(.+)(\*\/)$/, !1],
609
+ [/^(\/\/|["'#]|;{1,2}|%{1,2}|--)(.*)$/, !0],
610
+ [/^(\*)(.+)$/, !0]
611
+ ];
612
+ function Ze(e, t, n) {
613
+ let r = [];
614
+ for (let i of e) {
615
+ if (n === "v3") {
616
+ let e = i.children.flatMap((e, t) => {
617
+ if (e.type !== "element") return e;
618
+ let n = e.children[0];
619
+ if (n.type !== "text") return e;
620
+ let r = t === i.children.length - 1;
621
+ if (!z(n.value, r)) return e;
622
+ let a = n.value.split(qe);
623
+ if (a.length <= 1) return e;
624
+ let o = [a[0]];
625
+ for (let e = 1; e < a.length; e += 2) o.push(a[e] + (a[e + 1] || ""));
626
+ return o = o.filter(Boolean), o.length <= 1 ? e : o.map((t) => ({
627
+ ...e,
628
+ children: [{
629
+ type: "text",
630
+ value: t
631
+ }]
632
+ }));
633
+ });
634
+ e.length !== i.children.length && (i.children = e);
635
+ }
636
+ let e = i.children, a = e.length - 1;
637
+ n === "v1" ? a = 0 : t && (a = e.length - 2);
638
+ for (let n = Math.max(a, 0); n < e.length; n++) {
639
+ let a = e[n];
640
+ if (a.type !== "element") continue;
641
+ let o = a.children.at(0);
642
+ if (o?.type !== "text") continue;
643
+ let s = n === e.length - 1, c = z(o.value, s), l;
644
+ if (!c && n > 0 && o.value.trim().startsWith("[!code")) {
645
+ let t = e[n - 1];
646
+ if (t?.type === "element") {
647
+ let n = t.children.at(0);
648
+ if (n?.type === "text" && n.value.includes("//")) {
649
+ let l = z(n.value + o.value, s);
650
+ if (l) {
651
+ c = l, r.push({
652
+ info: l,
653
+ line: i,
654
+ token: t,
655
+ isLineCommentOnly: e.length === 2 && t.children.length === 1 && a.children.length === 1,
656
+ isJsxStyle: !1,
657
+ additionalTokens: [a]
658
+ });
659
+ continue;
660
+ }
661
+ }
662
+ }
663
+ }
664
+ if (c) {
665
+ if (t && !s && n !== 0) {
666
+ let t = Qe(e[n - 1], "{") && Qe(e[n + 1], "}");
667
+ r.push({
668
+ info: c,
669
+ line: i,
670
+ token: a,
671
+ isLineCommentOnly: e.length === 3 && a.children.length === 1,
672
+ isJsxStyle: t,
673
+ additionalTokens: l
674
+ });
675
+ } else r.push({
676
+ info: c,
677
+ line: i,
678
+ token: a,
679
+ isLineCommentOnly: e.length === 1 && a.children.length === 1,
680
+ isJsxStyle: !1,
681
+ additionalTokens: l
682
+ });
683
+ }
684
+ }
685
+ }
686
+ return r;
687
+ }
688
+ function Qe(e, t) {
689
+ if (e.type !== "element") return !1;
690
+ let n = e.children[0];
691
+ return n.type === "text" && n.value.trim() === t;
692
+ }
693
+ function z(e, t) {
694
+ let n = e.trimStart(), r = e.length - n.length;
695
+ n = n.trimEnd();
696
+ let i = e.length - n.length - r;
697
+ for (let [e, a] of Xe) {
698
+ if (a && !t) continue;
699
+ let o = e.exec(n);
700
+ if (o) return [
701
+ " ".repeat(r) + o[1],
702
+ o[2],
703
+ o[3] ? o[3] + " ".repeat(i) : void 0
704
+ ];
705
+ }
706
+ }
707
+ function $e(e) {
708
+ let t = e.match(Je);
709
+ return t && t[1].trim().length === 0 ? e.slice(0, t.index) : e;
710
+ }
711
+ function et(e) {
712
+ let t = e.match(Ye);
713
+ return t && t[1].trim().length === 0 ? e.slice(0, t.index).trimEnd() : e;
714
+ }
715
+ function tt(e, t, n, r) {
716
+ return r ??= "v3", {
717
+ name: e,
718
+ code(e) {
719
+ let i = e.children.filter((e) => e.type === "element"), a = [];
720
+ e.data ??= {};
721
+ let o = e.data;
722
+ o._shiki_notation ??= Ze(i, ["jsx", "tsx"].includes(this.options.lang), r);
723
+ let s = o._shiki_notation;
724
+ for (let e of s) {
725
+ if (e.info[1].length === 0) continue;
726
+ let o = i.indexOf(e.line);
727
+ e.isLineCommentOnly && r !== "v1" && o++;
728
+ let s = !1;
729
+ if (e.info[1] = e.info[1].replace(t, (...t) => n.call(this, t, e.line, e.token, i, o) ? (s = !0, "") : t[0]), !s) continue;
730
+ r === "v1" ? e.info[1] = $e(e.info[1]) : r === "v3" && (e.info[1] = et(e.info[1]));
731
+ let c = e.info[1].trim().length === 0;
732
+ if (c && (e.info[1] = ""), c && e.isLineCommentOnly) a.push(e.line);
733
+ else if (c && e.isJsxStyle) e.line.children.splice(e.line.children.indexOf(e.token) - 1, 3);
734
+ else if (c) {
735
+ if (e.additionalTokens) for (let t = e.additionalTokens.length - 1; t >= 0; t--) {
736
+ let n = e.additionalTokens[t], r = e.line.children.indexOf(n);
737
+ r !== -1 && e.line.children.splice(r, 1);
738
+ }
739
+ e.line.children.splice(e.line.children.indexOf(e.token), 1);
740
+ } else {
741
+ let t = e.token.children[0];
742
+ if (t.type === "text" && (t.value = e.info.join(""), e.additionalTokens)) for (let t of e.additionalTokens) {
743
+ let e = t.children[0];
744
+ e?.type === "text" && (e.value = "");
745
+ }
746
+ }
747
+ }
748
+ for (let t of a) {
749
+ let n = e.children.indexOf(t), r = e.children[n + 1], i = 1;
750
+ r?.type === "text" && r?.value === "\n" && (i = 2), e.children.splice(n, i);
751
+ }
752
+ }
753
+ };
754
+ }
755
+ var nt = /\{([\d,-]+)\}/;
756
+ function rt(e) {
757
+ if (!e) return null;
758
+ let t = e.match(nt);
759
+ return t ? t[1].split(",").flatMap((e) => {
760
+ let t = e.split("-").map((e) => Number.parseInt(e, 10));
761
+ return t.length === 1 ? [t[0]] : Array.from({ length: t[1] - t[0] + 1 }, (e, n) => t[0] + n);
762
+ }) : null;
763
+ }
764
+ var it = Symbol("highlighted-lines");
765
+ function at(e = {}) {
766
+ let { className: t = "highlighted", zeroIndexed: n = !1 } = e;
767
+ return {
768
+ name: "@shikijs/transformers:meta-highlight",
769
+ line(e, r) {
770
+ if (!this.options.meta?.__raw) return;
771
+ let i = this.meta;
772
+ i[it] ??= rt(this.options.meta.__raw);
773
+ let a = i[it] ?? [], o = n ? r - 1 : r;
774
+ return a.includes(o) && this.addClassToHast(e, t), e;
775
+ }
776
+ };
777
+ }
778
+ var ot = /[.*+?^${}()|[\]\\]/g;
779
+ function st(e) {
780
+ return e.replace(ot, "\\$&");
781
+ }
782
+ function B(e = {}, t = "@shikijs/transformers:notation-map") {
783
+ let { classMap: n = {}, classActivePre: r = void 0, classActiveCode: i = void 0 } = e;
784
+ return tt(t, RegExp(`#?\\s*\\[!code (${Object.keys(n).map(st).join("|")})(:\\d+)?\\]`, "gi"), function([e, t, a = ":1"], o, s, c, l) {
785
+ let u = Number.parseInt(a.slice(1), 10);
786
+ for (let e = l; e < Math.min(l + u, c.length); e++) this.addClassToHast(c[e], n[t]);
787
+ return r && this.addClassToHast(this.pre, r), i && this.addClassToHast(this.code, i), !0;
788
+ }, e.matchAlgorithm);
789
+ }
790
+ function ct(e = {}) {
791
+ let { classLineAdd: t = "diff add", classLineRemove: n = "diff remove", classActivePre: r = "has-diff", classActiveCode: i } = e;
792
+ return B({
793
+ classMap: {
794
+ "++": t,
795
+ "--": n
796
+ },
797
+ classActivePre: r,
798
+ classActiveCode: i,
799
+ matchAlgorithm: e.matchAlgorithm
800
+ }, "@shikijs/transformers:notation-diff");
801
+ }
802
+ function lt(e = {}) {
803
+ let { classMap: t = {
804
+ error: ["highlighted", "error"],
805
+ warning: ["highlighted", "warning"],
806
+ info: ["highlighted", "info"]
807
+ }, classActivePre: n = "has-highlighted", classActiveCode: r } = e;
808
+ return B({
809
+ classMap: t,
810
+ classActivePre: n,
811
+ classActiveCode: r,
812
+ matchAlgorithm: e.matchAlgorithm
813
+ }, "@shikijs/transformers:notation-error-level");
814
+ }
815
+ function ut(e = {}) {
816
+ let { classActiveLine: t = "focused", classActivePre: n = "has-focused", classActiveCode: r } = e;
817
+ return B({
818
+ classMap: { focus: t },
819
+ classActivePre: n,
820
+ classActiveCode: r,
821
+ matchAlgorithm: e.matchAlgorithm
822
+ }, "@shikijs/transformers:notation-focus");
823
+ }
824
+ function dt(e = {}) {
825
+ let { classActiveLine: t = "highlighted", classActivePre: n = "has-highlighted", classActiveCode: r } = e;
826
+ return B({
827
+ classMap: {
828
+ highlight: t,
829
+ hl: t
830
+ },
831
+ classActivePre: n,
832
+ classActiveCode: r,
833
+ matchAlgorithm: e.matchAlgorithm
834
+ }, "@shikijs/transformers:notation-highlight");
835
+ }
836
+ //#endregion
837
+ //#region src/node/lib/render/highlight/language.ts
838
+ var ft = [
839
+ "shellscript",
840
+ "shell",
841
+ "bash",
842
+ "sh",
843
+ "zsh"
844
+ ];
845
+ function pt(e) {
846
+ return ft.includes(e);
847
+ }
848
+ var mt = /^[a-zA-Z0-9-_]+/;
849
+ function ht(e) {
850
+ return mt.exec(e)?.[0] || "";
851
+ }
852
+ //#endregion
853
+ //#region src/node/lib/render/highlight/index.ts
854
+ var gt = new FinalizationRegistry((e) => {
855
+ e();
856
+ }), V = {
857
+ light: "github-light",
858
+ dark: "github-dark"
859
+ };
860
+ async function _t() {
861
+ let e = await Te({
862
+ themes: [V.light, V.dark],
863
+ langs: []
864
+ }), t = [
865
+ at(),
866
+ ct(),
867
+ ut({
868
+ classActiveLine: "has-focus",
869
+ classActivePre: "has-focused-lines"
870
+ }),
871
+ dt(),
872
+ lt(),
873
+ vt(),
874
+ {
875
+ name: "typedown:add-dir",
876
+ pre(e) {
877
+ e.properties.dir = "ltr";
878
+ }
879
+ }
880
+ ], n = new Set(e.getLoadedLanguages());
881
+ async function r(r, i, a) {
882
+ let o = ht(i);
883
+ if (o) {
884
+ let e = i;
885
+ i = o.toLowerCase(), a = e.slice(i.length).replace(/(?<!=)\{/g, " {") + " " + a, a = a.trim().replace(/\s+/g, " ");
886
+ }
887
+ i ||= "txt";
888
+ try {
889
+ !De(i) && !n.has(i) && (await e.loadLanguage(i), n.add(i));
890
+ } catch {
891
+ ae.warn(`\nThe language '${i}' is not loaded, falling back to 'txt' for syntax highlighting.`), i = "txt";
892
+ }
893
+ r = r.trimEnd();
894
+ let s = Ee(r, i, e);
895
+ return await e.loadLanguage(...s), e.codeToHtml(r, {
896
+ lang: i,
897
+ transformers: [...t, {
898
+ name: "typedown:empty-line",
899
+ code(e) {
900
+ e.children.forEach((e) => {
901
+ e.type === "element" && e.tagName === "span" && Array.isArray(e.properties.class) && e.properties.class.includes("line") && e.children.length === 0 && e.children.push({
902
+ type: "element",
903
+ tagName: "wbr",
904
+ properties: {},
905
+ children: []
906
+ });
907
+ });
908
+ }
909
+ }],
910
+ meta: { __raw: a },
911
+ themes: V,
912
+ defaultColor: !1,
913
+ colorReplacements: {
914
+ "github-light": {
915
+ "#959da5": "#6c676f",
916
+ "#28a745": "#0e790b",
917
+ "#b08800": "#846312",
918
+ "#e36209": "#c13617",
919
+ "#3192aa": "#05728b",
920
+ "#d73a49": "#c62739",
921
+ "#22863a": "#11782a",
922
+ "#6a737d": "#62687b",
923
+ "#1b7c83": "#06747a",
924
+ "#0366d6": "#0663d0",
925
+ "#cb2431": "#c82430"
926
+ },
927
+ "github-dark": {
928
+ "#586069": "#5b93a3",
929
+ "#6a737d": "#818e99",
930
+ "#ea4a5a": "#ef5564",
931
+ "#2188ff": "#268bf9"
932
+ }
933
+ }
934
+ });
935
+ }
936
+ return gt.register(r, () => e.dispose()), r;
937
+ }
938
+ function vt() {
939
+ return {
940
+ name: "typedown:disable-shell-symbol-select",
941
+ tokens(e) {
942
+ if (pt(this.options.lang)) for (let t of e) {
943
+ if (t.length < 2) continue;
944
+ let e = t[0].content.trim();
945
+ (e === "$" || e === ">") && t[1].content[0] === " " && (t[0].content = e + " ", t[0].htmlStyle ??= {}, t[0].htmlStyle["user-select"] = "none", t[0].htmlStyle["-webkit-user-select"] = "none", t[1].content = t[1].content.slice(1));
946
+ }
947
+ }
948
+ };
949
+ }
950
+ //#endregion
951
+ //#region src/node/lib/render/postprocess.ts
952
+ var yt;
953
+ async function bt(e) {
954
+ return e = await Ct(e), e = Dt(e), e;
955
+ }
956
+ function xt() {
957
+ return yt ||= _t(), yt;
958
+ }
959
+ var St = /<pre class="td-code-placeholder"([^>]*)><code>([\s\S]*?)<\/code><\/pre>/g;
960
+ function H(e, t) {
961
+ return e.match(RegExp(`${t}="([^"]*)"`))?.[1];
962
+ }
963
+ async function Ct(e) {
964
+ let t = await xt(), n = [...e.matchAll(St)];
965
+ if (n.length === 0) return e;
966
+ let r = await Promise.all(n.map(async (e) => {
967
+ let n = e[1], r = H(n, "data-lang") ?? "", i = H(n, "data-meta") ?? "", a = H(n, "data-title"), o = H(n, "data-line-numbers"), s = h(e[2]);
968
+ return wt(await t(s, r, i), r, {
969
+ title: a,
970
+ lineNumbers: o
971
+ });
972
+ })), i = e;
973
+ for (let e = n.length - 1; 0 <= e; e--) {
974
+ let t = n[e];
975
+ i = i.slice(0, t.index) + r[e] + i.slice(t.index + t[0].length);
976
+ }
977
+ return i;
978
+ }
979
+ function wt(e, t, n) {
980
+ t ||= "txt";
981
+ let r = n.title ?? t.replace(/_/g, " "), i = ["language-" + t];
982
+ n.title && i.push("has-title"), n.lineNumbers !== void 0 && i.push("line-numbers-mode");
983
+ let a = `<div class="${i.join(" ")}"><button title="Copy code" data-copied="Copied" class="copy"></button><span class="lang">${m(r)}</span>` + e;
984
+ if (n.lineNumbers !== void 0) {
985
+ let e = parseInt(n.lineNumbers) || 1, t = a.slice(a.indexOf("<code>"), a.indexOf("</code>")).split("\n").length, r = [...Array(t)].map((t, n) => `<span class="line-number">${n + e}</span><br>`).join("");
986
+ a += `<div class="line-numbers-wrapper" aria-hidden="true">${r}</div>`;
987
+ }
988
+ return a += "</div>", a;
989
+ }
990
+ var Tt = /<span class="td-math-inline">([\s\S]*?)<\/span>/g, Et = /<div class="td-math-block">([\s\S]*?)<\/div>/g;
991
+ function Dt(e) {
992
+ return e = e.replace(Tt, (e, t) => At(t, !1)), e = e.replace(Et, (e, t) => At(t, !0)), e;
993
+ }
994
+ var Ot = /`([^`]+)`|\$([^$]+)\$/g;
995
+ function kt(e) {
996
+ let t = 0, n = "";
997
+ for (let r of e.matchAll(Ot)) {
998
+ if (n += m(e.slice(t, r.index)), r[1] !== void 0) n += `<code>${m(r[1])}</code>`;
999
+ else if (r[2] !== void 0) try {
1000
+ n += ie.renderToString(r[2], { throwOnError: !1 });
1001
+ } catch {
1002
+ n += m(r[0]);
1003
+ }
1004
+ t = r.index + r[0].length;
1005
+ }
1006
+ return n += m(e.slice(t)), n;
1007
+ }
1008
+ function At(e, t) {
1009
+ let n = t ? "div" : "span";
1010
+ try {
1011
+ return ie.renderToString(h(e), {
1012
+ throwOnError: !1,
1013
+ displayMode: t
1014
+ });
1015
+ } catch {
1016
+ return `<${n} class="td-math-error">${e}</${n}>`;
1017
+ }
1018
+ }
1019
+ //#endregion
1020
+ //#region src/node/lib/render/vue.ts
1021
+ async function U(e, t, n) {
1022
+ let r = t.title || t.label || (p(n) ? S(n, (await e.getConfig()).siteTitle) : w(n));
1023
+ return {
1024
+ schema: t.schema,
1025
+ schemaLabel: t.schemaLabel,
1026
+ label: t.label,
1027
+ icon: t.icon,
1028
+ frontmatter: t.header ?? {},
1029
+ headings: Mt(t.headings),
1030
+ title: r,
1031
+ titleHtml: kt(r),
1032
+ filepath: n,
1033
+ fileMetadata: t.fileMetadata,
1034
+ seoMetadata: t.seoMetadata
1035
+ };
1036
+ }
1037
+ async function jt(e, t, n) {
1038
+ let r = await bt(t.content), i = await U(e, t, n), a = JSON.stringify(`@typedown/pages?resource=${encodeURIComponent(n)}`);
1039
+ return {
1040
+ vueSrc: [
1041
+ "<script>",
1042
+ `export { pageData } from ${a}`,
1043
+ `export default { name: ${JSON.stringify(n)} }`,
1044
+ "<\/script>",
1045
+ "<script setup>",
1046
+ "import { useRouter } from 'typerighter/client'",
1047
+ `import { pageData } from ${a}`,
1048
+ "useRouter().route.data = pageData",
1049
+ "<\/script>",
1050
+ `<template><div class="typedown-content">\n${Nt(r)}\n</div></template>`
1051
+ ].join("\n"),
1052
+ pageData: i
1053
+ };
1054
+ }
1055
+ function Mt(e) {
1056
+ let t = [], n = [];
1057
+ for (let r of e) {
1058
+ let e = {
1059
+ level: r.level,
1060
+ title: r.title,
1061
+ titleHtml: r.titleHtml ?? r.title,
1062
+ slug: r.slug,
1063
+ link: `#${r.slug}`,
1064
+ children: []
1065
+ };
1066
+ for (; 0 < n.length && r.level <= n[n.length - 1].level;) n.pop();
1067
+ 0 < n.length ? n[n.length - 1].children.push(e) : t.push(e), n.push(e);
1068
+ }
1069
+ return t;
1070
+ }
1071
+ function Nt(e) {
1072
+ return e.replaceAll("{{", "&#123;&#123;").replaceAll("}}", "&#125;&#125;");
1073
+ }
1074
+ //#endregion
1075
+ //#region src/node/plugin/vite/constants.ts
1076
+ var Pt = "@typedown/app", Ft = "\0@typedown/app", W = "@typedown/pages", It = "\0" + W;
1077
+ W + "";
1078
+ var G = "\0@typedown/pages?resource=", K = "@typedown/site-data", Lt = "\0@typedown/site-data", q = "@typedown/search-index", Rt = "\0@typedown/search-index", J = "@typedown/theme", zt = "\0@typedown/theme", Y = "typedown:page-data";
1079
+ //#endregion
1080
+ //#region src/node/plugin/vite/virtual/utils.ts
1081
+ function X(e, t) {
1082
+ let n = e.moduleGraph.getModuleById(t);
1083
+ if (n) {
1084
+ e.moduleGraph.invalidateModule(n);
1085
+ for (let t of n.importers) e.hot.send({
1086
+ type: "update",
1087
+ updates: [{
1088
+ type: "js-update",
1089
+ path: t.url,
1090
+ acceptedPath: n.url,
1091
+ timestamp: Date.now()
1092
+ }]
1093
+ });
1094
+ }
1095
+ }
1096
+ //#endregion
1097
+ //#region src/node/plugin/vite/virtual/app.ts
1098
+ var Bt = class {
1099
+ async load(e) {
1100
+ let t = await (await e.getTdContext()).getConfig(), n = await I(t.components, e.root);
1101
+ return Re({
1102
+ rootDir: t.rootDir,
1103
+ basePath: t.basePath,
1104
+ origin: t.origin ?? void 0,
1105
+ lang: t.lang,
1106
+ siteTitle: t.siteTitle,
1107
+ siteDescription: t.siteDescription,
1108
+ repo: t.repo ?? void 0,
1109
+ author: t.author ?? void 0,
1110
+ license: t.license ?? void 0,
1111
+ nav: t.nav,
1112
+ userComponents: n
1113
+ }, {
1114
+ theme: J,
1115
+ pages: W,
1116
+ siteData: K,
1117
+ searchIndex: q,
1118
+ pageDataEvent: Y
1119
+ });
1120
+ }
1121
+ invalidate(e) {
1122
+ X(e, Ft);
1123
+ }
1124
+ }, Vt = class {
1125
+ async load(e) {
1126
+ let t = (await e.getConfig()).rootDir ?? ".";
1127
+ return `export const pages = import.meta.glob('${t === "." ? "/**/*.{td,md}" : `/${t}/**/*.{td,md}`}');`;
1128
+ }
1129
+ resolvePageData(e) {
1130
+ if (e.startsWith("@typedown/pages?resource=")) return "\0" + e;
1131
+ }
1132
+ isPageDataModule(e) {
1133
+ return e.startsWith(G);
1134
+ }
1135
+ async loadPageData(e, t) {
1136
+ let n = decodeURIComponent(e.slice(G.length)), r = await U(t, await t.getFile(n), n);
1137
+ return `export const pageData = ${JSON.stringify(r)}`;
1138
+ }
1139
+ invalidatePageData(e, t) {
1140
+ X(e, G + encodeURIComponent(t));
1141
+ }
1142
+ sendPageData(e, t, n) {
1143
+ t.getFile(n).then(async (r) => {
1144
+ let i = await U(t, r, n);
1145
+ e.hot.send({
1146
+ type: "custom",
1147
+ event: Y,
1148
+ data: {
1149
+ filepath: n,
1150
+ pageData: i
1151
+ }
1152
+ });
1153
+ }).catch((e) => {
1154
+ console.error("[typedown] Failed to send page data:", e instanceof Error ? e.message : e);
1155
+ });
1156
+ }
1157
+ invalidate(e) {
1158
+ X(e, It);
1159
+ }
1160
+ }, Ht = class {
1161
+ async load(e) {
1162
+ return ze((await (await e.getTdContext()).getConfig()).layout ?? void 0, e.root);
1163
+ }
1164
+ invalidate(e) {
1165
+ X(e, zt);
1166
+ }
1167
+ }, Ut = "\0@typedown/site-data", Wt = {
1168
+ ready: !1,
1169
+ contentTree: { entries: [] },
1170
+ schemas: {},
1171
+ directoryListings: {}
1172
+ }, Gt = class {
1173
+ data;
1174
+ scan(e) {
1175
+ let t = ye("**/*.td", {
1176
+ cwd: e,
1177
+ exclude: (e) => e.startsWith("_")
1178
+ }).map((e) => ({
1179
+ filepath: e,
1180
+ label: w(e),
1181
+ header: {}
1182
+ })), n = v(t);
1183
+ this.data = {
1184
+ contentTree: n,
1185
+ schemas: {},
1186
+ directoryListings: _(n.entries, "")
1187
+ };
1188
+ }
1189
+ load(e) {
1190
+ let t = this.data ? {
1191
+ ready: !0,
1192
+ ...this.data
1193
+ } : Wt;
1194
+ return `export default ${JSON.stringify(t)}`;
1195
+ }
1196
+ clear() {
1197
+ this.data = void 0;
1198
+ }
1199
+ fetch = b((e, t) => {
1200
+ Kt(e).then((e) => {
1201
+ this.data = e, t && this.invalidate(t);
1202
+ }).catch((e) => {
1203
+ console.error("[typedown] Failed to fetch site data:", e instanceof Error ? e.message : e);
1204
+ });
1205
+ }, 200);
1206
+ async fetchSync(e) {
1207
+ this.data = await Kt(e);
1208
+ }
1209
+ invalidate(e) {
1210
+ X(e, Ut);
1211
+ }
1212
+ };
1213
+ async function Kt(e) {
1214
+ let [t, n, r] = await Promise.all([
1215
+ e.getConfig(),
1216
+ e.listSidebar(),
1217
+ e.listSchemas()
1218
+ ]), i = await Promise.all(r.map(async (t) => [t, (await e.getSchema(t)).properties])), a = Object.fromEntries(i), o = n.map((e) => ({
1219
+ ...e,
1220
+ header: {}
1221
+ })), s = v(o);
1222
+ return {
1223
+ contentTree: s,
1224
+ schemas: a,
1225
+ directoryListings: _(s.entries, t.siteTitle)
1226
+ };
1227
+ }
1228
+ //#endregion
1229
+ //#region src/node/lib/search-indexer/index.ts
1230
+ var qt = class {
1231
+ index;
1232
+ constructor() {
1233
+ this.index = new le({
1234
+ fields: g,
1235
+ storeFields: x
1236
+ });
1237
+ }
1238
+ addAll(e) {
1239
+ this.index.removeAll();
1240
+ for (let t of e) this.index.add(t);
1241
+ }
1242
+ addPage(e) {
1243
+ this.index.has(e.id) && this.index.discard(e.id), this.index.add(e);
1244
+ }
1245
+ discardPage(e) {
1246
+ this.index.has(e) && this.index.discard(e);
1247
+ }
1248
+ serialize() {
1249
+ return JSON.stringify(this.index);
1250
+ }
1251
+ };
1252
+ //#endregion
1253
+ //#region src/node/lib/search-indexer/scan.ts
1254
+ function Jt(e, t) {
1255
+ let n = Qt(e), r = [];
1256
+ for (let t of n) {
1257
+ let n = Zt(e, t);
1258
+ n && r.push(n);
1259
+ }
1260
+ t.addAll(r);
1261
+ }
1262
+ function Yt(e, n, r) {
1263
+ let i = Zt(e, A(e, n));
1264
+ i ? r.addPage(i) : r.discardPage(t(n));
1265
+ }
1266
+ function Xt(e, t) {
1267
+ let n = w(e);
1268
+ if (!t.startsWith("---")) return {
1269
+ title: n,
1270
+ body: t
1271
+ };
1272
+ let r = t.indexOf("\n---", 3);
1273
+ if (r === -1) return {
1274
+ title: n,
1275
+ body: t
1276
+ };
1277
+ let i = t.slice(4, r), a = t.slice(r + 4).trim();
1278
+ return {
1279
+ title: (/^_label:\s*"(.+)"$/m.exec(i) ?? /^_label:\s*'(.+)'$/m.exec(i))?.[1]?.trim() || n,
1280
+ body: a
1281
+ };
1282
+ }
1283
+ function Zt(e, n) {
1284
+ let r;
1285
+ try {
1286
+ r = be(n, "utf-8");
1287
+ } catch {
1288
+ return;
1289
+ }
1290
+ if (!r.trim()) return;
1291
+ let i = n.slice(e.length + 1), { title: a, body: o } = Xt(i, r);
1292
+ return {
1293
+ id: t(i),
1294
+ title: a,
1295
+ text: `${a}\n${o}`
1296
+ };
1297
+ }
1298
+ function Qt(e) {
1299
+ return ye("**/*.td", {
1300
+ cwd: e,
1301
+ exclude: (e) => e.startsWith("_")
1302
+ }).map((t) => A(e, t));
1303
+ }
1304
+ //#endregion
1305
+ //#region src/node/plugin/vite/virtual/search-index.ts
1306
+ var $t = "\0@typedown/search-index", en = class {
1307
+ indexer = new qt();
1308
+ load(e) {
1309
+ return `export default ${JSON.stringify(this.indexer.serialize())}`;
1310
+ }
1311
+ index(e) {
1312
+ Jt(e, this.indexer);
1313
+ }
1314
+ reindex(e, t) {
1315
+ Yt(e, t, this.indexer);
1316
+ }
1317
+ invalidate(e) {
1318
+ X(e, $t);
1319
+ }
1320
+ }, tn = Se(import.meta.url);
1321
+ function nn() {
1322
+ return [{
1323
+ find: "vue/server-renderer",
1324
+ replacement: tn.resolve("vue/server-renderer")
1325
+ }, {
1326
+ find: "vue",
1327
+ replacement: tn.resolve("vue/dist/vue.runtime.esm-bundler.js")
1328
+ }];
1329
+ }
1330
+ //#endregion
1331
+ //#region src/node/plugin/vite/middleware/vault-assets.ts
1332
+ var rn = {
1333
+ jpg: "image/jpeg",
1334
+ jpeg: "image/jpeg",
1335
+ png: "image/png",
1336
+ gif: "image/gif",
1337
+ webp: "image/webp",
1338
+ svg: "image/svg+xml",
1339
+ avif: "image/avif",
1340
+ ico: "image/x-icon",
1341
+ pdf: "application/pdf",
1342
+ zip: "application/zip",
1343
+ mp3: "audio/mpeg",
1344
+ mp4: "video/mp4",
1345
+ webm: "video/webm",
1346
+ woff2: "font/woff2",
1347
+ woff: "font/woff",
1348
+ ttf: "font/ttf"
1349
+ };
1350
+ function an(t, r) {
1351
+ return (i, o, s) => {
1352
+ if (!i.url || i.method !== "GET" || o.writableEnded) return s();
1353
+ let c = e(i.url);
1354
+ if (c.startsWith("/@") || c.startsWith("/node_modules")) return s();
1355
+ let l = n(r.basePath), u = (l && c.startsWith(l) ? c.slice(l.length) : c).replace(/^\//, ""), d = A(t.config.root, r.rootDirectory, u);
1356
+ if (ve(d)) try {
1357
+ let e = xe(d);
1358
+ if (e.isFile()) {
1359
+ let t = rn[a(d).slice(1).toLowerCase()] ?? "application/octet-stream";
1360
+ o.setHeader("Content-Type", t), o.setHeader("Content-Length", e.size), _e(d).pipe(o);
1361
+ return;
1362
+ }
1363
+ } catch {}
1364
+ s();
1365
+ };
1366
+ }
1367
+ //#endregion
1368
+ //#region src/node/plugin/vite/middleware/virtual-html.ts
1369
+ function on(t, r, i) {
1370
+ return (a, o, s) => {
1371
+ if (!a.url) return s();
1372
+ let c = n(e(a.url)), l = n(i.basePath);
1373
+ if (c.startsWith("/@") || c.startsWith("/node_modules") || !c.startsWith(l)) return s();
1374
+ let u = c.slice(l.length);
1375
+ if (u.startsWith("/@") || u.startsWith("/node_modules") || c.includes(".") && !c.endsWith("/index.html")) return s();
1376
+ r.getConfig().then(async (e) => {
1377
+ let n = await t.transformIndexHtml(a.url ?? "", sn(i, e));
1378
+ o.setHeader("Content-Type", "text/html"), o.end(n);
1379
+ }).catch(() => s());
1380
+ };
1381
+ }
1382
+ function sn(e, t) {
1383
+ return e.devHtml === void 0 && (e.devHtml = ne({
1384
+ title: t.siteTitle,
1385
+ description: t.siteDescription,
1386
+ base: "/",
1387
+ entryScript: Pt
1388
+ })), e.devHtml;
1389
+ }
1390
+ //#endregion
1391
+ //#region src/node/lib/prop-schema.ts
1392
+ function cn(e, t, n) {
1393
+ let r = {};
1394
+ for (let i of e) {
1395
+ let e = `./${k.relative(t, i.absolutePath)}`;
1396
+ try {
1397
+ let t = n.getComponentMeta(i.absolutePath), a = {}, o = !1;
1398
+ for (let e of t.props) {
1399
+ if (e.global) continue;
1400
+ let t = Z(e.schema);
1401
+ if (t !== void 0) {
1402
+ let n = { schema: e.required ? t : u(t) };
1403
+ e.description && (n.description = e.description), a[e.name] = n, o = !0;
1404
+ }
1405
+ }
1406
+ let s = t.slots.map((e) => e.name).filter((e) => e !== "default");
1407
+ r[i.name] = {
1408
+ source: e,
1409
+ props: o ? a : void 0,
1410
+ slots: 0 < s.length ? s : void 0
1411
+ };
1412
+ } catch {
1413
+ r[i.name] = { source: e };
1414
+ }
1415
+ }
1416
+ return r;
1417
+ }
1418
+ function ln(e) {
1419
+ if (!e || e.length !== 1) return;
1420
+ let t = Z(e[0]);
1421
+ return t === void 0 ? void 0 : {
1422
+ type: "array",
1423
+ items: t
1424
+ };
1425
+ }
1426
+ function un(e, t) {
1427
+ if (t && 0 < Object.keys(t).length) return fn(t);
1428
+ let n = /^(?:Record<string,\s*(\w+)>|\{\s*\[key:\s*string\]:\s*(\w+);\s*\})$/.exec(e);
1429
+ if (!n) return;
1430
+ let r = dn(n[1] ?? n[2]);
1431
+ return r === void 0 ? void 0 : {
1432
+ type: "object",
1433
+ additionalProperties: r
1434
+ };
1435
+ }
1436
+ function dn(e) {
1437
+ switch (e) {
1438
+ case "string": return { type: "string" };
1439
+ case "number": return { type: "number" };
1440
+ case "boolean": return { type: "boolean" };
1441
+ default: return;
1442
+ }
1443
+ }
1444
+ function fn(e) {
1445
+ let t = {}, n = [];
1446
+ for (let [r, i] of Object.entries(e)) {
1447
+ let e = Z(i.schema);
1448
+ if (e === void 0) return;
1449
+ t[r] = e, i.required && n.push(r);
1450
+ }
1451
+ let r = {
1452
+ type: "object",
1453
+ properties: t,
1454
+ additionalProperties: !1
1455
+ };
1456
+ return 0 < n.length && (r.required = n), r;
1457
+ }
1458
+ function Z(e) {
1459
+ if (typeof e == "string") return dn(e);
1460
+ switch (e.kind) {
1461
+ case "enum": return pn(e.schema);
1462
+ case "array": return ln(e.schema);
1463
+ case "object": return un(e.type, e.schema);
1464
+ default: return;
1465
+ }
1466
+ }
1467
+ function pn(e) {
1468
+ let t = e ?? [], n = t.some((e) => e === "undefined" || e === "null"), r = t.filter((e) => e !== "undefined" && e !== "null");
1469
+ if (r.length !== 0) {
1470
+ if (r.length === 1) {
1471
+ let e = Z(r[0]);
1472
+ return e === void 0 ? void 0 : n ? u(e) : e;
1473
+ }
1474
+ if (r.every((e) => typeof e == "object" && e.kind === "literal")) {
1475
+ let e = [];
1476
+ for (let t of r) {
1477
+ if (typeof t == "string" || !("value" in t)) return;
1478
+ e.push(t.value);
1479
+ }
1480
+ let t = { enum: e };
1481
+ return n ? u(t) : t;
1482
+ }
1483
+ }
1484
+ }
1485
+ //#endregion
1486
+ //#region src/node/plugin/vite/subplugins/component-contract.ts
1487
+ var mn = ".typedown/components.json";
1488
+ function hn(e) {
1489
+ return {
1490
+ name: "vite-plugin-typedown-component-contract",
1491
+ async buildStart() {
1492
+ let t = e();
1493
+ if (!t) return;
1494
+ let n = await I((await (await t.getTdContext()).getConfig()).components, t.root);
1495
+ $(t.root, n);
1496
+ },
1497
+ configureServer(t) {
1498
+ let n = e();
1499
+ n && n.getTdContext().then(async (e) => {
1500
+ let r = await e.getConfig(), i = await I(r.components, n.root);
1501
+ $(n.root, i), gn(t, r.components, n.root);
1502
+ }).catch(() => {});
1503
+ }
1504
+ };
1505
+ }
1506
+ function gn(e, t, n) {
1507
+ let r = new Set(t.filter((e) => e.kind === "explicit").map((e) => M(k.resolve(n, e.source)))), i = new Set(t.filter((e) => e.kind === "dir").map((e) => M(k.resolve(n, e.path))));
1508
+ for (let t of i) e.watcher.add(t);
1509
+ let a = (a) => {
1510
+ _n(a, r, i) && (e.config.logger.info("[typedown] component changed, rebuilding contract..."), I(t, n).then((e) => $(n, e)).catch(() => {}));
1511
+ };
1512
+ e.watcher.on("change", a), e.watcher.on("add", a), e.watcher.on("unlink", a);
1513
+ }
1514
+ function _n(e, t, n) {
1515
+ if (!e.endsWith(".vue")) return !1;
1516
+ let r = M(e);
1517
+ if (t.has(r)) return !0;
1518
+ for (let e of n) if (r.startsWith(e + "/")) return !0;
1519
+ return !1;
1520
+ }
1521
+ function vn() {
1522
+ try {
1523
+ let e = k.resolve(k.dirname(me(import.meta.url)), "builtin-components.json");
1524
+ return JSON.parse(P.readFileSync(e, "utf-8"));
1525
+ } catch {
1526
+ return {};
1527
+ }
1528
+ }
1529
+ var Q = vn();
1530
+ function $(e, t) {
1531
+ if (!(0 < Object.keys(Q).length) && t.length === 0) return;
1532
+ let n = 0 < t.length ? cn(t, e, Be(e)) : {}, r = {
1533
+ ...Q,
1534
+ ...n
1535
+ }, i = k.join(e, mn);
1536
+ P.mkdirSync(k.dirname(i), { recursive: !0 }), P.writeFileSync(i, JSON.stringify(r, null, 2));
1537
+ }
1538
+ //#endregion
1539
+ //#region src/node/plugin/vite/index.ts
1540
+ function yn(e = {}) {
1541
+ let t = e.context, n, i, a, o = new Bt(), s = new Ht(), l = new Vt(), u = new Gt(), d = new en(), f = {
1542
+ devHtml: void 0,
1543
+ basePath: "/",
1544
+ rootDirectory: "vault"
1545
+ };
1546
+ function p() {
1547
+ if (t === void 0) throw Error("typedown plugin not initialized");
1548
+ return t.getTdContext();
1549
+ }
1550
+ let m = {
1551
+ name: "vite-plugin-typedown",
1552
+ enforce: "pre",
1553
+ async config(n) {
1554
+ if (!t) {
1555
+ let r = e.root ? A(n.root ?? process.cwd(), e.root) : ce(n.root ?? process.cwd());
1556
+ t = se(r);
1557
+ }
1558
+ a = n.base ?? "/";
1559
+ let r = await (await p()).getConfig();
1560
+ return {
1561
+ base: n.base ?? r.basePath,
1562
+ publicDir: r.publicDir,
1563
+ server: {
1564
+ port: n.server?.port ?? 8686,
1565
+ strictPort: n.server?.strictPort ?? !1
1566
+ },
1567
+ resolve: { alias: nn() },
1568
+ ssr: { noExternal: ["typerighter"] }
1569
+ };
1570
+ },
1571
+ configResolved(e) {
1572
+ i = A(e.root, e.build.outDir);
1573
+ },
1574
+ async buildStart() {
1575
+ if (n) return;
1576
+ let e = await p(), t = await e.getConfig(), r = A(t.rootDir);
1577
+ d.index(r), await u.fetchSync(e);
1578
+ let i = await e.checkVault();
1579
+ if (wn(i.diagnostics), 0 < i.errorCount) {
1580
+ let e = i.diagnostics.filter((e) => e.severity === "error").map((e) => ` ${e.filepath}:${e.line}:${e.column} - ${e.message} (${e.code})`);
1581
+ this.error(`Vault check failed with ${i.errorCount} error(s):\n${e.join("\n")}`);
1582
+ }
1583
+ },
1584
+ resolveId(e) {
1585
+ if (e === "/@typedown/app" || e === "@typedown/app") return Ft;
1586
+ if (e === "@typedown/pages") return It;
1587
+ if (e.startsWith("@typedown/pages?resource=")) return l.resolvePageData(e);
1588
+ if (e === "@typedown/site-data") return Lt;
1589
+ if (e === "@typedown/search-index") return Rt;
1590
+ if (e === "@typedown/theme") return zt;
1591
+ },
1592
+ async load(e) {
1593
+ if (l.isPageDataModule(e)) return l.loadPageData(e, await p());
1594
+ if (e !== "\0@typedown/search-index" && e !== "\0@typedown/site-data" && e !== "\0@typedown/pages" && e !== "\0@typedown/app" && e !== "\0@typedown/theme") return;
1595
+ let n = await p();
1596
+ if (e === "\0@typedown/search-index") return d.load(n);
1597
+ if (e === "\0@typedown/site-data") return u.load(n);
1598
+ if (e === "\0@typedown/pages") return l.load(n);
1599
+ if (e === "\0@typedown/app") return o.load(t);
1600
+ if (e === "\0@typedown/theme") return s.load(t);
1601
+ },
1602
+ async configureServer(e) {
1603
+ n = e;
1604
+ let t = await p(), r = await t.getConfig(), i = A(r.rootDir);
1605
+ d.index(i), u.scan(i), u.fetch(t, n), e.httpServer?.once("listening", async () => {
1606
+ let e = await t.checkVault();
1607
+ 0 < e.diagnostics.length && (console.error(""), wn(e.diagnostics));
1608
+ }), t.rpc.onConfigChanged(() => {
1609
+ n && (f.devHtml = void 0, u.clear(), o.invalidate(n), s.invalidate(n), l.invalidate(n), xn(n), u.fetch(t, n));
1610
+ }), t.rpc.onComponentContractChanged(() => {
1611
+ n && (o.invalidate(n), xn(n));
1612
+ });
1613
+ function a(...e) {
1614
+ n && t.getConfig().then((t) => {
1615
+ if (!n) return;
1616
+ let r = [];
1617
+ for (let i of e) {
1618
+ let e = M(A(n.config.root, t.rootDir, i)), a = n.moduleGraph.getModulesByFile(e);
1619
+ if (a?.size) {
1620
+ for (let e of a) n.moduleGraph.invalidateModule(e), r.push(Cn(e));
1621
+ l.invalidatePageData(n, i);
1622
+ }
1623
+ }
1624
+ 0 < r.length && n.hot.send({
1625
+ type: "update",
1626
+ updates: r
1627
+ });
1628
+ }).catch(() => {});
1629
+ }
1630
+ t.rpc.onContentUpdated(({ filepath: e, affectedFiles: r = [] }) => {
1631
+ n && (d.reindex(i, e), d.invalidate(n), l.invalidate(n), u.fetch(t, n), a(e, ...r), l.sendPageData(n, t, e));
1632
+ }), t.rpc.onContentDeleted(({ filepath: e }) => {
1633
+ n && (d.reindex(i, e), d.invalidate(n), l.invalidate(n), u.fetch(t, n), a(e));
1634
+ });
1635
+ function c() {
1636
+ n && (u.clear(), Sn(n), u.fetch(t, n));
1637
+ }
1638
+ t.rpc.onSchemaUpdated(c), t.rpc.onSchemaDeleted(c);
1639
+ let m = await t.getConfig();
1640
+ f.basePath = m.basePath, f.rootDirectory = m.rootDir, t.rpc.onConfigChanged((e) => {
1641
+ f.basePath = e.basePath, f.rootDirectory = e.rootDir, f.devHtml = void 0;
1642
+ }), e.middlewares.use(an(e, f)), e.middlewares.use(on(e, t, f));
1643
+ },
1644
+ async transform(e, t) {
1645
+ let n = t.split("?")[0];
1646
+ if (!c(n)) return;
1647
+ if (T(n)) return {
1648
+ code: `<script>import theme from '${J}'; import { TdNotFound } from 'typerighter/client/theme-default'; export default theme.NotFound || TdNotFound; export const pageData = { frontmatter: {}, headings: [], title: '' };<\/script>`,
1649
+ map: null
1650
+ };
1651
+ let i = await p(), a = await i.getConfig(), o = r(n, a.rootDir);
1652
+ try {
1653
+ let { vueSrc: e } = await jt(i, await i.getFile(o), o);
1654
+ return {
1655
+ code: e,
1656
+ map: null
1657
+ };
1658
+ } catch (e) {
1659
+ if (oe(e)) return;
1660
+ let t = e instanceof Error ? e.message : String(e);
1661
+ this.error(`[typedown] Failed to transform ${o}: ${t}`);
1662
+ }
1663
+ },
1664
+ handleHotUpdate({ file: e }) {
1665
+ if (c(e)) return [];
1666
+ },
1667
+ async closeBundle() {
1668
+ if (!e.context && t) try {
1669
+ let e = (await (await t.getTdContext()).getConfig()).basePath, n = e.startsWith(a) ? e.slice(a.length) : e.replace(/^\//, "");
1670
+ await Ue(t, {
1671
+ outDir: A(i, n),
1672
+ base: e
1673
+ });
1674
+ } finally {
1675
+ t.dispose();
1676
+ }
1677
+ }
1678
+ }, h = de({
1679
+ include: e.root ? RegExp(`${e.root.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}/.*\\.(?:vue|td)$`) : /\.(?:vue|td)$/,
1680
+ template: { transformAssetUrls: !1 }
1681
+ });
1682
+ return [
1683
+ m,
1684
+ hn(() => t),
1685
+ h,
1686
+ ...ue()
1687
+ ];
1688
+ }
1689
+ function bn(e) {
1690
+ return [...e.moduleGraph.idToModuleMap.entries()].filter(([e]) => e.endsWith(".td")).map(([, e]) => e);
1691
+ }
1692
+ function xn(e) {
1693
+ for (let t of bn(e)) e.moduleGraph.invalidateModule(t);
1694
+ e.hot.send({ type: "full-reload" });
1695
+ }
1696
+ function Sn(e) {
1697
+ let t = bn(e).map((t) => (e.moduleGraph.invalidateModule(t), Cn(t)));
1698
+ 0 < t.length && e.hot.send({
1699
+ type: "update",
1700
+ updates: t
1701
+ });
1702
+ }
1703
+ function Cn(e) {
1704
+ return {
1705
+ type: "js-update",
1706
+ path: e.url,
1707
+ acceptedPath: e.url,
1708
+ timestamp: Date.now()
1709
+ };
1710
+ }
1711
+ function wn(e) {
1712
+ for (let t of e) {
1713
+ let e = `${t.filepath}:${t.line}:${t.column}`, n = t.severity === "error" ? j.red("error") : j.yellow("warn");
1714
+ console.error(` ${n} ${e} ${t.message} ${j.dim(`(${t.code})`)}`);
1715
+ }
1716
+ }
1717
+ //#endregion
1718
+ export { K as a, q as i, W as n, J as o, Y as r, Ue as s, yn as t };