@tobi-or-not/docpress 0.1.7 → 0.2.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/dist/cli.js +280 -226
- package/dist/cli.js.map +1 -1
- package/package.json +2 -1
- package/types/utils/commands.d.ts +2 -1
- package/types/utils/logger.d.ts +4 -0
package/dist/cli.js
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
import { createOption as
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
|
|
1
|
+
import { createOption as f, createCommand as D, Command as le } from "commander";
|
|
2
|
+
import T from "chalk";
|
|
3
|
+
import { fromError as pe } from "zod-validation-error";
|
|
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 g, dirname as Q, parse as $ } from "node:path";
|
|
6
|
+
import { z as l } from "zod";
|
|
7
|
+
import ge from "axios";
|
|
8
|
+
import { rimrafSync as he } from "rimraf";
|
|
9
|
+
import { Octokit as be } from "octokit";
|
|
10
|
+
import { simpleGit as ve } from "simple-git";
|
|
11
|
+
import { build as ye } from "vitepress";
|
|
12
|
+
import we from "yaml";
|
|
13
|
+
const Se = "@tobi-or-not/docpress", $e = "module", xe = "0.2.1", Ce = "pnpm@9.12.3", ke = "dist/docpress.js", _e = "types/index.d.ts", Oe = {
|
|
13
14
|
docpress: "bin/docpress.js"
|
|
14
|
-
},
|
|
15
|
+
}, Pe = [
|
|
15
16
|
"bin",
|
|
16
17
|
"dist",
|
|
17
18
|
"types"
|
|
18
|
-
],
|
|
19
|
+
], Ee = {
|
|
19
20
|
node: ">=20"
|
|
20
|
-
},
|
|
21
|
+
}, Re = {
|
|
21
22
|
build: "pnpm run build:types && pnpm run build:vite",
|
|
22
23
|
"build:clean": "rimraf ./dist ./types ./tsconfig.tsbuildinfo",
|
|
23
24
|
"build:docker": "docker build --tag tobi-or-not/docpress --target prod .",
|
|
@@ -37,8 +38,9 @@ const ve = "@tobi-or-not/docpress", ye = "module", we = "0.1.7", Se = "pnpm@9.12
|
|
|
37
38
|
"vp:dev": "vitepress dev ./docpress --port 8080",
|
|
38
39
|
"vp:dev:docker": "docker run --publish 8080:8080 --name docpress-vp --rm tobi-or-not/docs",
|
|
39
40
|
"vp:preview": "vitepress preview ./docpress --port 8080"
|
|
40
|
-
},
|
|
41
|
+
}, De = {
|
|
41
42
|
axios: "^1.7.7",
|
|
43
|
+
chalk: "^5.3.0",
|
|
42
44
|
commander: "^12.1.0",
|
|
43
45
|
octokit: "^4.0.2",
|
|
44
46
|
rimraf: "^6.0.1",
|
|
@@ -47,7 +49,7 @@ const ve = "@tobi-or-not/docpress", ye = "module", we = "0.1.7", Se = "pnpm@9.12
|
|
|
47
49
|
yaml: "^2.6.0",
|
|
48
50
|
zod: "^3.23.8",
|
|
49
51
|
"zod-validation-error": "^3.4.0"
|
|
50
|
-
},
|
|
52
|
+
}, Le = {
|
|
51
53
|
"@antfu/eslint-config": "^3.8.0",
|
|
52
54
|
"@commitlint/cli": "^19.5.0",
|
|
53
55
|
"@commitlint/config-conventional": "^19.5.0",
|
|
@@ -60,206 +62,249 @@ const ve = "@tobi-or-not/docpress", ye = "module", we = "0.1.7", Se = "pnpm@9.12
|
|
|
60
62
|
vite: "^5.4.9",
|
|
61
63
|
"vite-node": "^2.1.3",
|
|
62
64
|
vitest: "^2.1.3"
|
|
63
|
-
},
|
|
65
|
+
}, je = {
|
|
64
66
|
registry: "https://registry.npmjs.org/",
|
|
65
67
|
access: "public",
|
|
66
68
|
tag: "latest"
|
|
67
|
-
},
|
|
68
|
-
name:
|
|
69
|
-
type:
|
|
70
|
-
version:
|
|
71
|
-
packageManager:
|
|
72
|
-
module:
|
|
73
|
-
types:
|
|
74
|
-
bin:
|
|
75
|
-
files:
|
|
76
|
-
engines:
|
|
77
|
-
scripts:
|
|
78
|
-
dependencies:
|
|
79
|
-
devDependencies:
|
|
80
|
-
publishConfig:
|
|
81
|
-
}
|
|
69
|
+
}, Fe = {
|
|
70
|
+
name: Se,
|
|
71
|
+
type: $e,
|
|
72
|
+
version: xe,
|
|
73
|
+
packageManager: Ce,
|
|
74
|
+
module: ke,
|
|
75
|
+
types: _e,
|
|
76
|
+
bin: Oe,
|
|
77
|
+
files: Pe,
|
|
78
|
+
engines: Ee,
|
|
79
|
+
scripts: Re,
|
|
80
|
+
dependencies: De,
|
|
81
|
+
devDependencies: Le,
|
|
82
|
+
publishConfig: je
|
|
83
|
+
};
|
|
84
|
+
function Ie() {
|
|
85
|
+
return typeof Number(process.env.LOG_LEVEL) == "number" && !Number.isNaN(Number(process.env.LOG_LEVEL)) ? Number(process.env.LOG_LEVEL) : 30;
|
|
86
|
+
}
|
|
87
|
+
const M = {
|
|
88
|
+
info: { color: "white", level: 30 },
|
|
89
|
+
warn: { color: "yellow", level: 20 },
|
|
90
|
+
error: { color: "red", level: 10 },
|
|
91
|
+
debug: { color: "blue", level: 50 },
|
|
92
|
+
trace: { color: "white", level: 40 },
|
|
93
|
+
success: { color: "green", level: 30 }
|
|
94
|
+
};
|
|
95
|
+
function d(e, t = "info", r) {
|
|
96
|
+
const n = r ? T[r](e) : T[M[t].color](e), o = t === "success" ? "info" : t;
|
|
97
|
+
Ie() >= M[t].level && console[o](n);
|
|
98
|
+
}
|
|
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");
|
|
82
100
|
async function P(e) {
|
|
83
101
|
try {
|
|
84
|
-
return (await
|
|
102
|
+
return (await ge.head(e)).status;
|
|
85
103
|
} catch (t) {
|
|
86
104
|
return t.response?.status || t.status || 500;
|
|
87
105
|
}
|
|
88
106
|
}
|
|
89
|
-
function
|
|
90
|
-
let
|
|
91
|
-
return t?.removeIdx && (
|
|
107
|
+
function b(e, t) {
|
|
108
|
+
let r = "";
|
|
109
|
+
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;
|
|
92
110
|
}
|
|
93
|
-
function
|
|
111
|
+
function F(e, { clean: t } = { clean: !1 }) {
|
|
94
112
|
try {
|
|
95
|
-
t &&
|
|
96
|
-
} catch (
|
|
97
|
-
console.error(
|
|
113
|
+
t && G(e) && he(`${e}/*`, { glob: !0 }), G(e) || ue(e, { recursive: !0 });
|
|
114
|
+
} catch (r) {
|
|
115
|
+
console.error(r);
|
|
98
116
|
}
|
|
99
117
|
}
|
|
100
|
-
function
|
|
118
|
+
function Ne(e) {
|
|
101
119
|
try {
|
|
102
|
-
return
|
|
120
|
+
return L(e).isDirectory();
|
|
103
121
|
} catch {
|
|
104
122
|
return !1;
|
|
105
123
|
}
|
|
106
124
|
}
|
|
107
|
-
function
|
|
125
|
+
function Te(e) {
|
|
108
126
|
try {
|
|
109
|
-
return
|
|
127
|
+
return L(e).isFile();
|
|
110
128
|
} catch {
|
|
111
129
|
return !1;
|
|
112
130
|
}
|
|
113
131
|
}
|
|
114
132
|
function I(e) {
|
|
115
|
-
return (Array.isArray(e) ? e : [e]).flatMap((t) =>
|
|
133
|
+
return (Array.isArray(e) ? e : [e]).flatMap((t) => Te(t) ? [t] : Ne(t) ? Y(t).flatMap((r) => I(me(t, r))) : []);
|
|
116
134
|
}
|
|
117
|
-
function
|
|
118
|
-
return I(e).filter((t) =>
|
|
135
|
+
function se(e) {
|
|
136
|
+
return I(e).filter((t) => g(t).endsWith(".md"));
|
|
119
137
|
}
|
|
120
|
-
function
|
|
121
|
-
return e.reduce((t,
|
|
138
|
+
function Ge(e) {
|
|
139
|
+
return e.reduce((t, r, n, o) => n ? n === o.length - 1 ? `${t} or "${r}"` : `${t}, "${r}"` : `"${r}"`, "");
|
|
122
140
|
}
|
|
123
|
-
function
|
|
124
|
-
return JSON.parse(
|
|
141
|
+
function Ae() {
|
|
142
|
+
return JSON.parse(w(te).toString());
|
|
125
143
|
}
|
|
126
|
-
function
|
|
127
|
-
return JSON.parse(
|
|
144
|
+
function Me() {
|
|
145
|
+
return JSON.parse(w(ee).toString());
|
|
128
146
|
}
|
|
129
147
|
function R(...e) {
|
|
130
|
-
return e.reduce((t,
|
|
131
|
-
const o = t ? t[n] : null,
|
|
132
|
-
|
|
148
|
+
return e.reduce((t, r) => (r === null || Object.keys(r).forEach((n) => {
|
|
149
|
+
const o = t ? t[n] : null, s = r[n];
|
|
150
|
+
z(o) && z(s) ? t[n] = R(o, s) : t[n] = s;
|
|
133
151
|
}), t), {});
|
|
134
152
|
}
|
|
135
|
-
function
|
|
153
|
+
function z(e) {
|
|
136
154
|
return e && typeof e == "object" && !Array.isArray(e);
|
|
137
155
|
}
|
|
138
|
-
const
|
|
139
|
-
branch:
|
|
140
|
-
gitProvider:
|
|
141
|
-
reposFilter:
|
|
142
|
-
token:
|
|
143
|
-
username:
|
|
144
|
-
}),
|
|
145
|
-
extraHeaderPages:
|
|
146
|
-
extraPublicContent:
|
|
147
|
-
extraTheme:
|
|
148
|
-
vitepressConfig:
|
|
149
|
-
}),
|
|
150
|
-
config:
|
|
156
|
+
const J = ["github"], m = l.object({
|
|
157
|
+
branch: l.string().describe("Branch used to collect Git provider data.").optional().default("main"),
|
|
158
|
+
gitProvider: l.enum(J).describe(`Git provider used to retrieve data. Values should be ${Ge(J)}.`).optional().default("github"),
|
|
159
|
+
reposFilter: l.string().transform((e) => e.split(",")).or(l.string().array()).describe("List of comma separated repositories to retrieve from Git provider. Default to all user's public repositories.").optional(),
|
|
160
|
+
token: l.string().describe("Git provider token used to collect data.").optional(),
|
|
161
|
+
username: l.string().describe("Git provider username used to collect data.")
|
|
162
|
+
}), v = l.object({
|
|
163
|
+
extraHeaderPages: l.string().describe("List of comma separated additional files or directories to process Vitepress header pages.").transform((e) => e.split(",")).optional(),
|
|
164
|
+
extraPublicContent: l.string().describe("List of comma separated additional files or directories to process Vitepress public folder.").transform((e) => e.split(",")).optional(),
|
|
165
|
+
extraTheme: l.string().describe("List of comma separated additional files or directories to use as Vitepress theme.").transform((e) => e.split(",")).optional(),
|
|
166
|
+
vitepressConfig: l.string().describe("Path to the vitepress configuration file.").transform((e) => JSON.parse(w(c(process.cwd(), e)).toString())).optional()
|
|
167
|
+
}), V = l.object({
|
|
168
|
+
config: l.string().describe("Path to the docpress configuration file.").transform((e) => JSON.parse(w(c(process.cwd(), e)).toString())).optional()
|
|
151
169
|
});
|
|
152
|
-
|
|
153
|
-
const
|
|
154
|
-
build:
|
|
155
|
-
fetch:
|
|
156
|
-
prepare:
|
|
157
|
-
global:
|
|
170
|
+
m.merge(v).merge(Z);
|
|
171
|
+
const Ue = {
|
|
172
|
+
build: Z,
|
|
173
|
+
fetch: m,
|
|
174
|
+
prepare: v,
|
|
175
|
+
global: V
|
|
158
176
|
};
|
|
159
|
-
function
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
const n =
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
+
function N(e, t) {
|
|
178
|
+
d("Initializing Docpress...", "info", "blue"), d(`
|
|
179
|
+
|
|
180
|
+
-> Checking for required environment settings and configurations.`, "info");
|
|
181
|
+
function r(o, s) {
|
|
182
|
+
const i = Ue[o].safeParse({
|
|
183
|
+
...V.parse(s).config,
|
|
184
|
+
...s
|
|
185
|
+
});
|
|
186
|
+
if (i.success)
|
|
187
|
+
return i.data;
|
|
188
|
+
d(` An error occurred while checking configuration: ${pe(i.error).toString()}`, "error"), process.exit(0);
|
|
189
|
+
}
|
|
190
|
+
const n = e.reduce((o, s) => {
|
|
191
|
+
const i = r(s, t);
|
|
192
|
+
return Object.assign(o, i);
|
|
193
|
+
}, {});
|
|
194
|
+
return d(" Setup complete! Ready to process your documentation.", "info"), n;
|
|
195
|
+
}
|
|
196
|
+
function _(e, t) {
|
|
197
|
+
return t.forEach((r) => e.addOption(r)), e;
|
|
198
|
+
}
|
|
199
|
+
async function ze({ username: e, token: t, branch: r }) {
|
|
200
|
+
d(` Get infos for username '${e}'.`, "info");
|
|
201
|
+
const n = new be({ auth: t }), { data: o } = await n.request("GET /users/{username}", { username: e }), { data: s } = await n.request("GET /users/{username}/repos", { username: e, sort: "full_name" });
|
|
202
|
+
return { user: o, repos: s, branch: r };
|
|
203
|
+
}
|
|
204
|
+
async function Je(e, t, r, n) {
|
|
205
|
+
F(t, { clean: !0 });
|
|
177
206
|
try {
|
|
178
|
-
const o =
|
|
207
|
+
const o = ve({ baseDir: t });
|
|
179
208
|
await o.init().addConfig("core.sparseCheckout", "true", !0, "local").addRemote("origin", e);
|
|
180
|
-
for (const
|
|
181
|
-
|
|
209
|
+
for (const s of n)
|
|
210
|
+
K(c(t, ".git/info/sparse-checkout"), `${s}
|
|
182
211
|
`, "utf8");
|
|
183
|
-
await o.pull("origin",
|
|
212
|
+
await o.pull("origin", r), n.some((s) => s.includes("docs")) && (j(c(t, "docs"), t, { recursive: !0 }), A(c(t, "docs"), { recursive: !0 })), A(c(t, ".git"), { recursive: !0 });
|
|
184
213
|
} catch (o) {
|
|
185
|
-
|
|
214
|
+
d(` Error when cloning repository: ${o}.`, "error");
|
|
186
215
|
}
|
|
187
216
|
}
|
|
188
|
-
async function
|
|
189
|
-
const n = `https://github.com/${e}/${t}/tree/${
|
|
217
|
+
async function Be(e, t, r) {
|
|
218
|
+
const n = `https://github.com/${e}/${t}/tree/${r}/README.md`, o = `https://github.com/${e}/${t}/tree/${r}/docs`, s = `https://github.com/${e}/${t}/tree/${r}/docs/01-readme.md`, i = await P(n), a = await P(o), u = await P(s);
|
|
190
219
|
return {
|
|
191
|
-
rootReadmeStatus:
|
|
192
|
-
docsFolderStatus:
|
|
193
|
-
docsReadmeStatus:
|
|
220
|
+
rootReadmeStatus: i,
|
|
221
|
+
docsFolderStatus: a,
|
|
222
|
+
docsReadmeStatus: u
|
|
194
223
|
};
|
|
195
224
|
}
|
|
196
|
-
async function
|
|
197
|
-
|
|
225
|
+
async function He({ username: e, branch: t, reposFilter: r, token: n }) {
|
|
226
|
+
F(k, { clean: !0 }), await ze({ username: e, token: n, branch: t }).then(async ({ user: o, repos: s, branch: i }) => Xe(o, s, i, r)).then(async ({ repos: o }) => Ye(o, r));
|
|
198
227
|
}
|
|
199
|
-
async function
|
|
228
|
+
async function We(e, t, r) {
|
|
200
229
|
const n = [];
|
|
201
230
|
return await Promise.all(
|
|
202
231
|
e.map(async (o) => {
|
|
203
|
-
const
|
|
204
|
-
let
|
|
205
|
-
!o.fork && !o.private && !
|
|
232
|
+
const s = t ?? o.default_branch ?? "main", i = c(re, o.name), a = oe(o, r);
|
|
233
|
+
let u = [];
|
|
234
|
+
!o.fork && !o.private && !a && (u = await qe(o, s)), n.push({
|
|
206
235
|
...o,
|
|
207
236
|
docpress: {
|
|
208
|
-
filtered:
|
|
209
|
-
branch:
|
|
210
|
-
includes:
|
|
211
|
-
projectPath:
|
|
212
|
-
raw_url: `https://raw.githubusercontent.com/${o.owner.login}/${o.name}/${
|
|
213
|
-
replace_url: `https://github.com/${o.owner.login}/${o.name}/tree/${
|
|
237
|
+
filtered: a,
|
|
238
|
+
branch: s,
|
|
239
|
+
includes: u,
|
|
240
|
+
projectPath: i,
|
|
241
|
+
raw_url: `https://raw.githubusercontent.com/${o.owner.login}/${o.name}/${s}`,
|
|
242
|
+
replace_url: `https://github.com/${o.owner.login}/${o.name}/tree/${s}`
|
|
214
243
|
}
|
|
215
244
|
});
|
|
216
245
|
})
|
|
217
246
|
), n;
|
|
218
247
|
}
|
|
219
|
-
async function
|
|
220
|
-
const
|
|
221
|
-
return Object.values(
|
|
248
|
+
async function qe(e, t) {
|
|
249
|
+
const r = await Be(e.owner.login, e.name, t), n = [];
|
|
250
|
+
return Object.values(r).every((o) => o === 404) || !e.size ? [] : (r.docsFolderStatus !== 404 && n.push("docs/*"), (r.docsFolderStatus === 404 || r.docsReadmeStatus === 404) && n.push("README.md", "!*/**/README.md"), n);
|
|
222
251
|
}
|
|
223
|
-
async function
|
|
224
|
-
|
|
225
|
-
const o = await
|
|
226
|
-
return
|
|
252
|
+
async function Xe(e, t, r, n) {
|
|
253
|
+
y(te, JSON.stringify(e, null, 2));
|
|
254
|
+
const o = await We(t, r, n);
|
|
255
|
+
return y(ee, JSON.stringify(o, null, 2)), { user: e, repos: o };
|
|
227
256
|
}
|
|
228
|
-
async function
|
|
257
|
+
async function Ye(e, t) {
|
|
229
258
|
if (!e) {
|
|
230
|
-
|
|
259
|
+
d(" No repository respect docpress rules.", "warn");
|
|
231
260
|
return;
|
|
232
261
|
}
|
|
233
262
|
await Promise.all(
|
|
234
|
-
e.filter((
|
|
263
|
+
e.filter((r) => !oe(r, t)).map(async (r) => {
|
|
264
|
+
d(` Clone repository '${r.name}'.`, "info"), await Je(r.clone_url, r.docpress.projectPath, r.docpress.branch, r.docpress.includes);
|
|
265
|
+
})
|
|
235
266
|
);
|
|
236
267
|
}
|
|
237
|
-
function
|
|
238
|
-
const
|
|
268
|
+
function oe(e, t) {
|
|
269
|
+
const r = t?.filter((s) => s.startsWith("!")).some((s) => e.name === s.substring(1)), n = !t || t?.filter((s) => !s.startsWith("!")).includes(e.name), o = r || !n;
|
|
239
270
|
return "docpress" in e && !e.docpress.includes.length ? !0 : !(e.clone_url && !e.fork && !e.private && !o);
|
|
240
271
|
}
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
],
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
],
|
|
250
|
-
|
|
272
|
+
const O = [
|
|
273
|
+
f("-C, --config <string>", V.shape.config._def.description)
|
|
274
|
+
], B = "fetch", ne = [
|
|
275
|
+
f("-b, --branch <string>", m.shape.branch._def.description).default(m.shape.branch._def.defaultValue()),
|
|
276
|
+
f("-g, --git-provider <string>", m.shape.gitProvider._def.description).default(m.shape.gitProvider._def.defaultValue()),
|
|
277
|
+
f("-r, --repos-filter <string>", m.shape.reposFilter._def.description),
|
|
278
|
+
f("-T, --token <string>", m.shape.token._def.description),
|
|
279
|
+
f("-u, --username <string>", m.shape.username._def.description)
|
|
280
|
+
], Ke = _(D(B), [...ne, ...O]).description("Fetch docs with the given username and git provider.").action(async (e) => {
|
|
281
|
+
const t = N([B], e);
|
|
282
|
+
await ie(t);
|
|
251
283
|
});
|
|
252
|
-
async function
|
|
253
|
-
const { username: t, reposFilter:
|
|
254
|
-
|
|
284
|
+
async function ie(e) {
|
|
285
|
+
const { username: t, reposFilter: r, token: n, branch: o, gitProvider: s } = e;
|
|
286
|
+
d(`
|
|
287
|
+
-> Start fetching documentation files. This may take a moment, especially for larger repositories.`, "info"), await He({ username: t, branch: o, reposFilter: r, gitProvider: s, token: n });
|
|
255
288
|
}
|
|
256
|
-
const
|
|
257
|
-
await
|
|
289
|
+
const Qe = "build", Ze = _(D(Qe), O).description("Build vitepress website.").action(async (e) => {
|
|
290
|
+
await ce();
|
|
258
291
|
});
|
|
259
|
-
async function
|
|
260
|
-
|
|
292
|
+
async function ce() {
|
|
293
|
+
d(`
|
|
294
|
+
-> Start building Vitepress website.
|
|
295
|
+
|
|
296
|
+
`, "info");
|
|
297
|
+
try {
|
|
298
|
+
await ye(k), d(`
|
|
299
|
+
|
|
300
|
+
Docpress build succedeed.`, "success");
|
|
301
|
+
} catch (e) {
|
|
302
|
+
d(`
|
|
303
|
+
|
|
304
|
+
Docpress build failed : ${e}`, "error");
|
|
305
|
+
}
|
|
261
306
|
}
|
|
262
|
-
const
|
|
307
|
+
const H = {
|
|
263
308
|
base: "/",
|
|
264
309
|
lang: "en-US",
|
|
265
310
|
vite: {
|
|
@@ -296,139 +341,148 @@ const G = {
|
|
|
296
341
|
}
|
|
297
342
|
}
|
|
298
343
|
};
|
|
299
|
-
function
|
|
300
|
-
return
|
|
344
|
+
function et(e, t, r) {
|
|
345
|
+
return r ? R(H, r, { themeConfig: { sidebar: e, nav: t } }) : R(H, { themeConfig: { sidebar: e, nav: t } });
|
|
301
346
|
}
|
|
302
|
-
function
|
|
303
|
-
const n =
|
|
304
|
-
|
|
347
|
+
function tt(e, t) {
|
|
348
|
+
const n = w(e, "utf8").replace(/\[([^\]]+)\]\(\.\.\/([^)]+)\)/g, (o, s, i) => `[${s}](${t}/${i})`);
|
|
349
|
+
y(e, n, "utf8");
|
|
305
350
|
}
|
|
306
|
-
function
|
|
307
|
-
const n =
|
|
308
|
-
|
|
351
|
+
function rt(e, t) {
|
|
352
|
+
const n = w(e, "utf8").replace(/\[([^\]]+)\]\((?!\.?\/docs\/|docs\/|http|#)(\.?\/)?([^/][^)]+)\)/g, (o, s, i, a) => `[${s}](${t}/${a})`).replace(/\[([^\]]+)\]\((\.?\/docs\/|docs\/)([^)]*)\)/g, (o, s, i, a) => `[${s}](${a})`);
|
|
353
|
+
y(e, n, "utf8");
|
|
309
354
|
}
|
|
310
|
-
function
|
|
311
|
-
const o = `${
|
|
355
|
+
function W(e, t) {
|
|
356
|
+
const o = `${g(t) === "introduction.md" ? `
|
|
312
357
|
## Sources` : "# Sources"}
|
|
313
358
|
|
|
314
359
|
Take a look at the [project sources](${e}).
|
|
315
360
|
`;
|
|
316
|
-
|
|
361
|
+
K(t, o, "utf8");
|
|
317
362
|
}
|
|
318
|
-
function
|
|
319
|
-
const { name:
|
|
363
|
+
function st(e, t) {
|
|
364
|
+
const { name: r, login: n, bio: o } = t;
|
|
320
365
|
return {
|
|
321
366
|
layout: "home",
|
|
322
367
|
hero: {
|
|
323
|
-
name:
|
|
368
|
+
name: r ? `${r}'s projects` : `${n}'s projects`,
|
|
324
369
|
tagline: o ?? "Robots are everywhere 🤖"
|
|
325
370
|
// \U0001F916
|
|
326
371
|
},
|
|
327
372
|
features: e
|
|
328
373
|
};
|
|
329
374
|
}
|
|
330
|
-
function
|
|
375
|
+
function ot(e, t, r) {
|
|
331
376
|
const n = {
|
|
332
|
-
title:
|
|
377
|
+
title: b(e, { mode: "capitalize", replaceDash: !0 }),
|
|
333
378
|
details: t,
|
|
334
|
-
link: `/${e}/
|
|
379
|
+
link: `/${e}/introduction`
|
|
335
380
|
};
|
|
336
|
-
return
|
|
381
|
+
return r ? [...r, n] : [n];
|
|
337
382
|
}
|
|
338
|
-
function
|
|
383
|
+
function nt(e, t) {
|
|
339
384
|
return {
|
|
340
|
-
text:
|
|
385
|
+
text: b(e, { mode: "capitalize", replaceDash: !0 }),
|
|
341
386
|
collapsed: !0,
|
|
342
387
|
items: t
|
|
343
388
|
};
|
|
344
389
|
}
|
|
345
|
-
function
|
|
390
|
+
function E(e, t, r) {
|
|
346
391
|
const n = {
|
|
347
|
-
text: t === "
|
|
392
|
+
text: t === "introduction" ? "Introduction" : b(t, { mode: "capitalize", replaceDash: !0 }),
|
|
348
393
|
link: `/${e}/${t}`
|
|
349
394
|
};
|
|
350
|
-
return
|
|
351
|
-
}
|
|
352
|
-
function
|
|
353
|
-
const
|
|
354
|
-
for (const
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
});
|
|
358
|
-
const
|
|
359
|
-
const
|
|
360
|
-
|
|
361
|
-
|
|
395
|
+
return r ? [...r, n] : [n];
|
|
396
|
+
}
|
|
397
|
+
function it(e, t) {
|
|
398
|
+
const r = [], n = [];
|
|
399
|
+
for (const s of e) {
|
|
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}`), g(a).toLowerCase() === "readme.md" && rt(a, `https://github.com/${s.owner.login}/${s.name}/tree/${s.docpress.branch}`);
|
|
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() && g(c(s.docpress.projectPath, a)).endsWith(".md")).sort((a, u) => a.localeCompare(u)).reduce((a, u, x, C) => {
|
|
404
|
+
const h = c(s.docpress.projectPath, u);
|
|
405
|
+
let p = b(g(h), { mode: "lowercase", removeIdx: !0 });
|
|
406
|
+
if (p === "readme.md" && (p = "introduction.md"), p !== g(h) && fe(h, c(Q(h), p)), x === C.length - 1) {
|
|
407
|
+
let S;
|
|
362
408
|
if (C.length > 1)
|
|
363
|
-
return
|
|
364
|
-
|
|
365
|
-
S
|
|
366
|
-
|
|
409
|
+
return S = c(s.docpress.projectPath, "sources.md"), W(s.html_url, S), E(
|
|
410
|
+
s.name,
|
|
411
|
+
$(S).name,
|
|
412
|
+
E(s.name, $(p).name, a)
|
|
367
413
|
);
|
|
368
|
-
|
|
414
|
+
S = c(s.docpress.projectPath, p), W(s.html_url, S);
|
|
369
415
|
}
|
|
370
|
-
return
|
|
416
|
+
return E(s.name, $(p).name, a);
|
|
371
417
|
}, []);
|
|
372
|
-
n.push(
|
|
418
|
+
n.push(nt(s.name, i)), r.push(...ot(s.name, s.description || ""));
|
|
373
419
|
}
|
|
374
|
-
|
|
420
|
+
d(" Generate index content.", "info");
|
|
421
|
+
const o = st(r.sort((s, i) => s.title.localeCompare(i.title)), t);
|
|
375
422
|
return {
|
|
376
|
-
sidebar: n.sort((
|
|
423
|
+
sidebar: n.sort((s, i) => s.text.localeCompare(i.text)),
|
|
377
424
|
index: o
|
|
378
425
|
};
|
|
379
426
|
}
|
|
380
|
-
function
|
|
381
|
-
const t =
|
|
427
|
+
function ct(e) {
|
|
428
|
+
const t = se(e), r = [];
|
|
429
|
+
d(" Add extras Vitepress headers pages.", "info");
|
|
382
430
|
for (const n of t) {
|
|
383
|
-
const o =
|
|
384
|
-
|
|
385
|
-
text:
|
|
386
|
-
link: `/${
|
|
431
|
+
const o = c(process.cwd(), n), s = c(re, b(g(n), { mode: "lowercase", removeIdx: !0 }));
|
|
432
|
+
j(o, s), r.push({
|
|
433
|
+
text: b($(o).name, { replaceDash: !0, removeIdx: !0 }),
|
|
434
|
+
link: `/${b($(o).name, { removeIdx: !0, mode: "lowercase" })}`
|
|
387
435
|
});
|
|
388
436
|
}
|
|
389
|
-
return
|
|
437
|
+
return r;
|
|
390
438
|
}
|
|
391
|
-
function
|
|
439
|
+
function q(e, t, r) {
|
|
392
440
|
const n = I(e);
|
|
393
441
|
for (const o of n) {
|
|
394
|
-
const
|
|
395
|
-
|
|
442
|
+
const s = c(process.cwd(), o), i = c(t, g(o));
|
|
443
|
+
j(s, i);
|
|
396
444
|
}
|
|
397
445
|
}
|
|
398
|
-
function
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
446
|
+
function at(e, t) {
|
|
447
|
+
const r = `---
|
|
448
|
+
`;
|
|
449
|
+
F(Q(U)), d(" Generate Vitepress config.", "info"), y(U, `export default ${JSON.stringify(e, null, 2)}
|
|
450
|
+
`), d(" Generate index file.", "info"), y(Ve, r.concat(we.stringify(t), r));
|
|
451
|
+
}
|
|
452
|
+
const X = "prepare", ae = [
|
|
453
|
+
f("-c, --extra-public-content <string>", v.shape.extraPublicContent._def.description),
|
|
454
|
+
f("-p, --extra-header-pages <string>", v.shape.extraHeaderPages._def.description),
|
|
455
|
+
f("-t, --extra-theme <string>", v.shape.extraTheme._def.description),
|
|
456
|
+
f("-v, --vitepress-config <string>", v.shape.vitepressConfig._def.description)
|
|
457
|
+
], dt = _(D(X), [...ae, ...O]).description("Transform doc to the target vitepress format.").action(async (e) => {
|
|
458
|
+
const t = N([X], e);
|
|
459
|
+
await de(t);
|
|
410
460
|
});
|
|
411
|
-
async function
|
|
412
|
-
const { extraHeaderPages: t, extraPublicContent:
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
461
|
+
async function de(e) {
|
|
462
|
+
const { extraHeaderPages: t, extraPublicContent: r, extraTheme: n, vitepressConfig: o } = e;
|
|
463
|
+
d(`
|
|
464
|
+
-> Start transform files to prepare Vitepress build.`, "info");
|
|
465
|
+
const s = Ae(), i = Me().reduce((h, p) => p.clone_url && !p.fork && !p.private && p.docpress.includes.length && !p.docpress.filtered ? [...h, p] : h, []), { sidebar: a, index: u } = it(i, s), x = [];
|
|
466
|
+
t && x.push(...ct(t)), r && (d(" Add extras Vitepress public folder content.", "info"), q(r, c(k, "public"))), n && (d(" Add extras Vitepress theme files.", "info"), q(n, c(k, ".vitepress/theme")));
|
|
467
|
+
const C = et(a, x, o);
|
|
468
|
+
at(C, u);
|
|
469
|
+
}
|
|
470
|
+
function lt() {
|
|
471
|
+
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 n = N(["fetch", "prepare"], t);
|
|
473
|
+
await ie(n), await de(n), await ce();
|
|
420
474
|
}).configureHelp({
|
|
421
475
|
sortSubcommands: !0,
|
|
422
476
|
sortOptions: !0,
|
|
423
477
|
showGlobalOptions: !0
|
|
424
478
|
}).enablePositionalOptions().passThroughOptions();
|
|
425
|
-
return
|
|
479
|
+
return _(e, [...ne, ...ae, ...O]), e;
|
|
426
480
|
}
|
|
427
|
-
function
|
|
428
|
-
|
|
481
|
+
function xt() {
|
|
482
|
+
lt().parseAsync();
|
|
429
483
|
}
|
|
430
484
|
export {
|
|
431
|
-
|
|
432
|
-
|
|
485
|
+
lt as getProgram,
|
|
486
|
+
xt as main
|
|
433
487
|
};
|
|
434
488
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sources":["../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":["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'\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 const res = options[cmd].safeParse({\n ...globalOptsSchema.parse(opts).config,\n ...opts,\n })\n\n if (res.success) {\n return res.data as Options[T]\n }\n console.error(fromError(res.error).toString())\n process.exit(0)\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'\n\nexport async function getInfos({ username, token, branch }: Pick<FetchOpts, 'username' | 'branch' | 'token'>) {\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 (e) {\n console.error(e)\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 { 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 console.warn('No repository respect docpress rules.')\n return\n }\n\n await Promise.all(\n repos\n .filter(repo => !isRepoFiltered(repo, reposFilter))\n .map(async repo => cloneRepo(repo.clone_url as string, repo.docpress.projectPath, repo.docpress.branch, repo.docpress.includes)),\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 { 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 await main(opts)\n })\n\nexport async function main(opts: Config) {\n const { username, reposFilter, token, branch, gitProvider } = parseOptions(cmdName, opts)\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 { 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 await vitepressBuild(DOCPRESS_DIR)\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 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 === 'readme.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}/readme`,\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 === 'readme' ? '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 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 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 const filename = prettify(basename(file), { mode: 'lowercase', removeIdx: true })\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, 'readme.md')\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 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 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 createDir(dirname(VITEPRESS_CONFIG))\n\n writeFileSync(VITEPRESS_CONFIG, `export default ${JSON.stringify(vitepressConfig, null, 2)}\\n`)\n writeFileSync(INDEX_FILE, '---\\n'.concat(YAML.stringify(index)))\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 { 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 await main(opts)\n })\n\nexport async function main(opts: PrepareOpts) {\n const { extraHeaderPages, extraPublicContent, extraTheme, vitepressConfig } = parseOptions(cmdName, opts)\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 addContent(extraPublicContent, resolve(DOCPRESS_DIR, 'public'))\n }\n if (extraTheme) {\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 } 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 await fetchFn(opts)\n await prepareFn(opts)\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":["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","cmd","res","fromError","addOptions","opt","getInfos","username","token","branch","octokit","Octokit","user","cloneRepo","projectDir","includes","git","simpleGit","item","appendFileSync","cpSync","rmSync","e","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","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","a","b","filename","renameSync","dirname","sourceFile","parse","index","addExtraPages","files","src","dest","addContent","dir","fn","generateVitepressFiles","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 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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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tobi-or-not/docpress",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1
|
|
4
|
+
"version": "0.2.1",
|
|
5
5
|
"module": "dist/docpress.js",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
7
7
|
"bin": {
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"axios": "^1.7.7",
|
|
20
|
+
"chalk": "^5.3.0",
|
|
20
21
|
"commander": "^12.1.0",
|
|
21
22
|
"octokit": "^4.0.2",
|
|
22
23
|
"rimraf": "^6.0.1",
|
|
@@ -77,6 +77,7 @@ export declare const options: {
|
|
|
77
77
|
config?: string | undefined;
|
|
78
78
|
}>;
|
|
79
79
|
};
|
|
80
|
-
|
|
80
|
+
type MergeOptions<T extends Cmd[]> = (T extends [infer First, ...infer Rest] ? First extends Cmd ? Rest extends Cmd[] ? Options[First] & MergeOptions<Rest> : Options[First] : never : unknown);
|
|
81
|
+
export declare function parseOptions<T extends Cmd[]>(cmds: [...T], opts: MergeOptions<T>): MergeOptions<T>;
|
|
81
82
|
export declare function addOptions(cmd: Command, opts: Option[]): Command;
|
|
82
83
|
export {};
|