@tobi-or-not/docpress 0.2.1 → 0.2.3
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 +12 -6
- package/dist/cli.js +83 -81
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/types/lib/prepare.d.ts +1 -1
package/README.md
CHANGED
|
@@ -18,14 +18,20 @@ For optimal use of Docpress, please check the [rules section](#rules) to underst
|
|
|
18
18
|
|
|
19
19
|
## Quickstart
|
|
20
20
|
|
|
21
|
-
Generate website using the Docpress docker image
|
|
21
|
+
1. Generate website using the Docpress docker image.
|
|
22
|
+
```sh
|
|
23
|
+
docker run --name docpress --rm -v $(pwd)/docpress:/app/docpress:rw \
|
|
24
|
+
ghcr.io/this-is-tobi/docpress -u <github_username>
|
|
25
|
+
```
|
|
26
|
+
> The dist folder is available at `./docpress/.vitepress/dist`, ready to be served by a web server like Nginx, Apache, etc...
|
|
22
27
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
2. Start an Nginx docker image using the generated static folder.
|
|
29
|
+
```sh
|
|
30
|
+
docker run --name my-docs --rm -v ./docpress/.vitepress/dist:/usr/share/nginx/html:ro -p 8080:80 \
|
|
31
|
+
docker.io/nginx
|
|
32
|
+
```
|
|
27
33
|
|
|
28
|
-
|
|
34
|
+
3. Access the website at the following address : <http://localhost:8080>.
|
|
29
35
|
|
|
30
36
|
## Rules
|
|
31
37
|
|
package/dist/cli.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createOption as f, createCommand as D, Command as le } from "commander"
|
|
|
2
2
|
import T from "chalk";
|
|
3
3
|
import { fromError as pe } from "zod-validation-error";
|
|
4
4
|
import { readFileSync as w, existsSync as G, mkdirSync as ue, readdirSync as Y, statSync as L, appendFileSync as K, cpSync as j, rmSync as A, writeFileSync as y, renameSync as fe } from "node:fs";
|
|
5
|
-
import { resolve as c, join as me, basename as
|
|
5
|
+
import { resolve as c, join as me, basename as h, dirname as Q, parse as $ } from "node:path";
|
|
6
6
|
import { z as l } from "zod";
|
|
7
7
|
import ge from "axios";
|
|
8
8
|
import { rimrafSync as he } from "rimraf";
|
|
@@ -10,7 +10,7 @@ import { Octokit as be } from "octokit";
|
|
|
10
10
|
import { simpleGit as ve } from "simple-git";
|
|
11
11
|
import { build as ye } from "vitepress";
|
|
12
12
|
import we from "yaml";
|
|
13
|
-
const Se = "@tobi-or-not/docpress", $e = "module", xe = "0.2.
|
|
13
|
+
const Se = "@tobi-or-not/docpress", $e = "module", xe = "0.2.3", Ce = "pnpm@9.12.3", ke = "dist/docpress.js", _e = "types/index.d.ts", Oe = {
|
|
14
14
|
docpress: "bin/docpress.js"
|
|
15
15
|
}, Pe = [
|
|
16
16
|
"bin",
|
|
@@ -93,8 +93,8 @@ const M = {
|
|
|
93
93
|
success: { color: "green", level: 30 }
|
|
94
94
|
};
|
|
95
95
|
function d(e, t = "info", r) {
|
|
96
|
-
const
|
|
97
|
-
Ie() >= M[t].level && console[
|
|
96
|
+
const o = r ? T[r](e) : T[M[t].color](e), n = t === "success" ? "info" : t;
|
|
97
|
+
Ie() >= M[t].level && console[n](o);
|
|
98
98
|
}
|
|
99
99
|
const Z = l.object({}), k = c(process.cwd(), "docpress"), ee = c(process.cwd(), "docpress/repositories.json"), te = c(process.cwd(), "docpress/owner.json"), re = c(process.cwd(), "docpress/docs"), Ve = c(process.cwd(), "docpress/docs/index.md"), U = c(process.cwd(), "docpress/.vitepress/config.ts");
|
|
100
100
|
async function P(e) {
|
|
@@ -133,10 +133,10 @@ function I(e) {
|
|
|
133
133
|
return (Array.isArray(e) ? e : [e]).flatMap((t) => Te(t) ? [t] : Ne(t) ? Y(t).flatMap((r) => I(me(t, r))) : []);
|
|
134
134
|
}
|
|
135
135
|
function se(e) {
|
|
136
|
-
return I(e).filter((t) =>
|
|
136
|
+
return I(e).filter((t) => h(t).endsWith(".md"));
|
|
137
137
|
}
|
|
138
138
|
function Ge(e) {
|
|
139
|
-
return e.reduce((t, r,
|
|
139
|
+
return e.reduce((t, r, o, n) => o ? o === n.length - 1 ? `${t} or "${r}"` : `${t}, "${r}"` : `"${r}"`, "");
|
|
140
140
|
}
|
|
141
141
|
function Ae() {
|
|
142
142
|
return JSON.parse(w(te).toString());
|
|
@@ -145,9 +145,9 @@ function Me() {
|
|
|
145
145
|
return JSON.parse(w(ee).toString());
|
|
146
146
|
}
|
|
147
147
|
function R(...e) {
|
|
148
|
-
return e.reduce((t, r) => (r === null || Object.keys(r).forEach((
|
|
149
|
-
const
|
|
150
|
-
z(
|
|
148
|
+
return e.reduce((t, r) => (r === null || Object.keys(r).forEach((o) => {
|
|
149
|
+
const n = t ? t[o] : null, s = r[o];
|
|
150
|
+
z(n) && z(s) ? t[o] = R(n, s) : t[o] = s;
|
|
151
151
|
}), t), {});
|
|
152
152
|
}
|
|
153
153
|
function z(e) {
|
|
@@ -178,8 +178,8 @@ function N(e, t) {
|
|
|
178
178
|
d("Initializing Docpress...", "info", "blue"), d(`
|
|
179
179
|
|
|
180
180
|
-> Checking for required environment settings and configurations.`, "info");
|
|
181
|
-
function r(
|
|
182
|
-
const i = Ue[
|
|
181
|
+
function r(n, s) {
|
|
182
|
+
const i = Ue[n].safeParse({
|
|
183
183
|
...V.parse(s).config,
|
|
184
184
|
...s
|
|
185
185
|
});
|
|
@@ -187,72 +187,72 @@ function N(e, t) {
|
|
|
187
187
|
return i.data;
|
|
188
188
|
d(` An error occurred while checking configuration: ${pe(i.error).toString()}`, "error"), process.exit(0);
|
|
189
189
|
}
|
|
190
|
-
const
|
|
190
|
+
const o = e.reduce((n, s) => {
|
|
191
191
|
const i = r(s, t);
|
|
192
|
-
return Object.assign(
|
|
192
|
+
return Object.assign(n, i);
|
|
193
193
|
}, {});
|
|
194
|
-
return d(" Setup complete! Ready to process your documentation.", "info"),
|
|
194
|
+
return d(" Setup complete! Ready to process your documentation.", "info"), o;
|
|
195
195
|
}
|
|
196
196
|
function _(e, t) {
|
|
197
197
|
return t.forEach((r) => e.addOption(r)), e;
|
|
198
198
|
}
|
|
199
199
|
async function ze({ username: e, token: t, branch: r }) {
|
|
200
200
|
d(` Get infos for username '${e}'.`, "info");
|
|
201
|
-
const
|
|
202
|
-
return { user:
|
|
201
|
+
const o = new be({ auth: t }), { data: n } = await o.request("GET /users/{username}", { username: e }), { data: s } = await o.request("GET /users/{username}/repos", { username: e, sort: "full_name" });
|
|
202
|
+
return { user: n, repos: s, branch: r };
|
|
203
203
|
}
|
|
204
|
-
async function Je(e, t, r,
|
|
204
|
+
async function Je(e, t, r, o) {
|
|
205
205
|
F(t, { clean: !0 });
|
|
206
206
|
try {
|
|
207
|
-
const
|
|
208
|
-
await
|
|
209
|
-
for (const s of
|
|
207
|
+
const n = ve({ baseDir: t });
|
|
208
|
+
await n.init().addConfig("core.sparseCheckout", "true", !0, "local").addRemote("origin", e);
|
|
209
|
+
for (const s of o)
|
|
210
210
|
K(c(t, ".git/info/sparse-checkout"), `${s}
|
|
211
211
|
`, "utf8");
|
|
212
|
-
await
|
|
213
|
-
} catch (
|
|
214
|
-
d(` Error when cloning repository: ${
|
|
212
|
+
await n.pull("origin", r), o.some((s) => s.includes("docs")) && (j(c(t, "docs"), t, { recursive: !0 }), A(c(t, "docs"), { recursive: !0 })), A(c(t, ".git"), { recursive: !0 });
|
|
213
|
+
} catch (n) {
|
|
214
|
+
d(` Error when cloning repository: ${n}.`, "error");
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
217
|
async function Be(e, t, r) {
|
|
218
|
-
const
|
|
218
|
+
const o = `https://github.com/${e}/${t}/tree/${r}/README.md`, n = `https://github.com/${e}/${t}/tree/${r}/docs`, s = `https://github.com/${e}/${t}/tree/${r}/docs/01-readme.md`, i = await P(o), a = await P(n), u = await P(s);
|
|
219
219
|
return {
|
|
220
220
|
rootReadmeStatus: i,
|
|
221
221
|
docsFolderStatus: a,
|
|
222
222
|
docsReadmeStatus: u
|
|
223
223
|
};
|
|
224
224
|
}
|
|
225
|
-
async function He({ username: e, branch: t, reposFilter: r, token:
|
|
226
|
-
F(k, { clean: !0 }), await ze({ username: e, token:
|
|
225
|
+
async function He({ username: e, branch: t, reposFilter: r, token: o }) {
|
|
226
|
+
F(k, { clean: !0 }), await ze({ username: e, token: o, branch: t }).then(async ({ user: n, repos: s, branch: i }) => Xe(n, s, i, r)).then(async ({ repos: n }) => Ye(n, r));
|
|
227
227
|
}
|
|
228
228
|
async function We(e, t, r) {
|
|
229
|
-
const
|
|
229
|
+
const o = [];
|
|
230
230
|
return await Promise.all(
|
|
231
|
-
e.map(async (
|
|
232
|
-
const s = t ??
|
|
231
|
+
e.map(async (n) => {
|
|
232
|
+
const s = t ?? n.default_branch ?? "main", i = c(re, n.name), a = oe(n, r);
|
|
233
233
|
let u = [];
|
|
234
|
-
!
|
|
235
|
-
...
|
|
234
|
+
!n.fork && !n.private && !a && (u = await qe(n, s)), o.push({
|
|
235
|
+
...n,
|
|
236
236
|
docpress: {
|
|
237
237
|
filtered: a,
|
|
238
238
|
branch: s,
|
|
239
239
|
includes: u,
|
|
240
240
|
projectPath: i,
|
|
241
|
-
raw_url: `https://raw.githubusercontent.com/${
|
|
242
|
-
replace_url: `https://github.com/${
|
|
241
|
+
raw_url: `https://raw.githubusercontent.com/${n.owner.login}/${n.name}/${s}`,
|
|
242
|
+
replace_url: `https://github.com/${n.owner.login}/${n.name}/tree/${s}`
|
|
243
243
|
}
|
|
244
244
|
});
|
|
245
245
|
})
|
|
246
|
-
),
|
|
246
|
+
), o;
|
|
247
247
|
}
|
|
248
248
|
async function qe(e, t) {
|
|
249
|
-
const r = await Be(e.owner.login, e.name, t),
|
|
250
|
-
return Object.values(r).every((
|
|
249
|
+
const r = await Be(e.owner.login, e.name, t), o = [];
|
|
250
|
+
return Object.values(r).every((n) => n === 404) || !e.size ? [] : (r.docsFolderStatus !== 404 && o.push("docs/*"), (r.docsFolderStatus === 404 || r.docsReadmeStatus === 404) && o.push("README.md", "!*/**/README.md"), o);
|
|
251
251
|
}
|
|
252
|
-
async function Xe(e, t, r,
|
|
252
|
+
async function Xe(e, t, r, o) {
|
|
253
253
|
y(te, JSON.stringify(e, null, 2));
|
|
254
|
-
const
|
|
255
|
-
return y(ee, JSON.stringify(
|
|
254
|
+
const n = await We(t, r, o);
|
|
255
|
+
return y(ee, JSON.stringify(n, null, 2)), { user: e, repos: n };
|
|
256
256
|
}
|
|
257
257
|
async function Ye(e, t) {
|
|
258
258
|
if (!e) {
|
|
@@ -266,8 +266,8 @@ async function Ye(e, t) {
|
|
|
266
266
|
);
|
|
267
267
|
}
|
|
268
268
|
function oe(e, t) {
|
|
269
|
-
const r = t?.filter((
|
|
270
|
-
return "docpress" in e && !e.docpress.includes.length ? !0 : !(e.clone_url && !e.fork && !e.private && !
|
|
269
|
+
const r = t?.every((i) => i.startsWith("!")), o = t?.filter((i) => i.startsWith("!")).some((i) => e.name === i.substring(1)), n = !t || t?.filter((i) => !i.startsWith("!")).includes(e.name) || r && !o, s = o || !n;
|
|
270
|
+
return "docpress" in e && !e.docpress.includes.length ? !0 : !(e.clone_url && !e.fork && !e.private && !s);
|
|
271
271
|
}
|
|
272
272
|
const O = [
|
|
273
273
|
f("-C, --config <string>", V.shape.config._def.description)
|
|
@@ -282,9 +282,9 @@ const O = [
|
|
|
282
282
|
await ie(t);
|
|
283
283
|
});
|
|
284
284
|
async function ie(e) {
|
|
285
|
-
const { username: t, reposFilter: r, token:
|
|
285
|
+
const { username: t, reposFilter: r, token: o, branch: n, gitProvider: s } = e;
|
|
286
286
|
d(`
|
|
287
|
-
-> Start fetching documentation files. This may take a moment, especially for larger repositories.`, "info"), await He({ username: t, branch:
|
|
287
|
+
-> Start fetching documentation files. This may take a moment, especially for larger repositories.`, "info"), await He({ username: t, branch: n, reposFilter: r, gitProvider: s, token: o });
|
|
288
288
|
}
|
|
289
289
|
const Qe = "build", Ze = _(D(Qe), O).description("Build vitepress website.").action(async (e) => {
|
|
290
290
|
await ce();
|
|
@@ -345,40 +345,40 @@ function et(e, t, r) {
|
|
|
345
345
|
return r ? R(H, r, { themeConfig: { sidebar: e, nav: t } }) : R(H, { themeConfig: { sidebar: e, nav: t } });
|
|
346
346
|
}
|
|
347
347
|
function tt(e, t) {
|
|
348
|
-
const
|
|
349
|
-
y(e,
|
|
348
|
+
const o = w(e, "utf8").replace(/\[([^\]]+)\]\(\.\.\/([^)]+)\)/g, (n, s, i) => `[${s}](${t}/${i})`);
|
|
349
|
+
y(e, o, "utf8");
|
|
350
350
|
}
|
|
351
351
|
function rt(e, t) {
|
|
352
|
-
const
|
|
353
|
-
y(e,
|
|
352
|
+
const o = w(e, "utf8").replace(/\[([^\]]+)\]\((?!\.?\/docs\/|docs\/|http|#)(\.?\/)?([^/][^)]+)\)/g, (n, s, i, a) => `[${s}](${t}/${a})`).replace(/\[([^\]]+)\]\((\.?\/docs\/|docs\/)([^)]*)\)/g, (n, s, i, a) => `[${s}](${a})`);
|
|
353
|
+
y(e, o, "utf8");
|
|
354
354
|
}
|
|
355
355
|
function W(e, t) {
|
|
356
|
-
const
|
|
356
|
+
const n = `${h(t) === "introduction.md" ? `
|
|
357
357
|
## Sources` : "# Sources"}
|
|
358
358
|
|
|
359
359
|
Take a look at the [project sources](${e}).
|
|
360
360
|
`;
|
|
361
|
-
K(t,
|
|
361
|
+
K(t, n, "utf8");
|
|
362
362
|
}
|
|
363
363
|
function st(e, t) {
|
|
364
|
-
const { name: r, login:
|
|
364
|
+
const { name: r, login: o, bio: n } = t;
|
|
365
365
|
return {
|
|
366
366
|
layout: "home",
|
|
367
367
|
hero: {
|
|
368
|
-
name: r ? `${r}'s projects` : `${
|
|
369
|
-
tagline:
|
|
368
|
+
name: r ? `${r}'s projects` : `${o}'s projects`,
|
|
369
|
+
tagline: n ?? "Robots are everywhere 🤖"
|
|
370
370
|
// \U0001F916
|
|
371
371
|
},
|
|
372
372
|
features: e
|
|
373
373
|
};
|
|
374
374
|
}
|
|
375
375
|
function ot(e, t, r) {
|
|
376
|
-
const
|
|
376
|
+
const o = {
|
|
377
377
|
title: b(e, { mode: "capitalize", replaceDash: !0 }),
|
|
378
378
|
details: t,
|
|
379
379
|
link: `/${e}/introduction`
|
|
380
380
|
};
|
|
381
|
-
return r ? [...r,
|
|
381
|
+
return r ? [...r, o] : [o];
|
|
382
382
|
}
|
|
383
383
|
function nt(e, t) {
|
|
384
384
|
return {
|
|
@@ -388,22 +388,22 @@ function nt(e, t) {
|
|
|
388
388
|
};
|
|
389
389
|
}
|
|
390
390
|
function E(e, t, r) {
|
|
391
|
-
const
|
|
391
|
+
const o = {
|
|
392
392
|
text: t === "introduction" ? "Introduction" : b(t, { mode: "capitalize", replaceDash: !0 }),
|
|
393
393
|
link: `/${e}/${t}`
|
|
394
394
|
};
|
|
395
|
-
return r ? [...r,
|
|
395
|
+
return r ? [...r, o] : [o];
|
|
396
396
|
}
|
|
397
397
|
function it(e, t) {
|
|
398
|
-
const r = [],
|
|
398
|
+
const r = [], o = [];
|
|
399
399
|
for (const s of e) {
|
|
400
400
|
d(` Replace urls for repository '${s.name}'.`, "info"), se([s.docpress.projectPath]).forEach((a) => {
|
|
401
|
-
tt(a, `https://github.com/${s.owner.login}/${s.name}/tree/${s.docpress.branch}`),
|
|
401
|
+
tt(a, `https://github.com/${s.owner.login}/${s.name}/tree/${s.docpress.branch}`), h(a).toLowerCase() === "readme.md" && rt(a, `https://github.com/${s.owner.login}/${s.name}/tree/${s.docpress.branch}`);
|
|
402
402
|
}), d(` Generate sidebar for repository '${s.name}'.`, "info");
|
|
403
|
-
const i = Y(s.docpress.projectPath).filter((a) => L(c(s.docpress.projectPath, a)).isFile() &&
|
|
404
|
-
const
|
|
405
|
-
let p = b(g
|
|
406
|
-
if (p === "readme.md" && (p = "introduction.md"), p !== g
|
|
403
|
+
const i = Y(s.docpress.projectPath).filter((a) => L(c(s.docpress.projectPath, a)).isFile() && h(c(s.docpress.projectPath, a)).endsWith(".md")).sort((a, u) => a.localeCompare(u)).reduce((a, u, x, C) => {
|
|
404
|
+
const g = c(s.docpress.projectPath, u);
|
|
405
|
+
let p = b(h(g), { mode: "lowercase", removeIdx: !0 });
|
|
406
|
+
if (p === "readme.md" && (p = "introduction.md"), p !== h(g) && fe(g, c(Q(g), p)), x === C.length - 1) {
|
|
407
407
|
let S;
|
|
408
408
|
if (C.length > 1)
|
|
409
409
|
return S = c(s.docpress.projectPath, "sources.md"), W(s.html_url, S), E(
|
|
@@ -415,32 +415,34 @@ function it(e, t) {
|
|
|
415
415
|
}
|
|
416
416
|
return E(s.name, $(p).name, a);
|
|
417
417
|
}, []);
|
|
418
|
-
|
|
418
|
+
o.push(nt(s.name, i)), r.push(...ot(s.name, s.description || ""));
|
|
419
419
|
}
|
|
420
420
|
d(" Generate index content.", "info");
|
|
421
|
-
const
|
|
421
|
+
const n = st(r.sort((s, i) => s.title.localeCompare(i.title)), t);
|
|
422
422
|
return {
|
|
423
|
-
sidebar:
|
|
424
|
-
index:
|
|
423
|
+
sidebar: o.sort((s, i) => s.text.localeCompare(i.text)),
|
|
424
|
+
index: n
|
|
425
425
|
};
|
|
426
426
|
}
|
|
427
427
|
function ct(e) {
|
|
428
428
|
const t = se(e), r = [];
|
|
429
429
|
d(" Add extras Vitepress headers pages.", "info");
|
|
430
|
-
for (const
|
|
431
|
-
const
|
|
432
|
-
j(
|
|
433
|
-
text: b($(
|
|
434
|
-
link: `/${b($(
|
|
430
|
+
for (const o of t) {
|
|
431
|
+
const n = c(process.cwd(), o), s = c(re, b(h(o), { mode: "lowercase", removeIdx: !0 }));
|
|
432
|
+
j(n, s), r.push({
|
|
433
|
+
text: b($(n).name, { replaceDash: !0, removeIdx: !0 }),
|
|
434
|
+
link: `/${b($(n).name, { removeIdx: !0, mode: "lowercase" })}`
|
|
435
435
|
});
|
|
436
436
|
}
|
|
437
437
|
return r;
|
|
438
438
|
}
|
|
439
439
|
function q(e, t, r) {
|
|
440
|
-
const
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
440
|
+
for (const o of Array.isArray(e) ? e : [e]) {
|
|
441
|
+
const n = c(process.cwd(), o), s = I(n);
|
|
442
|
+
for (const i of s) {
|
|
443
|
+
const a = c(process.cwd(), i), u = c(t, i.replace(n, "."));
|
|
444
|
+
j(a, u);
|
|
445
|
+
}
|
|
444
446
|
}
|
|
445
447
|
}
|
|
446
448
|
function at(e, t) {
|
|
@@ -459,18 +461,18 @@ const X = "prepare", ae = [
|
|
|
459
461
|
await de(t);
|
|
460
462
|
});
|
|
461
463
|
async function de(e) {
|
|
462
|
-
const { extraHeaderPages: t, extraPublicContent: r, extraTheme:
|
|
464
|
+
const { extraHeaderPages: t, extraPublicContent: r, extraTheme: o, vitepressConfig: n } = e;
|
|
463
465
|
d(`
|
|
464
466
|
-> Start transform files to prepare Vitepress build.`, "info");
|
|
465
|
-
const s = Ae(), i = Me().reduce((
|
|
466
|
-
t && x.push(...ct(t)), r && (d(" Add extras Vitepress public folder content.", "info"), q(r, c(k, "public"))),
|
|
467
|
-
const C = et(a, x,
|
|
467
|
+
const s = Ae(), i = Me().reduce((g, p) => p.clone_url && !p.fork && !p.private && p.docpress.includes.length && !p.docpress.filtered ? [...g, p] : g, []), { sidebar: a, index: u } = it(i, s), x = [];
|
|
468
|
+
t && x.push(...ct(t)), r && (d(" Add extras Vitepress public folder content.", "info"), q(r, c(k, "public"))), o && (d(" Add extras Vitepress theme files.", "info"), q(o, c(k, ".vitepress/theme")));
|
|
469
|
+
const C = et(a, x, n);
|
|
468
470
|
at(C, u);
|
|
469
471
|
}
|
|
470
472
|
function lt() {
|
|
471
473
|
const e = new le().name("docpress").description("Build your doc website faster than light ⚡️⚡️⚡️").version(`${Fe.version}`).addCommand(Ke).addCommand(dt).addCommand(Ze).action(async (t, r) => {
|
|
472
|
-
const
|
|
473
|
-
await ie(
|
|
474
|
+
const o = N(["fetch", "prepare"], t);
|
|
475
|
+
await ie(o), await de(o), await ce();
|
|
474
476
|
}).configureHelp({
|
|
475
477
|
sortSubcommands: !0,
|
|
476
478
|
sortOptions: !0,
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sources":["../src/utils/logger.ts","../src/schemas/build.ts","../src/utils/const.ts","../src/utils/functions.ts","../src/schemas/fetch.ts","../src/schemas/prepare.ts","../src/schemas/global.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/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 { z } from 'zod'\n\nexport const buildOptsSchema = z.object({})\n\nexport type BuildOpts = Zod.infer<typeof buildOptsSchema>\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 VITEPRESS_CONFIG = resolve(process.cwd(), 'docpress/.vitepress/config.ts')\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join } 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\nfunction isObject(val: any): val is object {\n return val && typeof val === 'object' && !Array.isArray(val)\n}\n","import { z } from 'zod'\nimport { prettifyEnum } from '../utils/functions.js'\n\nconst providers = ['github'] as const\n\nexport const fetchOptsSchema = z.object({\n branch: z.string()\n .describe('Branch used to collect Git provider data.')\n .optional()\n .default('main'),\n gitProvider: z.enum(providers)\n .describe(`Git provider used to retrieve data. Values should be ${prettifyEnum(providers)}.`)\n .optional()\n .default('github'),\n reposFilter: z.string()\n .transform(repos => repos.split(','))\n .or(z.string().array())\n .describe('List of comma separated repositories to retrieve from Git provider. Default to all user\\'s public repositories.')\n .optional(),\n token: z.string()\n .describe('Git provider token used to collect data.')\n .optional(),\n username: z.string()\n .describe('Git provider username used to collect data.'),\n})\n\nexport type FetchOpts = Zod.infer<typeof fetchOptsSchema>\n","import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { defineConfig } from 'vitepress'\nimport { z } from 'zod'\n\nexport const prepareOptsSchema = z.object({\n extraHeaderPages: z.string()\n .describe('List of comma separated additional files or directories to process Vitepress header pages.')\n .transform(paths => paths.split(','))\n .optional(),\n extraPublicContent: z.string()\n .describe('List of comma separated additional files or directories to process Vitepress public folder.')\n .transform(paths => paths.split(','))\n .optional(),\n extraTheme: z.string()\n .describe('List of comma separated additional files or directories to use as Vitepress theme.')\n .transform(paths => paths.split(','))\n .optional(),\n vitepressConfig: z.string()\n .describe('Path to the vitepress configuration file.')\n .transform(path => JSON.parse(readFileSync(resolve(process.cwd(), path)).toString()) as ReturnType<typeof defineConfig>)\n .optional(),\n})\n\nexport type PrepareOpts = Zod.infer<typeof prepareOptsSchema>\n","import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { z } from 'zod'\nimport { buildOptsSchema } from './build.js'\nimport type { FetchOpts } from './fetch.js'\nimport { fetchOptsSchema } from './fetch.js'\nimport type { PrepareOpts } from './prepare.js'\nimport { prepareOptsSchema } from './prepare.js'\n\nexport const globalOptsSchema = z.object({\n config: z.string()\n .describe('Path to the docpress configuration file.')\n .transform(path => JSON.parse(readFileSync(resolve(process.cwd(), path)).toString()) as FetchOpts & PrepareOpts)\n .optional(),\n})\n\nexport type GlobalOpts = Zod.infer<typeof globalOptsSchema>\n\nexport const configSchema = fetchOptsSchema\n .merge(prepareOptsSchema)\n .merge(buildOptsSchema)\n\nexport type Config = Zod.infer<typeof configSchema>\n","import type { Command, Option } from 'commander'\nimport { fromError } 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\ntype MergeOptions<T extends Cmd[]> = (T extends [infer First, ...infer Rest]\n ? First extends Cmd\n ? Rest extends Cmd[]\n ? Options[First] & MergeOptions<Rest>\n : Options[First]\n : never\n : unknown)\n\nexport function parseOptions<T extends Cmd[]>(cmds: [...T], opts: MergeOptions<T>): MergeOptions<T> {\n log(`Initializing Docpress...`, 'info', 'blue')\n log(`\\n\\n-> Checking for required environment settings and configurations.`, 'info')\n\n function parseSingleOption<K extends Cmd>(cmd: K, singleOpts: Options[K]): Options[K] {\n const res = options[cmd].safeParse({\n ...globalOptsSchema.parse(singleOpts).config,\n ...singleOpts,\n })\n if (res.success) {\n return res.data as Options[K]\n }\n log(` An error occurred while checking configuration: ${fromError(res.error).toString()}`, 'error')\n process.exit(0)\n }\n\n const mergedResult = cmds.reduce((acc, singleCmd) => {\n const singleResult = parseSingleOption(singleCmd, opts as Options[typeof singleCmd])\n return Object.assign(acc, singleResult)\n }, {})\n\n log(' Setup complete! Ready to process your documentation.', 'info')\n return mergedResult as MergeOptions<T>\n}\n\n// export function parseOptions<T extends Cmd | Cmd[]>(cmds: T, opts: T extends Cmd[] ? MergeOptions<T> : Options[T]): T extends Cmd[] ? MergeOptions<T> : Options[T] {\n// log(`Initializing Docpress...`, 'info', 'blue')\n// log(`\\n\\n-> Checking for required environment settings and configurations.`, 'info')\n\n// function parseSingleOption<K extends Cmd>(cmd: K, singleOpts: Options[K]): Options[K] {\n// const res = options[cmd].safeParse({\n// ...globalOptsSchema.parse(singleOpts).config,\n// ...singleOpts,\n// })\n// if (res.success) {\n// return res.data as Options[K]\n// }\n// log(` An error occurred while checking configuration: ${fromError(res.error).toString()}`, 'error')\n// process.exit(0)\n// }\n\n// const cmdArray = Array.isArray(cmds) ? cmds : [cmds]\n// const mergedResult = cmdArray.reduce((acc, singleCmd) => {\n// const singleResult = parseSingleOption(singleCmd, opts as Options[typeof singleCmd])\n// return Object.assign(acc, singleResult)\n// }, {})\n\n// log(' Setup complete! Ready to process your documentation.', 'info')\n// return mergedResult as T extends Cmd[] ? MergeOptions<T> : 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'\nimport { simpleGit } from 'simple-git'\nimport { createDir } from '../utils/functions.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { log } from '../utils/logger.js'\n\nexport async function getInfos({ username, token, branch }: Pick<FetchOpts, 'username' | 'branch' | 'token'>) {\n log(` Get infos for username '${username}'.`, 'info')\n const octokit = new Octokit({ auth: token })\n const { data: user } = await octokit.request('GET /users/{username}', { username })\n const { data: repos } = await octokit.request('GET /users/{username}/repos', { username, sort: 'full_name' })\n\n return { user, repos, branch }\n}\n\nexport async function cloneRepo(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 appendFileSync(resolve(projectDir, '.git/info/sparse-checkout'), `${item}\\n`, 'utf8')\n }\n\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 { 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: FetchOpts['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 log(` Clone repository '${repo.name}'.`, 'info')\n await cloneRepo(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 isExcluded = reposFilter?.filter(filter => filter.startsWith('!'))\n .some(filter => repo.name === filter.substring(1))\n const isIncluded = !reposFilter || reposFilter?.filter(filter => !filter.startsWith('!'))\n .includes(repo.name)\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.fork && !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.shape.config._def.description),\n]\n","import { createCommand, createOption } from 'commander'\nimport { log } from '../utils/logger.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport { fetchOptsSchema } from '../schemas/fetch.js'\nimport { fetchDoc } from '../lib/fetch.js'\nimport type { Config } from '../schemas/global.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'fetch'\n\nexport const fetchOpts = [\n createOption('-b, --branch <string>', fetchOptsSchema.shape.branch._def.description)\n .default(fetchOptsSchema.shape.branch._def.defaultValue()),\n createOption('-g, --git-provider <string>', fetchOptsSchema.shape.gitProvider._def.description)\n .default(fetchOptsSchema.shape.gitProvider._def.defaultValue()),\n createOption('-r, --repos-filter <string>', fetchOptsSchema.shape.reposFilter._def.description),\n createOption('-T, --token <string>', fetchOptsSchema.shape.token._def.description),\n createOption('-u, --username <string>', fetchOptsSchema.shape.username._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: Config) {\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'\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 type { getUserInfos } from '../utils/functions.js'\nimport { createDir, extractFiles, getMdFiles, prettify } from '../utils/functions.js'\nimport { DOCS_DIR, INDEX_FILE, VITEPRESS_CONFIG } from '../utils/const.js'\nimport { replaceReadmePath, replaceRelativePath } from '../utils/regex.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.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 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 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 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(path: string | string[], dir: string, fn?: () => void) {\n const files = extractFiles(path)\n\n for (const file of files) {\n const src = resolve(process.cwd(), file)\n const dest = resolve(dir, basename(file))\n if (fn) {\n fn()\n }\n cpSync(src, dest)\n }\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}\n","import { resolve } from 'node:path'\nimport { createCommand, createOption } from 'commander'\nimport { DOCPRESS_DIR } 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, transformDoc } from '../lib/prepare.js'\nimport { prepareOptsSchema } from '../schemas/prepare.js'\nimport type { EnhancedRepository } from '../lib/fetch.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>', prepareOptsSchema.shape.extraPublicContent._def.description),\n createOption('-p, --extra-header-pages <string>', prepareOptsSchema.shape.extraHeaderPages._def.description),\n createOption('-t, --extra-theme <string>', prepareOptsSchema.shape.extraTheme._def.description),\n createOption('-v, --vitepress-config <string>', prepareOptsSchema.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 } = opts\n log(`\\n-> Start transform files to prepare Vitepress build.`, 'info')\n\n const user = getUserInfos()\n const repositories = getUserRepos()\n .reduce((acc: EnhancedRepository[], cur) => {\n if (cur.clone_url && !cur.fork && !cur.private && cur.docpress.includes.length && !cur.docpress.filtered) {\n return [...acc, cur]\n }\n return acc\n }, [])\n\n const { sidebar, index } = transformDoc(repositories, user)\n const nav: Page[] = []\n\n if (extraHeaderPages) {\n nav.push(...addExtraPages(extraHeaderPages))\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(DOCPRESS_DIR, '.vitepress/theme'))\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\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 .addCommand((fetchCmd))\n .addCommand(prepareCmd)\n .addCommand(buildCmd)\n .action(async (opts, _cmd) => {\n const parsedOpts = parseOptions(['fetch', 'prepare'], 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\n addOptions(pm, [...fetchOpts, ...prepareOpts, ...globalOpts])\n\n return pm\n}\n\nexport function main() {\n const pm = getProgram()\n pm.parseAsync()\n}\n"],"names":["getLogLevel","colorMap","log","msg","type","color","computedMsg","chalk","computedType","buildOptsSchema","z","DOCPRESS_DIR","resolve","USER_REPOS_INFOS","USER_INFOS","DOCS_DIR","INDEX_FILE","VITEPRESS_CONFIG","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","providers","fetchOptsSchema","repos","prepareOptsSchema","globalOptsSchema","options","parseOptions","cmds","parseSingleOption","cmd","singleOpts","res","fromError","mergedResult","singleCmd","singleResult","addOptions","opt","getInfos","username","token","branch","octokit","Octokit","user","cloneRepo","projectDir","includes","git","simpleGit","item","appendFileSync","cpSync","rmSync","checkDoc","repoOwner","repoName","rootReadmeUrl","docsFolderUrl","docsReadmeUrl","rootReadmeStatus","docsFolderStatus","docsReadmeStatus","fetchDoc","reposFilter","generateInfos","getDoc","enhanceRepositories","enhancedRepos","repo","computedBranch","projectPath","filtered","isRepoFiltered","getSparseCheckout","docsStatus","status","writeFileSync","isExcluded","filter","isIncluded","isFiltered","globalOpts","createOption","cmdName","fetchOpts","fetchCmd","createCommand","parsedOpts","main","gitProvider","buildCmd","_opts","vitepressBuild","defaultVitepressConfig","getVitepressConfig","sidebar","nav","vitepressConfig","replaceRelativePath","updatedContent","_match","p1","p2","replaceReadmePath","_p2","p3","addSources","repoUrl","outputPath","sourcesContent","generateIndex","features","name","login","bio","generateFeatures","description","content","generateSidebarProject","sidebarPages","generateSidebarPages","fileName","transformDoc","repositories","repository","sidebarItems","b","filename","renameSync","dirname","sourceFile","parse","index","a","addExtraPages","files","src","dest","addContent","dir","fn","generateVitepressFiles","separator","YAML","prepareOpts","prepareCmd","extraHeaderPages","extraPublicContent","extraTheme","config","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/schemas/build.ts","../src/utils/const.ts","../src/utils/functions.ts","../src/schemas/fetch.ts","../src/schemas/prepare.ts","../src/schemas/global.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/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 { z } from 'zod'\n\nexport const buildOptsSchema = z.object({})\n\nexport type BuildOpts = Zod.infer<typeof buildOptsSchema>\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 VITEPRESS_CONFIG = resolve(process.cwd(), 'docpress/.vitepress/config.ts')\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join } 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\nfunction isObject(val: any): val is object {\n return val && typeof val === 'object' && !Array.isArray(val)\n}\n","import { z } from 'zod'\nimport { prettifyEnum } from '../utils/functions.js'\n\nconst providers = ['github'] as const\n\nexport const fetchOptsSchema = z.object({\n branch: z.string()\n .describe('Branch used to collect Git provider data.')\n .optional()\n .default('main'),\n gitProvider: z.enum(providers)\n .describe(`Git provider used to retrieve data. Values should be ${prettifyEnum(providers)}.`)\n .optional()\n .default('github'),\n reposFilter: z.string()\n .transform(repos => repos.split(','))\n .or(z.string().array())\n .describe('List of comma separated repositories to retrieve from Git provider. Default to all user\\'s public repositories.')\n .optional(),\n token: z.string()\n .describe('Git provider token used to collect data.')\n .optional(),\n username: z.string()\n .describe('Git provider username used to collect data.'),\n})\n\nexport type FetchOpts = Zod.infer<typeof fetchOptsSchema>\n","import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { defineConfig } from 'vitepress'\nimport { z } from 'zod'\n\nexport const prepareOptsSchema = z.object({\n extraHeaderPages: z.string()\n .describe('List of comma separated additional files or directories to process Vitepress header pages.')\n .transform(paths => paths.split(','))\n .optional(),\n extraPublicContent: z.string()\n .describe('List of comma separated additional files or directories to process Vitepress public folder.')\n .transform(paths => paths.split(','))\n .optional(),\n extraTheme: z.string()\n .describe('List of comma separated additional files or directories to use as Vitepress theme.')\n .transform(paths => paths.split(','))\n .optional(),\n vitepressConfig: z.string()\n .describe('Path to the vitepress configuration file.')\n .transform(path => JSON.parse(readFileSync(resolve(process.cwd(), path)).toString()) as ReturnType<typeof defineConfig>)\n .optional(),\n})\n\nexport type PrepareOpts = Zod.infer<typeof prepareOptsSchema>\n","import { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { z } from 'zod'\nimport { buildOptsSchema } from './build.js'\nimport type { FetchOpts } from './fetch.js'\nimport { fetchOptsSchema } from './fetch.js'\nimport type { PrepareOpts } from './prepare.js'\nimport { prepareOptsSchema } from './prepare.js'\n\nexport const globalOptsSchema = z.object({\n config: z.string()\n .describe('Path to the docpress configuration file.')\n .transform(path => JSON.parse(readFileSync(resolve(process.cwd(), path)).toString()) as FetchOpts & PrepareOpts)\n .optional(),\n})\n\nexport type GlobalOpts = Zod.infer<typeof globalOptsSchema>\n\nexport const configSchema = fetchOptsSchema\n .merge(prepareOptsSchema)\n .merge(buildOptsSchema)\n\nexport type Config = Zod.infer<typeof configSchema>\n","import type { Command, Option } from 'commander'\nimport { fromError } 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\ntype MergeOptions<T extends Cmd[]> = (T extends [infer First, ...infer Rest]\n ? First extends Cmd\n ? Rest extends Cmd[]\n ? Options[First] & MergeOptions<Rest>\n : Options[First]\n : never\n : unknown)\n\nexport function parseOptions<T extends Cmd[]>(cmds: [...T], opts: MergeOptions<T>): MergeOptions<T> {\n log(`Initializing Docpress...`, 'info', 'blue')\n log(`\\n\\n-> Checking for required environment settings and configurations.`, 'info')\n\n function parseSingleOption<K extends Cmd>(cmd: K, singleOpts: Options[K]): Options[K] {\n const res = options[cmd].safeParse({\n ...globalOptsSchema.parse(singleOpts).config,\n ...singleOpts,\n })\n if (res.success) {\n return res.data as Options[K]\n }\n log(` An error occurred while checking configuration: ${fromError(res.error).toString()}`, 'error')\n process.exit(0)\n }\n\n const mergedResult = cmds.reduce((acc, singleCmd) => {\n const singleResult = parseSingleOption(singleCmd, opts as Options[typeof singleCmd])\n return Object.assign(acc, singleResult)\n }, {})\n\n log(' Setup complete! Ready to process your documentation.', 'info')\n return mergedResult as MergeOptions<T>\n}\n\n// export function parseOptions<T extends Cmd | Cmd[]>(cmds: T, opts: T extends Cmd[] ? MergeOptions<T> : Options[T]): T extends Cmd[] ? MergeOptions<T> : Options[T] {\n// log(`Initializing Docpress...`, 'info', 'blue')\n// log(`\\n\\n-> Checking for required environment settings and configurations.`, 'info')\n\n// function parseSingleOption<K extends Cmd>(cmd: K, singleOpts: Options[K]): Options[K] {\n// const res = options[cmd].safeParse({\n// ...globalOptsSchema.parse(singleOpts).config,\n// ...singleOpts,\n// })\n// if (res.success) {\n// return res.data as Options[K]\n// }\n// log(` An error occurred while checking configuration: ${fromError(res.error).toString()}`, 'error')\n// process.exit(0)\n// }\n\n// const cmdArray = Array.isArray(cmds) ? cmds : [cmds]\n// const mergedResult = cmdArray.reduce((acc, singleCmd) => {\n// const singleResult = parseSingleOption(singleCmd, opts as Options[typeof singleCmd])\n// return Object.assign(acc, singleResult)\n// }, {})\n\n// log(' Setup complete! Ready to process your documentation.', 'info')\n// return mergedResult as T extends Cmd[] ? MergeOptions<T> : 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'\nimport { simpleGit } from 'simple-git'\nimport { createDir } from '../utils/functions.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { log } from '../utils/logger.js'\n\nexport async function getInfos({ username, token, branch }: Pick<FetchOpts, 'username' | 'branch' | 'token'>) {\n log(` Get infos for username '${username}'.`, 'info')\n const octokit = new Octokit({ auth: token })\n const { data: user } = await octokit.request('GET /users/{username}', { username })\n const { data: repos } = await octokit.request('GET /users/{username}/repos', { username, sort: 'full_name' })\n\n return { user, repos, branch }\n}\n\nexport async function cloneRepo(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 appendFileSync(resolve(projectDir, '.git/info/sparse-checkout'), `${item}\\n`, 'utf8')\n }\n\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 { 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: FetchOpts['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 log(` Clone repository '${repo.name}'.`, 'info')\n await cloneRepo(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 || (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.fork && !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.shape.config._def.description),\n]\n","import { createCommand, createOption } from 'commander'\nimport { log } from '../utils/logger.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport { fetchOptsSchema } from '../schemas/fetch.js'\nimport { fetchDoc } from '../lib/fetch.js'\nimport type { Config } from '../schemas/global.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'fetch'\n\nexport const fetchOpts = [\n createOption('-b, --branch <string>', fetchOptsSchema.shape.branch._def.description)\n .default(fetchOptsSchema.shape.branch._def.defaultValue()),\n createOption('-g, --git-provider <string>', fetchOptsSchema.shape.gitProvider._def.description)\n .default(fetchOptsSchema.shape.gitProvider._def.defaultValue()),\n createOption('-r, --repos-filter <string>', fetchOptsSchema.shape.reposFilter._def.description),\n createOption('-T, --token <string>', fetchOptsSchema.shape.token._def.description),\n createOption('-u, --username <string>', fetchOptsSchema.shape.username._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: Config) {\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'\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 type { getUserInfos } from '../utils/functions.js'\nimport { createDir, extractFiles, getMdFiles, prettify } from '../utils/functions.js'\nimport { DOCS_DIR, INDEX_FILE, VITEPRESS_CONFIG } from '../utils/const.js'\nimport { replaceReadmePath, replaceRelativePath } from '../utils/regex.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.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 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 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 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 src = resolve(process.cwd(), file)\n const dest = resolve(dir, file.replace(absolutePath, '.'))\n if (fn) {\n fn()\n }\n cpSync(src, dest)\n }\n }\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}\n","import { resolve } from 'node:path'\nimport { createCommand, createOption } from 'commander'\nimport { DOCPRESS_DIR } 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, transformDoc } from '../lib/prepare.js'\nimport { prepareOptsSchema } from '../schemas/prepare.js'\nimport type { EnhancedRepository } from '../lib/fetch.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>', prepareOptsSchema.shape.extraPublicContent._def.description),\n createOption('-p, --extra-header-pages <string>', prepareOptsSchema.shape.extraHeaderPages._def.description),\n createOption('-t, --extra-theme <string>', prepareOptsSchema.shape.extraTheme._def.description),\n createOption('-v, --vitepress-config <string>', prepareOptsSchema.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 } = opts\n log(`\\n-> Start transform files to prepare Vitepress build.`, 'info')\n\n const user = getUserInfos()\n const repositories = getUserRepos()\n .reduce((acc: EnhancedRepository[], cur) => {\n if (cur.clone_url && !cur.fork && !cur.private && cur.docpress.includes.length && !cur.docpress.filtered) {\n return [...acc, cur]\n }\n return acc\n }, [])\n\n const { sidebar, index } = transformDoc(repositories, user)\n const nav: Page[] = []\n\n if (extraHeaderPages) {\n nav.push(...addExtraPages(extraHeaderPages))\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(DOCPRESS_DIR, '.vitepress/theme'))\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\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 .addCommand((fetchCmd))\n .addCommand(prepareCmd)\n .addCommand(buildCmd)\n .action(async (opts, _cmd) => {\n const parsedOpts = parseOptions(['fetch', 'prepare'], 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\n addOptions(pm, [...fetchOpts, ...prepareOpts, ...globalOpts])\n\n return pm\n}\n\nexport function main() {\n const pm = getProgram()\n pm.parseAsync()\n}\n"],"names":["getLogLevel","colorMap","log","msg","type","color","computedMsg","chalk","computedType","buildOptsSchema","z","DOCPRESS_DIR","resolve","USER_REPOS_INFOS","USER_INFOS","DOCS_DIR","INDEX_FILE","VITEPRESS_CONFIG","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","providers","fetchOptsSchema","repos","prepareOptsSchema","globalOptsSchema","options","parseOptions","cmds","parseSingleOption","cmd","singleOpts","res","fromError","mergedResult","singleCmd","singleResult","addOptions","opt","getInfos","username","token","branch","octokit","Octokit","user","cloneRepo","projectDir","includes","git","simpleGit","item","appendFileSync","cpSync","rmSync","checkDoc","repoOwner","repoName","rootReadmeUrl","docsFolderUrl","docsReadmeUrl","rootReadmeStatus","docsFolderStatus","docsReadmeStatus","fetchDoc","reposFilter","generateInfos","getDoc","enhanceRepositories","enhancedRepos","repo","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","vitepressConfig","replaceRelativePath","updatedContent","_match","p1","p2","replaceReadmePath","_p2","p3","addSources","repoUrl","outputPath","sourcesContent","generateIndex","features","name","login","bio","generateFeatures","description","content","generateSidebarProject","sidebarPages","generateSidebarPages","fileName","transformDoc","repositories","repository","sidebarItems","b","filename","renameSync","dirname","sourceFile","parse","index","a","addExtraPages","files","src","dest","addContent","dir","fn","absolutePath","generateVitepressFiles","separator","YAML","prepareOpts","prepareCmd","extraHeaderPages","extraPublicContent","extraTheme","config","getProgram","pm","Command","pkg","_cmd","fetchFn","prepareFn","buildFn"],"mappings":"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"}
|
package/package.json
CHANGED
package/types/lib/prepare.d.ts
CHANGED
|
@@ -50,6 +50,6 @@ export declare function transformDoc(repositories: EnhancedRepository[], user: R
|
|
|
50
50
|
};
|
|
51
51
|
};
|
|
52
52
|
export declare function addExtraPages(paths: string[]): Page[];
|
|
53
|
-
export declare function addContent(
|
|
53
|
+
export declare function addContent(paths: string | string[], dir: string, fn?: () => void): void;
|
|
54
54
|
export declare function parseVitepressConfig(path: string): any;
|
|
55
55
|
export declare function generateVitepressFiles(vitepressConfig: Partial<ReturnType<typeof defineConfig>>, index: Index): void;
|