@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 CHANGED
@@ -1,23 +1,24 @@
1
- import { createOption as u, createCommand as D, Command as ce } from "commander";
2
- import { fromError as ae } from "zod-validation-error";
3
- import { readFileSync as y, existsSync as N, mkdirSync as de, readdirSync as J, statSync as E, appendFileSync as B, cpSync as F, rmSync as L, writeFileSync as v, renameSync as pe } from "node:fs";
4
- import { resolve as i, join as le, basename as m, dirname as H, parse as S } from "node:path";
5
- import { z as d } from "zod";
6
- import ue from "axios";
7
- import { rimrafSync as fe } from "rimraf";
8
- import { Octokit as me } from "octokit";
9
- import { simpleGit as ge } from "simple-git";
10
- import { build as he } from "vitepress";
11
- import be from "yaml";
12
- const ve = "@tobi-or-not/docpress", ye = "module", we = "0.1.7", Se = "pnpm@9.12.3", $e = "dist/docpress.js", Ce = "types/index.d.ts", xe = {
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
- }, ke = [
15
+ }, Pe = [
15
16
  "bin",
16
17
  "dist",
17
18
  "types"
18
- ], _e = {
19
+ ], Ee = {
19
20
  node: ">=20"
20
- }, Pe = {
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
- }, Oe = {
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
- }, Re = {
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
- }, De = {
65
+ }, je = {
64
66
  registry: "https://registry.npmjs.org/",
65
67
  access: "public",
66
68
  tag: "latest"
67
- }, Ee = {
68
- name: ve,
69
- type: ye,
70
- version: we,
71
- packageManager: Se,
72
- module: $e,
73
- types: Ce,
74
- bin: xe,
75
- files: ke,
76
- engines: _e,
77
- scripts: Pe,
78
- dependencies: Oe,
79
- devDependencies: Re,
80
- publishConfig: De
81
- }, W = d.object({}), x = i(process.cwd(), "docpress"), q = i(process.cwd(), "docpress/repositories.json"), X = i(process.cwd(), "docpress/owner.json"), Y = i(process.cwd(), "docpress/docs"), Fe = i(process.cwd(), "docpress/docs/index.md"), V = i(process.cwd(), "docpress/.vitepress/config.ts");
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 ue.head(e)).status;
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 h(e, t) {
90
- let s = "";
91
- return t?.removeIdx && (s = e.replace(/^\d{2}-/, "")), t?.replaceDash && (s = (s || e).replaceAll("-", " ")), t?.mode === "capitalize" ? s = (s || e).slice(0, 1).toUpperCase() + (s || e).slice(1).toLowerCase() : t?.mode === "lowercase" ? s = (s || e).toLowerCase() : t?.mode === "uppercase" && (s = (s || e).toUpperCase()), s || e;
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 j(e, { clean: t } = { clean: !1 }) {
111
+ function F(e, { clean: t } = { clean: !1 }) {
94
112
  try {
95
- t && N(e) && fe(`${e}/*`, { glob: !0 }), N(e) || de(e, { recursive: !0 });
96
- } catch (s) {
97
- console.error(s);
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 je(e) {
118
+ function Ne(e) {
101
119
  try {
102
- return E(e).isDirectory();
120
+ return L(e).isDirectory();
103
121
  } catch {
104
122
  return !1;
105
123
  }
106
124
  }
107
- function Ie(e) {
125
+ function Te(e) {
108
126
  try {
109
- return E(e).isFile();
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) => Ie(t) ? [t] : je(t) ? J(t).flatMap((s) => I(le(t, s))) : []);
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 K(e) {
118
- return I(e).filter((t) => m(t).endsWith(".md"));
135
+ function se(e) {
136
+ return I(e).filter((t) => g(t).endsWith(".md"));
119
137
  }
120
- function Te(e) {
121
- return e.reduce((t, s, n, o) => n ? n === o.length - 1 ? `${t} or "${s}"` : `${t}, "${s}"` : `"${s}"`, "");
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 Ne() {
124
- return JSON.parse(y(X).toString());
141
+ function Ae() {
142
+ return JSON.parse(w(te).toString());
125
143
  }
126
- function Le() {
127
- return JSON.parse(y(q).toString());
144
+ function Me() {
145
+ return JSON.parse(w(ee).toString());
128
146
  }
129
147
  function R(...e) {
130
- return e.reduce((t, s) => (s === null || Object.keys(s).forEach((n) => {
131
- const o = t ? t[n] : null, r = s[n];
132
- A(o) && A(r) ? t[n] = R(o, r) : t[n] = r;
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 A(e) {
153
+ function z(e) {
136
154
  return e && typeof e == "object" && !Array.isArray(e);
137
155
  }
138
- const U = ["github"], f = d.object({
139
- branch: d.string().describe("Branch used to collect Git provider data.").optional().default("main"),
140
- gitProvider: d.enum(U).describe(`Git provider used to retrieve data. Values should be ${Te(U)}.`).optional().default("github"),
141
- reposFilter: d.string().transform((e) => e.split(",")).or(d.string().array()).describe("List of comma separated repositories to retrieve from Git provider. Default to all user's public repositories.").optional(),
142
- token: d.string().describe("Git provider token used to collect data.").optional(),
143
- username: d.string().describe("Git provider username used to collect data.")
144
- }), b = d.object({
145
- extraHeaderPages: d.string().describe("List of comma separated additional files or directories to process Vitepress header pages.").transform((e) => e.split(",")).optional(),
146
- extraPublicContent: d.string().describe("List of comma separated additional files or directories to process Vitepress public folder.").transform((e) => e.split(",")).optional(),
147
- extraTheme: d.string().describe("List of comma separated additional files or directories to use as Vitepress theme.").transform((e) => e.split(",")).optional(),
148
- vitepressConfig: d.string().describe("Path to the vitepress configuration file.").transform((e) => JSON.parse(y(i(process.cwd(), e)).toString())).optional()
149
- }), T = d.object({
150
- config: d.string().describe("Path to the docpress configuration file.").transform((e) => JSON.parse(y(i(process.cwd(), e)).toString())).optional()
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
- f.merge(b).merge(W);
153
- const Ve = {
154
- build: W,
155
- fetch: f,
156
- prepare: b,
157
- global: T
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 Q(e, t) {
160
- const s = Ve[e].safeParse({
161
- ...T.parse(t).config,
162
- ...t
163
- });
164
- if (s.success)
165
- return s.data;
166
- console.error(ae(s.error).toString()), process.exit(0);
167
- }
168
- function k(e, t) {
169
- return t.forEach((s) => e.addOption(s)), e;
170
- }
171
- async function Ae({ username: e, token: t, branch: s }) {
172
- const n = new me({ auth: t }), { data: o } = await n.request("GET /users/{username}", { username: e }), { data: r } = await n.request("GET /users/{username}/repos", { username: e, sort: "full_name" });
173
- return { user: o, repos: r, branch: s };
174
- }
175
- async function Ue(e, t, s, n) {
176
- j(t, { clean: !0 });
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 = ge({ baseDir: t });
207
+ const o = ve({ baseDir: t });
179
208
  await o.init().addConfig("core.sparseCheckout", "true", !0, "local").addRemote("origin", e);
180
- for (const r of n)
181
- B(i(t, ".git/info/sparse-checkout"), `${r}
209
+ for (const s of n)
210
+ K(c(t, ".git/info/sparse-checkout"), `${s}
182
211
  `, "utf8");
183
- await o.pull("origin", s), n.some((r) => r.includes("docs")) && (F(i(t, "docs"), t, { recursive: !0 }), L(i(t, "docs"), { recursive: !0 })), L(i(t, ".git"), { recursive: !0 });
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
- console.error(o);
214
+ d(` Error when cloning repository: ${o}.`, "error");
186
215
  }
187
216
  }
188
- async function Ge(e, t, s) {
189
- const n = `https://github.com/${e}/${t}/tree/${s}/README.md`, o = `https://github.com/${e}/${t}/tree/${s}/docs`, r = `https://github.com/${e}/${t}/tree/${s}/docs/01-readme.md`, a = await P(n), c = await P(o), l = await P(r);
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: a,
192
- docsFolderStatus: c,
193
- docsReadmeStatus: l
220
+ rootReadmeStatus: i,
221
+ docsFolderStatus: a,
222
+ docsReadmeStatus: u
194
223
  };
195
224
  }
196
- async function Me({ username: e, branch: t, reposFilter: s, token: n }) {
197
- j(x, { clean: !0 }), await Ae({ username: e, token: n, branch: t }).then(async ({ user: o, repos: r, branch: a }) => Be(o, r, a, s)).then(async ({ repos: o }) => He(o, s));
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 ze(e, t, s) {
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 r = t ?? o.default_branch ?? "main", a = i(Y, o.name), c = Z(o, s);
204
- let l = [];
205
- !o.fork && !o.private && !c && (l = await Je(o, r)), n.push({
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: c,
209
- branch: r,
210
- includes: l,
211
- projectPath: a,
212
- raw_url: `https://raw.githubusercontent.com/${o.owner.login}/${o.name}/${r}`,
213
- replace_url: `https://github.com/${o.owner.login}/${o.name}/tree/${r}`
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 Je(e, t) {
220
- const s = await Ge(e.owner.login, e.name, t), n = [];
221
- return Object.values(s).every((o) => o === 404) || !e.size ? [] : (s.docsFolderStatus !== 404 && n.push("docs/*"), (s.docsFolderStatus === 404 || s.docsReadmeStatus === 404) && n.push("README.md", "!*/**/README.md"), n);
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 Be(e, t, s, n) {
224
- v(X, JSON.stringify(e, null, 2));
225
- const o = await ze(t, s, n);
226
- return v(q, JSON.stringify(o, null, 2)), { user: e, repos: o };
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 He(e, t) {
257
+ async function Ye(e, t) {
229
258
  if (!e) {
230
- console.warn("No repository respect docpress rules.");
259
+ d(" No repository respect docpress rules.", "warn");
231
260
  return;
232
261
  }
233
262
  await Promise.all(
234
- e.filter((s) => !Z(s, t)).map(async (s) => Ue(s.clone_url, s.docpress.projectPath, s.docpress.branch, s.docpress.includes))
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 Z(e, t) {
238
- const s = t?.filter((r) => r.startsWith("!")).some((r) => e.name === r.substring(1)), n = !t || t?.filter((r) => !r.startsWith("!")).includes(e.name), o = s || !n;
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
- u("-C, --config <string>", T.shape.config._def.description)
243
- ], ee = "fetch", te = [
244
- u("-b, --branch <string>", f.shape.branch._def.description).default(f.shape.branch._def.defaultValue()),
245
- u("-g, --git-provider <string>", f.shape.gitProvider._def.description).default(f.shape.gitProvider._def.defaultValue()),
246
- u("-r, --repos-filter <string>", f.shape.reposFilter._def.description),
247
- u("-T, --token <string>", f.shape.token._def.description),
248
- u("-u, --username <string>", f.shape.username._def.description)
249
- ], We = k(D(ee), [...te, ..._]).description("Fetch docs with the given username and git provider.").action(async (e) => {
250
- await se(e);
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 se(e) {
253
- const { username: t, reposFilter: s, token: n, branch: o, gitProvider: r } = Q(ee, e);
254
- await Me({ username: t, branch: o, reposFilter: s, gitProvider: r, token: n });
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 qe = "build", Xe = k(D(qe), _).description("Build vitepress website.").action(async (e) => {
257
- await re();
289
+ const Qe = "build", Ze = _(D(Qe), O).description("Build vitepress website.").action(async (e) => {
290
+ await ce();
258
291
  });
259
- async function re() {
260
- await he(x);
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 G = {
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 Ye(e, t, s) {
300
- return s ? R(G, s, { themeConfig: { sidebar: e, nav: t } }) : R(G, { themeConfig: { sidebar: e, nav: t } });
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 Ke(e, t) {
303
- const n = y(e, "utf8").replace(/\[([^\]]+)\]\(\.\.\/([^)]+)\)/g, (o, r, a) => `[${r}](${t}/${a})`);
304
- v(e, n, "utf8");
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 Qe(e, t) {
307
- const n = y(e, "utf8").replace(/\[([^\]]+)\]\((?!\.?\/docs\/|docs\/|http)(\.?\/)?([^/][^)]+)\)/g, (o, r, a, c) => `[${r}](${t}/${c})`).replace(/\[([^\]]+)\]\((\.?\/docs\/|docs\/)([^)]*)\)/g, (o, r, a, c) => `[${r}](${c})`);
308
- v(e, n, "utf8");
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 M(e, t) {
311
- const o = `${m(t) === "readme.md" ? `
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
- B(t, o, "utf8");
361
+ K(t, o, "utf8");
317
362
  }
318
- function Ze(e, t) {
319
- const { name: s, login: n, bio: o } = t;
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: s ? `${s}'s projects` : `${n}'s projects`,
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 et(e, t, s) {
375
+ function ot(e, t, r) {
331
376
  const n = {
332
- title: h(e, { mode: "capitalize", replaceDash: !0 }),
377
+ title: b(e, { mode: "capitalize", replaceDash: !0 }),
333
378
  details: t,
334
- link: `/${e}/readme`
379
+ link: `/${e}/introduction`
335
380
  };
336
- return s ? [...s, n] : [n];
381
+ return r ? [...r, n] : [n];
337
382
  }
338
- function tt(e, t) {
383
+ function nt(e, t) {
339
384
  return {
340
- text: h(e, { mode: "capitalize", replaceDash: !0 }),
385
+ text: b(e, { mode: "capitalize", replaceDash: !0 }),
341
386
  collapsed: !0,
342
387
  items: t
343
388
  };
344
389
  }
345
- function O(e, t, s) {
390
+ function E(e, t, r) {
346
391
  const n = {
347
- text: t === "readme" ? "Introduction" : h(t, { mode: "capitalize", replaceDash: !0 }),
392
+ text: t === "introduction" ? "Introduction" : b(t, { mode: "capitalize", replaceDash: !0 }),
348
393
  link: `/${e}/${t}`
349
394
  };
350
- return s ? [...s, n] : [n];
351
- }
352
- function st(e, t) {
353
- const s = [], n = [];
354
- for (const r of e) {
355
- K([r.docpress.projectPath]).forEach((c) => {
356
- Ke(c, `https://github.com/${r.owner.login}/${r.name}/tree/${r.docpress.branch}`), m(c).toLowerCase() === "readme.md" && Qe(c, `https://github.com/${r.owner.login}/${r.name}/tree/${r.docpress.branch}`);
357
- });
358
- const a = J(r.docpress.projectPath).filter((c) => E(i(r.docpress.projectPath, c)).isFile() && m(i(r.docpress.projectPath, c)).endsWith(".md")).sort((c, l) => c.localeCompare(l)).reduce((c, l, $, C) => {
359
- const g = i(r.docpress.projectPath, l), p = h(m(g), { mode: "lowercase", removeIdx: !0 });
360
- if (p !== m(g) && pe(g, i(H(g), p)), $ === C.length - 1) {
361
- let w;
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 w = i(r.docpress.projectPath, "sources.md"), M(r.html_url, w), O(
364
- r.name,
365
- S(w).name,
366
- O(r.name, S(p).name, c)
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
- w = i(r.docpress.projectPath, "readme.md"), M(r.html_url, w);
414
+ S = c(s.docpress.projectPath, p), W(s.html_url, S);
369
415
  }
370
- return O(r.name, S(p).name, c);
416
+ return E(s.name, $(p).name, a);
371
417
  }, []);
372
- n.push(tt(r.name, a)), s.push(...et(r.name, r.description || ""));
418
+ n.push(nt(s.name, i)), r.push(...ot(s.name, s.description || ""));
373
419
  }
374
- const o = Ze(s.sort((r, a) => r.title.localeCompare(a.title)), t);
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((r, a) => r.text.localeCompare(a.text)),
423
+ sidebar: n.sort((s, i) => s.text.localeCompare(i.text)),
377
424
  index: o
378
425
  };
379
426
  }
380
- function rt(e) {
381
- const t = K(e), s = [];
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 = i(process.cwd(), n), r = i(Y, h(m(n), { mode: "lowercase", removeIdx: !0 }));
384
- F(o, r), s.push({
385
- text: h(S(o).name, { replaceDash: !0, removeIdx: !0 }),
386
- link: `/${h(S(o).name, { removeIdx: !0, mode: "lowercase" })}`
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 s;
437
+ return r;
390
438
  }
391
- function z(e, t, s) {
439
+ function q(e, t, r) {
392
440
  const n = I(e);
393
441
  for (const o of n) {
394
- const r = i(process.cwd(), o), a = i(t, m(o));
395
- F(r, a);
442
+ const s = c(process.cwd(), o), i = c(t, g(o));
443
+ j(s, i);
396
444
  }
397
445
  }
398
- function ot(e, t) {
399
- j(H(V)), v(V, `export default ${JSON.stringify(e, null, 2)}
400
- `), v(Fe, `---
401
- `.concat(be.stringify(t)));
402
- }
403
- const oe = "prepare", ne = [
404
- u("-c, --extra-public-content <string>", b.shape.extraPublicContent._def.description),
405
- u("-p, --extra-header-pages <string>", b.shape.extraHeaderPages._def.description),
406
- u("-t, --extra-theme <string>", b.shape.extraTheme._def.description),
407
- u("-v, --vitepress-config <string>", b.shape.vitepressConfig._def.description)
408
- ], nt = k(D(oe), [...ne, ..._]).description("Transform doc to the target vitepress format.").action(async (e) => {
409
- await ie(e);
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 ie(e) {
412
- const { extraHeaderPages: t, extraPublicContent: s, extraTheme: n, vitepressConfig: o } = Q(oe, e), r = Ne(), a = Le().reduce((g, p) => p.clone_url && !p.fork && !p.private && p.docpress.includes.length && !p.docpress.filtered ? [...g, p] : g, []), { sidebar: c, index: l } = st(a, r), $ = [];
413
- t && $.push(...rt(t)), s && z(s, i(x, "public")), n && z(n, i(x, ".vitepress/theme"));
414
- const C = Ye(c, $, o);
415
- ot(C, l);
416
- }
417
- function it() {
418
- const e = new ce().name("docpress").description("Build your doc website faster than light ⚡️⚡️⚡️").version(`${Ee.version}`).addCommand(We).addCommand(nt).addCommand(Xe).action(async (t, s) => {
419
- await se(t), await ie(t), await re();
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 k(e, [...te, ...ne, ..._]), e;
479
+ return _(e, [...ne, ...ae, ...O]), e;
426
480
  }
427
- function vt() {
428
- it().parseAsync();
481
+ function xt() {
482
+ lt().parseAsync();
429
483
  }
430
484
  export {
431
- it as getProgram,
432
- vt as main
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.7",
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
- export declare function parseOptions<T extends Cmd>(cmd: T, opts: Options[T]): Options[T];
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 {};
@@ -0,0 +1,4 @@
1
+ import type { ColorName } from 'chalk';
2
+ type LogType = keyof Pick<Console, 'info' | 'warn' | 'error' | 'debug' | 'trace'> | 'success';
3
+ export declare function log(msg: string, type?: LogType, color?: ColorName): void;
4
+ export {};