@tobi-or-not/docpress 0.4.0 → 0.5.1

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/README.md CHANGED
@@ -109,21 +109,29 @@ Both methods provide the same functionality, so you can choose the one that fits
109
109
 
110
110
  To ensure that the program functions correctly, please follow these conventions:
111
111
 
112
- 1. __Documentation folder structure__:
113
- - The script will only parse the `docs/` folder located at the root level of the repository. This folder is used to import advanced documentation features, such as multi-page documentation, embedded images, and files.
112
+ ### Repository name and structure
114
113
 
115
- 2. __File naming and sorting__:
116
- - If a `docs/` folder is present, all files within it will be sorted and renamed by removing any prefix numbers. This ensures that files appear cleanly in the generated website. For example, `docs/01-get-started.md` will be renamed to `get-started.md`.
114
+ - The script will only parse the `docs/` folder located at the root level of the repository. This folder is used to import advanced documentation features, such as multi-page documentation, embedded images, and files.
115
+ - Repositories whose name starts with a dot are processed, but the dot will be removed.
117
116
 
118
- 3. __Handling the root readme file__:
119
- - The `README.md` file located at the root of the repository will only be imported if there is no `./docs/01-readme.md` file present. This allows you to differentiate between the general README and the advanced documentation introduction page.
120
- - For instance, you might use the README file for a table of contents that is not relevant in the context of the documentation website.
117
+ ### File naming and sorting
121
118
 
122
- 4. __Link management__:
123
- - Any inline link in the `./README.md` file that does not point to `./docs/**` will be replaced with the corresponding GitHub link.
124
- - Similarly, any inline link in the `./docs/*.md` files that does not reference `./docs/**` will also be replaced with the appropriate GitHub link.
119
+ - If a `docs/` folder is present, all files within it will be sorted and renamed by removing any prefix numbers. This ensures that files appear cleanly in the generated website. For example, `docs/01-get-started.md` will be renamed to `get-started.md`.
125
120
 
126
- 5. __Project descriptions__:
127
- - The project description displayed on the home page of the generated website is extracted from the GitHub repository's description.
121
+ ### Handling the root readme file
122
+
123
+ - The `README.md` file located at the root of the repository will only be imported if there is no `./docs/01-readme.md` file present. This allows you to differentiate between the general README and the advanced documentation introduction page.
124
+ - For instance, you might use the README file for a table of contents that is not relevant in the context of the documentation website.
125
+
126
+ ### Link management
127
+
128
+ - Any inline link in the `./README.md` file that does not point to `./docs/**` will be replaced with the corresponding GitHub link.
129
+ - Similarly, any inline link in the `./docs/*.md` files that does not reference `./docs/**` will also be replaced with the appropriate GitHub link.
130
+
131
+ ### Project descriptions
132
+
133
+ - The project description displayed on the home page of the generated website is extracted from the GitHub repository's description.
134
+
135
+ ---
128
136
 
129
137
  By adhering to these rules, you can ensure that your documentation is processed correctly and that it aligns with the intended structure and functionality of the generated site.
package/dist/cli.js CHANGED
@@ -1,19 +1,19 @@
1
1
  import { createOption as m, createCommand as j, Command as Ce } from "commander";
2
- import J from "chalk";
2
+ import W from "chalk";
3
3
  import { fromZodError as ie } from "zod-validation-error";
4
4
  import { z as u } from "zod";
5
- import { readFileSync as C, existsSync as W, mkdirSync as Se, readdirSync as ce, statSync as A, appendFileSync as ae, cpSync as G, rmSync as q, writeFileSync as v, renameSync as xe } from "node:fs";
6
- import { resolve as d, join as Pe, basename as b, dirname as N, parse as x } from "node:path";
5
+ import { readFileSync as C, existsSync as J, mkdirSync as Se, readdirSync as ce, statSync as A, appendFileSync as ae, cpSync as G, rmSync as q, writeFileSync as y, renameSync as xe } from "node:fs";
6
+ import { resolve as d, join as Pe, basename as v, dirname as N, parse as x } from "node:path";
7
7
  import _e from "axios";
8
8
  import { rimrafSync as Ee } from "rimraf";
9
9
  import { Octokit as de } from "@octokit/rest";
10
10
  import { simpleGit as Oe } from "simple-git";
11
11
  import { build as Fe } from "vitepress";
12
12
  import ue from "yaml";
