@tobi-or-not/docpress 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,37 +4,56 @@ This project aims to automate the construction of documentation website based on
4
4
 
5
5
  ## Explanation
6
6
 
7
- The package will download the documentation files for the given repository list, to do this it will check if a `docs/` folder is present at root level and download this entire folder or only the `README.md` file if this is not the case.
8
- After downloading all project documentation files, it will build a static website using [vitepress](https://vitepress.dev/).
7
+ Docpress automates the process of downloading documentation files from specified GitHub repositories. Here's how it works:
9
8
 
10
- > If a `docs/` folder is present, all files in it will be sorted and renamed without the prefix number so it will not appeared inside the generated website. Example: `docs/01-get-started.md` will become `get-started.md`.
9
+ 1. __Repository Documentation Retrieval__:
10
+ - The program checks if a `docs/` folder is present at the root level of each specified repository.
11
+ - If the `docs/` folder exists, the entire folder will be downloaded, including all its contents.
12
+ - If the `docs/` folder is not found, only the `README.md` file will be downloaded.
11
13
 
12
- ## Rules
14
+ 2. __Static Website Generation__:
15
+ - After retrieving the documentation files, Docpress generates a static website using [VitePress](https://vitepress.dev/). This framework allows for the creation of fast and customizable documentation sites.
13
16
 
14
- It is important to understand and respect some conventions for the script to work correctly :
15
- - Only the `docs/` root folder in the repository will be parsed to import advanced documentation (multi pages documentation, embed images or files, etc...).
16
- - The `README.md` root file will only be imported if there is no `./docs/01-readme.md` file (this allows you to manage differences between the readme file and the advanced documentation introduction page, for example using a table of contents in the readme file that makes no sense in the documentation website).
17
- - Any inline link in the `./README.md` root file that does not point to `./docs/**` will be replaced by the appropriate Github link.
18
- - Any inline link in the `./docs/*.md` files that does not point to `./docs/**` will be replaced by the appropriate Github link.
19
- - Each project description on the home page is extracted from the Github repository description.
17
+ For optimal use of Docpress, please check the [rules section](#rules) to understand the conventions and guidelines that will ensure that everything works correctly. By following these rules, you can maximize the effectiveness of the documentation process.
20
18
 
21
19
  ## Quickstart
22
20
 
23
21
  Generate website using the Docpress docker image :
24
22
 
25
23
  ```sh
26
- docker run \
27
- --publish 8080:8080 \
28
- --name docpress \
29
- --rm \
30
- -v $(pwd)/docpress:/app/docpress:rw ghcr.io/this-is-tobi/docpress \
31
- -u <github_username>
24
+ docker run --name docpress --rm -v $(pwd)/docpress:/app/docpress:rw \
25
+ ghcr.io/this-is-tobi/docpress -u <github_username>
32
26
  ```
33
27
 
34
28
  The dist folder is available at `./docpress/.vitepress/dist`, ready to be delivered with a web server like Nginx, Apache, etc...
35
29
 
30
+ ## Rules
31
+
32
+ To ensure that the program functions correctly, please follow these conventions:
33
+
34
+ 1. __Documentation folder structure__:
35
+ - The script will only parse the `docs/` folder located at the root level of the repository. This folder is used to import advanced documentation features, such as multi-page documentation, embedded images, and files.
36
+
37
+ 2. __File naming and sorting__:
38
+ - If a `docs/` folder is present, all files within it will be sorted and renamed by removing any prefix numbers. This ensures that files appear cleanly in the generated website. For example, `docs/01-get-started.md` will be renamed to `get-started.md`.
39
+
40
+ 3. __Handling the root readme file__:
41
+ - The `README.md` file located at the root of the repository will only be imported if there is no `./docs/01-readme.md` file present. This allows you to differentiate between the general README and the advanced documentation introduction page.
42
+ - For instance, you might use the README file for a table of contents that is not relevant in the context of the documentation website.
43
+
44
+ 4. __Link management__:
45
+ - Any inline link in the `./README.md` file that does not point to `./docs/**` will be replaced with the corresponding GitHub link.
46
+ - Similarly, any inline link in the `./docs/*.md` files that does not reference `./docs/**` will also be replaced with the appropriate GitHub link.
47
+
48
+ 5. __Project descriptions__:
49
+ - The project description displayed on the home page of the generated website is extracted from the GitHub repository's description.
50
+
51
+ By adhering to these rules, you can ensure that your documentation is processed correctly and that it aligns with the intended structure and functionality of the generated site.
52
+
36
53
  ## Advanced usage
37
54
 
55
+ All CLI options are available with the helper flag `docker run ghcr.io/this-is-tobi/docpress -h` :
56
+
38
57
  ```txt
39
58
  Usage: docpress [options] [command]
40
59
 
@@ -44,7 +63,7 @@ Options:
44
63
  -b, --branch <string> Branch used to collect Git provider data. (default: "main")
45
64
  -c, --extra-public-content <string> List of comma separated additional files or directories to process Vitepress public folder.
46
65
  -C, --config <string> Path to the docpress configuration file.
47
- -g, --git-provider <string> Git provider used to retrieve data. Values should be one of "github" or "gitlab". (default: "github")
66
+ -g, --git-provider <string> Git provider used to retrieve data. Values should be "github". (default: "github")
48
67
  -h, --help display help for command
49
68
  -p, --extra-header-pages <string> List of comma separated additional files or directories to process Vitepress header pages.
50
69
  -r, --repos-filter <string> List of comma separated repositories to retrieve from Git provider. Default to all user's public repositories.
@@ -60,30 +79,206 @@ Commands:
60
79
  prepare [options] Transform doc to the target vitepress format.
61
80
  ```
62
81
 
82
+ ### Usage methods
83
+
84
+ Docpress is available through both [npm](https://www.npmjs.com/package/@tobi-or-not/docpress) and [Docker](https://github.com/this-is-tobi/docpress/pkgs/container/docpress), so you can choose the installation method that best suits your environment.
85
+
86
+ #### Using npm (or other package managers)
87
+
88
+ If you prefer Node.js package managers like npm, pnpm, or bun, you can easily install and run Docpress without additional setup.
89
+
90
+ To run Docpress using npm:
91
+ ```sh
92
+ npx @tobi-or-not/docpress -u <github_username>
93
+ ```
94
+
95
+ > [!TIP]
96
+ > If you’re using a package manager like pnpm or bun, simply replace npx with the corresponding command (pnpx or bunx) to execute Docpress.
97
+
98
+ #### Using Docker
99
+
100
+ Docpress also provides a Docker image, which is especially useful if you want to avoid installing dependencies directly on your system or if you’re working in a containerized environment. Using Docker ensures a consistent runtime environment.
101
+
102
+ To run Docpress with Docker:
103
+ ```sh
104
+ docker run --rm -v $(pwd)/docpress:/app/docpress:rw ghcr.io/this-is-tobi/docpress -u <github_username>
105
+ ```
106
+
107
+ In this command:
108
+ - `--rm` removes the container after it stops, keeping your environment clean.
109
+ - `-v $(pwd)/docpress:/app/docpress:rw` mounts the `docpress` directory in your current path to the container’s `/app/docpress` folder, allowing Docpress to store generated files locally.
110
+
111
+ > Ensure Docker is installed and running on your system before using this method.
112
+
113
+ Both methods provide the same functionality, so you can choose the one that fits your setup or use case.
114
+
115
+ ### Filter repositories
116
+
117
+ The `-r` or `--repos-filter` option allows you to specify which repositories to include or exclude when generating documentation. This option accepts a comma-separated list of repository names and can include exclusions by prefixing a repository name with `!`.
118
+
119
+ - __Including specific repositories__: To generate documentation for specific repositories, provide their names separated by commas. For example, `-r 'repo1,repo2'` will retrieve documentation only for `repo1` and `repo2`.
120
+ - __Excluding repositories__: To exclude certain repositories, prefix their names with `!`. For instance, `-r '!repo1,!repo2'` will retrieve all public repositories except `repo1` and `repo2`.
121
+
122
+ > Only public, non-fork repositories are fetched.
123
+
124
+ ### Docpress configuration
125
+
126
+ Docpress can be configured with an external configuration file specified by the `-C` or `--config` option. This file, which should be in JSON or YAML format, allows you to set Docpress parameters to automate and customize the documentation fetching and generation process. Key options that can be configured include:
127
+
128
+ - `username`: Git provider username (usually GitHub) to fetch repositories (equivalent to the `-u` CLI option).
129
+ - `reposFilter`: List of repositories to include or exclude (equivalent to the `-r` CLI option).
130
+ - `branch`: Default branch from which documentation will be fetched.
131
+ - `extraHeaderPages`: Additional pages to include in the website header (equivalent to `-p`).
132
+ - `extraPublicContent`: Additional content for the Vitepress public folder (equivalent to `-c`).
133
+ - `extraTheme`: Files or folders to customize the Vitepress theme (equivalent to `-t`).
134
+
135
+ Example JSON configuration:
136
+
137
+ ```json
138
+ {
139
+ "username": "my-github-username",
140
+ "reposFilter": ["!repo1", "!repo2"],
141
+ "branch": "main",
142
+ "extraHeaderPages": ["header1.md", "header2.md"],
143
+ "extraPublicContent": ["favicon.ico", "logo.png"],
144
+ "extraTheme": ["custom-theme.css"]
145
+ }
146
+ ```
147
+
148
+ ### Vitepress configuration
149
+
150
+ Vitepress configuration can be customized via a vitepress.config.js file, specified with the `-v` or `--vitepress-config` option. This file lets you adjust Vitepress options like the site title, navigation structure, footer, and plugins.
151
+
152
+ Key configurable options include:
153
+
154
+ - `title`: The title of the generated site.
155
+ - `description`: A description of the site (used for SEO).
156
+ - `themeConfig`: The theme configuration, including navigation and header links.
157
+ - `markdown`: Options to customize Markdown rendering.
158
+
159
+ Basic Vitepress configuration example:
160
+
161
+ ```json
162
+ {
163
+ "title": "My Project Documentation",
164
+ "description": "A site generated by Docpress",
165
+ "themeConfig": {
166
+ "socialLinks": [
167
+ { "icon": "github", "link": "https://github.com/this-is-tobi" }
168
+ ],
169
+ "outline": [2, 4]
170
+ }
171
+ }
172
+ ```
173
+
174
+ ### Vitepress theme
175
+
176
+ Docpress allows you to customize the Vitepress theme by adding files or directories specified with the `-t` or `--extra-theme` option. This flexibility enables you to adjust the look and feel of your documentation site by adding custom CSS, modifying components, or even creating an entirely custom theme.
177
+
178
+ You can approach theme customization in two main ways:
179
+
180
+ 1. __Extending the Default Theme__:
181
+ Vitepress offers options to extend its built-in default theme, which includes configuration for the layout, sidebar, and header. Extending the default theme is a good choice if you want to make minor tweaks to colors, fonts, or layout without changing the overall structure. To do this, you can:
182
+ - Add custom CSS or SCSS files for style adjustments.
183
+ - Override default theme components to change the behavior of certain sections (like headers or footers).
184
+ - Introduce new Vue components if needed.
185
+
186
+ For more details on extending the default theme, visit the [Vitepress guide on extending the default theme](https://vitepress.dev/guide/extending-default-theme).
187
+
188
+ 2. __Creating a Custom Theme__:
189
+ If your project requires a unique design or a complete overhaul of the site layout, you can create a fully custom theme. Vitepress allows you to replace its default theme entirely by creating a custom theme directory structure. With this approach, you gain full control over every part of the site, from page structure to individual components.
190
+
191
+ To implement a custom theme:
192
+ - Create a `theme/index.js` file where you export custom components.
193
+ - Organize components like headers, footers, and layout in the theme directory.
194
+ - Add global styles to `theme/style.css` or other preferred CSS files.
195
+
196
+ For a comprehensive guide on creating a custom theme, refer to the [Vitepress documentation on using a custom theme](https://vitepress.dev/guide/custom-theme#using-a-custom-theme).
197
+
198
+ > For either method, keep in mind that customizations should be tested across different pages to ensure they integrate smoothly with your content.
199
+
200
+ With these approaches, you can create a distinct look and feel for your documentation site while keeping it aligned with your project’s branding and user experience requirements.
201
+
202
+ ### Extra header pages
203
+
204
+ With the `-p` or `--extra-header-pages` option, you can add additional pages to the Vitepress website header, such as privacy policies, advanced user guides, or links to external resources.
205
+
206
+ This option accepts a comma-separated list of Markdown files or directories containing Markdown files. These pages will be included as-is in the final website and automatically added to the navigation bar at the top of each page on the generated site.
207
+
208
+ > All specified extra-header-pages must be in Markdown format and can include any Vitepress-compatible content, such as links, images, and other documentation elements.
209
+
210
+ ### Extra public content
211
+
212
+ The `-c` or `--extra-public-content` option allows you to include additional static assets in the Vitepress `public` folder. This is useful for adding content that needs to be accessible across all pages of the documentation, such as custom icons, logos, or other assets.
213
+
214
+ These files or directories will be copied directly into the `public` folder and will be available as static resources on the final website.
215
+
216
+ Common use cases for `extra-public-content` include:
217
+ - __Adding branding assets__: For example, including a custom favicon (`favicon.ico`) or logo (`logo.png`) that will display on every page.
218
+ - __Providing downloadable files__: Such as PDF guides, policy documents, or downloadable images that users may need quick access to.
219
+ - __Supplementing media files__: Including additional images, icons, or background files that you may want to reference across different parts of your documentation.
220
+
221
+ This option accepts a comma-separated list of file or directory paths.
222
+
223
+ > Ensure that any files you add are optimized for the web, as large or uncompressed files may impact site performance.
224
+
225
+ > All files and directories specified with extra-public-content are directly accessible at the root of the final site, making it easy to link to them within your Markdown files (e.g., using /logo.png in an img tag).
226
+
227
+ ### GitHub Token Option
228
+
229
+ When using the Docpress tool to fetch data from GitHub, you have the option to provide a personal access token using the `-T` flag. This token is important as it allows you to authenticate your requests, which can help increase your request limits on the GitHub API.
230
+
231
+ Utilizing a personal access token not only helps you avoid rate limiting issues but also enhances the reliability of data retrieval for your documentation projects.
232
+
233
+ For further details on how authentication affects rate limits and other considerations, please refer to the official GitHub documentation on [Rate limits for the REST API](https://docs.github.com/en/rest/overview/rate-limits-for-the-rest-api).
234
+
63
235
  ## Development
64
236
 
65
237
  ### Prerequisites
66
238
 
67
- To run the application in development mode, install :
68
- - [nodejs](https://nodejs.org/) *- javascript runtime.*
69
- - [pnpm](https://pnpm.io/) *- powerful, space efficient node package manager.*
239
+ To successfully run the Docpress application in development mode, you'll need to install the following prerequisites:
240
+
241
+ - __[Node.js](https://nodejs.org/)__: A JavaScript runtime that allows you to execute JavaScript code server-side. Make sure you install a version that is compatible with the project requirements.
242
+ - __[pnpm](https://pnpm.io/)__: A fast, disk space-efficient package manager for Node.js that is used to manage the project's dependencies.
70
243
 
71
- ### Use CLI
244
+ ### Setting Up the Development Environment
72
245
 
73
- 1. Install project nodejs dependencies.
246
+ Follow these steps to set up the development environment and start working with Docpress:
247
+
248
+ 1. __Clone the repository__
249
+ Start by cloning the Docpress repository to your local machine using Git:
250
+ ```sh
251
+ git clone https://github.com/this-is-tobi/docpress.git
252
+ cd docpress
253
+ ```
254
+ 2. __Install project dependencies__
255
+ Use pnpm to install all necessary Node.js dependencies:
74
256
  ```sh
75
257
  pnpm install
76
258
  ```
77
- 2. Fetch and build website.
259
+ 3. __Fetch and build the website__
260
+ Run the following command to fetch documentation from the specified GitHub username and build the static website:
78
261
  ```sh
79
- pnpm run dev -u <username>
262
+ pnpm run dev -u <github_username>
80
263
  ```
81
- 3. Preview website.
264
+ 4. __Preview the website__
265
+ Launch a local development server to preview your website:
82
266
  ```sh
83
267
  pnpm run vp:dev
84
268
  ```
85
-
86
- Preview website is available at <http://localhost:8080>.
269
+ You can access the preview by navigating to [http://localhost:8080](http://localhost:8080) in your web browser.
87
270
 
88
271
  > [!TIP]
89
272
  > Use command `pnpm run dev -h` to print options.
273
+
274
+ ## Contributions
275
+
276
+ All contributions to my repositories are welcome and must be made via Github with a pull request following the rules below.
277
+
278
+ ### Conventions
279
+
280
+ Commits must follow the specification of [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/), it is possible to add the [VSCode extension](https://github.com/vivaxy/vscode-conventional-commits) to facilitate the creation of commits.
281
+
282
+ A PR must be made with an updated branch with the `main` branch in rebase (and without merge) before requesting a merge, and the merge must be requested in `main`.
283
+
284
+ Check whether the repository has linting rules or tests to keep them clean and ensure that CI workflows pass (new features in repositories with tests should be accompanied by new tests to ensure that the new feature works properly).
package/dist/cli.js CHANGED
@@ -1,28 +1,29 @@
1
- import { createOption as l, createCommand as R, Command as ie } from "commander";
2
- import { readFileSync as y, existsSync as T, mkdirSync as ce, readdirSync as M, statSync as D, appendFileSync as z, cpSync as E, rmSync as N, writeFileSync as v, renameSync as ae } from "node:fs";
3
- import { resolve as i, join as de, basename as m, dirname as J, parse as S } from "node:path";
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";
4
5
  import { z as d } from "zod";
5
- import pe from "axios";
6
- import { rimrafSync as ue } from "rimraf";
7
- import { Octokit as le } from "octokit";
8
- import { simpleGit as fe } from "simple-git";
9
- import { build as me } from "vitepress";
10
- import ge from "yaml";
11
- const he = "@tobi-or-not/docpress", be = "module", ve = "0.1.6", ye = "pnpm@9.12.3", we = "dist/docpress.js", Se = "types/index.d.ts", $e = {
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 = {
12
13
  docpress: "bin/docpress.js"
13
- }, Ce = [
14
+ }, ke = [
14
15
  "bin",
15
16
  "dist",
16
17
  "types"
17
- ], xe = {
18
+ ], _e = {
18
19
  node: ">=20"
19
- }, ke = {
20
+ }, Pe = {
20
21
  build: "pnpm run build:types && pnpm run build:vite",
21
22
  "build:clean": "rimraf ./dist ./types ./tsconfig.tsbuildinfo",
22
23
  "build:docker": "docker build --tag tobi-or-not/docpress --target prod .",
23
24
  "build:types": "tsc",
24
25
  "build:vite": "vite build",
25
- dev: "vite-node ./dev/docpress.ts",
26
+ dev: "rimraf ./docpress && vite-node ./dev/docpress.ts",
26
27
  format: "eslint . --fix",
27
28
  lint: "eslint .",
28
29
  prepare: "husky",
@@ -36,7 +37,7 @@ const he = "@tobi-or-not/docpress", be = "module", ve = "0.1.6", ye = "pnpm@9.12
36
37
  "vp:dev": "vitepress dev ./docpress --port 8080",
37
38
  "vp:dev:docker": "docker run --publish 8080:8080 --name docpress-vp --rm tobi-or-not/docs",
38
39
  "vp:preview": "vitepress preview ./docpress --port 8080"
39
- }, _e = {
40
+ }, Oe = {
40
41
  axios: "^1.7.7",
41
42
  commander: "^12.1.0",
42
43
  octokit: "^4.0.2",
@@ -44,8 +45,9 @@ const he = "@tobi-or-not/docpress", be = "module", ve = "0.1.6", ye = "pnpm@9.12
44
45
  "simple-git": "^3.27.0",
45
46
  vitepress: "^1.4.1",
46
47
  yaml: "^2.6.0",
47
- zod: "^3.23.8"
48
- }, Pe = {
48
+ zod: "^3.23.8",
49
+ "zod-validation-error": "^3.4.0"
50
+ }, Re = {
49
51
  "@antfu/eslint-config": "^3.8.0",
50
52
  "@commitlint/cli": "^19.5.0",
51
53
  "@commitlint/config-conventional": "^19.5.0",
@@ -58,28 +60,28 @@ const he = "@tobi-or-not/docpress", be = "module", ve = "0.1.6", ye = "pnpm@9.12
58
60
  vite: "^5.4.9",
59
61
  "vite-node": "^2.1.3",
60
62
  vitest: "^2.1.3"
61
- }, Oe = {
63
+ }, De = {
62
64
  registry: "https://registry.npmjs.org/",
63
65
  access: "public",
64
66
  tag: "latest"
65
- }, Re = {
66
- name: he,
67
- type: be,
68
- version: ve,
69
- packageManager: ye,
70
- module: we,
71
- types: Se,
72
- bin: $e,
73
- files: Ce,
74
- engines: xe,
75
- scripts: ke,
76
- dependencies: _e,
77
- devDependencies: Pe,
78
- publishConfig: Oe
79
- }, B = d.object({}), x = i(process.cwd(), "docpress"), H = i(process.cwd(), "docpress/repositories.json"), W = i(process.cwd(), "docpress/owner.json"), q = i(process.cwd(), "docpress/docs"), De = i(process.cwd(), "docpress/docs/index.md"), L = i(process.cwd(), "docpress/.vitepress/config.ts");
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");
80
82
  async function P(e) {
81
83
  try {
82
- return (await pe.head(e)).status;
84
+ return (await ue.head(e)).status;
83
85
  } catch (t) {
84
86
  return t.response?.status || t.status || 500;
85
87
  }
@@ -88,46 +90,54 @@ function h(e, t) {
88
90
  let s = "";
89
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;
90
92
  }
91
- function F(e, { clean: t } = { clean: !1 }) {
93
+ function j(e, { clean: t } = { clean: !1 }) {
92
94
  try {
93
- t && T(e) && ue(`${e}/*`, { glob: !0 }), T(e) || ce(e, { recursive: !0 });
95
+ t && N(e) && fe(`${e}/*`, { glob: !0 }), N(e) || de(e, { recursive: !0 });
94
96
  } catch (s) {
95
97
  console.error(s);
96
98
  }
97
99
  }
98
- function Ee(e) {
99
- return D(e).isDirectory();
100
+ function je(e) {
101
+ try {
102
+ return E(e).isDirectory();
103
+ } catch {
104
+ return !1;
105
+ }
100
106
  }
101
- function Fe(e) {
102
- return D(e).isFile();
107
+ function Ie(e) {
108
+ try {
109
+ return E(e).isFile();
110
+ } catch {
111
+ return !1;
112
+ }
103
113
  }
104
- function j(e) {
105
- return (Array.isArray(e) ? e : [e]).flatMap((t) => Fe(t) ? [t] : Ee(t) ? M(t).flatMap((s) => j(de(t, s))) : []);
114
+ 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))) : []);
106
116
  }
107
- function X(e) {
108
- return j(e).filter((t) => m(t).endsWith(".md"));
117
+ function K(e) {
118
+ return I(e).filter((t) => m(t).endsWith(".md"));
109
119
  }
110
- function je(e) {
111
- return e.reduce((t, s, o, n) => o ? o === n.length - 1 ? `${t} or "${s}"` : `${t}, "${s}"` : `"${s}"`, "");
120
+ function Te(e) {
121
+ return e.reduce((t, s, n, o) => n ? n === o.length - 1 ? `${t} or "${s}"` : `${t}, "${s}"` : `"${s}"`, "");
112
122
  }
113
- function Ie() {
114
- return JSON.parse(y(W).toString());
123
+ function Ne() {
124
+ return JSON.parse(y(X).toString());
115
125
  }
116
- function Te() {
117
- return JSON.parse(y(H).toString());
126
+ function Le() {
127
+ return JSON.parse(y(q).toString());
118
128
  }
119
- function Y(...e) {
120
- return e.reduce((t, s) => (s === null || Object.keys(s).forEach((o) => {
121
- const n = t ? t[o] : null, r = s[o];
122
- V(n) && V(r) ? t[o] = Y(n, r) : t[o] = r;
129
+ 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;
123
133
  }), t), {});
124
134
  }
125
- function V(e) {
135
+ function A(e) {
126
136
  return e && typeof e == "object" && !Array.isArray(e);
127
137
  }
128
- const A = ["github"], f = d.object({
138
+ const U = ["github"], f = d.object({
129
139
  branch: d.string().describe("Branch used to collect Git provider data.").optional().default("main"),
130
- gitProvider: d.enum(A).describe(`Git provider used to retrieve data. Values should be one of ${je(A)}.`).optional().default("github"),
140
+ gitProvider: d.enum(U).describe(`Git provider used to retrieve data. Values should be ${Te(U)}.`).optional().default("github"),
131
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(),
132
142
  token: d.string().describe("Git provider token used to collect data.").optional(),
133
143
  username: d.string().describe("Git provider username used to collect data.")
@@ -136,120 +146,120 @@ const A = ["github"], f = d.object({
136
146
  extraPublicContent: d.string().describe("List of comma separated additional files or directories to process Vitepress public folder.").transform((e) => e.split(",")).optional(),
137
147
  extraTheme: d.string().describe("List of comma separated additional files or directories to use as Vitepress theme.").transform((e) => e.split(",")).optional(),
138
148
  vitepressConfig: d.string().describe("Path to the vitepress configuration file.").transform((e) => JSON.parse(y(i(process.cwd(), e)).toString())).optional()
139
- }), I = d.object({
149
+ }), T = d.object({
140
150
  config: d.string().describe("Path to the docpress configuration file.").transform((e) => JSON.parse(y(i(process.cwd(), e)).toString())).optional()
141
151
  });
142
- f.merge(b).merge(B);
143
- const Ne = {
144
- build: B,
152
+ f.merge(b).merge(W);
153
+ const Ve = {
154
+ build: W,
145
155
  fetch: f,
146
156
  prepare: b,
147
- global: I
157
+ global: T
148
158
  };
149
- function K(e, t) {
150
- const s = Ne[e].safeParse({
151
- ...I.parse(t).config,
159
+ function Q(e, t) {
160
+ const s = Ve[e].safeParse({
161
+ ...T.parse(t).config,
152
162
  ...t
153
163
  });
154
164
  if (s.success)
155
165
  return s.data;
156
- throw new Error(`Invalid options: ${s.error}`);
166
+ console.error(ae(s.error).toString()), process.exit(0);
157
167
  }
158
168
  function k(e, t) {
159
169
  return t.forEach((s) => e.addOption(s)), e;
160
170
  }
161
- async function Le({ username: e, token: t, branch: s }) {
162
- const o = new le({ auth: t }), { data: n } = await o.request("GET /users/{username}", { username: e }), { data: r } = await o.request("GET /users/{username}/repos", { username: e, sort: "full_name" });
163
- return { user: n, repos: r, branch: s };
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 };
164
174
  }
165
- async function Ve(e, t, s, o) {
166
- F(t, { clean: !0 });
175
+ async function Ue(e, t, s, n) {
176
+ j(t, { clean: !0 });
167
177
  try {
168
- const n = fe({ baseDir: t });
169
- await n.init().addConfig("core.sparseCheckout", "true", !0, "local").addRemote("origin", e);
170
- for (const r of o)
171
- z(i(t, ".git/info/sparse-checkout"), `${r}
178
+ const o = ge({ baseDir: t });
179
+ 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}
172
182
  `, "utf8");
173
- await n.pull("origin", s), o.some((r) => r.includes("docs")) && (E(i(t, "docs"), t, { recursive: !0 }), N(i(t, "docs"), { recursive: !0 })), N(i(t, ".git"), { recursive: !0 });
174
- } catch (n) {
175
- console.error(n);
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 });
184
+ } catch (o) {
185
+ console.error(o);
176
186
  }
177
187
  }
178
- async function Ae(e, t, s) {
179
- const o = `https://github.com/${e}/${t}/tree/${s}/README.md`, n = `https://github.com/${e}/${t}/tree/${s}/docs`, r = `https://github.com/${e}/${t}/tree/${s}/docs/01-readme.md`, a = await P(o), c = await P(n), u = await P(r);
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);
180
190
  return {
181
191
  rootReadmeStatus: a,
182
192
  docsFolderStatus: c,
183
- docsReadmeStatus: u
193
+ docsReadmeStatus: l
184
194
  };
185
195
  }
186
- async function Ue({ username: e, branch: t, reposFilter: s, token: o }) {
187
- F(x, { clean: !0 }), await Le({ username: e, token: o, branch: t }).then(async ({ user: n, repos: r, branch: a }) => ze(n, r, a, s)).then(async ({ repos: n }) => Je(n, s));
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));
188
198
  }
189
- async function Ge(e, t, s) {
190
- const o = [];
199
+ async function ze(e, t, s) {
200
+ const n = [];
191
201
  return await Promise.all(
192
- e.map(async (n) => {
193
- const r = t ?? n.default_branch ?? "main", a = i(q, n.name), c = Q(n, s);
194
- let u = [];
195
- !n.fork && !n.private && !c && (u = await Me(n, r)), o.push({
196
- ...n,
202
+ 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({
206
+ ...o,
197
207
  docpress: {
198
208
  filtered: c,
199
209
  branch: r,
200
- includes: u,
210
+ includes: l,
201
211
  projectPath: a,
202
- raw_url: `https://raw.githubusercontent.com/${n.owner.login}/${n.name}/${r}`,
203
- replace_url: `https://github.com/${n.owner.login}/${n.name}/tree/${r}`
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}`
204
214
  }
205
215
  });
206
216
  })
207
- ), o;
217
+ ), n;
208
218
  }
209
- async function Me(e, t) {
210
- const s = await Ae(e.owner.login, e.name, t), o = [];
211
- return Object.values(s).every((n) => n === 404) || !e.size ? [] : (s.docsFolderStatus !== 404 && o.push("docs/*"), (s.docsFolderStatus === 404 || s.docsReadmeStatus === 404) && o.push("README.md", "!*/**/README.md"), o);
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);
212
222
  }
213
- async function ze(e, t, s, o) {
214
- v(W, JSON.stringify(e, null, 2));
215
- const n = await Ge(t, s, o);
216
- return v(H, JSON.stringify(n, null, 2)), { user: e, repos: n };
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 };
217
227
  }
218
- async function Je(e, t) {
228
+ async function He(e, t) {
219
229
  if (!e) {
220
230
  console.warn("No repository respect docpress rules.");
221
231
  return;
222
232
  }
223
233
  await Promise.all(
224
- e.filter((s) => !Q(s, t)).map(async (s) => Ve(s.clone_url, s.docpress.projectPath, s.docpress.branch, s.docpress.includes))
234
+ e.filter((s) => !Z(s, t)).map(async (s) => Ue(s.clone_url, s.docpress.projectPath, s.docpress.branch, s.docpress.includes))
225
235
  );
226
236
  }
227
- function Q(e, t) {
228
- const s = t?.filter((r) => r.startsWith("!")).some((r) => e.name === r.substring(1)), o = !t || t?.filter((r) => !r.startsWith("!")).includes(e.name), n = s || !o;
229
- return "docpress" in e && !e.docpress.includes.length ? !0 : !(e.clone_url && !e.fork && !e.private && !n);
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;
239
+ return "docpress" in e && !e.docpress.includes.length ? !0 : !(e.clone_url && !e.fork && !e.private && !o);
230
240
  }
231
241
  const _ = [
232
- l("-C, --config <string>", I.shape.config._def.description)
233
- ], Z = "fetch", ee = [
234
- l("-b, --branch <string>", f.shape.branch._def.description).default(f.shape.branch._def.defaultValue()),
235
- l("-g, --git-provider <string>", f.shape.gitProvider._def.description).default(f.shape.gitProvider._def.defaultValue()),
236
- l("-r, --repos-filter <string>", f.shape.reposFilter._def.description),
237
- l("-T, --token <string>", f.shape.token._def.description),
238
- l("-u, --username <string>", f.shape.username._def.description)
239
- ], Be = k(R(Z), [...ee, ..._]).description("Fetch docs with the given username and git provider.").action(async (e) => {
240
- await te(e);
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);
241
251
  });
242
- async function te(e) {
243
- const { username: t, reposFilter: s, token: o, branch: n, gitProvider: r } = K(Z, e);
244
- await Ue({ username: t, branch: n, reposFilter: s, gitProvider: r, token: o });
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 });
245
255
  }
246
- const He = "build", We = k(R(He), _).description("Build vitepress website.").action(async (e) => {
247
- await se();
256
+ const qe = "build", Xe = k(D(qe), _).description("Build vitepress website.").action(async (e) => {
257
+ await re();
248
258
  });
249
- async function se() {
250
- await me(x);
259
+ async function re() {
260
+ await he(x);
251
261
  }
252
- const qe = {
262
+ const G = {
253
263
  base: "/",
254
264
  lang: "en-US",
255
265
  vite: {
@@ -258,7 +268,7 @@ const qe = {
258
268
  title: "Home",
259
269
  description: "Docpress",
260
270
  srcDir: "./docs",
261
- cleanUrls: !0,
271
+ cleanUrls: !1,
262
272
  ignoreDeadLinks: "localhostLinks",
263
273
  themeConfig: {
264
274
  outline: [2, 3],
@@ -286,54 +296,46 @@ const qe = {
286
296
  }
287
297
  }
288
298
  };
289
- function Xe(e, t, s) {
290
- const o = Y(qe, s ?? {});
291
- return {
292
- ...o,
293
- themeConfig: {
294
- ...o.themeConfig,
295
- sidebar: e,
296
- nav: t
297
- }
298
- };
299
- }
300
- function Ye(e, t) {
301
- const o = y(e, "utf8").replace(/\[([^\]]+)\]\(\.\.\/([^)]+)\)/g, (n, r, a) => `[${r}](${t}/${a})`);
302
- v(e, o, "utf8");
299
+ function Ye(e, t, s) {
300
+ return s ? R(G, s, { themeConfig: { sidebar: e, nav: t } }) : R(G, { themeConfig: { sidebar: e, nav: t } });
303
301
  }
304
302
  function Ke(e, t) {
305
- const o = y(e, "utf8").replace(/\[([^\]]+)\]\((?!\.?\/docs\/|docs\/|http)(\.?\/)?([^/][^)]+)\)/g, (n, r, a, c) => `[${r}](${t}/${c})`).replace(/\[([^\]]+)\]\((\.?\/docs\/|docs\/)([^)]*)\)/g, (n, r, a, c) => `[${r}](${c})`);
306
- v(e, o, "utf8");
303
+ const n = y(e, "utf8").replace(/\[([^\]]+)\]\(\.\.\/([^)]+)\)/g, (o, r, a) => `[${r}](${t}/${a})`);
304
+ v(e, n, "utf8");
305
+ }
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");
307
309
  }
308
- function U(e, t) {
309
- const n = `${m(t) === "readme.md" ? `
310
+ function M(e, t) {
311
+ const o = `${m(t) === "readme.md" ? `
310
312
  ## Sources` : "# Sources"}
311
313
 
312
314
  Take a look at the [project sources](${e}).
313
315
  `;
314
- z(t, n, "utf8");
316
+ B(t, o, "utf8");
315
317
  }
316
- function Qe(e, t) {
317
- const { name: s, login: o, bio: n } = t;
318
+ function Ze(e, t) {
319
+ const { name: s, login: n, bio: o } = t;
318
320
  return {
319
321
  layout: "home",
320
322
  hero: {
321
- name: s ? `${s}'s projects` : `${o}'s projects`,
322
- tagline: n ?? "Robots are everywhere 🤖"
323
+ name: s ? `${s}'s projects` : `${n}'s projects`,
324
+ tagline: o ?? "Robots are everywhere 🤖"
323
325
  // \U0001F916
324
326
  },
325
327
  features: e
326
328
  };
327
329
  }
328
- function Ze(e, t, s) {
329
- const o = {
330
+ function et(e, t, s) {
331
+ const n = {
330
332
  title: h(e, { mode: "capitalize", replaceDash: !0 }),
331
333
  details: t,
332
334
  link: `/${e}/readme`
333
335
  };
334
- return s ? [...s, o] : [o];
336
+ return s ? [...s, n] : [n];
335
337
  }
336
- function et(e, t) {
338
+ function tt(e, t) {
337
339
  return {
338
340
  text: h(e, { mode: "capitalize", replaceDash: !0 }),
339
341
  collapsed: !0,
@@ -341,92 +343,92 @@ function et(e, t) {
341
343
  };
342
344
  }
343
345
  function O(e, t, s) {
344
- const o = {
346
+ const n = {
345
347
  text: t === "readme" ? "Introduction" : h(t, { mode: "capitalize", replaceDash: !0 }),
346
348
  link: `/${e}/${t}`
347
349
  };
348
- return s ? [...s, o] : [o];
350
+ return s ? [...s, n] : [n];
349
351
  }
350
- function tt(e, t) {
351
- const s = [], o = [];
352
+ function st(e, t) {
353
+ const s = [], n = [];
352
354
  for (const r of e) {
353
- X([r.docpress.projectPath]).forEach((c) => {
354
- Ye(c, `https://github.com/${r.owner.login}/${r.name}/tree/${r.docpress.branch}`), m(c).toLowerCase() === "readme.md" && Ke(c, `https://github.com/${r.owner.login}/${r.name}/tree/${r.docpress.branch}`);
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}`);
355
357
  });
356
- const a = M(r.docpress.projectPath).filter((c) => D(i(r.docpress.projectPath, c)).isFile() && m(i(r.docpress.projectPath, c)).endsWith(".md")).sort((c, u) => c.localeCompare(u)).reduce((c, u, $, C) => {
357
- const g = i(r.docpress.projectPath, u), p = h(m(g), { mode: "lowercase", removeIdx: !0 });
358
- if (p !== m(g) && ae(g, i(J(g), p)), $ === C.length - 1) {
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) {
359
361
  let w;
360
362
  if (C.length > 1)
361
- return w = i(r.docpress.projectPath, "sources.md"), U(r.html_url, w), O(
363
+ return w = i(r.docpress.projectPath, "sources.md"), M(r.html_url, w), O(
362
364
  r.name,
363
365
  S(w).name,
364
366
  O(r.name, S(p).name, c)
365
367
  );
366
- w = i(r.docpress.projectPath, "readme.md"), U(r.html_url, w);
368
+ w = i(r.docpress.projectPath, "readme.md"), M(r.html_url, w);
367
369
  }
368
370
  return O(r.name, S(p).name, c);
369
371
  }, []);
370
- o.push(et(r.name, a)), s.push(...Ze(r.name, r.description || ""));
372
+ n.push(tt(r.name, a)), s.push(...et(r.name, r.description || ""));
371
373
  }
372
- const n = Qe(s.sort((r, a) => r.title.localeCompare(a.title)), t);
374
+ const o = Ze(s.sort((r, a) => r.title.localeCompare(a.title)), t);
373
375
  return {
374
- sidebar: o.sort((r, a) => r.text.localeCompare(a.text)),
375
- index: n
376
+ sidebar: n.sort((r, a) => r.text.localeCompare(a.text)),
377
+ index: o
376
378
  };
377
379
  }
378
- function st(e) {
379
- const t = X(e), s = [];
380
- for (const o of t) {
381
- const n = i(process.cwd(), o), r = i(q, h(m(o), { mode: "lowercase", removeIdx: !0 }));
382
- E(n, r), s.push({
383
- text: h(S(n).name, { replaceDash: !0, removeIdx: !0 }),
384
- link: `/${h(S(n).name, { removeIdx: !0, mode: "lowercase" })}`
380
+ function rt(e) {
381
+ const t = K(e), s = [];
382
+ 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" })}`
385
387
  });
386
388
  }
387
389
  return s;
388
390
  }
389
- function G(e, t, s) {
390
- const o = j(e);
391
- for (const n of o) {
392
- const r = i(process.cwd(), n), a = i(t, m(n));
393
- E(r, a);
391
+ function z(e, t, s) {
392
+ const n = I(e);
393
+ for (const o of n) {
394
+ const r = i(process.cwd(), o), a = i(t, m(o));
395
+ F(r, a);
394
396
  }
395
397
  }
396
- function rt(e, t) {
397
- F(J(L)), v(L, `export default ${JSON.stringify(e, null, 2)}
398
- `), v(De, `---
399
- `.concat(ge.stringify(t)));
400
- }
401
- const re = "prepare", oe = [
402
- l("-c, --extra-public-content <string>", b.shape.extraPublicContent._def.description),
403
- l("-p, --extra-header-pages <string>", b.shape.extraHeaderPages._def.description),
404
- l("-t, --extra-theme <string>", b.shape.extraTheme._def.description),
405
- l("-v, --vitepress-config <string>", b.shape.vitepressConfig._def.description)
406
- ], ot = k(R(re), [...oe, ..._]).description("Transform doc to the target vitepress format.").action(async (e) => {
407
- await ne(e);
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);
408
410
  });
409
- async function ne(e) {
410
- const { extraHeaderPages: t, extraPublicContent: s, extraTheme: o, vitepressConfig: n } = K(re, e), r = Ie(), a = Te().reduce((g, p) => p.clone_url && !p.fork && !p.private && p.docpress.includes.length && !p.docpress.filtered ? [...g, p] : g, []), { sidebar: c, index: u } = tt(a, r), $ = [];
411
- t && $.push(...st(t)), s && G(s, i(x, "public")), o && G(o, i(x, ".vitepress/theme"));
412
- const C = Xe(c, $, n);
413
- rt(C, u);
414
- }
415
- function nt() {
416
- const e = new ie().name("docpress").description("Build your doc website faster than light ⚡️⚡️⚡️").version(`${Re.version}`).addCommand(Be).addCommand(ot).addCommand(We).action(async (t, s) => {
417
- await te(t), await ne(t), await se();
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();
418
420
  }).configureHelp({
419
421
  sortSubcommands: !0,
420
422
  sortOptions: !0,
421
423
  showGlobalOptions: !0
422
424
  }).enablePositionalOptions().passThroughOptions();
423
- return k(e, [...ee, ...oe, ..._]), e;
425
+ return k(e, [...te, ...ne, ..._]), e;
424
426
  }
425
- function ht() {
426
- nt().parseAsync();
427
+ function vt() {
428
+ it().parseAsync();
427
429
  }
428
430
  export {
429
- nt as getProgram,
430
- ht as main
431
+ it as getProgram,
432
+ vt as main
431
433
  };
432
434
  //# 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 return statSync(path).isDirectory()\n}\n\nexport function isFile(path: string) {\n return statSync(path).isFile()\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 one of ${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 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 throw new Error(`Invalid options: ${res.error}`)\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: true,\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 const mergedConfig = deepMerge(defaultVitepressConfig, vitepressConfig ?? {})\n\n return {\n ...mergedConfig,\n themeConfig: {\n ...mergedConfig.themeConfig,\n sidebar,\n nav,\n },\n }\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","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","mergedConfig","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/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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"}
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.6",
4
+ "version": "0.1.7",
5
5
  "module": "dist/docpress.js",
6
6
  "types": "types/index.d.ts",
7
7
  "bin": {
@@ -23,7 +23,8 @@
23
23
  "simple-git": "^3.27.0",
24
24
  "vitepress": "^1.4.1",
25
25
  "yaml": "^2.6.0",
26
- "zod": "^3.23.8"
26
+ "zod": "^3.23.8",
27
+ "zod-validation-error": "^3.4.0"
27
28
  },
28
29
  "devDependencies": {
29
30
  "@antfu/eslint-config": "^3.8.0",
@@ -50,7 +51,7 @@
50
51
  "build:docker": "docker build --tag tobi-or-not/docpress --target prod .",
51
52
  "build:types": "tsc",
52
53
  "build:vite": "vite build",
53
- "dev": "vite-node ./dev/docpress.ts",
54
+ "dev": "rimraf ./docpress && vite-node ./dev/docpress.ts",
54
55
  "format": "eslint . --fix",
55
56
  "lint": "eslint .",
56
57
  "start": "./bin/docpress.js",