13
- const Re = "@tobi-or-not/docpress", Te = "module", De = "0.4.0", Le = "pnpm@9.15.0", Ve = "dist/docpress.js", Ie = "types/index.d.ts", je = { docpress: "bin/docpress.js" }, Ae = ["bin", "dist", "types"], Ge = { node: ">=20" }, Ne = { build: "pnpm run build:types && pnpm run build:vite", "build:clean": "rimraf ./dist ./types ./tsconfig.tsbuildinfo", "build:docker": "docker build --tag tobi-or-not/docpress --target prod .", "build:types": "tsc", "build:vite": "vite build", dev: "vite-node ./dev/docpress.ts", "dev:clean": "rimraf ./docpress && pnpm run dev", format: "eslint . --fix", lint: "eslint .", prepare: "husky", start: "./bin/docpress.js", "start:docker": "docker run --name docpress --rm -v $(pwd)/docpress:/app/docpress:rw tobi-or-not/docpress", "stop:docker": "docker rm --force docpress", test: "vitest run", "test:cov": "vitest run --coverage", "vp:build": "vitepress build ./docpress", "vp:build:docker": "docker build --tag tobi-or-not/docs --target prod .", "vp:dev": "vitepress dev ./docpress --port 8080", "vp:dev:docker": "docker run --publish 8080:8080 --name docpress-vp --rm tobi-or-not/docs", "vp:preview": "vitepress preview ./docpress --port 8080" }, Me = { "@octokit/rest": "^21.0.2", axios: "^1.7.9", chalk: "^5.3.0", commander: "^12.1.0", octokit: "^4.0.2", rimraf: "^6.0.1", "simple-git": "^3.27.0", vitepress: "^1.5.0", yaml: "^2.6.1", zod: "^3.24.1", "zod-validation-error": "^3.4.0" }, Ue = { "@antfu/eslint-config": "^3.11.2", "@commitlint/cli": "^19.6.0", "@commitlint/config-conventional": "^19.6.0", "@octokit/types": "^13.6.2", "@types/node": "^22.10.2", "@vitest/coverage-v8": "^2.1.8", eslint: "^9.16.0", husky: "^9.1.7", "lint-staged": "^15.2.11", typescript: "^5.7.2", vite: "^6.0.3", "vite-node": "^2.1.8", vitest: "^2.1.8" }, He = { registry: "https://registry.npmjs.org/", access: "public", tag: "latest" }, ze = {
14
- name: Re,
15
- type: Te,
16
- version: De,
13
+ const De = "@tobi-or-not/docpress", Re = "module", Te = "0.5.1", Le = "pnpm@9.15.0", Ve = "dist/docpress.js", Ie = "types/index.d.ts", je = { docpress: "bin/docpress.js" }, Ae = ["bin", "dist", "types"], Ge = { node: ">=20" }, Ne = { build: "pnpm run build:types && pnpm run build:vite", "build:clean": "rimraf ./dist ./types ./tsconfig.tsbuildinfo", "build:docker": "docker build --tag tobi-or-not/docpress --target prod .", "build:types": "tsc", "build:vite": "vite build", dev: "vite-node ./dev/docpress.ts", "dev:clean": "rimraf ./docpress && pnpm run dev", format: "eslint . --fix", lint: "eslint .", prepare: "husky", start: "./bin/docpress.js", "start:docker": "docker run --name docpress --rm -v $(pwd)/docpress:/app/docpress:rw tobi-or-not/docpress", "stop:docker": "docker rm --force docpress", test: "vitest run", "test:cov": "vitest run --coverage", "vp:build": "vitepress build ./docpress", "vp:build:docker": "docker build --tag tobi-or-not/docs --target prod .", "vp:dev": "vitepress dev ./docpress --port 8080", "vp:dev:docker": "docker run --publish 8080:8080 --name docpress-vp --rm tobi-or-not/docs", "vp:preview": "vitepress preview ./docpress --port 8080" }, Me = { "@octokit/rest": "^21.0.2", axios: "^1.7.9", chalk: "^5.3.0", commander: "^12.1.0", octokit: "^4.0.2", rimraf: "^6.0.1", "simple-git": "^3.27.0", vitepress: "^1.5.0", yaml: "^2.6.1", zod: "^3.24.1", "zod-validation-error": "^3.4.0" }, Ue = { "@antfu/eslint-config": "^3.11.2", "@commitlint/cli": "^19.6.0", "@commitlint/config-conventional": "^19.6.0", "@octokit/types": "^13.6.2", "@types/node": "^22.10.2", "@vitest/coverage-v8": "^2.1.8", eslint: "^9.16.0", husky: "^9.1.7", "lint-staged": "^15.2.11", typescript: "^5.7.2", vite: "^6.0.3", "vite-node": "^2.1.8", vitest: "^2.1.8" }, He = { registry: "https://registry.npmjs.org/", access: "public", tag: "latest" }, ze = {
14
+ name: De,
15
+ type: Re,
16
+ version: Te,
17
17
  packageManager: Le,
18
18
  module: Ve,
19
19
  types: Ie,
@@ -37,10 +37,10 @@ const K = {
37
37
  success: { color: "green", level: 30 }
38
38
  };
39
39
  function c(e, t = "info", r) {
40
- const s = r ? J[r](e) : J[K[t].color](e), n = t === "success" ? "info" : t;
40
+ const s = r ? W[r](e) : W[K[t].color](e), n = t === "success" ? "info" : t;
41
41
  Be() >= K[t].level && console[n](s);
42
42
  }
43
- const M = d(process.cwd(), "docpress"), pe = d(process.cwd(), "docpress/repositories.json"), le = d(process.cwd(), "docpress/owner.json"), fe = d(process.cwd(), "docpress/docs"), Je = d(process.cwd(), "docpress/docs/index.md"), We = d(process.cwd(), "docpress/docs/forks.md"), X = d(process.cwd(), "docpress/.vitepress/config.ts"), qe = d(process.cwd(), "docpress/.vitepress/theme"), Ke = d(process.cwd(), "docpress/.vitepress/theme/extras"), Y = process.env.NODE_ENV === "development" ? d(import.meta.dirname, "../../public/templates/theme") : d(import.meta.dirname, "./templates/theme");
43
+ const M = d(process.cwd(), "docpress"), pe = d(process.cwd(), "docpress/repositories.json"), le = d(process.cwd(), "docpress/owner.json"), fe = d(process.cwd(), "docpress/docs"), We = d(process.cwd(), "docpress/docs/index.md"), Je = d(process.cwd(), "docpress/docs/forks.md"), X = d(process.cwd(), "docpress/.vitepress/config.ts"), qe = d(process.cwd(), "docpress/.vitepress/theme"), Ke = d(process.cwd(), "docpress/.vitepress/theme/extras"), Y = process.env.NODE_ENV === "development" ? d(import.meta.dirname, "../../public/templates/theme") : d(import.meta.dirname, "./templates/theme");
44
44
  async function L(e) {
45
45
  try {
46
46
  return (await _e.head(e)).status;
@@ -48,13 +48,13 @@ async function L(e) {
48
48
  return t.response?.status || t.status || 500;
49
49
  }
50
50
  }
51
- function k(e, t) {
51
+ function g(e, t) {
52
52
  let r = "";
53
- return t?.removeIdx && (r = e.replace(/^\d{2}-/, "")), t?.replaceDash && (r = (r || e).replaceAll("-", " ")), t?.mode === "capitalize" ? r = (r || e).slice(0, 1).toUpperCase() + (r || e).slice(1).toLowerCase() : t?.mode === "lowercase" ? r = (r || e).toLowerCase() : t?.mode === "uppercase" && (r = (r || e).toUpperCase()), r || e;
53
+ return e.startsWith(".") && t?.removeDot && (r = e.slice(1)), t?.removeIdx && (r = e.replace(/^\d{2}-/, "")), t?.replaceDash && (r = (r || e).replaceAll("-", " ")), t?.mode === "capitalize" ? r = (r || e).slice(0, 1).toUpperCase() + (r || e).slice(1).toLowerCase() : t?.mode === "lowercase" ? r = (r || e).toLowerCase() : t?.mode === "uppercase" && (r = (r || e).toUpperCase()), r || e;
54
54
  }
55
55
  function E(e, { clean: t } = { clean: !1 }) {
56
56
  try {
57
- t && W(e) && Ee(`${e}/*`, { glob: !0 }), W(e) || Se(e, { recursive: !0 });
57
+ t && J(e) && Ee(`${e}/*`, { glob: !0 }), J(e) || Se(e, { recursive: !0 });
58
58
  } catch (r) {
59
59
  console.error(r);
60
60
  }
@@ -77,7 +77,7 @@ function O(e) {
77
77
  return (Array.isArray(e) ? e : [e]).flatMap((t) => Ye(t) ? [t] : Xe(t) ? ce(t).flatMap((r) => O(Pe(t, r))) : []);
78
78
  }
79
79
  function me(e) {
80
- return O(e).filter((t) => b(t).endsWith(".md"));
80
+ return O(e).filter((t) => v(t).endsWith(".md"));
81
81
  }
82
82
  function Ze(e) {
83
83
  return e.reduce((t, r, s, n) => s ? s === n.length - 1 ? `${t} or "${r}"` : `${t}, "${r}"` : `"${r}"`, "");
@@ -130,13 +130,13 @@ function U(e) {
130
130
  const o = p.partial().parse(Q(t)), i = Q(r), a = p.partial().required({ branch: !0, gitProvider: !0 }).parse({}), l = {
131
131
  ...i,
132
132
  ...o.vitepressConfig
133
- }, g = {
133
+ }, h = {
134
134
  ...o,
135
135
  ...a,
136
136
  ...n,
137
137
  ...Object.keys(l).length && { vitepressConfig: l }
138
138
  };
139
- return { ...p.partial().required({ username: !0 }).parse(g), token: s };
139
+ return { ...p.partial().required({ username: !0 }).parse(h), token: s };
140
140
  } catch (o) {
141
141
  c(` An error occurred while checking configuration.
142
142
  ${ie(o).toString()}`, "error"), process.exit(1);
@@ -181,7 +181,7 @@ function H(e, t) {
181
181
  return r.error && (c(` An error occurred while checking configuration.
182
182
  ${ie(r.error).toString()}`, "error"), process.exit(1)), c(" Setup complete! Ready to process your documentation.", "info"), r.data;
183
183
  }
184
- function R(e, t) {
184
+ function D(e, t) {
185
185
  return t.forEach((r) => e.addOption(r)), e;
186
186
  }
187
187
  async function nt({ username: e, token: t, branch: r }) {
@@ -265,7 +265,7 @@ async function ut(e, t, r) {
265
265
  const s = [];
266
266
  return await Promise.all(
267
267
  e.map(async (n) => {
268
- const o = t ?? n.default_branch ?? "main", i = d(fe, n.name), a = ge(n, r);
268
+ const o = t ?? n.default_branch ?? "main", i = d(fe, g(n.name, { removeDot: !0 })), a = ge(n, r);
269
269
  let l = [];
270
270
  !n.fork && !n.private && !a && (l = await pt(n, o)), s.push({
271
271
  ...n,
@@ -286,9 +286,9 @@ async function pt(e, t) {
286
286
  return Object.values(r).every((n) => n === 404) || !e.size ? [] : (r.docsFolderStatus !== 404 && s.push("docs/*"), (r.docsFolderStatus === 404 || r.docsReadmeStatus === 404) && s.push("README.md", "!*/**/README.md"), s);
287
287
  }
288
288
  async function lt(e, t, r, s) {
289
- v(le, JSON.stringify(e, null, 2));
289
+ y(le, JSON.stringify(e, null, 2));
290
290
  const n = await ut(t, r, s);
291
- return v(pe, JSON.stringify(n, null, 2)), { user: e, repos: n };
291
+ return y(pe, JSON.stringify(n, null, 2)), { user: e, repos: n };
292
292
  }
293
293
  async function ft(e, t) {
294
294
  if (!e) {
@@ -305,7 +305,7 @@ function ge(e, t) {
305
305
  const r = t?.every((i) => i.startsWith("!")), s = t?.filter((i) => i.startsWith("!")).some((i) => e.name === i.substring(1)), n = !t || t?.filter((i) => !i.startsWith("!")).includes(e.name) || e.fork && !s || r && !s, o = s || !n;
306
306
  return "docpress" in e && !e.docpress.includes.length ? !0 : !(e.clone_url && !e.private && !o);
307
307
  }
308
- const T = [
308
+ const R = [
309
309
  m("-C, --config <string>", _.innerType().shape.config._def.description),
310
310
  m("-T, --token <string>", _.innerType().shape.token._def.description),
311
311
  m("-U, --username <string>", _.innerType().shape.username._def.description)
@@ -313,7 +313,7 @@ const T = [
313
313
  m("-b, --branch <string>", p.shape.branch._def.description).default(p.shape.branch._def.defaultValue()),
314
314
  m("-g, --git-provider <string>", p.shape.gitProvider._def.description).default(p.shape.gitProvider._def.defaultValue()),
315
315
  m("-r, --repos-filter <string>", p.shape.reposFilter._def.description)
316
- ], mt = R(j(te), [...he, ...T]).description("Fetch docs with the given username and git provider.").action(async (e) => {
316
+ ], mt = D(j(te), [...he, ...R]).description("Fetch docs with the given username and git provider.").action(async (e) => {
317
317
  const t = H(te, e);
318
318
  await be(t);
319
319
  });
@@ -322,7 +322,7 @@ async function be(e) {
322
322
  c(`
323
323
  -> Start fetching documentation files. This may take a moment, especially for larger repositories.`, "info"), await dt({ username: t, branch: n, reposFilter: r, gitProvider: o, token: s });
324
324
  }
325
- const gt = "build", ht = R(j(gt), T).description("Build vitepress website.").action(async (e) => {
325
+ const gt = "build", ht = D(j(gt), R).description("Build vitepress website.").action(async (e) => {
326
326
  await ve();
327
327
  });
328
328
  async function ve() {
@@ -382,18 +382,18 @@ function bt(e, t, r) {
382
382
  }
383
383
  function vt(e, t) {
384
384
  const r = C(e, { encoding: "utf8" });
385
- E(N(t)), v(t, r);
385
+ E(N(t)), y(t, r);
386
386
  }
387
387
  function yt(e, t) {
388
388
  const s = C(e, "utf8").replace(/\[([^\]]+)\]\(\.\.\/([^)]+)\)/g, (n, o, i) => `[${o}](${t}/${i})`);
389
- v(e, s, "utf8");
389
+ y(e, s, "utf8");
390
390
  }
391
391
  function wt(e, t) {
392
392
  const s = C(e, "utf8").replace(/\[([^\]]+)\]\((?!\.?\/docs\/|docs\/|http|#)(\.?\/)?([^/][^)]+)\)/g, (n, o, i, a) => `[${o}](${t}/${a})`).replace(/\[([^\]]+)\]\((\.?\/docs\/|docs\/)([^)]*)\)/g, (n, o, i, a) => `[${o}](${a})`);
393
- v(e, s, "utf8");
393
+ y(e, s, "utf8");
394
394
  }
395
395
  function oe(e, t) {
396
- const n = `${b(t) === "introduction.md" ? `
396
+ const n = `${v(t) === "introduction.md" ? `
397
397
  ## Sources` : "# Sources"}
398
398
 
399
399
  Take a look at the [project sources](${e}).
@@ -414,7 +414,7 @@ function kt(e, t) {
414
414
  }
415
415
  function $t(e, t, r) {
416
416
  const s = {
417
- title: k(e, { mode: "capitalize", replaceDash: !0 }),
417
+ title: g(e, { mode: "capitalize", replaceDash: !0 }),
418
418
  details: t,
419
419
  link: `/${e}/introduction`
420
420
  };
@@ -422,14 +422,14 @@ function $t(e, t, r) {
422
422
  }
423
423
  function Ct(e, t) {
424
424
  return {
425
- text: k(e, { mode: "capitalize", replaceDash: !0 }),
425
+ text: g(e, { mode: "capitalize", replaceDash: !0 }),
426
426
  collapsed: !0,
427
427
  items: t
428
428
  };
429
429
  }
430
430
  function V(e, t, r) {
431
431
  const s = {
432
- text: t === "introduction" ? "Introduction" : k(t, { mode: "capitalize", replaceDash: !0 }),
432
+ text: t === "introduction" ? "Introduction" : g(t, { mode: "capitalize", replaceDash: !0 }),
433
433
  link: `/${e}/${t}`
434
434
  };
435
435
  return r ? [...r, s] : [s];
@@ -438,24 +438,24 @@ function St(e, t) {
438
438
  const r = [], s = [];
439
439
  for (const o of e) {
440
440
  c(` Replace urls for repository '${o.name}'.`, "info"), me([o.docpress.projectPath]).forEach((a) => {
441
- c(` Processing file '${b(a)}' for repository '${o.name}'.`, "debug"), yt(a, `https://github.com/${o.owner.login}/${o.name}/tree/${o.docpress.branch}`), b(a).toLowerCase() === "readme.md" && wt(a, `https://github.com/${o.owner.login}/${o.name}/tree/${o.docpress.branch}`);
441
+ c(` Processing file '${v(a)}' for repository '${o.name}'.`, "debug"), yt(a, `https://github.com/${o.owner.login}/${o.name}/tree/${o.docpress.branch}`), v(a).toLowerCase() === "readme.md" && wt(a, `https://github.com/${o.owner.login}/${o.name}/tree/${o.docpress.branch}`);
442
442
  }), c(` Generate sidebar for repository '${o.name}'.`, "info");
443
- const i = ce(o.docpress.projectPath).filter((a) => A(d(o.docpress.projectPath, a)).isFile() && b(d(o.docpress.projectPath, a)).endsWith(".md")).sort((a, l) => a.localeCompare(l)).reduce((a, l, g, y) => {
444
- const h = d(o.docpress.projectPath, l);
445
- let f = k(b(h), { mode: "lowercase", removeIdx: !0 });
446
- if (f === "readme.md" && (f = "introduction.md"), f !== b(h) && xe(h, d(N(h), f)), g === y.length - 1) {
447
- let w;
448
- if (y.length > 1)
449
- return w = d(o.docpress.projectPath, "sources.md"), c(` Add sources for repository '${o.name}'.`, "info"), oe(o.html_url, w), V(
443
+ const i = ce(o.docpress.projectPath).filter((a) => A(d(o.docpress.projectPath, a)).isFile() && v(d(o.docpress.projectPath, a)).endsWith(".md")).sort((a, l) => a.localeCompare(l)).reduce((a, l, h, w) => {
444
+ const b = d(o.docpress.projectPath, l);
445
+ let f = g(v(b), { mode: "lowercase", removeIdx: !0 });
446
+ if (f === "readme.md" && (f = "introduction.md"), f !== v(b) && xe(b, d(N(b), f)), h === w.length - 1) {
447
+ let k;
448
+ if (w.length > 1)
449
+ return k = d(o.docpress.projectPath, "sources.md"), c(` Add sources for repository '${o.name}'.`, "info"), oe(o.html_url, k), V(
450
450
  o.name,
451
- x(w).name,
451
+ x(k).name,
452
452
  V(o.name, x(f).name, a)
453
453
  );
454
- w = d(o.docpress.projectPath, f), oe(o.html_url, w);
454
+ k = d(o.docpress.projectPath, f), oe(o.html_url, k);
455
455
  }
456
- return V(o.name, x(f).name, a);
456
+ return V(g(o.name, { removeDot: !0 }), x(f).name, a);
457
457
  }, []);
458
- s.push(Ct(o.name, i)), r.push(...$t(o.name, o.description || ""));
458
+ s.push(Ct(g(o.name, { removeDot: !0 }), i)), r.push(...$t(g(o.name, { removeDot: !0 }), o.description || ""));
459
459
  }
460
460
  c(" Generate index content.", "info");
461
461
  const n = kt(r.sort((o, i) => o.title.localeCompare(i.title)), t);
@@ -469,10 +469,10 @@ function xt(e) {
469
469
  c(" Add extras Vitepress headers pages.", "info");
470
470
  for (const s of t) {
471
471
  c(` Processing file '${s}'.`, "debug");
472
- const n = d(process.cwd(), s), o = d(fe, k(b(s), { mode: "lowercase", removeIdx: !0 }));
472
+ const n = d(process.cwd(), s), o = d(fe, g(v(s), { mode: "lowercase", removeIdx: !0 }));
473
473
  G(n, o), r.push({
474
- text: k(x(n).name, { replaceDash: !0, removeIdx: !0 }),
475
- link: `/${k(x(n).name, { removeIdx: !0, mode: "lowercase" })}`
474
+ text: g(x(n).name, { replaceDash: !0, removeIdx: !0 }),
475
+ link: `/${g(x(n).name, { removeIdx: !0, mode: "lowercase" })}`
476
476
  });
477
477
  }
478
478
  return r;
@@ -483,8 +483,8 @@ function se(e, t, r) {
483
483
  for (const i of o) {
484
484
  const a = i.replace(n, ".");
485
485
  c(` Processing file '${a}' for entry '${s}'.`, "debug");
486
- const l = d(process.cwd(), i), g = d(t, a);
487
- G(l, g);
486
+ const l = d(process.cwd(), i), h = d(t, a);
487
+ G(l, h);
488
488
  }
489
489
  }
490
490
  }
@@ -501,10 +501,10 @@ Every tile below represents a unique project where contributions have been made-
501
501
 
502
502
  This page serves as both a portfolio of past work and a resource for revisiting projects that have made a meaningful impact.
503
503
  `, n = e.map(({ repository: o, contributions: i }) => {
504
- const { name: a, owner: l, html_url: g, description: y, stargazers_count: h } = o;
505
- return { name: a, owner: l.login, html_url: g, description: y, stargazers_count: h, contributions: i };
504
+ const { name: a, owner: l, html_url: h, description: w, stargazers_count: b } = o;
505
+ return { name: a, owner: l.login, html_url: h, description: w, stargazers_count: b, contributions: i };
506
506
  });
507
- c(" Generate forks page.", "info"), v(We, t.concat(r, ue.stringify(n), t, s));
507
+ c(" Generate forks page.", "info"), y(Je, t.concat(r, ue.stringify(n), t, s));
508
508
  }
509
509
  async function _t(e, t, r) {
510
510
  const s = await Promise.all(
@@ -521,8 +521,8 @@ async function _t(e, t, r) {
521
521
  function Et(e, t) {
522
522
  const r = `---
523
523
  `;
524
- return E(N(X)), c(" Generate Vitepress config.", "info"), v(X, `export default ${JSON.stringify(e, null, 2)}
525
- `), c(" Generate index file.", "info"), v(Je, r.concat(ue.stringify(t), r)), c(" Add Docpress theme files.", "info"), O(Y).forEach((s) => {
524
+ return E(N(X)), c(" Generate Vitepress config.", "info"), y(X, `export default ${JSON.stringify(e, null, 2)}
525
+ `), c(" Generate index file.", "info"), y(We, r.concat(ue.stringify(t), r)), c(" Add Docpress theme files.", "info"), O(Y).forEach((s) => {
526
526
  const n = s.replace(`${Y}/`, "");
527
527
  vt(s, d(qe, n));
528
528
  });
@@ -533,7 +533,7 @@ const ne = "prepare", ye = [
533
533
  m("-p, --extra-header-pages <string>", p.shape.extraHeaderPages._def.description),
534
534
  m("-t, --extra-theme <string>", p.shape.extraTheme._def.description),
535
535
  m("-v, --vitepress-config <string>", p.shape.vitepressConfig._def.description)
536
- ], Ot = R(j(ne), [...ye, ...T]).description("Transform doc to the target vitepress format.").action(async (e) => {
536
+ ], Ot = D(j(ne), [...ye, ...R]).description("Transform doc to the target vitepress format.").action(async (e) => {
537
537
  const t = H(ne, e);
538
538
  await we(t);
539
539
  });
@@ -541,23 +541,23 @@ async function we(e) {
541
541
  const { extraHeaderPages: t, extraPublicContent: r, extraTheme: s, vitepressConfig: n, forks: o, token: i, username: a } = e;
542
542
  c(`
543
543
  -> Start transform files to prepare Vitepress build.`, "info");
544
- const l = Qe(), g = et().reduce(({ internals: $, forks: S }, D) => {
545
- const { clone_url: ke, private: $e, fork: z, docpress: B } = D;
544
+ const l = Qe(), h = et().reduce(({ internals: $, forks: S }, T) => {
545
+ const { clone_url: ke, private: $e, fork: z, docpress: B } = T;
546
546
  if (ke && !$e && !B.filtered) {
547
547
  if (!z && B.includes.length)
548
- return { internals: [...$, D], forks: S };
548
+ return { internals: [...$, T], forks: S };
549
549
  if (z)
550
- return { internals: $, forks: [...S, D] };
550
+ return { internals: $, forks: [...S, T] };
551
551
  }
552
552
  return { internals: $, forks: S };
553
- }, { internals: [], forks: [] }), { sidebar: y, index: h } = St(g.internals, l), f = [];
553
+ }, { internals: [], forks: [] }), { sidebar: w, index: b } = St(h.internals, l), f = [];
554
554
  if (t) {
555
555
  const $ = xt(t);
556
556
  o ? f.push(...$.filter((S) => S.link !== "/forks")) : f.push(...$);
557
557
  }
558
- r && (c(" Add extras Vitepress public folder content.", "info"), se(r, d(M, "public"))), s && (c(" Add extras Vitepress theme files.", "info"), se(s, d(Ke))), o && a && (c(" Add fork page to display external contributions.", "info"), await _t(g.forks, a, i), f.push({ text: "Forks", link: "/forks" }));
559
- const w = bt(y, f, n);
560
- Et(w, h);
558
+ r && (c(" Add extras Vitepress public folder content.", "info"), se(r, d(M, "public"))), s && (c(" Add extras Vitepress theme files.", "info"), se(s, d(Ke))), o && a && (c(" Add fork page to display external contributions.", "info"), await _t(h.forks, a, i), f.push({ text: "Forks", link: "/forks" }));
559
+ const k = bt(w, f, n);
560
+ Et(k, b);
561
561
  }
562
562
  function Ft() {
563
563
  const e = new Ce().name("docpress").description("Build your doc website faster than light ⚡️⚡️⚡️").version(`${ze.version}`).action(async (t, r) => {
@@ -568,7 +568,7 @@ function Ft() {
568
568
  sortOptions: !0,
569
569
  showGlobalOptions: !0
570
570
  }).enablePositionalOptions().passThroughOptions().addCommand(mt).addCommand(Ot).addCommand(ht);
571
- return R(e, [...he, ...ye, ...T]), e;
571
+ return D(e, [...he, ...ye, ...R]), e;
572
572
  }
573
573
  function Ht() {
574
574
  Ft().parseAsync(process.argv);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../src/utils/logger.ts","../src/utils/const.ts","../src/utils/functions.ts","../src/schemas/global.ts","../src/schemas/build.ts","../src/schemas/fetch.ts","../src/schemas/prepare.ts","../src/utils/commands.ts","../src/lib/git.ts","../src/lib/fetch.ts","../src/commands/global.ts","../src/commands/fetch.ts","../src/commands/build.ts","../src/lib/vitepress.ts","../src/utils/templates.ts","../src/utils/regex.ts","../src/lib/prepare.ts","../src/commands/prepare.ts","../src/cli.ts"],"sourcesContent":["/* eslint-disable dot-notation */\nimport type { ColorName } from 'chalk'\nimport chalk from 'chalk'\n\ntype LogType = keyof Pick<Console, 'info' | 'warn' | 'error' | 'debug' | 'trace'> | 'success'\n\ntype ColorMap = {\n [K in LogType]: {\n color: ColorName\n level: number\n }\n}\n\nfunction getLogLevel() {\n return typeof Number(process.env['LOG_LEVEL']) === 'number' && !Number.isNaN(Number(process.env['LOG_LEVEL']))\n ? Number(process.env['LOG_LEVEL'])\n : 30\n}\n\nconst colorMap: ColorMap = {\n info: { color: 'white', level: 30 },\n warn: { color: 'yellow', level: 20 },\n error: { color: 'red', level: 10 },\n debug: { color: 'blue', level: 50 },\n trace: { color: 'white', level: 40 },\n success: { color: 'green', level: 30 },\n}\n\nexport function log(msg: string, type: LogType = 'info', color?: ColorName) {\n const computedMsg = color ? chalk[color](msg) : chalk[colorMap[type].color](msg)\n const computedType = type === 'success' ? 'info' : type\n\n if (getLogLevel() >= colorMap[type].level) {\n console[computedType](computedMsg)\n }\n}\n","import { resolve } from 'node:path'\n\nexport const DOCPRESS_DIR = resolve(process.cwd(), 'docpress')\n\nexport const USER_REPOS_INFOS = resolve(process.cwd(), 'docpress/repositories.json')\n\nexport const USER_INFOS = resolve(process.cwd(), 'docpress/owner.json')\n\nexport const DOCS_DIR = resolve(process.cwd(), 'docpress/docs')\n\nexport const INDEX_FILE = resolve(process.cwd(), 'docpress/docs/index.md')\n\nexport const FORKS_FILE = resolve(process.cwd(), 'docpress/docs/forks.md')\n\nexport const VITEPRESS_CONFIG = resolve(process.cwd(), 'docpress/.vitepress/config.ts')\n\nexport const VITEPRESS_THEME = resolve(process.cwd(), 'docpress/.vitepress/theme')\n\nexport const VITEPRESS_USER_THEME = resolve(process.cwd(), 'docpress/.vitepress/theme/extras')\n\n// eslint-disable-next-line dot-notation\nexport const TEMPLATE_THEME = process.env['NODE_ENV'] === 'development'\n ? resolve(import.meta.dirname, '../../public/templates/theme')\n : resolve(import.meta.dirname, './templates/theme')\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join, resolve } from 'node:path'\nimport axios from 'axios'\nimport { rimrafSync } from 'rimraf'\nimport type { EnhancedRepository } from '../lib/fetch.js'\nimport type { getInfos } from '../lib/git.js'\nimport { USER_INFOS, USER_REPOS_INFOS } from './const.js'\n\nexport async function checkHttpStatus(url: string): Promise<number> {\n try {\n const response = await axios.head(url)\n return response.status\n } catch (error) {\n return error.response?.status || error.status || 500\n }\n}\n\ninterface PrettifyOpts {\n mode?: 'capitalize' | 'uppercase' | 'lowercase'\n replaceDash?: boolean\n removeIdx?: boolean\n}\n\nexport function prettify(s: string, opts: PrettifyOpts) {\n let u: string = ''\n\n if (opts?.removeIdx) {\n u = s.replace(/^\\d{2}-/, '')\n }\n\n if (opts?.replaceDash) {\n u = (u || s).replaceAll('-', ' ')\n }\n\n if (opts?.mode === 'capitalize') {\n u = (u || s).slice(0, 1).toUpperCase() + (u || s).slice(1).toLowerCase()\n } else if (opts?.mode === 'lowercase') {\n u = (u || s).toLowerCase()\n } else if (opts?.mode === 'uppercase') {\n u = (u || s).toUpperCase()\n }\n\n return u || s\n}\n\nexport function createDir(directory: string, { clean }: { clean?: boolean } = { clean: false }) {\n try {\n if (clean && existsSync(directory)) {\n rimrafSync(`${directory}/*`, { glob: true })\n }\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true })\n }\n } catch (err) {\n console.error(err)\n }\n}\n\nexport function isDir(path: string) {\n try {\n return statSync(path).isDirectory()\n } catch (_error) {\n return false\n }\n}\n\nexport function isFile(path: string) {\n try {\n return statSync(path).isFile()\n } catch (_error) {\n return false\n }\n}\n\nexport function extractFiles(paths: string[] | string): string[] {\n return (Array.isArray(paths) ? paths : [paths]).flatMap((path) => {\n if (isFile(path)) {\n return [path]\n }\n if (isDir(path)) {\n return readdirSync(path).flatMap(file => extractFiles(join(path, file)))\n }\n return []\n })\n}\n\nexport function getMdFiles(path: string[]) {\n return extractFiles(path).filter(file => basename(file).endsWith('.md'))\n}\n\nexport function prettifyEnum(arr: readonly string[]) {\n return arr.reduce((acc, cur, idx, arr) => {\n if (!idx) {\n return `\"${cur}\"`\n } else if (idx === arr.length - 1) {\n return `${acc} or \"${cur}\"`\n } else {\n return `${acc}, \"${cur}\"`\n }\n }, '')\n}\n\nexport function getUserInfos() {\n return JSON.parse(readFileSync(USER_INFOS).toString()) as Awaited<ReturnType<typeof getInfos>>['user']\n}\n\nexport function getUserRepos() {\n return JSON.parse(readFileSync(USER_REPOS_INFOS).toString()) as EnhancedRepository[]\n}\n\nexport function deepMerge<T extends Record<string, any> | null>(...objects: T[]): T {\n return objects.reduce((acc, obj) => {\n if (obj === null) {\n return acc\n }\n\n Object.keys(obj).forEach((key) => {\n const accValue = acc ? acc[key] : null\n const objValue = obj[key]\n\n if (isObject(accValue) && isObject(objValue)) {\n (acc as Record<string, any>)[key] = deepMerge(accValue, objValue)\n } else {\n (acc as Record<string, any>)[key] = objValue\n }\n })\n return acc\n }, {} as T)\n}\n\nexport function isObject(val: any): val is object {\n return val && typeof val === 'object' && !Array.isArray(val)\n}\n\nexport function loadConfigFile(configPath?: string) {\n if (!configPath) {\n return {}\n }\n try {\n const fullPath = resolve(process.cwd(), configPath)\n const fileContents = readFileSync(fullPath, 'utf8')\n return JSON.parse(fileContents)\n } catch (_error) {\n return {}\n }\n}\n\nexport function splitByComma(s: string) {\n return s.split(',')\n}\n","import { z } from 'zod'\nimport { fromZodError } from 'zod-validation-error'\nimport type { UserConfig } from 'vitepress'\nimport { loadConfigFile, prettifyEnum, splitByComma } from '../utils/functions.js'\nimport { log } from '../utils/logger.js'\n\nconst providers = ['github'] as const\n\nexport const configSchema = z.object({\n // Global\n username: z.string()\n .describe('Git provider username used to collect data.'),\n // Fetch\n branch: z.string()\n .describe('Branch used to collect Git provider data.')\n .default('main'),\n gitProvider: z.enum(providers)\n .describe(`Git provider used to retrieve data. Values should be ${prettifyEnum(providers)}.`)\n .default('github'),\n reposFilter: z.array(z.string())\n .describe('List of comma separated repositories to retrieve from Git provider. Default to all user\\'s public repositories.'),\n // Prepare\n extraHeaderPages: z.array(z.string())\n .describe('List of comma separated additional files or directories to process Vitepress header pages.'),\n extraPublicContent: z.array(z.string())\n .describe('List of comma separated additional files or directories to process Vitepress public folder.'),\n extraTheme: z.array(z.string())\n .describe('List of comma separated additional files or directories to use as Vitepress theme.'),\n forks: z.boolean()\n .describe('Whether or not to create the dedicated fork page that aggregate external contributions.')\n .default(false),\n vitepressConfig: z.any()\n .describe('Path to the vitepress configuration file.'),\n})\n\nexport type Config = Zod.infer<typeof configSchema>\n\nexport function applyGlobalOptsTransform(data: Cli) {\n const { config, vitepressConfig, token, ...rest } = data\n\n try {\n const loadedDPConfig = configSchema.partial().parse(loadConfigFile(config)) as Config\n const loadedVPConfig = loadConfigFile(vitepressConfig) as UserConfig\n const defaultConfig = configSchema.partial().required({ branch: true, gitProvider: true }).parse({})\n const vpConfig = {\n ...loadedVPConfig,\n ...loadedDPConfig.vitepressConfig,\n }\n const mergedConfig = {\n ...loadedDPConfig,\n ...defaultConfig,\n ...rest,\n ...(Object.keys(vpConfig).length && { vitepressConfig: vpConfig }),\n }\n const parsedConfig = configSchema.partial().required({ username: true }).parse(mergedConfig)\n\n return { ...parsedConfig, token }\n } catch (error) {\n log(` An error occurred while checking configuration.\\n ${fromZodError(error).toString()}`, 'error')\n process.exit(1)\n }\n}\n\nexport const cliSchema = configSchema\n .partial()\n .extend({\n config: z.string()\n .describe('Path to the docpress configuration file.')\n .optional(),\n token: z.string()\n .describe('Git provider token used to collect data.')\n .optional(),\n reposFilter: z.string()\n .describe(configSchema.shape.reposFilter.description || '')\n .transform(splitByComma)\n .optional(),\n extraHeaderPages: z.string()\n .describe(configSchema.shape.extraHeaderPages.description || '')\n .transform(splitByComma)\n .optional(),\n extraPublicContent: z.string()\n .describe(configSchema.shape.extraPublicContent.description || '')\n .transform(splitByComma)\n .optional(),\n extraTheme: z.string()\n .describe(configSchema.shape.extraTheme.description || '')\n .transform(splitByComma)\n .optional(),\n vitepressConfig: z.string()\n .describe(configSchema.shape.vitepressConfig.description || '')\n .optional(),\n })\n\nexport type Cli = Zod.infer<typeof cliSchema>\n\nexport const globalOptsSchema = cliSchema\n .partial()\n .transform(applyGlobalOptsTransform)\n\nexport type GlobalOpts = Required<Pick<Zod.infer<typeof globalOptsSchema>, 'branch' | 'gitProvider'>>\n & Omit<Zod.infer<typeof globalOptsSchema>, 'branch' | 'gitProvider'>\n","import { cliSchema } from './global.js'\n\nexport const buildOptsSchema = cliSchema\n .pick({})\n\nexport type BuildOpts = Zod.infer<typeof buildOptsSchema>\n","// import type { GlobalOpts } from './global.js'\nimport { applyGlobalOptsTransform, cliSchema } from './global.js'\n\nexport const fetchOptsSchema = cliSchema\n .pick({\n branch: true,\n config: true,\n gitProvider: true,\n reposFilter: true,\n token: true,\n username: true,\n })\n .transform(applyGlobalOptsTransform)\n\nexport type FetchOpts = Zod.infer<typeof fetchOptsSchema>\n","// import type { GlobalOpts } from './global.js'\nimport { applyGlobalOptsTransform, cliSchema } from './global.js'\n\nexport const prepareOptsSchema = cliSchema\n .pick({\n extraHeaderPages: true,\n extraPublicContent: true,\n extraTheme: true,\n config: true,\n gitProvider: true,\n reposFilter: true,\n token: true,\n username: true,\n vitepressConfig: true,\n })\n .transform(applyGlobalOptsTransform)\n\nexport type PrepareOpts = Zod.infer<typeof prepareOptsSchema>\n","import type { Command, Option } from 'commander'\nimport { fromZodError } from 'zod-validation-error'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport { globalOptsSchema } from '../schemas/global.js'\nimport type { BuildOpts } from '../schemas/build.js'\nimport { buildOptsSchema } from '../schemas/build.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { fetchOptsSchema } from '../schemas/fetch.js'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { prepareOptsSchema } from '../schemas/prepare.js'\nimport { log } from './logger.js'\n\ntype Cmd = 'fetch' | 'build' | 'prepare' | 'global'\n\ninterface Options {\n build: BuildOpts\n fetch: FetchOpts\n prepare: PrepareOpts\n global: GlobalOpts\n}\n\nexport const options = {\n build: buildOptsSchema,\n fetch: fetchOptsSchema,\n prepare: prepareOptsSchema,\n global: globalOptsSchema,\n}\n\nexport function parseOptions<T extends Cmd>(cmd: T, opts: Options[T]) {\n log(`Initializing Docpress...`, 'info', 'blue')\n log(`\\n\\n-> Checking for required environment settings and configurations.`, 'info')\n\n const res = options[cmd].safeParse(opts)\n if (res.error) {\n log(` An error occurred while checking configuration.\\n ${fromZodError(res.error).toString()}`, 'error')\n process.exit(1)\n }\n log(' Setup complete! Ready to process your documentation.', 'info')\n return res.data as Options[T]\n}\n\nexport function addOptions(cmd: Command, opts: Option[]) {\n opts.forEach(opt => cmd.addOption(opt))\n return cmd\n}\n","import { appendFileSync, cpSync, rmSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Octokit } from '@octokit/rest'\nimport { simpleGit } from 'simple-git'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { createDir } from '../utils/functions.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.js'\n\nexport async function getInfos({ username, token, branch }: Pick<FetchOpts, 'branch'> & Pick<GlobalOpts, 'token'> & Required<Pick<GlobalOpts, 'username'>>) {\n log(` Get infos for username '${username}'.`, 'info')\n const octokit = new Octokit({ auth: token })\n log(` Get user infos.`, 'debug')\n const { data: user } = await octokit.rest.users.getByUsername({ username })\n log(` Get repositories infos.`, 'debug')\n const { data: repos } = await octokit.rest.repos.listForUser({ username, sort: 'full_name' })\n\n return { user, repos, branch }\n}\n\nexport async function getContributors({\n repository,\n token,\n}: {\n repository: EnhancedRepository\n token: GlobalOpts['token']\n}) {\n log(` Get contributors infos for repository '${repository.name}'.`, 'info')\n const octokit = new Octokit({\n auth: token,\n log: {\n debug: () => {},\n info: () => {},\n warn: (message) => {\n if (!message.includes('404')) console.warn(message)\n },\n error: (message) => {\n if (!message.includes('404')) console.error(message)\n },\n },\n })\n const { data: repo } = await octokit.rest.repos.get({\n owner: repository.owner.login,\n repo: repository.name,\n })\n if (!repo.source?.owner?.login) {\n return { source: repo.source, contributors: [] }\n }\n const contributors: Array<any> = []\n try {\n for await (const { data } of octokit.paginate.iterator(\n octokit.rest.repos.listContributors,\n {\n owner: repo.source.owner.login,\n repo: repo.name,\n per_page: 500,\n },\n )) {\n contributors.push(...data)\n }\n } catch (_error) {\n log(\n ` Failed to get contributors infos for repository '${repository.name}'.`,\n 'warn',\n )\n return { source: repo.source, contributors: [] }\n }\n\n return { source: repo.source, contributors }\n}\n\nexport async function cloneRepo(name: string, url: string, projectDir: string, branch: string, includes: string[]) {\n createDir(projectDir, { clean: true })\n\n try {\n const git = simpleGit({ baseDir: projectDir })\n await git.init()\n .addConfig('core.sparseCheckout', 'true', true, 'local')\n .addRemote('origin', url)\n\n for (const item of includes) {\n log(` Add '${item}' to '${name}' sparse-checkout file.`, 'debug')\n appendFileSync(resolve(projectDir, '.git/info/sparse-checkout'), `${item}\\n`, 'utf8')\n }\n\n log(` Clone repository '${name}'.`, 'info')\n await git.pull('origin', branch)\n\n if (includes.some(item => item.includes('docs'))) {\n cpSync(resolve(projectDir, 'docs'), projectDir, { recursive: true })\n rmSync(resolve(projectDir, 'docs'), { recursive: true })\n }\n rmSync(resolve(projectDir, '.git'), { recursive: true })\n } catch (error) {\n log(` Error when cloning repository: ${error}.`, 'error')\n }\n}\n","import { resolve } from 'node:path'\nimport { writeFileSync } from 'node:fs'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { checkHttpStatus, createDir } from '../utils/functions.js'\nimport { DOCPRESS_DIR, DOCS_DIR, USER_INFOS, USER_REPOS_INFOS } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { cloneRepo, getInfos } from './git.js'\n\nexport type EnhancedRepository = Awaited<ReturnType<typeof getInfos>>['repos'][number] & {\n docpress: {\n branch: string\n filtered: boolean\n includes: string[]\n projectPath: string\n raw_url: string\n replace_url: string\n }\n}\n\nexport async function checkDoc(repoOwner: GlobalOpts['username'], repoName: string, branch: FetchOpts['branch']) {\n const rootReadmeUrl = `https://github.com/${repoOwner}/${repoName}/tree/${branch}/README.md`\n const docsFolderUrl = `https://github.com/${repoOwner}/${repoName}/tree/${branch}/docs`\n const docsReadmeUrl = `https://github.com/${repoOwner}/${repoName}/tree/${branch}/docs/01-readme.md`\n\n const rootReadmeStatus = await checkHttpStatus(rootReadmeUrl)\n const docsFolderStatus = await checkHttpStatus(docsFolderUrl)\n const docsReadmeStatus = await checkHttpStatus(docsReadmeUrl)\n\n return {\n rootReadmeStatus,\n docsFolderStatus,\n docsReadmeStatus,\n }\n}\n\nexport async function fetchDoc({ username, branch, reposFilter, token }: FetchOpts) {\n createDir(DOCPRESS_DIR, { clean: true })\n\n await getInfos({ username, token, branch })\n .then(async ({ user, repos, branch }) => generateInfos(user, repos, branch, reposFilter))\n .then(async ({ repos }) => getDoc(repos, reposFilter))\n}\n\nexport async function enhanceRepositories(repos: Awaited<ReturnType<typeof getInfos>>['repos'], branch?: FetchOpts['branch'], reposFilter?: FetchOpts['reposFilter']) {\n const enhancedRepos: EnhancedRepository[] = []\n\n await Promise.all(\n repos.map(async (repo) => {\n const computedBranch = branch ?? repo.default_branch ?? 'main'\n const projectPath = resolve(DOCS_DIR, repo.name)\n const filtered = isRepoFiltered(repo, reposFilter)\n let includes: string[] = []\n\n if (!repo.fork && !repo.private && !filtered) {\n includes = await getSparseCheckout(repo, computedBranch)\n }\n\n enhancedRepos.push({\n ...repo,\n docpress: {\n filtered,\n branch: computedBranch,\n includes,\n projectPath,\n raw_url: `https://raw.githubusercontent.com/${repo.owner.login}/${repo.name}/${computedBranch}`,\n replace_url: `https://github.com/${repo.owner.login}/${repo.name}/tree/${computedBranch}`,\n },\n })\n }),\n )\n\n return enhancedRepos\n}\n\nexport async function getSparseCheckout(repo: Awaited<ReturnType<typeof getInfos>>['repos'][number], branch: FetchOpts['branch']) {\n const docsStatus = await checkDoc(repo.owner.login, repo.name, branch)\n\n const includes: string[] = []\n if (Object.values(docsStatus).every(status => status === 404) || !repo.size) {\n return []\n }\n if (docsStatus.docsFolderStatus !== 404) {\n includes.push('docs/*')\n }\n if (docsStatus.docsFolderStatus === 404 || docsStatus.docsReadmeStatus === 404) {\n includes.push('README.md', '!*/**/README.md')\n }\n return includes\n}\n\nexport async function generateInfos(user: Awaited<ReturnType<typeof getInfos>>['user'], repos: Awaited<ReturnType<typeof getInfos>>['repos'], branch?: FetchOpts['branch'], reposFilter?: FetchOpts['reposFilter']) {\n writeFileSync(USER_INFOS, JSON.stringify(user, null, 2))\n\n const enhancedRepos = await enhanceRepositories(repos, branch, reposFilter)\n writeFileSync(USER_REPOS_INFOS, JSON.stringify(enhancedRepos, null, 2))\n\n return { user, repos: enhancedRepos }\n}\n\nexport async function getDoc(repos?: EnhancedRepository[], reposFilter?: FetchOpts['reposFilter']) {\n if (!repos) {\n log(` No repository respect docpress rules.`, 'warn')\n return\n }\n\n await Promise.all(\n repos\n .filter(repo => !isRepoFiltered(repo, reposFilter))\n .map(async (repo) => {\n await cloneRepo(repo.name, repo.clone_url as string, repo.docpress.projectPath, repo.docpress.branch, repo.docpress.includes)\n }),\n )\n}\n\nexport function isRepoFiltered(repo: EnhancedRepository | Awaited<ReturnType<typeof getInfos>>['repos'][number], reposFilter?: FetchOpts['reposFilter']) {\n const hasOnlyExclusions = reposFilter?.every(filter => filter.startsWith('!'))\n const isExcluded = reposFilter?.filter(filter => filter.startsWith('!'))\n .some(filter => repo.name === filter.substring(1))\n const isIncluded = !reposFilter\n || reposFilter?.filter(filter => !filter.startsWith('!')).includes(repo.name)\n || (repo.fork && !isExcluded)\n || (hasOnlyExclusions && !isExcluded)\n\n const isFiltered = isExcluded || !isIncluded\n\n if ('docpress' in repo && !repo.docpress.includes.length) {\n return true\n }\n\n if (!!repo.clone_url && !repo.private && !isFiltered) {\n return false\n }\n return true\n}\n","import { createOption } from 'commander'\nimport { globalOptsSchema } from '../schemas/global.js'\n\nexport const globalOpts = [\n createOption('-C, --config <string>', globalOptsSchema.innerType().shape.config._def.description),\n createOption('-T, --token <string>', globalOptsSchema.innerType().shape.token._def.description),\n createOption('-U, --username <string>', globalOptsSchema.innerType().shape.username._def.description),\n]\n","import { createCommand, createOption } from 'commander'\nimport { log } from '../utils/logger.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { fetchDoc } from '../lib/fetch.js'\nimport { configSchema } from '../schemas/global.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'fetch'\n\nexport const fetchOpts = [\n createOption('-b, --branch <string>', configSchema.shape.branch._def.description)\n .default(configSchema.shape.branch._def.defaultValue()),\n createOption('-g, --git-provider <string>', configSchema.shape.gitProvider._def.description)\n .default(configSchema.shape.gitProvider._def.defaultValue()),\n createOption('-r, --repos-filter <string>', configSchema.shape.reposFilter._def.description),\n]\n\nexport const fetchCmd = addOptions(createCommand(cmdName), [...fetchOpts, ...globalOpts])\n .description('Fetch docs with the given username and git provider.')\n .action(async (opts) => {\n const parsedOpts = parseOptions(cmdName, opts)\n await main(parsedOpts)\n })\n\nexport async function main(opts: FetchOpts) {\n const { username, reposFilter, token, branch, gitProvider } = opts\n log(`\\n-> Start fetching documentation files. This may take a moment, especially for larger repositories.`, 'info')\n\n await fetchDoc({ username, branch, reposFilter, gitProvider, token })\n}\n","import { build as vitepressBuild } from 'vitepress'\nimport { createCommand } from 'commander'\nimport { addOptions } from '../utils/commands.js'\nimport { DOCPRESS_DIR } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'build'\n\nexport const buildOpts = []\n\nexport const buildCmd = addOptions(createCommand(cmdName), globalOpts)\n .description('Build vitepress website.')\n .action(async (_opts) => {\n await main()\n })\n\nexport async function main() {\n log(`\\n-> Start building Vitepress website.\\n\\n`, 'info')\n\n try {\n await vitepressBuild(DOCPRESS_DIR)\n log(`\\n\\nDocpress build succedeed.`, 'success')\n } catch (error) {\n log(`\\n\\nDocpress build failed : ${error}`, 'error')\n }\n}\n","import type { defineConfig } from 'vitepress'\nimport { deepMerge } from '../utils/functions.js'\nimport type { Page, SidebarProject } from './prepare.js'\n\nconst defaultVitepressConfig: ReturnType<typeof defineConfig> = {\n base: '/',\n lang: 'en-US',\n vite: {\n publicDir: '../public',\n },\n title: 'Home',\n description: 'Docpress',\n srcDir: './docs',\n cleanUrls: false,\n ignoreDeadLinks: 'localhostLinks',\n themeConfig: {\n outline: [2, 3],\n search: {\n provider: 'local',\n options: {\n translations: {\n button: {\n buttonText: 'Search...',\n buttonAriaLabel: 'Search',\n },\n modal: {\n backButtonTitle: 'erase search',\n displayDetails: 'show details',\n noResultsText: 'No results for : ',\n resetButtonTitle: 'cancel search',\n footer: {\n selectText: 'go to',\n navigateText: 'navigate in results',\n closeText: 'close',\n },\n },\n },\n },\n },\n },\n}\n\nexport function getVitepressConfig(sidebar: SidebarProject[], nav: Page[], vitepressConfig?: ReturnType<typeof defineConfig>): Partial<ReturnType<typeof defineConfig>> {\n return vitepressConfig\n ? deepMerge(defaultVitepressConfig, vitepressConfig, { themeConfig: { sidebar, nav } })\n : deepMerge(defaultVitepressConfig, { themeConfig: { sidebar, nav } })\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { createDir } from './functions.js'\n\nexport function generateFile(src: string, dest: string) {\n const content = readFileSync(src, { encoding: 'utf8' })\n createDir(dirname(dest))\n writeFileSync(dest, content)\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\n\nexport function replaceRelativePath(file: string, url: string) {\n const fileContent = readFileSync(file, 'utf8')\n const updatedContent = fileContent.replace(/\\[([^\\]]+)\\]\\(\\.\\.\\/([^)]+)\\)/g, (_match, p1, p2) => {\n return `[${p1}](${url}/${p2})`\n })\n writeFileSync(file, updatedContent, 'utf8')\n}\n\nexport function replaceReadmePath(file: string, url: string) {\n const readmeContent = readFileSync(file, 'utf8')\n const updatedContent = readmeContent\n .replace(/\\[([^\\]]+)\\]\\((?!\\.?\\/docs\\/|docs\\/|http|#)(\\.?\\/)?([^/][^)]+)\\)/g, (_match, p1, _p2, p3) => {\n return `[${p1}](${url}/${p3})`\n })\n .replace(/\\[([^\\]]+)\\]\\((\\.?\\/docs\\/|docs\\/)([^)]*)\\)/g, (_match, p1, _p2, p3) => {\n return `[${p1}](${p3})`\n })\n writeFileSync(file, updatedContent, 'utf8')\n}\n","import { basename, dirname, parse, resolve } from 'node:path'\nimport { appendFileSync, cpSync, readdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs'\nimport YAML from 'yaml'\nimport type { defineConfig } from 'vitepress'\nimport { generateFile } from '../utils/templates.js'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { getUserInfos } from '../utils/functions.js'\nimport { createDir, extractFiles, getMdFiles, prettify } from '../utils/functions.js'\nimport { DOCS_DIR, FORKS_FILE, INDEX_FILE, TEMPLATE_THEME, VITEPRESS_CONFIG, VITEPRESS_THEME } from '../utils/const.js'\nimport { replaceReadmePath, replaceRelativePath } from '../utils/regex.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.js'\nimport type { getInfos } from './git.js'\nimport { getContributors } from './git.js'\n\nexport interface Page {\n text: string\n link: string\n}\n\nexport interface SidebarProject {\n text: string\n collapsed: boolean\n items: Page[]\n}\n\nexport interface Feature {\n title: string\n details: string\n link: string\n}\n\nexport interface Index {\n layout: string\n hero: {\n name: string\n tagline: string\n }\n features: Feature[]\n}\n\nfunction addSources(repoUrl: string, outputPath: string) {\n const fileName = basename(outputPath)\n const title = fileName === 'introduction.md' ? '\\n## Sources' : '# Sources'\n\n const sourcesContent = `${title}\\n\\nTake a look at the [project sources](${repoUrl}).\\n`\n\n appendFileSync(outputPath, sourcesContent, 'utf8')\n}\n\n// export function addContribution(outputPath: string) {\n// const sourcesContent = `\n// If you'd like to improve or fix the code, check out the [contribution guidelines](/contribute).\n// `\n\n// appendFileSync(outputPath, sourcesContent, 'utf8')\n// }\n\nexport function generateIndex(features: Feature[], user: ReturnType<typeof getUserInfos>) {\n const { name, login, bio } = user\n return {\n layout: 'home',\n hero: {\n name: name ? `${name}'s projects` : `${login}'s projects`,\n tagline: bio ?? 'Robots are everywhere 🤖', // \\U0001F916\n },\n features,\n }\n}\n\nexport function generateFeatures(repoName: string, description: string, features?: Feature[]) {\n const content = {\n title: prettify(repoName, { mode: 'capitalize', replaceDash: true }),\n details: description,\n link: `/${repoName}/introduction`,\n }\n\n return features ? [...features, content] : [content]\n}\n\nexport function generateSidebarProject(repoName: string, sidebarPages: Page[]) {\n return {\n text: prettify(repoName, { mode: 'capitalize', replaceDash: true }),\n collapsed: true,\n items: sidebarPages,\n }\n}\n\nexport function generateSidebarPages(repoName: string, fileName: string, sidebarPages?: Page[]) {\n const content = {\n text: fileName === 'introduction' ? 'Introduction' : prettify(fileName, { mode: 'capitalize', replaceDash: true }),\n link: `/${repoName}/${fileName}`,\n }\n\n return sidebarPages ? [...sidebarPages, content] : [content]\n}\n\nexport function transformDoc(repositories: EnhancedRepository[], user: ReturnType<typeof getUserInfos>) {\n const features: Feature[] = []\n const sidebar: SidebarProject[] = []\n\n for (const repository of repositories) {\n log(` Replace urls for repository '${repository.name}'.`, 'info')\n getMdFiles([repository.docpress.projectPath]).forEach((file) => {\n log(` Processing file '${basename(file)}' for repository '${repository.name}'.`, 'debug')\n replaceRelativePath(file, `https://github.com/${repository.owner.login}/${repository.name}/tree/${repository.docpress.branch}`)\n\n if (basename(file).toLowerCase() === 'readme.md') {\n replaceReadmePath(file, `https://github.com/${repository.owner.login}/${repository.name}/tree/${repository.docpress.branch}`)\n }\n })\n\n log(` Generate sidebar for repository '${repository.name}'.`, 'info')\n const sidebarItems = readdirSync(repository.docpress.projectPath)\n .filter((file) => {\n return statSync(resolve(repository.docpress.projectPath, file)).isFile()\n && basename(resolve(repository.docpress.projectPath, file)).endsWith('.md')\n })\n .sort((a, b) => a.localeCompare(b))\n .reduce((acc: Page[], cur, idx, arr) => {\n const file = resolve(repository.docpress.projectPath, cur)\n let filename = prettify(basename(file), { mode: 'lowercase', removeIdx: true })\n\n if (filename === 'readme.md') {\n filename = 'introduction.md'\n }\n if (filename !== basename(file)) {\n renameSync(file, resolve(dirname(file), filename))\n }\n\n if (idx === arr.length - 1) {\n let sourceFile\n if (arr.length > 1) {\n sourceFile = resolve(repository.docpress.projectPath, 'sources.md')\n log(` Add sources for repository '${repository.name}'.`, 'info')\n addSources(repository.html_url, sourceFile)\n\n return generateSidebarPages(\n repository.name,\n parse(sourceFile).name,\n generateSidebarPages(repository.name, parse(filename).name, acc),\n )\n }\n sourceFile = resolve(repository.docpress.projectPath, filename)\n addSources(repository.html_url, sourceFile)\n }\n\n return generateSidebarPages(repository.name, parse(filename).name, acc)\n }, [])\n\n sidebar.push(generateSidebarProject(repository.name, sidebarItems))\n features.push(...generateFeatures(repository.name, repository.description || ''))\n }\n\n log(` Generate index content.`, 'info')\n const index = generateIndex(features.sort((a, b) => a.title.localeCompare(b.title)), user)\n return {\n sidebar: sidebar.sort((a, b) => a.text.localeCompare(b.text)),\n index,\n }\n}\n\nexport function addExtraPages(paths: string[]) {\n const files = getMdFiles(paths)\n const nav: Page[] = []\n\n log(` Add extras Vitepress headers pages.`, 'info')\n for (const file of files) {\n log(` Processing file '${file}'.`, 'debug')\n const src = resolve(process.cwd(), file)\n const dest = resolve(DOCS_DIR, prettify(basename(file), { mode: 'lowercase', removeIdx: true }))\n cpSync(src, dest)\n nav.push({\n text: prettify(parse(src).name, { replaceDash: true, removeIdx: true }),\n link: `/${prettify(parse(src).name, { removeIdx: true, mode: 'lowercase' })}`,\n })\n }\n return nav\n}\n\nexport function addContent(paths: string | string[], dir: string, fn?: () => void) {\n for (const path of Array.isArray(paths) ? paths : [paths]) {\n const absolutePath = resolve(process.cwd(), path)\n const files = extractFiles(absolutePath)\n\n for (const file of files) {\n const formattedFile = file.replace(absolutePath, '.')\n log(` Processing file '${formattedFile}' for entry '${path}'.`, 'debug')\n const src = resolve(process.cwd(), file)\n const dest = resolve(dir, formattedFile)\n if (fn) {\n fn()\n }\n cpSync(src, dest)\n }\n }\n}\n\nexport function addForkPage(forks: { repository: Awaited<ReturnType<typeof getInfos>>['repos'][number], contributions: number }[]) {\n const separator = '---\\n'\n const header = 'layout: fork-page\\nrepoList:\\n'\n const text = '\\n# External contributions\\n\\nThis gallery is a visual representation of the collaborative work done across a variety of open-source projects, each driven by a shared passion for innovation and community growth.\\n\\nEvery tile below represents a unique project where contributions have been made-ranging from code enhancements to documentation improvements. Each project includes a summary of its goals, features, and links to GitHub for direct access.\\n\\nThis page serves as both a portfolio of past work and a resource for revisiting projects that have made a meaningful impact.\\n'\n const frontmatter = forks.map(({ repository, contributions }) => {\n const { name, owner, html_url, description, stargazers_count } = repository\n return { name, owner: owner.login, html_url, description, stargazers_count, contributions }\n })\n log(` Generate forks page.`, 'info')\n writeFileSync(FORKS_FILE, separator.concat(header, YAML.stringify(frontmatter), separator, text))\n}\n\ntype Source = Required<Awaited<ReturnType<typeof getContributors>>['source']>\n\ntype AdaptedLicense = Omit<NonNullable<Source>['license'], 'spdx_id'> & { spdx_id?: string }\n\ntype AdaptedRepository = Omit<NonNullable<Source>, 'license'> & { license: AdaptedLicense }\n\nexport async function processForks(repositories: EnhancedRepository[], username: GlobalOpts['username'], token?: GlobalOpts['token']) {\n const forks = await Promise.all(\n repositories.map(async (repository) => {\n const { source, contributors } = await getContributors({ repository, token })\n return {\n contributions: contributors?.find(contributor => contributor.login === username)?.contributions ?? 0,\n repository: source as AdaptedRepository,\n }\n }),\n ).then(f => f.filter(({ repository, contributions }) => !!repository && contributions))\n\n addForkPage(forks)\n}\n\nexport function parseVitepressConfig(path: string) {\n return JSON.parse(readFileSync(resolve(process.cwd(), path)).toString())\n}\n\nexport function generateVitepressFiles(vitepressConfig: Partial<ReturnType<typeof defineConfig>>, index: Index) {\n const separator = '---\\n'\n createDir(dirname(VITEPRESS_CONFIG))\n\n log(` Generate Vitepress config.`, 'info')\n writeFileSync(VITEPRESS_CONFIG, `export default ${JSON.stringify(vitepressConfig, null, 2)}\\n`)\n log(` Generate index file.`, 'info')\n writeFileSync(INDEX_FILE, separator.concat(YAML.stringify(index), separator))\n log(` Add Docpress theme files.`, 'info')\n return extractFiles(TEMPLATE_THEME).forEach((path) => {\n const relativePath = path.replace(`${TEMPLATE_THEME}/`, '')\n generateFile(path, resolve(VITEPRESS_THEME, relativePath))\n })\n}\n","import { resolve } from 'node:path'\nimport { createCommand, createOption } from 'commander'\nimport type { EnhancedRepository } from '../lib/fetch.js'\nimport { configSchema } from '../schemas/global.js'\nimport { DOCPRESS_DIR, VITEPRESS_USER_THEME } from '../utils/const.js'\nimport { getUserInfos, getUserRepos } from '../utils/functions.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport { getVitepressConfig } from '../lib/vitepress.js'\nimport { addContent, addExtraPages, generateVitepressFiles, processForks, transformDoc } from '../lib/prepare.js'\nimport type { Page } from '../lib/prepare.js'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { log } from '../utils/logger.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'prepare'\n\nexport const prepareOpts = [\n createOption('-c, --extra-public-content <string>', configSchema.shape.extraPublicContent._def.description),\n createOption('-f, --forks', configSchema.shape.forks._def.description),\n createOption('-p, --extra-header-pages <string>', configSchema.shape.extraHeaderPages._def.description),\n createOption('-t, --extra-theme <string>', configSchema.shape.extraTheme._def.description),\n createOption('-v, --vitepress-config <string>', configSchema.shape.vitepressConfig._def.description),\n]\n\nexport const prepareCmd = addOptions(createCommand(cmdName), [...prepareOpts, ...globalOpts])\n .description('Transform doc to the target vitepress format.')\n .action(async (opts) => {\n const parsedOpts = parseOptions(cmdName, opts)\n await main(parsedOpts)\n })\n\nexport async function main(opts: PrepareOpts) {\n const { extraHeaderPages, extraPublicContent, extraTheme, vitepressConfig, forks, token, username } = opts\n log(`\\n-> Start transform files to prepare Vitepress build.`, 'info')\n\n const user = getUserInfos()\n const repositories = getUserRepos()\n .reduce(({ internals, forks }: { internals: EnhancedRepository[], forks: EnhancedRepository[] }, cur) => {\n const { clone_url, private: privateRepo, fork, docpress } = cur\n if (clone_url && !privateRepo && !docpress.filtered) {\n if (!fork && docpress.includes.length) {\n return { internals: [...internals, cur], forks }\n } else if (fork) {\n return { internals, forks: [...forks, cur] }\n }\n }\n return { internals, forks }\n }, { internals: [], forks: [] })\n\n const { sidebar, index } = transformDoc(repositories.internals, user)\n const nav: Page[] = []\n\n if (extraHeaderPages) {\n const pages = addExtraPages(extraHeaderPages)\n if (forks) {\n nav.push(...pages.filter(p => p.link !== '/forks'))\n } else {\n nav.push(...pages)\n }\n }\n if (extraPublicContent) {\n log(` Add extras Vitepress public folder content.`, 'info')\n addContent(extraPublicContent, resolve(DOCPRESS_DIR, 'public'))\n }\n if (extraTheme) {\n log(` Add extras Vitepress theme files.`, 'info')\n addContent(extraTheme, resolve(VITEPRESS_USER_THEME))\n }\n if (forks && username) {\n log(` Add fork page to display external contributions.`, 'info')\n await processForks(repositories.forks, username, token)\n nav.push({ text: 'Forks', link: '/forks' })\n }\n\n const config = getVitepressConfig(sidebar, nav, vitepressConfig)\n\n generateVitepressFiles(config, index)\n}\n","import { Command } from 'commander'\nimport pkg from '../package.json' with { type: 'json' }\nimport { fetchCmd, main as fetchFn, fetchOpts } from './commands/fetch.js'\nimport { buildCmd, main as buildFn } from './commands/build.js'\nimport { prepareCmd, main as prepareFn, prepareOpts } from './commands/prepare.js'\nimport { addOptions, parseOptions } from './utils/commands.js'\nimport { globalOpts } from './commands/global.js'\n\n// const options = {\n// fetchOpts: [\n// createOption('-b, --branch <string>', configSchema.shape.branch._def.description)\n// .default(configSchema.shape.branch._def.defaultValue()),\n// createOption('-g, --git-provider <string>', configSchema.shape.gitProvider._def.description)\n// .default(configSchema.shape.gitProvider._def.defaultValue()),\n// createOption('-r, --repos-filter <string>', configSchema.shape.reposFilter._def.description),\n// ],\n// }\n\nexport function getProgram() {\n const pm = new Command()\n .name('docpress')\n .description('Build your doc website faster than light ⚡️⚡️⚡️')\n .version(`${pkg.version}`)\n .action(async (opts, _cmd) => {\n const parsedOpts = parseOptions('global', opts)\n await fetchFn(parsedOpts)\n await prepareFn(parsedOpts)\n await buildFn()\n })\n .configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n showGlobalOptions: true,\n })\n .enablePositionalOptions()\n .passThroughOptions()\n .addCommand(fetchCmd)\n .addCommand(prepareCmd)\n .addCommand(buildCmd)\n\n addOptions(pm, [...fetchOpts, ...prepareOpts, ...globalOpts])\n\n return pm\n}\n\nexport function main() {\n const pm = getProgram()\n pm.parseAsync(process.argv)\n}\n"],"names":["getLogLevel","colorMap","log","msg","type","color","computedMsg","chalk","computedType","DOCPRESS_DIR","resolve","USER_REPOS_INFOS","USER_INFOS","DOCS_DIR","INDEX_FILE","FORKS_FILE","VITEPRESS_CONFIG","VITEPRESS_THEME","VITEPRESS_USER_THEME","TEMPLATE_THEME","checkHttpStatus","url","axios","error","prettify","s","opts","u","createDir","directory","clean","existsSync","rimrafSync","mkdirSync","err","isDir","path","statSync","isFile","extractFiles","paths","readdirSync","file","join","getMdFiles","basename","prettifyEnum","arr","acc","cur","idx","getUserInfos","readFileSync","getUserRepos","deepMerge","objects","obj","key","accValue","objValue","isObject","val","loadConfigFile","configPath","fullPath","fileContents","splitByComma","providers","configSchema","z","applyGlobalOptsTransform","data","config","vitepressConfig","token","rest","loadedDPConfig","loadedVPConfig","defaultConfig","vpConfig","mergedConfig","fromZodError","cliSchema","globalOptsSchema","buildOptsSchema","fetchOptsSchema","prepareOptsSchema","options","parseOptions","cmd","res","addOptions","opt","getInfos","username","branch","octokit","Octokit","user","repos","getContributors","repository","message","repo","contributors","cloneRepo","name","projectDir","includes","git","simpleGit","item","appendFileSync","cpSync","rmSync","checkDoc","repoOwner","repoName","rootReadmeUrl","docsFolderUrl","docsReadmeUrl","rootReadmeStatus","docsFolderStatus","docsReadmeStatus","fetchDoc","reposFilter","generateInfos","getDoc","enhanceRepositories","enhancedRepos","computedBranch","projectPath","filtered","isRepoFiltered","getSparseCheckout","docsStatus","status","writeFileSync","hasOnlyExclusions","filter","isExcluded","isIncluded","isFiltered","globalOpts","createOption","cmdName","fetchOpts","fetchCmd","createCommand","parsedOpts","main","gitProvider","buildCmd","_opts","vitepressBuild","defaultVitepressConfig","getVitepressConfig","sidebar","nav","generateFile","src","dest","content","dirname","replaceRelativePath","updatedContent","_match","p1","p2","replaceReadmePath","_p2","p3","addSources","repoUrl","outputPath","sourcesContent","generateIndex","features","login","bio","generateFeatures","description","generateSidebarProject","sidebarPages","generateSidebarPages","fileName","transformDoc","repositories","sidebarItems","b","filename","renameSync","sourceFile","parse","index","a","addExtraPages","files","addContent","dir","fn","absolutePath","formattedFile","addForkPage","forks","separator","header","text","frontmatter","contributions","owner","html_url","stargazers_count","YAML","processForks","source","contributor","f","generateVitepressFiles","relativePath","prepareOpts","prepareCmd","extraHeaderPages","extraPublicContent","extraTheme","internals","clone_url","privateRepo","fork","docpress","pages","p","getProgram","pm","Command","pkg","_cmd","fetchFn","prepareFn","buildFn"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sources":["../src/utils/logger.ts","../src/utils/const.ts","../src/utils/functions.ts","../src/schemas/global.ts","../src/schemas/build.ts","../src/schemas/fetch.ts","../src/schemas/prepare.ts","../src/utils/commands.ts","../src/lib/git.ts","../src/lib/fetch.ts","../src/commands/global.ts","../src/commands/fetch.ts","../src/commands/build.ts","../src/lib/vitepress.ts","../src/utils/templates.ts","../src/utils/regex.ts","../src/lib/prepare.ts","../src/commands/prepare.ts","../src/cli.ts"],"sourcesContent":["/* eslint-disable dot-notation */\nimport type { ColorName } from 'chalk'\nimport chalk from 'chalk'\n\ntype LogType = keyof Pick<Console, 'info' | 'warn' | 'error' | 'debug' | 'trace'> | 'success'\n\ntype ColorMap = {\n [K in LogType]: {\n color: ColorName\n level: number\n }\n}\n\nfunction getLogLevel() {\n return typeof Number(process.env['LOG_LEVEL']) === 'number' && !Number.isNaN(Number(process.env['LOG_LEVEL']))\n ? Number(process.env['LOG_LEVEL'])\n : 30\n}\n\nconst colorMap: ColorMap = {\n info: { color: 'white', level: 30 },\n warn: { color: 'yellow', level: 20 },\n error: { color: 'red', level: 10 },\n debug: { color: 'blue', level: 50 },\n trace: { color: 'white', level: 40 },\n success: { color: 'green', level: 30 },\n}\n\nexport function log(msg: string, type: LogType = 'info', color?: ColorName) {\n const computedMsg = color ? chalk[color](msg) : chalk[colorMap[type].color](msg)\n const computedType = type === 'success' ? 'info' : type\n\n if (getLogLevel() >= colorMap[type].level) {\n console[computedType](computedMsg)\n }\n}\n","import { resolve } from 'node:path'\n\nexport const DOCPRESS_DIR = resolve(process.cwd(), 'docpress')\n\nexport const USER_REPOS_INFOS = resolve(process.cwd(), 'docpress/repositories.json')\n\nexport const USER_INFOS = resolve(process.cwd(), 'docpress/owner.json')\n\nexport const DOCS_DIR = resolve(process.cwd(), 'docpress/docs')\n\nexport const INDEX_FILE = resolve(process.cwd(), 'docpress/docs/index.md')\n\nexport const FORKS_FILE = resolve(process.cwd(), 'docpress/docs/forks.md')\n\nexport const VITEPRESS_CONFIG = resolve(process.cwd(), 'docpress/.vitepress/config.ts')\n\nexport const VITEPRESS_THEME = resolve(process.cwd(), 'docpress/.vitepress/theme')\n\nexport const VITEPRESS_USER_THEME = resolve(process.cwd(), 'docpress/.vitepress/theme/extras')\n\n// eslint-disable-next-line dot-notation\nexport const TEMPLATE_THEME = process.env['NODE_ENV'] === 'development'\n ? resolve(import.meta.dirname, '../../public/templates/theme')\n : resolve(import.meta.dirname, './templates/theme')\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join, resolve } from 'node:path'\nimport axios from 'axios'\nimport { rimrafSync } from 'rimraf'\nimport type { EnhancedRepository } from '../lib/fetch.js'\nimport type { getInfos } from '../lib/git.js'\nimport { USER_INFOS, USER_REPOS_INFOS } from './const.js'\n\nexport async function checkHttpStatus(url: string): Promise<number> {\n try {\n const response = await axios.head(url)\n return response.status\n } catch (error) {\n return error.response?.status || error.status || 500\n }\n}\n\ninterface PrettifyOpts {\n mode?: 'capitalize' | 'uppercase' | 'lowercase'\n replaceDash?: boolean\n removeIdx?: boolean\n removeDot?: boolean\n}\n\nexport function prettify(s: string, opts: PrettifyOpts) {\n let u: string = ''\n\n if (s.startsWith('.') && opts?.removeDot) {\n u = s.slice(1)\n }\n\n if (opts?.removeIdx) {\n u = s.replace(/^\\d{2}-/, '')\n }\n\n if (opts?.replaceDash) {\n u = (u || s).replaceAll('-', ' ')\n }\n\n if (opts?.mode === 'capitalize') {\n u = (u || s).slice(0, 1).toUpperCase() + (u || s).slice(1).toLowerCase()\n } else if (opts?.mode === 'lowercase') {\n u = (u || s).toLowerCase()\n } else if (opts?.mode === 'uppercase') {\n u = (u || s).toUpperCase()\n }\n\n return u || s\n}\n\nexport function createDir(directory: string, { clean }: { clean?: boolean } = { clean: false }) {\n try {\n if (clean && existsSync(directory)) {\n rimrafSync(`${directory}/*`, { glob: true })\n }\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true })\n }\n } catch (err) {\n console.error(err)\n }\n}\n\nexport function isDir(path: string) {\n try {\n return statSync(path).isDirectory()\n } catch (_error) {\n return false\n }\n}\n\nexport function isFile(path: string) {\n try {\n return statSync(path).isFile()\n } catch (_error) {\n return false\n }\n}\n\nexport function extractFiles(paths: string[] | string): string[] {\n return (Array.isArray(paths) ? paths : [paths]).flatMap((path) => {\n if (isFile(path)) {\n return [path]\n }\n if (isDir(path)) {\n return readdirSync(path).flatMap(file => extractFiles(join(path, file)))\n }\n return []\n })\n}\n\nexport function getMdFiles(path: string[]) {\n return extractFiles(path).filter(file => basename(file).endsWith('.md'))\n}\n\nexport function prettifyEnum(arr: readonly string[]) {\n return arr.reduce((acc, cur, idx, arr) => {\n if (!idx) {\n return `\"${cur}\"`\n } else if (idx === arr.length - 1) {\n return `${acc} or \"${cur}\"`\n } else {\n return `${acc}, \"${cur}\"`\n }\n }, '')\n}\n\nexport function getUserInfos() {\n return JSON.parse(readFileSync(USER_INFOS).toString()) as Awaited<ReturnType<typeof getInfos>>['user']\n}\n\nexport function getUserRepos() {\n return JSON.parse(readFileSync(USER_REPOS_INFOS).toString()) as EnhancedRepository[]\n}\n\nexport function deepMerge<T extends Record<string, any> | null>(...objects: T[]): T {\n return objects.reduce((acc, obj) => {\n if (obj === null) {\n return acc\n }\n\n Object.keys(obj).forEach((key) => {\n const accValue = acc ? acc[key] : null\n const objValue = obj[key]\n\n if (isObject(accValue) && isObject(objValue)) {\n (acc as Record<string, any>)[key] = deepMerge(accValue, objValue)\n } else {\n (acc as Record<string, any>)[key] = objValue\n }\n })\n return acc\n }, {} as T)\n}\n\nexport function isObject(val: any): val is object {\n return val && typeof val === 'object' && !Array.isArray(val)\n}\n\nexport function loadConfigFile(configPath?: string) {\n if (!configPath) {\n return {}\n }\n try {\n const fullPath = resolve(process.cwd(), configPath)\n const fileContents = readFileSync(fullPath, 'utf8')\n return JSON.parse(fileContents)\n } catch (_error) {\n return {}\n }\n}\n\nexport function splitByComma(s: string) {\n return s.split(',')\n}\n","import { z } from 'zod'\nimport { fromZodError } from 'zod-validation-error'\nimport type { UserConfig } from 'vitepress'\nimport { loadConfigFile, prettifyEnum, splitByComma } from '../utils/functions.js'\nimport { log } from '../utils/logger.js'\n\nconst providers = ['github'] as const\n\nexport const configSchema = z.object({\n // Global\n username: z.string()\n .describe('Git provider username used to collect data.'),\n // Fetch\n branch: z.string()\n .describe('Branch used to collect Git provider data.')\n .default('main'),\n gitProvider: z.enum(providers)\n .describe(`Git provider used to retrieve data. Values should be ${prettifyEnum(providers)}.`)\n .default('github'),\n reposFilter: z.array(z.string())\n .describe('List of comma separated repositories to retrieve from Git provider. Default to all user\\'s public repositories.'),\n // Prepare\n extraHeaderPages: z.array(z.string())\n .describe('List of comma separated additional files or directories to process Vitepress header pages.'),\n extraPublicContent: z.array(z.string())\n .describe('List of comma separated additional files or directories to process Vitepress public folder.'),\n extraTheme: z.array(z.string())\n .describe('List of comma separated additional files or directories to use as Vitepress theme.'),\n forks: z.boolean()\n .describe('Whether or not to create the dedicated fork page that aggregate external contributions.')\n .default(false),\n vitepressConfig: z.any()\n .describe('Path to the vitepress configuration file.'),\n})\n\nexport type Config = Zod.infer<typeof configSchema>\n\nexport function applyGlobalOptsTransform(data: Cli) {\n const { config, vitepressConfig, token, ...rest } = data\n\n try {\n const loadedDPConfig = configSchema.partial().parse(loadConfigFile(config)) as Config\n const loadedVPConfig = loadConfigFile(vitepressConfig) as UserConfig\n const defaultConfig = configSchema.partial().required({ branch: true, gitProvider: true }).parse({})\n const vpConfig = {\n ...loadedVPConfig,\n ...loadedDPConfig.vitepressConfig,\n }\n const mergedConfig = {\n ...loadedDPConfig,\n ...defaultConfig,\n ...rest,\n ...(Object.keys(vpConfig).length && { vitepressConfig: vpConfig }),\n }\n const parsedConfig = configSchema.partial().required({ username: true }).parse(mergedConfig)\n\n return { ...parsedConfig, token }\n } catch (error) {\n log(` An error occurred while checking configuration.\\n ${fromZodError(error).toString()}`, 'error')\n process.exit(1)\n }\n}\n\nexport const cliSchema = configSchema\n .partial()\n .extend({\n config: z.string()\n .describe('Path to the docpress configuration file.')\n .optional(),\n token: z.string()\n .describe('Git provider token used to collect data.')\n .optional(),\n reposFilter: z.string()\n .describe(configSchema.shape.reposFilter.description || '')\n .transform(splitByComma)\n .optional(),\n extraHeaderPages: z.string()\n .describe(configSchema.shape.extraHeaderPages.description || '')\n .transform(splitByComma)\n .optional(),\n extraPublicContent: z.string()\n .describe(configSchema.shape.extraPublicContent.description || '')\n .transform(splitByComma)\n .optional(),\n extraTheme: z.string()\n .describe(configSchema.shape.extraTheme.description || '')\n .transform(splitByComma)\n .optional(),\n vitepressConfig: z.string()\n .describe(configSchema.shape.vitepressConfig.description || '')\n .optional(),\n })\n\nexport type Cli = Zod.infer<typeof cliSchema>\n\nexport const globalOptsSchema = cliSchema\n .partial()\n .transform(applyGlobalOptsTransform)\n\nexport type GlobalOpts = Required<Pick<Zod.infer<typeof globalOptsSchema>, 'branch' | 'gitProvider'>>\n & Omit<Zod.infer<typeof globalOptsSchema>, 'branch' | 'gitProvider'>\n","import { cliSchema } from './global.js'\n\nexport const buildOptsSchema = cliSchema\n .pick({})\n\nexport type BuildOpts = Zod.infer<typeof buildOptsSchema>\n","// import type { GlobalOpts } from './global.js'\nimport { applyGlobalOptsTransform, cliSchema } from './global.js'\n\nexport const fetchOptsSchema = cliSchema\n .pick({\n branch: true,\n config: true,\n gitProvider: true,\n reposFilter: true,\n token: true,\n username: true,\n })\n .transform(applyGlobalOptsTransform)\n\nexport type FetchOpts = Zod.infer<typeof fetchOptsSchema>\n","// import type { GlobalOpts } from './global.js'\nimport { applyGlobalOptsTransform, cliSchema } from './global.js'\n\nexport const prepareOptsSchema = cliSchema\n .pick({\n extraHeaderPages: true,\n extraPublicContent: true,\n extraTheme: true,\n config: true,\n gitProvider: true,\n reposFilter: true,\n token: true,\n username: true,\n vitepressConfig: true,\n })\n .transform(applyGlobalOptsTransform)\n\nexport type PrepareOpts = Zod.infer<typeof prepareOptsSchema>\n","import type { Command, Option } from 'commander'\nimport { fromZodError } from 'zod-validation-error'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport { globalOptsSchema } from '../schemas/global.js'\nimport type { BuildOpts } from '../schemas/build.js'\nimport { buildOptsSchema } from '../schemas/build.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { fetchOptsSchema } from '../schemas/fetch.js'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { prepareOptsSchema } from '../schemas/prepare.js'\nimport { log } from './logger.js'\n\ntype Cmd = 'fetch' | 'build' | 'prepare' | 'global'\n\ninterface Options {\n build: BuildOpts\n fetch: FetchOpts\n prepare: PrepareOpts\n global: GlobalOpts\n}\n\nexport const options = {\n build: buildOptsSchema,\n fetch: fetchOptsSchema,\n prepare: prepareOptsSchema,\n global: globalOptsSchema,\n}\n\nexport function parseOptions<T extends Cmd>(cmd: T, opts: Options[T]) {\n log(`Initializing Docpress...`, 'info', 'blue')\n log(`\\n\\n-> Checking for required environment settings and configurations.`, 'info')\n\n const res = options[cmd].safeParse(opts)\n if (res.error) {\n log(` An error occurred while checking configuration.\\n ${fromZodError(res.error).toString()}`, 'error')\n process.exit(1)\n }\n log(' Setup complete! Ready to process your documentation.', 'info')\n return res.data as Options[T]\n}\n\nexport function addOptions(cmd: Command, opts: Option[]) {\n opts.forEach(opt => cmd.addOption(opt))\n return cmd\n}\n","import { appendFileSync, cpSync, rmSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Octokit } from '@octokit/rest'\nimport { simpleGit } from 'simple-git'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { createDir } from '../utils/functions.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.js'\n\nexport async function getInfos({ username, token, branch }: Pick<FetchOpts, 'branch'> & Pick<GlobalOpts, 'token'> & Required<Pick<GlobalOpts, 'username'>>) {\n log(` Get infos for username '${username}'.`, 'info')\n const octokit = new Octokit({ auth: token })\n log(` Get user infos.`, 'debug')\n const { data: user } = await octokit.rest.users.getByUsername({ username })\n log(` Get repositories infos.`, 'debug')\n const { data: repos } = await octokit.rest.repos.listForUser({ username, sort: 'full_name' })\n\n return { user, repos, branch }\n}\n\nexport async function getContributors({\n repository,\n token,\n}: {\n repository: EnhancedRepository\n token: GlobalOpts['token']\n}) {\n log(` Get contributors infos for repository '${repository.name}'.`, 'info')\n const octokit = new Octokit({\n auth: token,\n log: {\n debug: () => {},\n info: () => {},\n warn: (message) => {\n if (!message.includes('404')) console.warn(message)\n },\n error: (message) => {\n if (!message.includes('404')) console.error(message)\n },\n },\n })\n const { data: repo } = await octokit.rest.repos.get({\n owner: repository.owner.login,\n repo: repository.name,\n })\n if (!repo.source?.owner?.login) {\n return { source: repo.source, contributors: [] }\n }\n const contributors: Array<any> = []\n try {\n for await (const { data } of octokit.paginate.iterator(\n octokit.rest.repos.listContributors,\n {\n owner: repo.source.owner.login,\n repo: repo.name,\n per_page: 500,\n },\n )) {\n contributors.push(...data)\n }\n } catch (_error) {\n log(\n ` Failed to get contributors infos for repository '${repository.name}'.`,\n 'warn',\n )\n return { source: repo.source, contributors: [] }\n }\n\n return { source: repo.source, contributors }\n}\n\nexport async function cloneRepo(name: string, url: string, projectDir: string, branch: string, includes: string[]) {\n createDir(projectDir, { clean: true })\n\n try {\n const git = simpleGit({ baseDir: projectDir })\n await git.init()\n .addConfig('core.sparseCheckout', 'true', true, 'local')\n .addRemote('origin', url)\n\n for (const item of includes) {\n log(` Add '${item}' to '${name}' sparse-checkout file.`, 'debug')\n appendFileSync(resolve(projectDir, '.git/info/sparse-checkout'), `${item}\\n`, 'utf8')\n }\n\n log(` Clone repository '${name}'.`, 'info')\n await git.pull('origin', branch)\n\n if (includes.some(item => item.includes('docs'))) {\n cpSync(resolve(projectDir, 'docs'), projectDir, { recursive: true })\n rmSync(resolve(projectDir, 'docs'), { recursive: true })\n }\n rmSync(resolve(projectDir, '.git'), { recursive: true })\n } catch (error) {\n log(` Error when cloning repository: ${error}.`, 'error')\n }\n}\n","import { resolve } from 'node:path'\nimport { writeFileSync } from 'node:fs'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { checkHttpStatus, createDir, prettify } from '../utils/functions.js'\nimport { DOCPRESS_DIR, DOCS_DIR, USER_INFOS, USER_REPOS_INFOS } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { cloneRepo, getInfos } from './git.js'\n\nexport type EnhancedRepository = Awaited<ReturnType<typeof getInfos>>['repos'][number] & {\n docpress: {\n branch: string\n filtered: boolean\n includes: string[]\n projectPath: string\n raw_url: string\n replace_url: string\n }\n}\n\nexport async function checkDoc(repoOwner: GlobalOpts['username'], repoName: string, branch: FetchOpts['branch']) {\n const rootReadmeUrl = `https://github.com/${repoOwner}/${repoName}/tree/${branch}/README.md`\n const docsFolderUrl = `https://github.com/${repoOwner}/${repoName}/tree/${branch}/docs`\n const docsReadmeUrl = `https://github.com/${repoOwner}/${repoName}/tree/${branch}/docs/01-readme.md`\n\n const rootReadmeStatus = await checkHttpStatus(rootReadmeUrl)\n const docsFolderStatus = await checkHttpStatus(docsFolderUrl)\n const docsReadmeStatus = await checkHttpStatus(docsReadmeUrl)\n\n return {\n rootReadmeStatus,\n docsFolderStatus,\n docsReadmeStatus,\n }\n}\n\nexport async function fetchDoc({ username, branch, reposFilter, token }: FetchOpts) {\n createDir(DOCPRESS_DIR, { clean: true })\n\n await getInfos({ username, token, branch })\n .then(async ({ user, repos, branch }) => generateInfos(user, repos, branch, reposFilter))\n .then(async ({ repos }) => getDoc(repos, reposFilter))\n}\n\nexport async function enhanceRepositories(repos: Awaited<ReturnType<typeof getInfos>>['repos'], branch?: FetchOpts['branch'], reposFilter?: FetchOpts['reposFilter']) {\n const enhancedRepos: EnhancedRepository[] = []\n\n await Promise.all(\n repos.map(async (repo) => {\n const computedBranch = branch ?? repo.default_branch ?? 'main'\n const projectPath = resolve(DOCS_DIR, prettify(repo.name, { removeDot: true }))\n const filtered = isRepoFiltered(repo, reposFilter)\n let includes: string[] = []\n\n if (!repo.fork && !repo.private && !filtered) {\n includes = await getSparseCheckout(repo, computedBranch)\n }\n\n enhancedRepos.push({\n ...repo,\n docpress: {\n filtered,\n branch: computedBranch,\n includes,\n projectPath,\n raw_url: `https://raw.githubusercontent.com/${repo.owner.login}/${repo.name}/${computedBranch}`,\n replace_url: `https://github.com/${repo.owner.login}/${repo.name}/tree/${computedBranch}`,\n },\n })\n }),\n )\n\n return enhancedRepos\n}\n\nexport async function getSparseCheckout(repo: Awaited<ReturnType<typeof getInfos>>['repos'][number], branch: FetchOpts['branch']) {\n const docsStatus = await checkDoc(repo.owner.login, repo.name, branch)\n\n const includes: string[] = []\n if (Object.values(docsStatus).every(status => status === 404) || !repo.size) {\n return []\n }\n if (docsStatus.docsFolderStatus !== 404) {\n includes.push('docs/*')\n }\n if (docsStatus.docsFolderStatus === 404 || docsStatus.docsReadmeStatus === 404) {\n includes.push('README.md', '!*/**/README.md')\n }\n return includes\n}\n\nexport async function generateInfos(user: Awaited<ReturnType<typeof getInfos>>['user'], repos: Awaited<ReturnType<typeof getInfos>>['repos'], branch?: FetchOpts['branch'], reposFilter?: FetchOpts['reposFilter']) {\n writeFileSync(USER_INFOS, JSON.stringify(user, null, 2))\n\n const enhancedRepos = await enhanceRepositories(repos, branch, reposFilter)\n writeFileSync(USER_REPOS_INFOS, JSON.stringify(enhancedRepos, null, 2))\n\n return { user, repos: enhancedRepos }\n}\n\nexport async function getDoc(repos?: EnhancedRepository[], reposFilter?: FetchOpts['reposFilter']) {\n if (!repos) {\n log(` No repository respect docpress rules.`, 'warn')\n return\n }\n\n await Promise.all(\n repos\n .filter(repo => !isRepoFiltered(repo, reposFilter))\n .map(async (repo) => {\n await cloneRepo(repo.name, repo.clone_url as string, repo.docpress.projectPath, repo.docpress.branch, repo.docpress.includes)\n }),\n )\n}\n\nexport function isRepoFiltered(repo: EnhancedRepository | Awaited<ReturnType<typeof getInfos>>['repos'][number], reposFilter?: FetchOpts['reposFilter']) {\n const hasOnlyExclusions = reposFilter?.every(filter => filter.startsWith('!'))\n const isExcluded = reposFilter?.filter(filter => filter.startsWith('!'))\n .some(filter => repo.name === filter.substring(1))\n const isIncluded = !reposFilter\n || reposFilter?.filter(filter => !filter.startsWith('!')).includes(repo.name)\n || (repo.fork && !isExcluded)\n || (hasOnlyExclusions && !isExcluded)\n\n const isFiltered = isExcluded || !isIncluded\n\n if ('docpress' in repo && !repo.docpress.includes.length) {\n return true\n }\n\n if (!!repo.clone_url && !repo.private && !isFiltered) {\n return false\n }\n return true\n}\n","import { createOption } from 'commander'\nimport { globalOptsSchema } from '../schemas/global.js'\n\nexport const globalOpts = [\n createOption('-C, --config <string>', globalOptsSchema.innerType().shape.config._def.description),\n createOption('-T, --token <string>', globalOptsSchema.innerType().shape.token._def.description),\n createOption('-U, --username <string>', globalOptsSchema.innerType().shape.username._def.description),\n]\n","import { createCommand, createOption } from 'commander'\nimport { log } from '../utils/logger.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { fetchDoc } from '../lib/fetch.js'\nimport { configSchema } from '../schemas/global.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'fetch'\n\nexport const fetchOpts = [\n createOption('-b, --branch <string>', configSchema.shape.branch._def.description)\n .default(configSchema.shape.branch._def.defaultValue()),\n createOption('-g, --git-provider <string>', configSchema.shape.gitProvider._def.description)\n .default(configSchema.shape.gitProvider._def.defaultValue()),\n createOption('-r, --repos-filter <string>', configSchema.shape.reposFilter._def.description),\n]\n\nexport const fetchCmd = addOptions(createCommand(cmdName), [...fetchOpts, ...globalOpts])\n .description('Fetch docs with the given username and git provider.')\n .action(async (opts) => {\n const parsedOpts = parseOptions(cmdName, opts)\n await main(parsedOpts)\n })\n\nexport async function main(opts: FetchOpts) {\n const { username, reposFilter, token, branch, gitProvider } = opts\n log(`\\n-> Start fetching documentation files. This may take a moment, especially for larger repositories.`, 'info')\n\n await fetchDoc({ username, branch, reposFilter, gitProvider, token })\n}\n","import { build as vitepressBuild } from 'vitepress'\nimport { createCommand } from 'commander'\nimport { addOptions } from '../utils/commands.js'\nimport { DOCPRESS_DIR } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'build'\n\nexport const buildOpts = []\n\nexport const buildCmd = addOptions(createCommand(cmdName), globalOpts)\n .description('Build vitepress website.')\n .action(async (_opts) => {\n await main()\n })\n\nexport async function main() {\n log(`\\n-> Start building Vitepress website.\\n\\n`, 'info')\n\n try {\n await vitepressBuild(DOCPRESS_DIR)\n log(`\\n\\nDocpress build succedeed.`, 'success')\n } catch (error) {\n log(`\\n\\nDocpress build failed : ${error}`, 'error')\n }\n}\n","import type { defineConfig } from 'vitepress'\nimport { deepMerge } from '../utils/functions.js'\nimport type { Page, SidebarProject } from './prepare.js'\n\nconst defaultVitepressConfig: ReturnType<typeof defineConfig> = {\n base: '/',\n lang: 'en-US',\n vite: {\n publicDir: '../public',\n },\n title: 'Home',\n description: 'Docpress',\n srcDir: './docs',\n cleanUrls: false,\n ignoreDeadLinks: 'localhostLinks',\n themeConfig: {\n outline: [2, 3],\n search: {\n provider: 'local',\n options: {\n translations: {\n button: {\n buttonText: 'Search...',\n buttonAriaLabel: 'Search',\n },\n modal: {\n backButtonTitle: 'erase search',\n displayDetails: 'show details',\n noResultsText: 'No results for : ',\n resetButtonTitle: 'cancel search',\n footer: {\n selectText: 'go to',\n navigateText: 'navigate in results',\n closeText: 'close',\n },\n },\n },\n },\n },\n },\n}\n\nexport function getVitepressConfig(sidebar: SidebarProject[], nav: Page[], vitepressConfig?: ReturnType<typeof defineConfig>): Partial<ReturnType<typeof defineConfig>> {\n return vitepressConfig\n ? deepMerge(defaultVitepressConfig, vitepressConfig, { themeConfig: { sidebar, nav } })\n : deepMerge(defaultVitepressConfig, { themeConfig: { sidebar, nav } })\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { createDir } from './functions.js'\n\nexport function generateFile(src: string, dest: string) {\n const content = readFileSync(src, { encoding: 'utf8' })\n createDir(dirname(dest))\n writeFileSync(dest, content)\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\n\nexport function replaceRelativePath(file: string, url: string) {\n const fileContent = readFileSync(file, 'utf8')\n const updatedContent = fileContent.replace(/\\[([^\\]]+)\\]\\(\\.\\.\\/([^)]+)\\)/g, (_match, p1, p2) => {\n return `[${p1}](${url}/${p2})`\n })\n writeFileSync(file, updatedContent, 'utf8')\n}\n\nexport function replaceReadmePath(file: string, url: string) {\n const readmeContent = readFileSync(file, 'utf8')\n const updatedContent = readmeContent\n .replace(/\\[([^\\]]+)\\]\\((?!\\.?\\/docs\\/|docs\\/|http|#)(\\.?\\/)?([^/][^)]+)\\)/g, (_match, p1, _p2, p3) => {\n return `[${p1}](${url}/${p3})`\n })\n .replace(/\\[([^\\]]+)\\]\\((\\.?\\/docs\\/|docs\\/)([^)]*)\\)/g, (_match, p1, _p2, p3) => {\n return `[${p1}](${p3})`\n })\n writeFileSync(file, updatedContent, 'utf8')\n}\n","import { basename, dirname, parse, resolve } from 'node:path'\nimport { appendFileSync, cpSync, readdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs'\nimport YAML from 'yaml'\nimport type { defineConfig } from 'vitepress'\nimport { generateFile } from '../utils/templates.js'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { getUserInfos } from '../utils/functions.js'\nimport { createDir, extractFiles, getMdFiles, prettify } from '../utils/functions.js'\nimport { DOCS_DIR, FORKS_FILE, INDEX_FILE, TEMPLATE_THEME, VITEPRESS_CONFIG, VITEPRESS_THEME } from '../utils/const.js'\nimport { replaceReadmePath, replaceRelativePath } from '../utils/regex.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.js'\nimport type { getInfos } from './git.js'\nimport { getContributors } from './git.js'\n\nexport interface Page {\n text: string\n link: string\n}\n\nexport interface SidebarProject {\n text: string\n collapsed: boolean\n items: Page[]\n}\n\nexport interface Feature {\n title: string\n details: string\n link: string\n}\n\nexport interface Index {\n layout: string\n hero: {\n name: string\n tagline: string\n }\n features: Feature[]\n}\n\nfunction addSources(repoUrl: string, outputPath: string) {\n const fileName = basename(outputPath)\n const title = fileName === 'introduction.md' ? '\\n## Sources' : '# Sources'\n\n const sourcesContent = `${title}\\n\\nTake a look at the [project sources](${repoUrl}).\\n`\n\n appendFileSync(outputPath, sourcesContent, 'utf8')\n}\n\n// export function addContribution(outputPath: string) {\n// const sourcesContent = `\n// If you'd like to improve or fix the code, check out the [contribution guidelines](/contribute).\n// `\n\n// appendFileSync(outputPath, sourcesContent, 'utf8')\n// }\n\nexport function generateIndex(features: Feature[], user: ReturnType<typeof getUserInfos>) {\n const { name, login, bio } = user\n return {\n layout: 'home',\n hero: {\n name: name ? `${name}'s projects` : `${login}'s projects`,\n tagline: bio ?? 'Robots are everywhere 🤖', // \\U0001F916\n },\n features,\n }\n}\n\nexport function generateFeatures(repoName: string, description: string, features?: Feature[]) {\n const content = {\n title: prettify(repoName, { mode: 'capitalize', replaceDash: true }),\n details: description,\n link: `/${repoName}/introduction`,\n }\n\n return features ? [...features, content] : [content]\n}\n\nexport function generateSidebarProject(repoName: string, sidebarPages: Page[]) {\n return {\n text: prettify(repoName, { mode: 'capitalize', replaceDash: true }),\n collapsed: true,\n items: sidebarPages,\n }\n}\n\nexport function generateSidebarPages(repoName: string, fileName: string, sidebarPages?: Page[]) {\n const content = {\n text: fileName === 'introduction' ? 'Introduction' : prettify(fileName, { mode: 'capitalize', replaceDash: true }),\n link: `/${repoName}/${fileName}`,\n }\n\n return sidebarPages ? [...sidebarPages, content] : [content]\n}\n\nexport function transformDoc(repositories: EnhancedRepository[], user: ReturnType<typeof getUserInfos>) {\n const features: Feature[] = []\n const sidebar: SidebarProject[] = []\n\n for (const repository of repositories) {\n log(` Replace urls for repository '${repository.name}'.`, 'info')\n getMdFiles([repository.docpress.projectPath]).forEach((file) => {\n log(` Processing file '${basename(file)}' for repository '${repository.name}'.`, 'debug')\n replaceRelativePath(file, `https://github.com/${repository.owner.login}/${repository.name}/tree/${repository.docpress.branch}`)\n\n if (basename(file).toLowerCase() === 'readme.md') {\n replaceReadmePath(file, `https://github.com/${repository.owner.login}/${repository.name}/tree/${repository.docpress.branch}`)\n }\n })\n\n log(` Generate sidebar for repository '${repository.name}'.`, 'info')\n const sidebarItems = readdirSync(repository.docpress.projectPath)\n .filter((file) => {\n return statSync(resolve(repository.docpress.projectPath, file)).isFile()\n && basename(resolve(repository.docpress.projectPath, file)).endsWith('.md')\n })\n .sort((a, b) => a.localeCompare(b))\n .reduce((acc: Page[], cur, idx, arr) => {\n const file = resolve(repository.docpress.projectPath, cur)\n let filename = prettify(basename(file), { mode: 'lowercase', removeIdx: true })\n\n if (filename === 'readme.md') {\n filename = 'introduction.md'\n }\n if (filename !== basename(file)) {\n renameSync(file, resolve(dirname(file), filename))\n }\n\n if (idx === arr.length - 1) {\n let sourceFile\n if (arr.length > 1) {\n sourceFile = resolve(repository.docpress.projectPath, 'sources.md')\n log(` Add sources for repository '${repository.name}'.`, 'info')\n addSources(repository.html_url, sourceFile)\n\n return generateSidebarPages(\n repository.name,\n parse(sourceFile).name,\n generateSidebarPages(repository.name, parse(filename).name, acc),\n )\n }\n sourceFile = resolve(repository.docpress.projectPath, filename)\n addSources(repository.html_url, sourceFile)\n }\n\n return generateSidebarPages(prettify(repository.name, { removeDot: true }), parse(filename).name, acc)\n }, [])\n\n sidebar.push(generateSidebarProject(prettify(repository.name, { removeDot: true }), sidebarItems))\n features.push(...generateFeatures(prettify(repository.name, { removeDot: true }), repository.description || ''))\n }\n\n log(` Generate index content.`, 'info')\n const index = generateIndex(features.sort((a, b) => a.title.localeCompare(b.title)), user)\n return {\n sidebar: sidebar.sort((a, b) => a.text.localeCompare(b.text)),\n index,\n }\n}\n\nexport function addExtraPages(paths: string[]) {\n const files = getMdFiles(paths)\n const nav: Page[] = []\n\n log(` Add extras Vitepress headers pages.`, 'info')\n for (const file of files) {\n log(` Processing file '${file}'.`, 'debug')\n const src = resolve(process.cwd(), file)\n const dest = resolve(DOCS_DIR, prettify(basename(file), { mode: 'lowercase', removeIdx: true }))\n cpSync(src, dest)\n nav.push({\n text: prettify(parse(src).name, { replaceDash: true, removeIdx: true }),\n link: `/${prettify(parse(src).name, { removeIdx: true, mode: 'lowercase' })}`,\n })\n }\n return nav\n}\n\nexport function addContent(paths: string | string[], dir: string, fn?: () => void) {\n for (const path of Array.isArray(paths) ? paths : [paths]) {\n const absolutePath = resolve(process.cwd(), path)\n const files = extractFiles(absolutePath)\n\n for (const file of files) {\n const formattedFile = file.replace(absolutePath, '.')\n log(` Processing file '${formattedFile}' for entry '${path}'.`, 'debug')\n const src = resolve(process.cwd(), file)\n const dest = resolve(dir, formattedFile)\n if (fn) {\n fn()\n }\n cpSync(src, dest)\n }\n }\n}\n\nexport function addForkPage(forks: { repository: Awaited<ReturnType<typeof getInfos>>['repos'][number], contributions: number }[]) {\n const separator = '---\\n'\n const header = 'layout: fork-page\\nrepoList:\\n'\n const text = '\\n# External contributions\\n\\nThis gallery is a visual representation of the collaborative work done across a variety of open-source projects, each driven by a shared passion for innovation and community growth.\\n\\nEvery tile below represents a unique project where contributions have been made-ranging from code enhancements to documentation improvements. Each project includes a summary of its goals, features, and links to GitHub for direct access.\\n\\nThis page serves as both a portfolio of past work and a resource for revisiting projects that have made a meaningful impact.\\n'\n const frontmatter = forks.map(({ repository, contributions }) => {\n const { name, owner, html_url, description, stargazers_count } = repository\n return { name, owner: owner.login, html_url, description, stargazers_count, contributions }\n })\n log(` Generate forks page.`, 'info')\n writeFileSync(FORKS_FILE, separator.concat(header, YAML.stringify(frontmatter), separator, text))\n}\n\ntype Source = Required<Awaited<ReturnType<typeof getContributors>>['source']>\n\ntype AdaptedLicense = Omit<NonNullable<Source>['license'], 'spdx_id'> & { spdx_id?: string }\n\ntype AdaptedRepository = Omit<NonNullable<Source>, 'license'> & { license: AdaptedLicense }\n\nexport async function processForks(repositories: EnhancedRepository[], username: GlobalOpts['username'], token?: GlobalOpts['token']) {\n const forks = await Promise.all(\n repositories.map(async (repository) => {\n const { source, contributors } = await getContributors({ repository, token })\n return {\n contributions: contributors?.find(contributor => contributor.login === username)?.contributions ?? 0,\n repository: source as AdaptedRepository,\n }\n }),\n ).then(f => f.filter(({ repository, contributions }) => !!repository && contributions))\n\n addForkPage(forks)\n}\n\nexport function parseVitepressConfig(path: string) {\n return JSON.parse(readFileSync(resolve(process.cwd(), path)).toString())\n}\n\nexport function generateVitepressFiles(vitepressConfig: Partial<ReturnType<typeof defineConfig>>, index: Index) {\n const separator = '---\\n'\n createDir(dirname(VITEPRESS_CONFIG))\n\n log(` Generate Vitepress config.`, 'info')\n writeFileSync(VITEPRESS_CONFIG, `export default ${JSON.stringify(vitepressConfig, null, 2)}\\n`)\n log(` Generate index file.`, 'info')\n writeFileSync(INDEX_FILE, separator.concat(YAML.stringify(index), separator))\n log(` Add Docpress theme files.`, 'info')\n return extractFiles(TEMPLATE_THEME).forEach((path) => {\n const relativePath = path.replace(`${TEMPLATE_THEME}/`, '')\n generateFile(path, resolve(VITEPRESS_THEME, relativePath))\n })\n}\n","import { resolve } from 'node:path'\nimport { createCommand, createOption } from 'commander'\nimport type { EnhancedRepository } from '../lib/fetch.js'\nimport { configSchema } from '../schemas/global.js'\nimport { DOCPRESS_DIR, VITEPRESS_USER_THEME } from '../utils/const.js'\nimport { getUserInfos, getUserRepos } from '../utils/functions.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport { getVitepressConfig } from '../lib/vitepress.js'\nimport { addContent, addExtraPages, generateVitepressFiles, processForks, transformDoc } from '../lib/prepare.js'\nimport type { Page } from '../lib/prepare.js'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { log } from '../utils/logger.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'prepare'\n\nexport const prepareOpts = [\n createOption('-c, --extra-public-content <string>', configSchema.shape.extraPublicContent._def.description),\n createOption('-f, --forks', configSchema.shape.forks._def.description),\n createOption('-p, --extra-header-pages <string>', configSchema.shape.extraHeaderPages._def.description),\n createOption('-t, --extra-theme <string>', configSchema.shape.extraTheme._def.description),\n createOption('-v, --vitepress-config <string>', configSchema.shape.vitepressConfig._def.description),\n]\n\nexport const prepareCmd = addOptions(createCommand(cmdName), [...prepareOpts, ...globalOpts])\n .description('Transform doc to the target vitepress format.')\n .action(async (opts) => {\n const parsedOpts = parseOptions(cmdName, opts)\n await main(parsedOpts)\n })\n\nexport async function main(opts: PrepareOpts) {\n const { extraHeaderPages, extraPublicContent, extraTheme, vitepressConfig, forks, token, username } = opts\n log(`\\n-> Start transform files to prepare Vitepress build.`, 'info')\n\n const user = getUserInfos()\n const repositories = getUserRepos()\n .reduce(({ internals, forks }: { internals: EnhancedRepository[], forks: EnhancedRepository[] }, cur) => {\n const { clone_url, private: privateRepo, fork, docpress } = cur\n if (clone_url && !privateRepo && !docpress.filtered) {\n if (!fork && docpress.includes.length) {\n return { internals: [...internals, cur], forks }\n } else if (fork) {\n return { internals, forks: [...forks, cur] }\n }\n }\n return { internals, forks }\n }, { internals: [], forks: [] })\n\n const { sidebar, index } = transformDoc(repositories.internals, user)\n const nav: Page[] = []\n\n if (extraHeaderPages) {\n const pages = addExtraPages(extraHeaderPages)\n if (forks) {\n nav.push(...pages.filter(p => p.link !== '/forks'))\n } else {\n nav.push(...pages)\n }\n }\n if (extraPublicContent) {\n log(` Add extras Vitepress public folder content.`, 'info')\n addContent(extraPublicContent, resolve(DOCPRESS_DIR, 'public'))\n }\n if (extraTheme) {\n log(` Add extras Vitepress theme files.`, 'info')\n addContent(extraTheme, resolve(VITEPRESS_USER_THEME))\n }\n if (forks && username) {\n log(` Add fork page to display external contributions.`, 'info')\n await processForks(repositories.forks, username, token)\n nav.push({ text: 'Forks', link: '/forks' })\n }\n\n const config = getVitepressConfig(sidebar, nav, vitepressConfig)\n\n generateVitepressFiles(config, index)\n}\n","import { Command } from 'commander'\nimport pkg from '../package.json' with { type: 'json' }\nimport { fetchCmd, main as fetchFn, fetchOpts } from './commands/fetch.js'\nimport { buildCmd, main as buildFn } from './commands/build.js'\nimport { prepareCmd, main as prepareFn, prepareOpts } from './commands/prepare.js'\nimport { addOptions, parseOptions } from './utils/commands.js'\nimport { globalOpts } from './commands/global.js'\n\n// const options = {\n// fetchOpts: [\n// createOption('-b, --branch <string>', configSchema.shape.branch._def.description)\n// .default(configSchema.shape.branch._def.defaultValue()),\n// createOption('-g, --git-provider <string>', configSchema.shape.gitProvider._def.description)\n// .default(configSchema.shape.gitProvider._def.defaultValue()),\n// createOption('-r, --repos-filter <string>', configSchema.shape.reposFilter._def.description),\n// ],\n// }\n\nexport function getProgram() {\n const pm = new Command()\n .name('docpress')\n .description('Build your doc website faster than light ⚡️⚡️⚡️')\n .version(`${pkg.version}`)\n .action(async (opts, _cmd) => {\n const parsedOpts = parseOptions('global', opts)\n await fetchFn(parsedOpts)\n await prepareFn(parsedOpts)\n await buildFn()\n })\n .configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n showGlobalOptions: true,\n })\n .enablePositionalOptions()\n .passThroughOptions()\n .addCommand(fetchCmd)\n .addCommand(prepareCmd)\n .addCommand(buildCmd)\n\n addOptions(pm, [...fetchOpts, ...prepareOpts, ...globalOpts])\n\n return pm\n}\n\nexport function main() {\n const pm = getProgram()\n pm.parseAsync(process.argv)\n}\n"],"names":["getLogLevel","colorMap","log","msg","type","color","computedMsg","chalk","computedType","DOCPRESS_DIR","resolve","USER_REPOS_INFOS","USER_INFOS","DOCS_DIR","INDEX_FILE","FORKS_FILE","VITEPRESS_CONFIG","VITEPRESS_THEME","VITEPRESS_USER_THEME","TEMPLATE_THEME","checkHttpStatus","url","axios","error","prettify","s","opts","u","createDir","directory","clean","existsSync","rimrafSync","mkdirSync","err","isDir","path","statSync","isFile","extractFiles","paths","readdirSync","file","join","getMdFiles","basename","prettifyEnum","arr","acc","cur","idx","getUserInfos","readFileSync","getUserRepos","deepMerge","objects","obj","key","accValue","objValue","isObject","val","loadConfigFile","configPath","fullPath","fileContents","splitByComma","providers","configSchema","z","applyGlobalOptsTransform","data","config","vitepressConfig","token","rest","loadedDPConfig","loadedVPConfig","defaultConfig","vpConfig","mergedConfig","fromZodError","cliSchema","globalOptsSchema","buildOptsSchema","fetchOptsSchema","prepareOptsSchema","options","parseOptions","cmd","res","addOptions","opt","getInfos","username","branch","octokit","Octokit","user","repos","getContributors","repository","message","repo","contributors","cloneRepo","name","projectDir","includes","git","simpleGit","item","appendFileSync","cpSync","rmSync","checkDoc","repoOwner","repoName","rootReadmeUrl","docsFolderUrl","docsReadmeUrl","rootReadmeStatus","docsFolderStatus","docsReadmeStatus","fetchDoc","reposFilter","generateInfos","getDoc","enhanceRepositories","enhancedRepos","computedBranch","projectPath","filtered","isRepoFiltered","getSparseCheckout","docsStatus","status","writeFileSync","hasOnlyExclusions","filter","isExcluded","isIncluded","isFiltered","globalOpts","createOption","cmdName","fetchOpts","fetchCmd","createCommand","parsedOpts","main","gitProvider","buildCmd","_opts","vitepressBuild","defaultVitepressConfig","getVitepressConfig","sidebar","nav","generateFile","src","dest","content","dirname","replaceRelativePath","updatedContent","_match","p1","p2","replaceReadmePath","_p2","p3","addSources","repoUrl","outputPath","sourcesContent","generateIndex","features","login","bio","generateFeatures","description","generateSidebarProject","sidebarPages","generateSidebarPages","fileName","transformDoc","repositories","sidebarItems","b","filename","renameSync","sourceFile","parse","index","a","addExtraPages","files","addContent","dir","fn","absolutePath","formattedFile","addForkPage","forks","separator","header","text","frontmatter","contributions","owner","html_url","stargazers_count","YAML","processForks","source","contributor","f","generateVitepressFiles","relativePath","prepareOpts","prepareCmd","extraHeaderPages","extraPublicContent","extraTheme","internals","clone_url","privateRepo","fork","docpress","pages","p","getProgram","pm","Command","pkg","_cmd","fetchFn","prepareFn","buildFn"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tobi-or-not/docpress",
3
3
  "type": "module",
4
- "version": "0.4.0",
4
+ "version": "0.5.1",
5
5
  "module": "dist/docpress.js",
6
6
  "types": "types/index.d.ts",
7
7
  "bin": {
@@ -5,6 +5,7 @@ interface PrettifyOpts {
5
5
  mode?: 'capitalize' | 'uppercase' | 'lowercase';
6
6
  replaceDash?: boolean;
7
7
  removeIdx?: boolean;
8
+ removeDot?: boolean;
8
9
  }
9
10
  export declare function prettify(s: string, opts: PrettifyOpts): string;
10
11
  export declare function createDir(directory: string, { clean }?: {