@tobi-or-not/docpress 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -11,7 +11,7 @@ import { simpleGit as De } from "simple-git";
11
11
  import { build as Re } from "vitepress";
12
12
  import { readFile as je } from "node:fs/promises";
13
13
  import K from "yaml";
14
- const Le = "@tobi-or-not/docpress", Ve = "module", Ie = "0.6.0", Ae = "pnpm@9.15.0", Ge = "https://this-is-tobi.com/docpress/introduction", Ne = { type: "git", url: "https://github.com/this-is-tobi/docpress.git" }, Me = "dist/docpress.js", He = "types/index.d.ts", Ue = { docpress: "bin/docpress.js" }, ze = ["bin", "dist", "types"], We = { node: ">=20" }, Be = { build: "pnpm run build:types && pnpm run build:vite", "build:clean": "rimraf ./dist ./types ./tsconfig.tsbuildinfo", "build:docker": "docker build --tag tobi-or-not/docpress --target prod .", "build:types": "tsc", "build:vite": "vite build", dev: "vite-node ./dev/docpress.ts", "dev:clean": "rimraf ./docpress && pnpm run dev", format: "eslint . --fix", lint: "eslint .", prepare: "husky", start: "./bin/docpress.js", "start:docker": "docker run --name docpress --rm -v $(pwd)/docpress:/app/docpress:rw tobi-or-not/docpress", "stop:docker": "docker rm --force docpress", test: "vitest run", "test:cov": "vitest run --coverage", "vp:build": "vitepress build ./docpress", "vp:build:docker": "docker build --tag tobi-or-not/docs --target prod .", "vp:dev": "vitepress dev ./docpress --port 8080", "vp:dev:docker": "docker run --publish 8080:8080 --name docpress-vp --rm tobi-or-not/docs", "vp:preview": "vitepress preview ./docpress --port 8080" }, Je = { "@octokit/rest": "^21.1.0", axios: "^1.7.9", chalk: "^5.4.1", commander: "^13.0.0", octokit: "^4.1.0", rimraf: "^6.0.1", "simple-git": "^3.27.0", vitepress: "^1.5.0", yaml: "^2.7.0", zod: "^3.24.1", "zod-validation-error": "^3.4.0" }, qe = { "@antfu/eslint-config": "^3.14.0", "@commitlint/cli": "^19.6.1", "@commitlint/config-conventional": "^19.6.0", "@octokit/types": "^13.7.0", "@types/node": "^22.10.6", "@vitest/coverage-v8": "^2.1.8", eslint: "^9.18.0", husky: "^9.1.7", "lint-staged": "^15.3.0", typescript: "^5.7.3", vite: "^6.0.7", "vite-node": "^2.1.8", vitest: "^2.1.8" }, Ke = { registry: "https://registry.npmjs.org/", access: "public", tag: "latest" }, Xe = {
14
+ const Le = "@tobi-or-not/docpress", Ve = "module", Ie = "0.6.1", Ae = "pnpm@9.15.0", Ge = "https://this-is-tobi.com/docpress/introduction", Ne = { type: "git", url: "https://github.com/this-is-tobi/docpress.git" }, Me = "dist/docpress.js", He = "types/index.d.ts", Ue = { docpress: "bin/docpress.js" }, ze = ["bin", "dist", "types"], We = { node: ">=20" }, Be = { build: "pnpm run build:types && pnpm run build:vite", "build:clean": "rimraf ./dist ./types ./tsconfig.tsbuildinfo", "build:docker": "docker build --tag tobi-or-not/docpress --target prod .", "build:types": "tsc", "build:vite": "vite build", dev: "vite-node ./dev/docpress.ts", "dev:clean": "rimraf ./docpress && pnpm run dev", format: "eslint . --fix", lint: "eslint .", prepare: "husky", start: "./bin/docpress.js", "start:docker": "docker run --name docpress --rm -v $(pwd)/docpress:/app/docpress:rw tobi-or-not/docpress", "stop:docker": "docker rm --force docpress", test: "vitest run", "test:cov": "vitest run --coverage", "vp:build": "vitepress build ./docpress", "vp:build:docker": "docker build --tag tobi-or-not/docs --target prod .", "vp:dev": "vitepress dev ./docpress --port 8080", "vp:dev:docker": "docker run --publish 8080:8080 --name docpress-vp --rm tobi-or-not/docs", "vp:preview": "vitepress preview ./docpress --port 8080" }, Je = { "@octokit/rest": "^21.1.0", axios: "^1.7.9", chalk: "^5.4.1", commander: "^13.0.0", octokit: "^4.1.0", rimraf: "^6.0.1", "simple-git": "^3.27.0", vitepress: "^1.5.0", yaml: "^2.7.0", zod: "^3.24.1", "zod-validation-error": "^3.4.0" }, qe = { "@antfu/eslint-config": "^3.14.0", "@commitlint/cli": "^19.6.1", "@commitlint/config-conventional": "^19.6.0", "@octokit/types": "^13.7.0", "@types/node": "^22.10.6", "@vitest/coverage-v8": "^2.1.8", eslint: "^9.18.0", husky: "^9.1.7", "lint-staged": "^15.3.0", typescript: "^5.7.3", vite: "^6.0.7", "vite-node": "^2.1.8", vitest: "^2.1.8" }, Ke = { registry: "https://registry.npmjs.org/", access: "public", tag: "latest" }, Xe = {
15
15
  name: Le,
16
16
  type: Ve,
17
17
  version: Ie,
@@ -242,14 +242,14 @@ async function lt({
242
242
  r.rest.repos.listContributors,
243
243
  {
244
244
  owner: o.source.owner.login,
245
- repo: o.name,
245
+ repo: o.parent?.name ?? o.name,
246
246
  per_page: 500
247
247
  }
248
248
  ))
249
249
  n.push(...i);
250
- } catch {
250
+ } catch (i) {
251
251
  return c(
252
- ` Failed to get contributors infos for repository '${e.name}'.`,
252
+ ` Failed to get contributors infos for repository '${e.name}'. Error : ${i.message}`,
253
253
  "warn"
254
254
  ), { source: o.source, contributors: [] };
255
255
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../src/utils/const.ts","../src/utils/functions.ts","../src/utils/logger.ts","../src/schemas/global.ts","../src/schemas/build.ts","../src/schemas/fetch.ts","../src/schemas/prepare.ts","../src/utils/commands.ts","../src/lib/git.ts","../src/lib/fetch.ts","../src/commands/global.ts","../src/commands/fetch.ts","../src/commands/build.ts","../src/utils/templates.ts","../src/utils/regex.ts","../src/lib/vitepress.ts","../src/lib/prepare.ts","../src/commands/prepare.ts","../src/cli.ts"],"sourcesContent":["import { resolve } from 'node:path'\n\nexport const DOCPRESS_DIR = resolve(process.cwd(), 'docpress')\n\nexport const USER_REPOS_INFOS = resolve(process.cwd(), 'docpress/repositories.json')\n\nexport const USER_INFOS = resolve(process.cwd(), 'docpress/owner.json')\n\nexport const DOCS_DIR = resolve(process.cwd(), 'docpress/docs')\n\nexport const INDEX_FILE = resolve(process.cwd(), 'docpress/docs/index.md')\n\nexport const FORKS_FILE = resolve(process.cwd(), 'docpress/docs/forks.md')\n\nexport const VITEPRESS_CONFIG = resolve(process.cwd(), 'docpress/.vitepress/config.ts')\n\nexport const VITEPRESS_THEME = resolve(process.cwd(), 'docpress/.vitepress/theme')\n\nexport const VITEPRESS_USER_THEME = resolve(process.cwd(), 'docpress/.vitepress/theme/extras')\n\n// eslint-disable-next-line dot-notation\nexport const TEMPLATE_THEME = process.env['NODE_ENV'] === 'development'\n ? resolve(import.meta.dirname, '../../public/templates/theme')\n : resolve(import.meta.dirname, './templates/theme')\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join, resolve } from 'node:path'\nimport axios from 'axios'\nimport { rimrafSync } from 'rimraf'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { EnhancedRepository } from '../lib/fetch.js'\nimport type { getInfos } from '../lib/git.js'\nimport { DOCPRESS_DIR } from './const.js'\n\nexport async function checkHttpStatus(url: string): Promise<number> {\n try {\n const response = await axios.head(url)\n return response.status\n } catch (error) {\n return error.response?.status || error.status || 500\n }\n}\n\ninterface PrettifyOpts {\n mode?: 'capitalize' | 'uppercase' | 'lowercase'\n replaceDash?: boolean\n removeIdx?: boolean\n removeDot?: boolean\n}\n\nexport function prettify(s: string, opts: PrettifyOpts) {\n let u: string = ''\n\n if (s.startsWith('.') && opts?.removeDot) {\n u = s.slice(1)\n }\n\n if (opts?.removeIdx) {\n u = s.replace(/^\\d{2}-/, '')\n }\n\n if (opts?.replaceDash) {\n u = (u || s).replaceAll('-', ' ')\n }\n\n if (opts?.mode === 'capitalize') {\n u = (u || s).slice(0, 1).toUpperCase() + (u || s).slice(1).toLowerCase()\n } else if (opts?.mode === 'lowercase') {\n u = (u || s).toLowerCase()\n } else if (opts?.mode === 'uppercase') {\n u = (u || s).toUpperCase()\n }\n\n return u || s\n}\n\nexport function createDir(directory: string, { clean }: { clean?: boolean } = { clean: false }) {\n try {\n if (clean && existsSync(directory)) {\n rimrafSync(`${directory}/*`, { glob: true })\n }\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true })\n }\n } catch (err) {\n console.error(err)\n }\n}\n\nexport function isDir(path: string) {\n try {\n return statSync(path).isDirectory()\n } catch (_error) {\n return false\n }\n}\n\nexport function isFile(path: string) {\n try {\n return statSync(path).isFile()\n } catch (_error) {\n return false\n }\n}\n\nexport function extractFiles(paths: string[] | string): string[] {\n return (Array.isArray(paths) ? paths : [paths]).flatMap((path) => {\n if (isFile(path)) {\n return [path]\n }\n if (isDir(path)) {\n return readdirSync(path).flatMap(file => extractFiles(join(path, file)))\n }\n return []\n })\n}\n\nexport function getMdFiles(path: string[]) {\n return extractFiles(path).filter(file => basename(file).endsWith('.md'))\n}\n\nexport function prettifyEnum(arr: readonly string[]) {\n return arr.reduce((acc, cur, idx, arr) => {\n if (!idx) {\n return `\"${cur}\"`\n } else if (idx === arr.length - 1) {\n return `${acc} or \"${cur}\"`\n } else {\n return `${acc}, \"${cur}\"`\n }\n }, '')\n}\n\nexport function getUserInfos(username: GlobalOpts['usernames'][number]) {\n return JSON.parse(readFileSync(`${DOCPRESS_DIR}/user-${username}.json`).toString()) as Awaited<ReturnType<typeof getInfos>>['user']\n}\n\nexport function getUserRepos(username: GlobalOpts['usernames'][number]) {\n return JSON.parse(readFileSync(`${DOCPRESS_DIR}/repos-${username}.json`).toString()) as EnhancedRepository[]\n}\n\nexport function deepMerge<T extends Record<string, any> | null>(...objects: T[]): T {\n return objects.reduce((acc, obj) => {\n if (obj === null) {\n return acc\n }\n\n Object.keys(obj).forEach((key) => {\n const accValue = acc ? acc[key] : null\n const objValue = obj[key]\n\n if (isObject(accValue) && isObject(objValue)) {\n (acc as Record<string, any>)[key] = deepMerge(accValue, objValue)\n } else {\n (acc as Record<string, any>)[key] = objValue\n }\n })\n return acc\n }, {} as T)\n}\n\nexport function isObject(val: any): val is object {\n return val && typeof val === 'object' && !Array.isArray(val)\n}\n\nexport function loadConfigFile(configPath?: string) {\n if (!configPath) {\n return {}\n }\n try {\n const fullPath = resolve(process.cwd(), configPath)\n const fileContents = readFileSync(fullPath, 'utf8')\n return JSON.parse(fileContents)\n } catch (_error) {\n return {}\n }\n}\n\nexport function splitByComma(s: string) {\n return s.split(',')\n}\n","/* eslint-disable dot-notation */\nimport type { ColorName } from 'chalk'\nimport chalk from 'chalk'\n\ntype LogType = keyof Pick<Console, 'info' | 'warn' | 'error' | 'debug' | 'trace'> | 'success'\n\ntype ColorMap = {\n [K in LogType]: {\n color: ColorName\n level: number\n }\n}\n\nfunction getLogLevel() {\n return typeof Number(process.env['LOG_LEVEL']) === 'number' && !Number.isNaN(Number(process.env['LOG_LEVEL']))\n ? Number(process.env['LOG_LEVEL'])\n : 30\n}\n\nconst colorMap: ColorMap = {\n info: { color: 'white', level: 30 },\n warn: { color: 'yellow', level: 20 },\n error: { color: 'red', level: 10 },\n debug: { color: 'blue', level: 50 },\n trace: { color: 'white', level: 40 },\n success: { color: 'green', level: 30 },\n}\n\nexport function log(msg: string, type: LogType = 'info', color?: ColorName) {\n const computedMsg = color ? chalk[color](msg) : chalk[colorMap[type].color](msg)\n const computedType = type === 'success' ? 'info' : type\n\n if (getLogLevel() >= colorMap[type].level) {\n console[computedType](computedMsg)\n }\n}\n","import { z } from 'zod'\nimport { fromZodError } from 'zod-validation-error'\nimport type { UserConfig } from 'vitepress'\nimport { loadConfigFile, prettifyEnum, splitByComma } from '../utils/functions.js'\nimport { log } from '../utils/logger.js'\n\nconst providers = ['github'] as const\n\nexport const configSchema = z.object({\n // Global\n usernames: z.string()\n .array()\n .describe('List of comma separated Git provider usernames used to collect data.'),\n // Fetch\n branch: z.string()\n .describe('Branch used to collect Git provider data.')\n .default('main'),\n gitProvider: z.enum(providers)\n .describe(`Git provider used to retrieve data. Values should be ${prettifyEnum(providers)}.`)\n .default('github'),\n reposFilter: z.string()\n .array()\n .describe('List of comma separated repositories to retrieve from Git provider. Default to all user\\'s public repositories.'),\n // Prepare\n extraHeaderPages: z.string()\n .array()\n .describe('List of comma separated additional files or directories to process Vitepress header pages.'),\n extraPublicContent: z.string()\n .array()\n .describe('List of comma separated additional files or directories to process Vitepress public folder.'),\n extraTheme: z.string()\n .array()\n .describe('List of comma separated additional files or directories to use as Vitepress theme.'),\n forks: z.boolean()\n .describe('Whether or not to create the dedicated fork page that aggregate external contributions.')\n .default(false),\n vitepressConfig: z.any()\n .describe('Path to the vitepress configuration file.'),\n websiteTitle: z.string()\n .describe('Website title.'),\n websiteTagline: z.string()\n .describe('Website tagline.'),\n})\n\nexport type Config = Zod.infer<typeof configSchema>\n\nexport function applyGlobalOptsTransform(data: Cli) {\n const { config, vitepressConfig, token, ...rest } = data\n\n try {\n const loadedDPConfig = configSchema.partial().parse(loadConfigFile(config)) as Config\n const loadedVPConfig = loadConfigFile(vitepressConfig) as UserConfig\n const defaultConfig = configSchema.partial().required({ branch: true, gitProvider: true }).parse({})\n const vpConfig = {\n ...loadedVPConfig,\n ...loadedDPConfig.vitepressConfig,\n }\n const mergedConfig = {\n ...loadedDPConfig,\n ...defaultConfig,\n ...rest,\n ...(Object.keys(vpConfig).length && { vitepressConfig: vpConfig }),\n }\n const parsedConfig = configSchema.partial().required({ usernames: true }).parse(mergedConfig)\n\n return { ...parsedConfig, token }\n } catch (error) {\n log(` An error occurred while checking configuration.\\n ${fromZodError(error).toString()}`, 'error')\n process.exit(1)\n }\n}\n\nexport const baseCliSchema = configSchema.partial().extend({\n config: z.string()\n .describe('Path to the docpress configuration file.')\n .optional(),\n token: z.string()\n .describe('Git provider token used to collect data.')\n .optional(),\n usernames: z.string()\n .describe(configSchema.shape.usernames.description || '')\n .optional(),\n reposFilter: z.string()\n .describe(configSchema.shape.reposFilter.description || '')\n .optional(),\n extraHeaderPages: z.string()\n .describe(configSchema.shape.extraHeaderPages.description || '')\n .optional(),\n extraPublicContent: z.string()\n .describe(configSchema.shape.extraPublicContent.description || '')\n .optional(),\n extraTheme: z.string()\n .describe(configSchema.shape.extraTheme.description || '')\n .optional(),\n vitepressConfig: z.string()\n .describe(configSchema.shape.vitepressConfig.description || '')\n .optional(),\n})\n\nexport type RawCli = z.infer<typeof baseCliSchema>\n\nexport const cliSchema = configSchema\n .partial()\n .extend({\n config: z.string()\n .describe('Path to the docpress configuration file.')\n .optional(),\n token: z.string()\n .describe('Git provider token used to collect data.')\n .optional(),\n usernames: z.string()\n .describe(configSchema.shape.usernames.description || '')\n .transform(splitByComma)\n .optional(),\n reposFilter: z.string()\n .describe(configSchema.shape.reposFilter.description || '')\n .transform(splitByComma)\n .optional(),\n extraHeaderPages: z.string()\n .describe(configSchema.shape.extraHeaderPages.description || '')\n .transform(splitByComma)\n .optional(),\n extraPublicContent: z.string()\n .describe(configSchema.shape.extraPublicContent.description || '')\n .transform(splitByComma)\n .optional(),\n extraTheme: z.string()\n .describe(configSchema.shape.extraTheme.description || '')\n .transform(splitByComma)\n .optional(),\n vitepressConfig: z.string()\n .describe(configSchema.shape.vitepressConfig.description || '')\n .optional(),\n })\n\nexport type Cli = Zod.infer<typeof cliSchema>\n\nexport const globalOptsSchema = cliSchema\n .partial()\n .transform(applyGlobalOptsTransform)\n\nexport type GlobalOpts = Required<Pick<Zod.infer<typeof globalOptsSchema>, 'branch' | 'gitProvider'>>\n & Omit<Zod.infer<typeof globalOptsSchema>, 'branch' | 'gitProvider'>\n","import { cliSchema } from './global.js'\n\nexport const buildOptsSchema = cliSchema\n .pick({})\n\nexport type BuildOpts = Zod.infer<typeof buildOptsSchema>\n","// import type { GlobalOpts } from './global.js'\nimport { applyGlobalOptsTransform, cliSchema } from './global.js'\n\nexport const fetchOptsSchema = cliSchema\n .pick({\n branch: true,\n config: true,\n gitProvider: true,\n reposFilter: true,\n token: true,\n usernames: true,\n })\n .transform(applyGlobalOptsTransform)\n\nexport type FetchOpts = Zod.infer<typeof fetchOptsSchema>\n\nexport type FetchOptsUser = Omit<FetchOpts, 'usernames'> & { username: FetchOpts['usernames'][number] }\n","// import type { GlobalOpts } from './global.js'\nimport { applyGlobalOptsTransform, cliSchema } from './global.js'\n\nexport const prepareOptsSchema = cliSchema\n .pick({\n extraHeaderPages: true,\n extraPublicContent: true,\n extraTheme: true,\n config: true,\n gitProvider: true,\n reposFilter: true,\n token: true,\n usernames: true,\n vitepressConfig: true,\n })\n .transform(applyGlobalOptsTransform)\n\nexport type PrepareOpts = Zod.infer<typeof prepareOptsSchema>\n","import type { Command, Option } from 'commander'\nimport { fromZodError } from 'zod-validation-error'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport { globalOptsSchema } from '../schemas/global.js'\nimport type { BuildOpts } from '../schemas/build.js'\nimport { buildOptsSchema } from '../schemas/build.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { fetchOptsSchema } from '../schemas/fetch.js'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { prepareOptsSchema } from '../schemas/prepare.js'\nimport { log } from './logger.js'\n\ntype Cmd = 'fetch' | 'build' | 'prepare' | 'global'\n\ninterface Options {\n build: BuildOpts\n fetch: FetchOpts\n prepare: PrepareOpts\n global: GlobalOpts\n}\n\nexport const options = {\n build: buildOptsSchema,\n fetch: fetchOptsSchema,\n prepare: prepareOptsSchema,\n global: globalOptsSchema,\n}\n\nexport function parseOptions<T extends Cmd>(cmd: T, opts: Options[T]) {\n log(`Initializing Docpress...`, 'info', 'blue')\n log(`\\n\\n-> Checking for required environment settings and configurations.`, 'info')\n\n const res = options[cmd].safeParse(opts)\n if (res.error) {\n log(` An error occurred while checking configuration.\\n ${fromZodError(res.error).toString()}`, 'error')\n process.exit(1)\n }\n log(' Setup complete! Ready to process your documentation.', 'info')\n return res.data as Options[T]\n}\n\nexport function addOptions(cmd: Command, opts: Option[]) {\n opts.forEach(opt => cmd.addOption(opt))\n return cmd\n}\n","import { appendFileSync, cpSync, rmSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Octokit } from '@octokit/rest'\nimport { simpleGit } from 'simple-git'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { createDir } from '../utils/functions.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.js'\n\nexport async function getInfos({ username, token, branch }: Pick<FetchOpts, 'branch'> & Pick<GlobalOpts, 'token'> & { username: GlobalOpts['usernames'][number] }) {\n log(` Get infos for username '${username}'.`, 'info')\n const octokit = new Octokit({ auth: token })\n log(` Get user infos.`, 'debug')\n const { data: user } = await octokit.rest.users.getByUsername({ username })\n log(` Get repositories infos.`, 'debug')\n const { data: repos } = await octokit.rest.repos.listForUser({ username, sort: 'full_name' })\n\n return { user, repos, branch }\n}\n\nexport async function getContributors({\n repository,\n token,\n}: {\n repository: EnhancedRepository\n token: GlobalOpts['token']\n}) {\n log(` Get contributors infos for repository '${repository.name}'.`, 'info')\n const octokit = new Octokit({\n auth: token,\n log: {\n debug: () => {},\n info: () => {},\n warn: (message) => {\n if (!message.includes('404')) console.warn(message)\n },\n error: (message) => {\n if (!message.includes('404')) console.error(message)\n },\n },\n })\n const { data: repo } = await octokit.rest.repos.get({\n owner: repository.owner.login,\n repo: repository.name,\n })\n if (!repo.source?.owner?.login) {\n return { source: repo.source, contributors: [] }\n }\n const contributors: Array<any> = []\n try {\n for await (const { data } of octokit.paginate.iterator(\n octokit.rest.repos.listContributors,\n {\n owner: repo.source.owner.login,\n repo: repo.name,\n per_page: 500,\n },\n )) {\n contributors.push(...data)\n }\n } catch (_error) {\n log(\n ` Failed to get contributors infos for repository '${repository.name}'.`,\n 'warn',\n )\n return { source: repo.source, contributors: [] }\n }\n\n return { source: repo.source, contributors }\n}\n\nexport async function cloneRepo(name: string, url: string, projectDir: string, branch: string, includes: string[]) {\n createDir(projectDir, { clean: true })\n\n try {\n const git = simpleGit({ baseDir: projectDir })\n await git.init()\n .addConfig('core.sparseCheckout', 'true', true, 'local')\n .addRemote('origin', url)\n\n for (const item of includes) {\n log(` Add '${item}' to '${name}' sparse-checkout file.`, 'debug')\n appendFileSync(resolve(projectDir, '.git/info/sparse-checkout'), `${item}\\n`, 'utf8')\n }\n\n log(` Clone repository '${name}'.`, 'info')\n await git.pull('origin', branch)\n\n if (includes.some(item => item.includes('docs'))) {\n cpSync(resolve(projectDir, 'docs'), projectDir, { recursive: true })\n rmSync(resolve(projectDir, 'docs'), { recursive: true })\n }\n rmSync(resolve(projectDir, '.git'), { recursive: true })\n } catch (error) {\n log(` Error when cloning repository: ${error}.`, 'error')\n }\n}\n","import { resolve } from 'node:path'\nimport { writeFileSync } from 'node:fs'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { FetchOpts, FetchOptsUser } from '../schemas/fetch.js'\nimport { checkHttpStatus, prettify } from '../utils/functions.js'\nimport { DOCPRESS_DIR, DOCS_DIR } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { cloneRepo, getInfos } from './git.js'\n\nexport type EnhancedRepository = Awaited<ReturnType<typeof getInfos>>['repos'][number] & {\n docpress: {\n branch: string\n filtered: boolean\n includes: string[]\n projectPath: string\n raw_url: string\n replace_url: string\n }\n}\n\nexport async function checkDoc(repoOwner: GlobalOpts['usernames'][number], 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 }: FetchOptsUser) {\n await getInfos({ username, token, branch })\n .then(async ({ user, repos, branch }) => generateInfos(user, repos, branch, reposFilter))\n .then(async ({ repos }) => getDoc(repos, reposFilter))\n}\n\nexport async function enhanceRepositories(repos: Awaited<ReturnType<typeof getInfos>>['repos'], branch?: FetchOpts['branch'], reposFilter?: FetchOpts['reposFilter']) {\n const enhancedRepos: EnhancedRepository[] = []\n\n await Promise.all(\n repos.map(async (repo) => {\n const computedBranch = branch ?? repo.default_branch ?? 'main'\n const projectPath = resolve(DOCS_DIR, prettify(repo.name, { removeDot: true }))\n const filtered = isRepoFiltered(repo, reposFilter)\n let includes: string[] = []\n\n if (!repo.fork && !repo.private && !filtered) {\n includes = await getSparseCheckout(repo, computedBranch)\n }\n\n enhancedRepos.push({\n ...repo,\n docpress: {\n filtered,\n branch: computedBranch,\n includes,\n projectPath,\n raw_url: `https://raw.githubusercontent.com/${repo.owner.login}/${repo.name}/${computedBranch}`,\n replace_url: `https://github.com/${repo.owner.login}/${repo.name}/tree/${computedBranch}`,\n },\n })\n }),\n )\n\n return enhancedRepos\n}\n\nexport async function getSparseCheckout(repo: Awaited<ReturnType<typeof getInfos>>['repos'][number], branch: FetchOpts['branch']) {\n const docsStatus = await checkDoc(repo.owner.login, repo.name, branch)\n\n const includes: string[] = []\n if (Object.values(docsStatus).every(status => status === 404) || !repo.size) {\n return []\n }\n if (docsStatus.docsFolderStatus !== 404) {\n includes.push('docs/*')\n }\n if (docsStatus.docsFolderStatus === 404 || docsStatus.docsReadmeStatus === 404) {\n includes.push('README.md', '!*/**/README.md')\n }\n return includes\n}\n\nexport async function generateInfos(user: Awaited<ReturnType<typeof getInfos>>['user'], repos: Awaited<ReturnType<typeof getInfos>>['repos'], branch?: FetchOpts['branch'], reposFilter?: FetchOpts['reposFilter']) {\n writeFileSync(`${DOCPRESS_DIR}/user-${user.login}.json`, JSON.stringify(user, null, 2))\n\n const enhancedRepos = await enhanceRepositories(repos, branch, reposFilter)\n writeFileSync(`${DOCPRESS_DIR}/repos-${user.login}.json`, JSON.stringify(enhancedRepos, null, 2))\n\n return { user, repos: enhancedRepos }\n}\n\nexport async function getDoc(repos?: EnhancedRepository[], reposFilter?: FetchOpts['reposFilter']) {\n if (!repos) {\n log(` No repository respect docpress rules.`, 'warn')\n return\n }\n\n await Promise.all(\n repos\n .filter(repo => !isRepoFiltered(repo, reposFilter))\n .map(async (repo) => {\n await cloneRepo(repo.name, repo.clone_url as string, repo.docpress.projectPath, repo.docpress.branch, repo.docpress.includes)\n }),\n )\n}\n\nexport function isRepoFiltered(repo: EnhancedRepository | Awaited<ReturnType<typeof getInfos>>['repos'][number], reposFilter?: FetchOpts['reposFilter']) {\n const hasOnlyExclusions = reposFilter?.every(filter => filter.startsWith('!'))\n const isExcluded = reposFilter?.filter(filter => filter.startsWith('!'))\n .some(filter => repo.name === filter.substring(1))\n const isIncluded = !reposFilter\n || reposFilter?.filter(filter => !filter.startsWith('!')).includes(repo.name)\n || (repo.fork && !isExcluded)\n || (hasOnlyExclusions && !isExcluded)\n\n const isFiltered = isExcluded || !isIncluded\n\n if ('docpress' in repo && !repo.docpress.includes.length) {\n return true\n }\n\n if (!!repo.clone_url && !repo.private && !isFiltered) {\n return false\n }\n return true\n}\n","import { createOption } from 'commander'\nimport { globalOptsSchema } from '../schemas/global.js'\n\nexport const globalOpts = [\n createOption('-C, --config <string>', globalOptsSchema.innerType().shape.config._def.description),\n createOption('-T, --token <string>', globalOptsSchema.innerType().shape.token._def.description),\n createOption('-U, --usernames <string>', globalOptsSchema.innerType().shape.usernames._def.description),\n]\n","import { createCommand, createOption } from 'commander'\nimport { createDir } from '../utils/functions.js'\nimport { DOCPRESS_DIR } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { fetchDoc } from '../lib/fetch.js'\nimport { configSchema } from '../schemas/global.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'fetch'\n\nexport const fetchOpts = [\n createOption('-b, --branch <string>', configSchema.shape.branch._def.description)\n .default(configSchema.shape.branch._def.defaultValue()),\n createOption('-g, --git-provider <string>', configSchema.shape.gitProvider._def.description)\n .default(configSchema.shape.gitProvider._def.defaultValue()),\n createOption('-r, --repos-filter <string>', configSchema.shape.reposFilter._def.description),\n]\n\nexport const fetchCmd = addOptions(createCommand(cmdName), [...fetchOpts, ...globalOpts])\n .description('Fetch docs with the given username(s) and git provider.')\n .action(async (opts) => {\n const parsedOpts = parseOptions(cmdName, opts)\n await main(parsedOpts)\n })\n\nexport async function main(opts: FetchOpts) {\n const { usernames, reposFilter, token, branch, gitProvider } = opts\n log(`\\n-> Start fetching documentation files. This may take a moment, especially for larger repositories.`, 'info')\n\n createDir(DOCPRESS_DIR, { clean: true })\n for (const username of usernames) {\n const finalRF = usernames.length > 1\n ? reposFilter?.filter(rf => rf.startsWith(username)).map(rf => rf.replace(`${username}/`, ''))\n : reposFilter\n await fetchDoc({ username, branch, reposFilter: finalRF, gitProvider, token })\n }\n}\n","import { build as vitepressBuild } from 'vitepress'\nimport { createCommand } from 'commander'\nimport { addOptions } from '../utils/commands.js'\nimport { DOCPRESS_DIR } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'build'\n\nexport const buildOpts = []\n\nexport const buildCmd = addOptions(createCommand(cmdName), globalOpts)\n .description('Build vitepress website.')\n .action(async (_opts) => {\n await main()\n })\n\nexport async function main() {\n log(`\\n-> Start building Vitepress website.\\n\\n`, 'info')\n\n try {\n await vitepressBuild(DOCPRESS_DIR)\n log(`\\n\\nDocpress build succedeed.`, 'success')\n } catch (error) {\n log(`\\n\\nDocpress build failed : ${error}`, 'error')\n }\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { createDir } from './functions.js'\n\nexport function generateFile(src: string, dest: string) {\n const content = readFileSync(src, { encoding: 'utf8' })\n createDir(dirname(dest))\n writeFileSync(dest, content)\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\n\nexport function replaceRelativePath(file: string, url: string) {\n const fileContent = readFileSync(file, 'utf8')\n const updatedContent = fileContent.replace(/\\[([^\\]]+)\\]\\(\\.\\.\\/([^)]+)\\)/g, (_match, p1, p2) => {\n return `[${p1}](${url}/${p2})`\n })\n writeFileSync(file, updatedContent, 'utf8')\n}\n\nexport function replaceReadmePath(file: string, url: string) {\n const readmeContent = readFileSync(file, 'utf8')\n const updatedContent = readmeContent\n .replace(/\\[([^\\]]+)\\]\\((?!\\.?\\/docs\\/|docs\\/|http|#)(\\.?\\/)?([^/][^)]+)\\)/g, (_match, p1, _p2, p3) => {\n return `[${p1}](${url}/${p3})`\n })\n .replace(/\\[([^\\]]+)\\]\\((\\.?\\/docs\\/|docs\\/)([^)]*)\\)/g, (_match, p1, _p2, p3) => {\n return `[${p1}](${p3})`\n })\n writeFileSync(file, updatedContent, 'utf8')\n}\n","import 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 { basename, dirname, parse, resolve } from 'node:path'\nimport { appendFileSync, cpSync, existsSync, readdirSync, renameSync, statSync, writeFileSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport YAML from 'yaml'\nimport type { defineConfig } from 'vitepress'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { generateFile } from '../utils/templates.js'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport { createDir, extractFiles, getMdFiles, getUserInfos, getUserRepos, prettify } from '../utils/functions.js'\nimport { DOCPRESS_DIR, DOCS_DIR, FORKS_FILE, INDEX_FILE, TEMPLATE_THEME, VITEPRESS_CONFIG, VITEPRESS_THEME, VITEPRESS_USER_THEME } from '../utils/const.js'\nimport { replaceReadmePath, replaceRelativePath } from '../utils/regex.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.js'\nimport type { getInfos } from './git.js'\nimport { getContributors } from './git.js'\nimport { getVitepressConfig } from './vitepress.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\nexport async function prepareDoc({ extraHeaderPages, extraPublicContent, extraTheme, vitepressConfig, forks, token, username, websiteTitle, websiteTagline }: Omit<PrepareOpts, 'usernames' | 'branch' | 'gitProvider' | 'reposFilter'> & { username: PrepareOpts['usernames'][number] }) {\n const user = getUserInfos(username)\n const repositories = getUserRepos(username)\n .reduce(({ internals, forks }: { internals: EnhancedRepository[], forks: EnhancedRepository[] }, cur) => {\n const { clone_url, private: privateRepo, fork, docpress } = cur\n if (clone_url && !privateRepo && !docpress.filtered) {\n if (!fork && docpress.includes.length) {\n return { internals: [...internals, cur], forks }\n } else if (fork) {\n return { internals, forks: [...forks, cur] }\n }\n }\n return { internals, forks }\n }, { internals: [], forks: [] })\n\n const websiteInfos = { title: websiteTitle, tagline: websiteTagline }\n const { index, sidebar } = transformDoc(repositories.internals, user, websiteInfos)\n\n let finalSB\n let finalIndex\n if (existsSync(INDEX_FILE) && existsSync(VITEPRESS_CONFIG)) {\n const actualConfig = await parseVitepressConfig(VITEPRESS_CONFIG)\n const actualIndex = await parseVitepressIndex(INDEX_FILE)\n finalSB = [\n ...(actualConfig.themeConfig?.sidebar as SidebarProject[] ?? []),\n ...sidebar,\n ].sort((a, b) => a.text.localeCompare(b.text))\n finalIndex = {\n ...index,\n features: [\n ...actualIndex.features,\n ...index.features,\n ].sort((a, b) => a.title.localeCompare(b.title)),\n }\n } else {\n finalSB = sidebar\n finalIndex = index\n }\n const nav: Page[] = []\n\n if (extraHeaderPages) {\n const pages = addExtraPages(extraHeaderPages)\n if (forks) {\n nav.push(...pages.filter(p => p.link !== '/forks'))\n } else {\n nav.push(...pages)\n }\n }\n if (extraPublicContent) {\n log(` Add extras Vitepress public folder content.`, 'info')\n addContent(extraPublicContent, resolve(DOCPRESS_DIR, 'public'))\n }\n if (extraTheme) {\n log(` Add extras Vitepress theme files.`, 'info')\n addContent(extraTheme, resolve(VITEPRESS_USER_THEME))\n }\n if (forks && username.length) {\n log(` Add fork page to display external contributions.`, 'info')\n await processForks(repositories.forks, username, token)\n nav.push({ text: 'Forks', link: '/forks' })\n }\n\n const config = getVitepressConfig(finalSB, nav, vitepressConfig)\n\n generateVitepressFiles(config, finalIndex)\n}\n\nexport function addSources(repoUrl: string, outputPath: string) {\n const fileName = basename(outputPath)\n const title = fileName === 'introduction.md' ? '\\n## Sources' : '# Sources'\n\n const sourcesContent = `${title}\\n\\nTake a look at the [project sources](${repoUrl}).\\n`\n\n appendFileSync(outputPath, sourcesContent, 'utf8')\n}\n\nexport interface WebsiteInfos {\n title?: string\n tagline?: string\n}\n\nexport function generateIndex(features: Feature[], user: ReturnType<typeof getUserInfos>, websiteInfos: WebsiteInfos) {\n const { name, login, bio } = user\n const { title, tagline } = websiteInfos\n\n const hero = title\n ? { name: title, tagline }\n : { name: name ? `${name}'s projects` : `${login}'s projects`, tagline: bio ?? 'Robots are everywhere 🤖' }\n\n return {\n layout: 'home',\n hero,\n features,\n }\n}\n\nexport function generateFeatures(repoName: string, description: string, features?: Feature[]) {\n const content = {\n title: prettify(repoName, { mode: 'capitalize', replaceDash: true }),\n details: description,\n link: `/${repoName}/introduction`,\n }\n\n return features ? [...features, content] : [content]\n}\n\nexport function generateSidebarProject(repoName: string, sidebarPages: Page[]) {\n return {\n text: prettify(repoName, { mode: 'capitalize', replaceDash: true }),\n collapsed: true,\n items: sidebarPages,\n }\n}\n\nexport function generateSidebarPages(repoName: string, fileName: string, sidebarPages?: Page[]) {\n const content = {\n text: fileName === 'introduction' ? 'Introduction' : prettify(fileName, { mode: 'capitalize', replaceDash: true }),\n link: `/${repoName}/${fileName}`,\n }\n\n return sidebarPages ? [...sidebarPages, content] : [content]\n}\n\nexport function transformDoc(repositories: EnhancedRepository[], user: ReturnType<typeof getUserInfos>, websiteInfos: WebsiteInfos) {\n const features: Feature[] = []\n const sidebar: SidebarProject[] = []\n\n for (const repository of repositories) {\n log(` Replace urls for repository '${repository.name}'.`, 'info')\n getMdFiles([repository.docpress.projectPath]).forEach((file) => {\n log(` Processing file '${basename(file)}' for repository '${repository.name}'.`, 'debug')\n replaceRelativePath(file, `https://github.com/${repository.owner.login}/${repository.name}/tree/${repository.docpress.branch}`)\n\n if (basename(file).toLowerCase() === 'readme.md') {\n replaceReadmePath(file, `https://github.com/${repository.owner.login}/${repository.name}/tree/${repository.docpress.branch}`)\n }\n })\n\n log(` Generate sidebar for repository '${repository.name}'.`, 'info')\n const sidebarItems = readdirSync(repository.docpress.projectPath)\n .filter((file) => {\n return statSync(resolve(repository.docpress.projectPath, file)).isFile()\n && basename(resolve(repository.docpress.projectPath, file)).endsWith('.md')\n })\n .sort((a, b) => a.localeCompare(b))\n .reduce((acc: Page[], cur, idx, arr) => {\n const file = resolve(repository.docpress.projectPath, cur)\n let filename = prettify(basename(file), { mode: 'lowercase', removeIdx: true })\n\n if (filename === 'readme.md') {\n filename = 'introduction.md'\n }\n if (filename !== basename(file)) {\n renameSync(file, resolve(dirname(file), filename))\n }\n\n if (idx === arr.length - 1) {\n let sourceFile\n if (arr.length > 1) {\n sourceFile = resolve(repository.docpress.projectPath, 'sources.md')\n log(` Add sources for repository '${repository.name}'.`, 'info')\n addSources(repository.html_url, sourceFile)\n\n return generateSidebarPages(\n repository.name,\n parse(sourceFile).name,\n generateSidebarPages(repository.name, parse(filename).name, acc),\n )\n }\n sourceFile = resolve(repository.docpress.projectPath, filename)\n addSources(repository.html_url, sourceFile)\n }\n\n return generateSidebarPages(prettify(repository.name, { removeDot: true }), parse(filename).name, acc)\n }, [])\n\n sidebar.push(generateSidebarProject(prettify(repository.name, { removeDot: true }), sidebarItems))\n features.push(...generateFeatures(prettify(repository.name, { removeDot: true }), repository.description || ''))\n }\n\n log(` Generate index content.`, 'info')\n const index = generateIndex(features.toSorted((a, b) => a.title.localeCompare(b.title)), user, websiteInfos)\n return {\n sidebar: sidebar.toSorted((a, b) => a.text.localeCompare(b.text)),\n index,\n }\n}\n\nexport function addExtraPages(paths: string[]) {\n const files = getMdFiles(paths)\n const nav: Page[] = []\n\n log(` Add extras Vitepress headers pages.`, 'info')\n for (const file of files) {\n log(` Processing file '${file}'.`, 'debug')\n const src = resolve(process.cwd(), file)\n const dest = resolve(DOCS_DIR, prettify(basename(file), { mode: 'lowercase', removeIdx: true }))\n cpSync(src, dest)\n nav.push({\n text: prettify(parse(src).name, { replaceDash: true, removeIdx: true }),\n link: `/${prettify(parse(src).name, { removeIdx: true, mode: 'lowercase' })}`,\n })\n }\n return nav\n}\n\nexport function addContent(paths: string | string[], dir: string, fn?: () => void) {\n for (const path of Array.isArray(paths) ? paths : [paths]) {\n const absolutePath = resolve(process.cwd(), path)\n const files = extractFiles(absolutePath)\n\n for (const file of files) {\n const formattedFile = file.replace(absolutePath, '.')\n log(` Processing file '${formattedFile}' for entry '${path}'.`, 'debug')\n const src = resolve(process.cwd(), file)\n const dest = resolve(dir, formattedFile)\n if (fn) {\n fn()\n }\n cpSync(src, dest)\n }\n }\n}\n\nexport function addForkPage(forks: { repository: Awaited<ReturnType<typeof getInfos>>['repos'][number], contributions: number }[]) {\n const separator = '---\\n'\n const header = 'layout: fork-page\\nrepoList:\\n'\n const text = '\\n# External contributions\\n\\nThis gallery is a visual representation of the collaborative work done across a variety of open-source projects, each driven by a shared passion for innovation and community growth.\\n\\nEvery tile below represents a unique project where contributions have been made-ranging from code enhancements to documentation improvements. Each project includes a summary of its goals, features, and links to GitHub for direct access.\\n\\nThis page serves as both a portfolio of past work and a resource for revisiting projects that have made a meaningful impact.\\n'\n const frontmatter = forks.map(({ repository, contributions }) => {\n const { name, owner, html_url, description, stargazers_count } = repository\n return { name, owner: owner.login, html_url, description, stargazers_count, contributions }\n })\n log(` Generate forks page.`, 'info')\n writeFileSync(FORKS_FILE, separator.concat(header, YAML.stringify(frontmatter), separator, text))\n}\n\ntype Source = Required<Awaited<ReturnType<typeof getContributors>>['source']>\n\ntype AdaptedLicense = Omit<NonNullable<Source>['license'], 'spdx_id'> & { spdx_id?: string }\n\ntype AdaptedRepository = Omit<NonNullable<Source>, 'license'> & { license: AdaptedLicense }\n\nexport async function processForks(repositories: EnhancedRepository[], username: GlobalOpts['usernames'][number], token?: GlobalOpts['token']) {\n const forks = await Promise.all(\n repositories.map(async (repository) => {\n const { source, contributors } = await getContributors({ repository, token })\n return {\n contributions: contributors?.find(contributor => contributor.login === username)?.contributions ?? 0,\n repository: source as AdaptedRepository,\n }\n }),\n ).then(f => f.filter(({ repository, contributions }) => !!repository && contributions))\n\n addForkPage(forks)\n}\n\nexport async function parseVitepressConfig(path: string): Promise<Partial<ReturnType<typeof defineConfig>>> {\n const { config } = await import(resolve(process.cwd(), path)).catch(e => e)\n return config\n}\n\nexport async function parseVitepressIndex(path: string): Promise<Index> {\n const index = (await readFile(resolve(process.cwd(), path))).toString()\n return YAML.parse(index)\n}\n\nexport function generateVitepressFiles(vitepressConfig: Partial<ReturnType<typeof defineConfig>>, index: Index) {\n const separator = '---\\n'\n createDir(dirname(VITEPRESS_CONFIG))\n\n log(` Generate Vitepress config.`, 'info')\n writeFileSync(VITEPRESS_CONFIG, `export const config = ${JSON.stringify(vitepressConfig, null, 2)}\\n\\nexport default config\\n`)\n log(` Generate index file.`, 'info')\n writeFileSync(INDEX_FILE, separator.concat(YAML.stringify(index)))\n log(` Add Docpress theme files.`, 'info')\n return extractFiles(TEMPLATE_THEME).forEach((path) => {\n const relativePath = path.replace(`${TEMPLATE_THEME}/`, '')\n generateFile(path, resolve(VITEPRESS_THEME, relativePath))\n })\n}\n","import { dirname } from 'node:path'\nimport { createCommand, createOption } from 'commander'\nimport { configSchema } from '../schemas/global.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport { prepareDoc } from '../lib/prepare.js'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { log } from '../utils/logger.js'\nimport { createDir } from '../utils/functions.js'\nimport { VITEPRESS_CONFIG } from '../utils/const.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'prepare'\n\nexport const prepareOpts = [\n createOption('-c, --extra-public-content <string>', configSchema.shape.extraPublicContent._def.description),\n createOption('-f, --forks', configSchema.shape.forks._def.description),\n createOption('-p, --extra-header-pages <string>', configSchema.shape.extraHeaderPages._def.description),\n createOption('-t, --extra-theme <string>', configSchema.shape.extraTheme._def.description),\n createOption('-v, --vitepress-config <string>', configSchema.shape.vitepressConfig._def.description),\n createOption('--website-title <string>', configSchema.shape.websiteTitle._def.description),\n createOption('--website-tagline <string>', configSchema.shape.websiteTagline._def.description),\n]\n\nexport const prepareCmd = addOptions(createCommand(cmdName), [...prepareOpts, ...globalOpts])\n .description('Transform doc to the target vitepress format.')\n .action(async (opts) => {\n const parsedOpts = parseOptions(cmdName, opts)\n await main(parsedOpts)\n })\n\nexport async function main(opts: PrepareOpts) {\n const { extraHeaderPages, extraPublicContent, extraTheme, vitepressConfig, forks, token, usernames, websiteTitle, websiteTagline } = opts\n log(`\\n-> Start transform files to prepare Vitepress build.`, 'info')\n\n createDir(dirname(VITEPRESS_CONFIG), { clean: true })\n for (const username of usernames) {\n await prepareDoc({ extraHeaderPages, extraPublicContent, extraTheme, vitepressConfig, forks, token, username, websiteTitle, websiteTagline })\n }\n}\n","import { Command } from 'commander'\nimport pkg from '../package.json' with { type: 'json' }\nimport { fetchCmd, main as fetchFn, fetchOpts } from './commands/fetch.js'\nimport { buildCmd, main as buildFn } from './commands/build.js'\nimport { prepareCmd, main as prepareFn, prepareOpts } from './commands/prepare.js'\nimport { addOptions, parseOptions } from './utils/commands.js'\nimport { globalOpts } from './commands/global.js'\n\nexport function getProgram() {\n const pm = new Command()\n .name('docpress')\n .description('Build your doc website faster than light ⚡️⚡️⚡️')\n .version(`${pkg.version}`)\n .action(async (opts, _cmd) => {\n const parsedOpts = parseOptions('global', opts)\n await fetchFn(parsedOpts)\n await prepareFn(parsedOpts)\n await buildFn()\n })\n .configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n showGlobalOptions: true,\n })\n .enablePositionalOptions()\n .passThroughOptions()\n .addCommand(fetchCmd)\n .addCommand(prepareCmd)\n .addCommand(buildCmd)\n\n addOptions(pm, [...fetchOpts, ...prepareOpts, ...globalOpts])\n\n return pm\n}\n\nexport function main() {\n const pm = getProgram()\n pm.parseAsync(process.argv)\n}\n"],"names":["DOCPRESS_DIR","resolve","DOCS_DIR","INDEX_FILE","FORKS_FILE","VITEPRESS_CONFIG","VITEPRESS_THEME","VITEPRESS_USER_THEME","TEMPLATE_THEME","checkHttpStatus","url","axios","error","prettify","s","opts","u","createDir","directory","clean","existsSync","rimrafSync","mkdirSync","err","isDir","path","statSync","isFile","extractFiles","paths","readdirSync","file","join","getMdFiles","basename","prettifyEnum","arr","acc","cur","idx","getUserInfos","username","readFileSync","getUserRepos","deepMerge","objects","obj","key","accValue","objValue","isObject","val","loadConfigFile","configPath","fullPath","fileContents","splitByComma","getLogLevel","colorMap","log","msg","type","color","computedMsg","chalk","computedType","providers","configSchema","z","applyGlobalOptsTransform","data","config","vitepressConfig","token","rest","loadedDPConfig","loadedVPConfig","defaultConfig","vpConfig","mergedConfig","fromZodError","cliSchema","globalOptsSchema","buildOptsSchema","fetchOptsSchema","prepareOptsSchema","options","parseOptions","cmd","res","addOptions","opt","getInfos","branch","octokit","Octokit","user","repos","getContributors","repository","message","repo","contributors","cloneRepo","name","projectDir","includes","git","simpleGit","item","appendFileSync","cpSync","rmSync","checkDoc","repoOwner","repoName","rootReadmeUrl","docsFolderUrl","docsReadmeUrl","rootReadmeStatus","docsFolderStatus","docsReadmeStatus","fetchDoc","reposFilter","generateInfos","getDoc","enhanceRepositories","enhancedRepos","computedBranch","projectPath","filtered","isRepoFiltered","getSparseCheckout","docsStatus","status","writeFileSync","hasOnlyExclusions","filter","isExcluded","isIncluded","isFiltered","globalOpts","createOption","cmdName","fetchOpts","fetchCmd","createCommand","parsedOpts","main","usernames","gitProvider","finalRF","rf","buildCmd","_opts","vitepressBuild","generateFile","src","dest","content","dirname","replaceRelativePath","updatedContent","_match","p1","p2","replaceReadmePath","_p2","p3","defaultVitepressConfig","getVitepressConfig","sidebar","nav","prepareDoc","extraHeaderPages","extraPublicContent","extraTheme","forks","websiteTitle","websiteTagline","repositories","internals","clone_url","privateRepo","fork","docpress","websiteInfos","index","transformDoc","finalSB","finalIndex","actualConfig","parseVitepressConfig","actualIndex","parseVitepressIndex","a","b","pages","addExtraPages","p","addContent","processForks","generateVitepressFiles","addSources","repoUrl","outputPath","sourcesContent","generateIndex","features","login","bio","title","tagline","generateFeatures","description","generateSidebarProject","sidebarPages","generateSidebarPages","fileName","sidebarItems","filename","renameSync","sourceFile","parse","files","dir","fn","absolutePath","formattedFile","addForkPage","separator","header","text","frontmatter","contributions","owner","html_url","stargazers_count","YAML","source","contributor","f","e","readFile","relativePath","prepareOpts","prepareCmd","getProgram","pm","Command","pkg","_cmd","fetchFn","prepareFn","buildFn"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sources":["../src/utils/const.ts","../src/utils/functions.ts","../src/utils/logger.ts","../src/schemas/global.ts","../src/schemas/build.ts","../src/schemas/fetch.ts","../src/schemas/prepare.ts","../src/utils/commands.ts","../src/lib/git.ts","../src/lib/fetch.ts","../src/commands/global.ts","../src/commands/fetch.ts","../src/commands/build.ts","../src/utils/templates.ts","../src/utils/regex.ts","../src/lib/vitepress.ts","../src/lib/prepare.ts","../src/commands/prepare.ts","../src/cli.ts"],"sourcesContent":["import { resolve } from 'node:path'\n\nexport const DOCPRESS_DIR = resolve(process.cwd(), 'docpress')\n\nexport const USER_REPOS_INFOS = resolve(process.cwd(), 'docpress/repositories.json')\n\nexport const USER_INFOS = resolve(process.cwd(), 'docpress/owner.json')\n\nexport const DOCS_DIR = resolve(process.cwd(), 'docpress/docs')\n\nexport const INDEX_FILE = resolve(process.cwd(), 'docpress/docs/index.md')\n\nexport const FORKS_FILE = resolve(process.cwd(), 'docpress/docs/forks.md')\n\nexport const VITEPRESS_CONFIG = resolve(process.cwd(), 'docpress/.vitepress/config.ts')\n\nexport const VITEPRESS_THEME = resolve(process.cwd(), 'docpress/.vitepress/theme')\n\nexport const VITEPRESS_USER_THEME = resolve(process.cwd(), 'docpress/.vitepress/theme/extras')\n\n// eslint-disable-next-line dot-notation\nexport const TEMPLATE_THEME = process.env['NODE_ENV'] === 'development'\n ? resolve(import.meta.dirname, '../../public/templates/theme')\n : resolve(import.meta.dirname, './templates/theme')\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { basename, join, resolve } from 'node:path'\nimport axios from 'axios'\nimport { rimrafSync } from 'rimraf'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { EnhancedRepository } from '../lib/fetch.js'\nimport type { getInfos } from '../lib/git.js'\nimport { DOCPRESS_DIR } from './const.js'\n\nexport async function checkHttpStatus(url: string): Promise<number> {\n try {\n const response = await axios.head(url)\n return response.status\n } catch (error) {\n return error.response?.status || error.status || 500\n }\n}\n\ninterface PrettifyOpts {\n mode?: 'capitalize' | 'uppercase' | 'lowercase'\n replaceDash?: boolean\n removeIdx?: boolean\n removeDot?: boolean\n}\n\nexport function prettify(s: string, opts: PrettifyOpts) {\n let u: string = ''\n\n if (s.startsWith('.') && opts?.removeDot) {\n u = s.slice(1)\n }\n\n if (opts?.removeIdx) {\n u = s.replace(/^\\d{2}-/, '')\n }\n\n if (opts?.replaceDash) {\n u = (u || s).replaceAll('-', ' ')\n }\n\n if (opts?.mode === 'capitalize') {\n u = (u || s).slice(0, 1).toUpperCase() + (u || s).slice(1).toLowerCase()\n } else if (opts?.mode === 'lowercase') {\n u = (u || s).toLowerCase()\n } else if (opts?.mode === 'uppercase') {\n u = (u || s).toUpperCase()\n }\n\n return u || s\n}\n\nexport function createDir(directory: string, { clean }: { clean?: boolean } = { clean: false }) {\n try {\n if (clean && existsSync(directory)) {\n rimrafSync(`${directory}/*`, { glob: true })\n }\n if (!existsSync(directory)) {\n mkdirSync(directory, { recursive: true })\n }\n } catch (err) {\n console.error(err)\n }\n}\n\nexport function isDir(path: string) {\n try {\n return statSync(path).isDirectory()\n } catch (_error) {\n return false\n }\n}\n\nexport function isFile(path: string) {\n try {\n return statSync(path).isFile()\n } catch (_error) {\n return false\n }\n}\n\nexport function extractFiles(paths: string[] | string): string[] {\n return (Array.isArray(paths) ? paths : [paths]).flatMap((path) => {\n if (isFile(path)) {\n return [path]\n }\n if (isDir(path)) {\n return readdirSync(path).flatMap(file => extractFiles(join(path, file)))\n }\n return []\n })\n}\n\nexport function getMdFiles(path: string[]) {\n return extractFiles(path).filter(file => basename(file).endsWith('.md'))\n}\n\nexport function prettifyEnum(arr: readonly string[]) {\n return arr.reduce((acc, cur, idx, arr) => {\n if (!idx) {\n return `\"${cur}\"`\n } else if (idx === arr.length - 1) {\n return `${acc} or \"${cur}\"`\n } else {\n return `${acc}, \"${cur}\"`\n }\n }, '')\n}\n\nexport function getUserInfos(username: GlobalOpts['usernames'][number]) {\n return JSON.parse(readFileSync(`${DOCPRESS_DIR}/user-${username}.json`).toString()) as Awaited<ReturnType<typeof getInfos>>['user']\n}\n\nexport function getUserRepos(username: GlobalOpts['usernames'][number]) {\n return JSON.parse(readFileSync(`${DOCPRESS_DIR}/repos-${username}.json`).toString()) as EnhancedRepository[]\n}\n\nexport function deepMerge<T extends Record<string, any> | null>(...objects: T[]): T {\n return objects.reduce((acc, obj) => {\n if (obj === null) {\n return acc\n }\n\n Object.keys(obj).forEach((key) => {\n const accValue = acc ? acc[key] : null\n const objValue = obj[key]\n\n if (isObject(accValue) && isObject(objValue)) {\n (acc as Record<string, any>)[key] = deepMerge(accValue, objValue)\n } else {\n (acc as Record<string, any>)[key] = objValue\n }\n })\n return acc\n }, {} as T)\n}\n\nexport function isObject(val: any): val is object {\n return val && typeof val === 'object' && !Array.isArray(val)\n}\n\nexport function loadConfigFile(configPath?: string) {\n if (!configPath) {\n return {}\n }\n try {\n const fullPath = resolve(process.cwd(), configPath)\n const fileContents = readFileSync(fullPath, 'utf8')\n return JSON.parse(fileContents)\n } catch (_error) {\n return {}\n }\n}\n\nexport function splitByComma(s: string) {\n return s.split(',')\n}\n","/* eslint-disable dot-notation */\nimport type { ColorName } from 'chalk'\nimport chalk from 'chalk'\n\ntype LogType = keyof Pick<Console, 'info' | 'warn' | 'error' | 'debug' | 'trace'> | 'success'\n\ntype ColorMap = {\n [K in LogType]: {\n color: ColorName\n level: number\n }\n}\n\nfunction getLogLevel() {\n return typeof Number(process.env['LOG_LEVEL']) === 'number' && !Number.isNaN(Number(process.env['LOG_LEVEL']))\n ? Number(process.env['LOG_LEVEL'])\n : 30\n}\n\nconst colorMap: ColorMap = {\n info: { color: 'white', level: 30 },\n warn: { color: 'yellow', level: 20 },\n error: { color: 'red', level: 10 },\n debug: { color: 'blue', level: 50 },\n trace: { color: 'white', level: 40 },\n success: { color: 'green', level: 30 },\n}\n\nexport function log(msg: string, type: LogType = 'info', color?: ColorName) {\n const computedMsg = color ? chalk[color](msg) : chalk[colorMap[type].color](msg)\n const computedType = type === 'success' ? 'info' : type\n\n if (getLogLevel() >= colorMap[type].level) {\n console[computedType](computedMsg)\n }\n}\n","import { z } from 'zod'\nimport { fromZodError } from 'zod-validation-error'\nimport type { UserConfig } from 'vitepress'\nimport { loadConfigFile, prettifyEnum, splitByComma } from '../utils/functions.js'\nimport { log } from '../utils/logger.js'\n\nconst providers = ['github'] as const\n\nexport const configSchema = z.object({\n // Global\n usernames: z.string()\n .array()\n .describe('List of comma separated Git provider usernames used to collect data.'),\n // Fetch\n branch: z.string()\n .describe('Branch used to collect Git provider data.')\n .default('main'),\n gitProvider: z.enum(providers)\n .describe(`Git provider used to retrieve data. Values should be ${prettifyEnum(providers)}.`)\n .default('github'),\n reposFilter: z.string()\n .array()\n .describe('List of comma separated repositories to retrieve from Git provider. Default to all user\\'s public repositories.'),\n // Prepare\n extraHeaderPages: z.string()\n .array()\n .describe('List of comma separated additional files or directories to process Vitepress header pages.'),\n extraPublicContent: z.string()\n .array()\n .describe('List of comma separated additional files or directories to process Vitepress public folder.'),\n extraTheme: z.string()\n .array()\n .describe('List of comma separated additional files or directories to use as Vitepress theme.'),\n forks: z.boolean()\n .describe('Whether or not to create the dedicated fork page that aggregate external contributions.')\n .default(false),\n vitepressConfig: z.any()\n .describe('Path to the vitepress configuration file.'),\n websiteTitle: z.string()\n .describe('Website title.'),\n websiteTagline: z.string()\n .describe('Website tagline.'),\n})\n\nexport type Config = Zod.infer<typeof configSchema>\n\nexport function applyGlobalOptsTransform(data: Cli) {\n const { config, vitepressConfig, token, ...rest } = data\n\n try {\n const loadedDPConfig = configSchema.partial().parse(loadConfigFile(config)) as Config\n const loadedVPConfig = loadConfigFile(vitepressConfig) as UserConfig\n const defaultConfig = configSchema.partial().required({ branch: true, gitProvider: true }).parse({})\n const vpConfig = {\n ...loadedVPConfig,\n ...loadedDPConfig.vitepressConfig,\n }\n const mergedConfig = {\n ...loadedDPConfig,\n ...defaultConfig,\n ...rest,\n ...(Object.keys(vpConfig).length && { vitepressConfig: vpConfig }),\n }\n const parsedConfig = configSchema.partial().required({ usernames: true }).parse(mergedConfig)\n\n return { ...parsedConfig, token }\n } catch (error) {\n log(` An error occurred while checking configuration.\\n ${fromZodError(error).toString()}`, 'error')\n process.exit(1)\n }\n}\n\nexport const baseCliSchema = configSchema.partial().extend({\n config: z.string()\n .describe('Path to the docpress configuration file.')\n .optional(),\n token: z.string()\n .describe('Git provider token used to collect data.')\n .optional(),\n usernames: z.string()\n .describe(configSchema.shape.usernames.description || '')\n .optional(),\n reposFilter: z.string()\n .describe(configSchema.shape.reposFilter.description || '')\n .optional(),\n extraHeaderPages: z.string()\n .describe(configSchema.shape.extraHeaderPages.description || '')\n .optional(),\n extraPublicContent: z.string()\n .describe(configSchema.shape.extraPublicContent.description || '')\n .optional(),\n extraTheme: z.string()\n .describe(configSchema.shape.extraTheme.description || '')\n .optional(),\n vitepressConfig: z.string()\n .describe(configSchema.shape.vitepressConfig.description || '')\n .optional(),\n})\n\nexport type RawCli = z.infer<typeof baseCliSchema>\n\nexport const cliSchema = configSchema\n .partial()\n .extend({\n config: z.string()\n .describe('Path to the docpress configuration file.')\n .optional(),\n token: z.string()\n .describe('Git provider token used to collect data.')\n .optional(),\n usernames: z.string()\n .describe(configSchema.shape.usernames.description || '')\n .transform(splitByComma)\n .optional(),\n reposFilter: z.string()\n .describe(configSchema.shape.reposFilter.description || '')\n .transform(splitByComma)\n .optional(),\n extraHeaderPages: z.string()\n .describe(configSchema.shape.extraHeaderPages.description || '')\n .transform(splitByComma)\n .optional(),\n extraPublicContent: z.string()\n .describe(configSchema.shape.extraPublicContent.description || '')\n .transform(splitByComma)\n .optional(),\n extraTheme: z.string()\n .describe(configSchema.shape.extraTheme.description || '')\n .transform(splitByComma)\n .optional(),\n vitepressConfig: z.string()\n .describe(configSchema.shape.vitepressConfig.description || '')\n .optional(),\n })\n\nexport type Cli = Zod.infer<typeof cliSchema>\n\nexport const globalOptsSchema = cliSchema\n .partial()\n .transform(applyGlobalOptsTransform)\n\nexport type GlobalOpts = Required<Pick<Zod.infer<typeof globalOptsSchema>, 'branch' | 'gitProvider'>>\n & Omit<Zod.infer<typeof globalOptsSchema>, 'branch' | 'gitProvider'>\n","import { cliSchema } from './global.js'\n\nexport const buildOptsSchema = cliSchema\n .pick({})\n\nexport type BuildOpts = Zod.infer<typeof buildOptsSchema>\n","// import type { GlobalOpts } from './global.js'\nimport { applyGlobalOptsTransform, cliSchema } from './global.js'\n\nexport const fetchOptsSchema = cliSchema\n .pick({\n branch: true,\n config: true,\n gitProvider: true,\n reposFilter: true,\n token: true,\n usernames: true,\n })\n .transform(applyGlobalOptsTransform)\n\nexport type FetchOpts = Zod.infer<typeof fetchOptsSchema>\n\nexport type FetchOptsUser = Omit<FetchOpts, 'usernames'> & { username: FetchOpts['usernames'][number] }\n","// import type { GlobalOpts } from './global.js'\nimport { applyGlobalOptsTransform, cliSchema } from './global.js'\n\nexport const prepareOptsSchema = cliSchema\n .pick({\n extraHeaderPages: true,\n extraPublicContent: true,\n extraTheme: true,\n config: true,\n gitProvider: true,\n reposFilter: true,\n token: true,\n usernames: true,\n vitepressConfig: true,\n })\n .transform(applyGlobalOptsTransform)\n\nexport type PrepareOpts = Zod.infer<typeof prepareOptsSchema>\n","import type { Command, Option } from 'commander'\nimport { fromZodError } from 'zod-validation-error'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport { globalOptsSchema } from '../schemas/global.js'\nimport type { BuildOpts } from '../schemas/build.js'\nimport { buildOptsSchema } from '../schemas/build.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { fetchOptsSchema } from '../schemas/fetch.js'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { prepareOptsSchema } from '../schemas/prepare.js'\nimport { log } from './logger.js'\n\ntype Cmd = 'fetch' | 'build' | 'prepare' | 'global'\n\ninterface Options {\n build: BuildOpts\n fetch: FetchOpts\n prepare: PrepareOpts\n global: GlobalOpts\n}\n\nexport const options = {\n build: buildOptsSchema,\n fetch: fetchOptsSchema,\n prepare: prepareOptsSchema,\n global: globalOptsSchema,\n}\n\nexport function parseOptions<T extends Cmd>(cmd: T, opts: Options[T]) {\n log(`Initializing Docpress...`, 'info', 'blue')\n log(`\\n\\n-> Checking for required environment settings and configurations.`, 'info')\n\n const res = options[cmd].safeParse(opts)\n if (res.error) {\n log(` An error occurred while checking configuration.\\n ${fromZodError(res.error).toString()}`, 'error')\n process.exit(1)\n }\n log(' Setup complete! Ready to process your documentation.', 'info')\n return res.data as Options[T]\n}\n\nexport function addOptions(cmd: Command, opts: Option[]) {\n opts.forEach(opt => cmd.addOption(opt))\n return cmd\n}\n","import { appendFileSync, cpSync, rmSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Octokit } from '@octokit/rest'\nimport { simpleGit } from 'simple-git'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { createDir } from '../utils/functions.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.js'\n\nexport async function getInfos({ username, token, branch }: Pick<FetchOpts, 'branch'> & Pick<GlobalOpts, 'token'> & { username: GlobalOpts['usernames'][number] }) {\n log(` Get infos for username '${username}'.`, 'info')\n const octokit = new Octokit({ auth: token })\n log(` Get user infos.`, 'debug')\n const { data: user } = await octokit.rest.users.getByUsername({ username })\n log(` Get repositories infos.`, 'debug')\n const { data: repos } = await octokit.rest.repos.listForUser({ username, sort: 'full_name' })\n\n return { user, repos, branch }\n}\n\nexport async function getContributors({\n repository,\n token,\n}: {\n repository: EnhancedRepository\n token: GlobalOpts['token']\n}) {\n log(` Get contributors infos for repository '${repository.name}'.`, 'info')\n const octokit = new Octokit({\n auth: token,\n log: {\n debug: () => {},\n info: () => {},\n warn: (message) => {\n if (!message.includes('404')) console.warn(message)\n },\n error: (message) => {\n if (!message.includes('404')) console.error(message)\n },\n },\n })\n const { data: repo } = await octokit.rest.repos.get({\n owner: repository.owner.login,\n repo: repository.name,\n })\n if (!repo.source?.owner?.login) {\n return { source: repo.source, contributors: [] }\n }\n const contributors: Array<any> = []\n try {\n for await (const { data } of octokit.paginate.iterator(\n octokit.rest.repos.listContributors,\n {\n owner: repo.source.owner.login,\n repo: repo.parent?.name ?? repo.name,\n per_page: 500,\n },\n )) {\n contributors.push(...data)\n }\n } catch (error) {\n log(\n ` Failed to get contributors infos for repository '${repository.name}'. Error : ${error.message}`,\n 'warn',\n )\n return { source: repo.source, contributors: [] }\n }\n\n return { source: repo.source, contributors }\n}\n\nexport async function cloneRepo(name: string, url: string, projectDir: string, branch: string, includes: string[]) {\n createDir(projectDir, { clean: true })\n\n try {\n const git = simpleGit({ baseDir: projectDir })\n await git.init()\n .addConfig('core.sparseCheckout', 'true', true, 'local')\n .addRemote('origin', url)\n\n for (const item of includes) {\n log(` Add '${item}' to '${name}' sparse-checkout file.`, 'debug')\n appendFileSync(resolve(projectDir, '.git/info/sparse-checkout'), `${item}\\n`, 'utf8')\n }\n\n log(` Clone repository '${name}'.`, 'info')\n await git.pull('origin', branch)\n\n if (includes.some(item => item.includes('docs'))) {\n cpSync(resolve(projectDir, 'docs'), projectDir, { recursive: true })\n rmSync(resolve(projectDir, 'docs'), { recursive: true })\n }\n rmSync(resolve(projectDir, '.git'), { recursive: true })\n } catch (error) {\n log(` Error when cloning repository: ${error}.`, 'error')\n }\n}\n","import { resolve } from 'node:path'\nimport { writeFileSync } from 'node:fs'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport type { FetchOpts, FetchOptsUser } from '../schemas/fetch.js'\nimport { checkHttpStatus, prettify } from '../utils/functions.js'\nimport { DOCPRESS_DIR, DOCS_DIR } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { cloneRepo, getInfos } from './git.js'\n\nexport type EnhancedRepository = Awaited<ReturnType<typeof getInfos>>['repos'][number] & {\n docpress: {\n branch: string\n filtered: boolean\n includes: string[]\n projectPath: string\n raw_url: string\n replace_url: string\n }\n}\n\nexport async function checkDoc(repoOwner: GlobalOpts['usernames'][number], 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 }: FetchOptsUser) {\n await getInfos({ username, token, branch })\n .then(async ({ user, repos, branch }) => generateInfos(user, repos, branch, reposFilter))\n .then(async ({ repos }) => getDoc(repos, reposFilter))\n}\n\nexport async function enhanceRepositories(repos: Awaited<ReturnType<typeof getInfos>>['repos'], branch?: FetchOpts['branch'], reposFilter?: FetchOpts['reposFilter']) {\n const enhancedRepos: EnhancedRepository[] = []\n\n await Promise.all(\n repos.map(async (repo) => {\n const computedBranch = branch ?? repo.default_branch ?? 'main'\n const projectPath = resolve(DOCS_DIR, prettify(repo.name, { removeDot: true }))\n const filtered = isRepoFiltered(repo, reposFilter)\n let includes: string[] = []\n\n if (!repo.fork && !repo.private && !filtered) {\n includes = await getSparseCheckout(repo, computedBranch)\n }\n\n enhancedRepos.push({\n ...repo,\n docpress: {\n filtered,\n branch: computedBranch,\n includes,\n projectPath,\n raw_url: `https://raw.githubusercontent.com/${repo.owner.login}/${repo.name}/${computedBranch}`,\n replace_url: `https://github.com/${repo.owner.login}/${repo.name}/tree/${computedBranch}`,\n },\n })\n }),\n )\n\n return enhancedRepos\n}\n\nexport async function getSparseCheckout(repo: Awaited<ReturnType<typeof getInfos>>['repos'][number], branch: FetchOpts['branch']) {\n const docsStatus = await checkDoc(repo.owner.login, repo.name, branch)\n\n const includes: string[] = []\n if (Object.values(docsStatus).every(status => status === 404) || !repo.size) {\n return []\n }\n if (docsStatus.docsFolderStatus !== 404) {\n includes.push('docs/*')\n }\n if (docsStatus.docsFolderStatus === 404 || docsStatus.docsReadmeStatus === 404) {\n includes.push('README.md', '!*/**/README.md')\n }\n return includes\n}\n\nexport async function generateInfos(user: Awaited<ReturnType<typeof getInfos>>['user'], repos: Awaited<ReturnType<typeof getInfos>>['repos'], branch?: FetchOpts['branch'], reposFilter?: FetchOpts['reposFilter']) {\n writeFileSync(`${DOCPRESS_DIR}/user-${user.login}.json`, JSON.stringify(user, null, 2))\n\n const enhancedRepos = await enhanceRepositories(repos, branch, reposFilter)\n writeFileSync(`${DOCPRESS_DIR}/repos-${user.login}.json`, JSON.stringify(enhancedRepos, null, 2))\n\n return { user, repos: enhancedRepos }\n}\n\nexport async function getDoc(repos?: EnhancedRepository[], reposFilter?: FetchOpts['reposFilter']) {\n if (!repos) {\n log(` No repository respect docpress rules.`, 'warn')\n return\n }\n\n await Promise.all(\n repos\n .filter(repo => !isRepoFiltered(repo, reposFilter))\n .map(async (repo) => {\n await cloneRepo(repo.name, repo.clone_url as string, repo.docpress.projectPath, repo.docpress.branch, repo.docpress.includes)\n }),\n )\n}\n\nexport function isRepoFiltered(repo: EnhancedRepository | Awaited<ReturnType<typeof getInfos>>['repos'][number], reposFilter?: FetchOpts['reposFilter']) {\n const hasOnlyExclusions = reposFilter?.every(filter => filter.startsWith('!'))\n const isExcluded = reposFilter?.filter(filter => filter.startsWith('!'))\n .some(filter => repo.name === filter.substring(1))\n const isIncluded = !reposFilter\n || reposFilter?.filter(filter => !filter.startsWith('!')).includes(repo.name)\n || (repo.fork && !isExcluded)\n || (hasOnlyExclusions && !isExcluded)\n\n const isFiltered = isExcluded || !isIncluded\n\n if ('docpress' in repo && !repo.docpress.includes.length) {\n return true\n }\n\n if (!!repo.clone_url && !repo.private && !isFiltered) {\n return false\n }\n return true\n}\n","import { createOption } from 'commander'\nimport { globalOptsSchema } from '../schemas/global.js'\n\nexport const globalOpts = [\n createOption('-C, --config <string>', globalOptsSchema.innerType().shape.config._def.description),\n createOption('-T, --token <string>', globalOptsSchema.innerType().shape.token._def.description),\n createOption('-U, --usernames <string>', globalOptsSchema.innerType().shape.usernames._def.description),\n]\n","import { createCommand, createOption } from 'commander'\nimport { createDir } from '../utils/functions.js'\nimport { DOCPRESS_DIR } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport type { FetchOpts } from '../schemas/fetch.js'\nimport { fetchDoc } from '../lib/fetch.js'\nimport { configSchema } from '../schemas/global.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'fetch'\n\nexport const fetchOpts = [\n createOption('-b, --branch <string>', configSchema.shape.branch._def.description)\n .default(configSchema.shape.branch._def.defaultValue()),\n createOption('-g, --git-provider <string>', configSchema.shape.gitProvider._def.description)\n .default(configSchema.shape.gitProvider._def.defaultValue()),\n createOption('-r, --repos-filter <string>', configSchema.shape.reposFilter._def.description),\n]\n\nexport const fetchCmd = addOptions(createCommand(cmdName), [...fetchOpts, ...globalOpts])\n .description('Fetch docs with the given username(s) and git provider.')\n .action(async (opts) => {\n const parsedOpts = parseOptions(cmdName, opts)\n await main(parsedOpts)\n })\n\nexport async function main(opts: FetchOpts) {\n const { usernames, reposFilter, token, branch, gitProvider } = opts\n log(`\\n-> Start fetching documentation files. This may take a moment, especially for larger repositories.`, 'info')\n\n createDir(DOCPRESS_DIR, { clean: true })\n for (const username of usernames) {\n const finalRF = usernames.length > 1\n ? reposFilter?.filter(rf => rf.startsWith(username)).map(rf => rf.replace(`${username}/`, ''))\n : reposFilter\n await fetchDoc({ username, branch, reposFilter: finalRF, gitProvider, token })\n }\n}\n","import { build as vitepressBuild } from 'vitepress'\nimport { createCommand } from 'commander'\nimport { addOptions } from '../utils/commands.js'\nimport { DOCPRESS_DIR } from '../utils/const.js'\nimport { log } from '../utils/logger.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'build'\n\nexport const buildOpts = []\n\nexport const buildCmd = addOptions(createCommand(cmdName), globalOpts)\n .description('Build vitepress website.')\n .action(async (_opts) => {\n await main()\n })\n\nexport async function main() {\n log(`\\n-> Start building Vitepress website.\\n\\n`, 'info')\n\n try {\n await vitepressBuild(DOCPRESS_DIR)\n log(`\\n\\nDocpress build succedeed.`, 'success')\n } catch (error) {\n log(`\\n\\nDocpress build failed : ${error}`, 'error')\n }\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { createDir } from './functions.js'\n\nexport function generateFile(src: string, dest: string) {\n const content = readFileSync(src, { encoding: 'utf8' })\n createDir(dirname(dest))\n writeFileSync(dest, content)\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\n\nexport function replaceRelativePath(file: string, url: string) {\n const fileContent = readFileSync(file, 'utf8')\n const updatedContent = fileContent.replace(/\\[([^\\]]+)\\]\\(\\.\\.\\/([^)]+)\\)/g, (_match, p1, p2) => {\n return `[${p1}](${url}/${p2})`\n })\n writeFileSync(file, updatedContent, 'utf8')\n}\n\nexport function replaceReadmePath(file: string, url: string) {\n const readmeContent = readFileSync(file, 'utf8')\n const updatedContent = readmeContent\n .replace(/\\[([^\\]]+)\\]\\((?!\\.?\\/docs\\/|docs\\/|http|#)(\\.?\\/)?([^/][^)]+)\\)/g, (_match, p1, _p2, p3) => {\n return `[${p1}](${url}/${p3})`\n })\n .replace(/\\[([^\\]]+)\\]\\((\\.?\\/docs\\/|docs\\/)([^)]*)\\)/g, (_match, p1, _p2, p3) => {\n return `[${p1}](${p3})`\n })\n writeFileSync(file, updatedContent, 'utf8')\n}\n","import 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 { basename, dirname, parse, resolve } from 'node:path'\nimport { appendFileSync, cpSync, existsSync, readdirSync, renameSync, statSync, writeFileSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport YAML from 'yaml'\nimport type { defineConfig } from 'vitepress'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { generateFile } from '../utils/templates.js'\nimport type { GlobalOpts } from '../schemas/global.js'\nimport { createDir, extractFiles, getMdFiles, getUserInfos, getUserRepos, prettify } from '../utils/functions.js'\nimport { DOCPRESS_DIR, DOCS_DIR, FORKS_FILE, INDEX_FILE, TEMPLATE_THEME, VITEPRESS_CONFIG, VITEPRESS_THEME, VITEPRESS_USER_THEME } from '../utils/const.js'\nimport { replaceReadmePath, replaceRelativePath } from '../utils/regex.js'\nimport { log } from '../utils/logger.js'\nimport type { EnhancedRepository } from './fetch.js'\nimport type { getInfos } from './git.js'\nimport { getContributors } from './git.js'\nimport { getVitepressConfig } from './vitepress.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\nexport async function prepareDoc({ extraHeaderPages, extraPublicContent, extraTheme, vitepressConfig, forks, token, username, websiteTitle, websiteTagline }: Omit<PrepareOpts, 'usernames' | 'branch' | 'gitProvider' | 'reposFilter'> & { username: PrepareOpts['usernames'][number] }) {\n const user = getUserInfos(username)\n const repositories = getUserRepos(username)\n .reduce(({ internals, forks }: { internals: EnhancedRepository[], forks: EnhancedRepository[] }, cur) => {\n const { clone_url, private: privateRepo, fork, docpress } = cur\n if (clone_url && !privateRepo && !docpress.filtered) {\n if (!fork && docpress.includes.length) {\n return { internals: [...internals, cur], forks }\n } else if (fork) {\n return { internals, forks: [...forks, cur] }\n }\n }\n return { internals, forks }\n }, { internals: [], forks: [] })\n\n const websiteInfos = { title: websiteTitle, tagline: websiteTagline }\n const { index, sidebar } = transformDoc(repositories.internals, user, websiteInfos)\n\n let finalSB\n let finalIndex\n if (existsSync(INDEX_FILE) && existsSync(VITEPRESS_CONFIG)) {\n const actualConfig = await parseVitepressConfig(VITEPRESS_CONFIG)\n const actualIndex = await parseVitepressIndex(INDEX_FILE)\n finalSB = [\n ...(actualConfig.themeConfig?.sidebar as SidebarProject[] ?? []),\n ...sidebar,\n ].sort((a, b) => a.text.localeCompare(b.text))\n finalIndex = {\n ...index,\n features: [\n ...actualIndex.features,\n ...index.features,\n ].sort((a, b) => a.title.localeCompare(b.title)),\n }\n } else {\n finalSB = sidebar\n finalIndex = index\n }\n const nav: Page[] = []\n\n if (extraHeaderPages) {\n const pages = addExtraPages(extraHeaderPages)\n if (forks) {\n nav.push(...pages.filter(p => p.link !== '/forks'))\n } else {\n nav.push(...pages)\n }\n }\n if (extraPublicContent) {\n log(` Add extras Vitepress public folder content.`, 'info')\n addContent(extraPublicContent, resolve(DOCPRESS_DIR, 'public'))\n }\n if (extraTheme) {\n log(` Add extras Vitepress theme files.`, 'info')\n addContent(extraTheme, resolve(VITEPRESS_USER_THEME))\n }\n if (forks && username.length) {\n log(` Add fork page to display external contributions.`, 'info')\n await processForks(repositories.forks, username, token)\n nav.push({ text: 'Forks', link: '/forks' })\n }\n\n const config = getVitepressConfig(finalSB, nav, vitepressConfig)\n\n generateVitepressFiles(config, finalIndex)\n}\n\nexport function addSources(repoUrl: string, outputPath: string) {\n const fileName = basename(outputPath)\n const title = fileName === 'introduction.md' ? '\\n## Sources' : '# Sources'\n\n const sourcesContent = `${title}\\n\\nTake a look at the [project sources](${repoUrl}).\\n`\n\n appendFileSync(outputPath, sourcesContent, 'utf8')\n}\n\nexport interface WebsiteInfos {\n title?: string\n tagline?: string\n}\n\nexport function generateIndex(features: Feature[], user: ReturnType<typeof getUserInfos>, websiteInfos: WebsiteInfos) {\n const { name, login, bio } = user\n const { title, tagline } = websiteInfos\n\n const hero = title\n ? { name: title, tagline }\n : { name: name ? `${name}'s projects` : `${login}'s projects`, tagline: bio ?? 'Robots are everywhere 🤖' }\n\n return {\n layout: 'home',\n hero,\n features,\n }\n}\n\nexport function generateFeatures(repoName: string, description: string, features?: Feature[]) {\n const content = {\n title: prettify(repoName, { mode: 'capitalize', replaceDash: true }),\n details: description,\n link: `/${repoName}/introduction`,\n }\n\n return features ? [...features, content] : [content]\n}\n\nexport function generateSidebarProject(repoName: string, sidebarPages: Page[]) {\n return {\n text: prettify(repoName, { mode: 'capitalize', replaceDash: true }),\n collapsed: true,\n items: sidebarPages,\n }\n}\n\nexport function generateSidebarPages(repoName: string, fileName: string, sidebarPages?: Page[]) {\n const content = {\n text: fileName === 'introduction' ? 'Introduction' : prettify(fileName, { mode: 'capitalize', replaceDash: true }),\n link: `/${repoName}/${fileName}`,\n }\n\n return sidebarPages ? [...sidebarPages, content] : [content]\n}\n\nexport function transformDoc(repositories: EnhancedRepository[], user: ReturnType<typeof getUserInfos>, websiteInfos: WebsiteInfos) {\n const features: Feature[] = []\n const sidebar: SidebarProject[] = []\n\n for (const repository of repositories) {\n log(` Replace urls for repository '${repository.name}'.`, 'info')\n getMdFiles([repository.docpress.projectPath]).forEach((file) => {\n log(` Processing file '${basename(file)}' for repository '${repository.name}'.`, 'debug')\n replaceRelativePath(file, `https://github.com/${repository.owner.login}/${repository.name}/tree/${repository.docpress.branch}`)\n\n if (basename(file).toLowerCase() === 'readme.md') {\n replaceReadmePath(file, `https://github.com/${repository.owner.login}/${repository.name}/tree/${repository.docpress.branch}`)\n }\n })\n\n log(` Generate sidebar for repository '${repository.name}'.`, 'info')\n const sidebarItems = readdirSync(repository.docpress.projectPath)\n .filter((file) => {\n return statSync(resolve(repository.docpress.projectPath, file)).isFile()\n && basename(resolve(repository.docpress.projectPath, file)).endsWith('.md')\n })\n .sort((a, b) => a.localeCompare(b))\n .reduce((acc: Page[], cur, idx, arr) => {\n const file = resolve(repository.docpress.projectPath, cur)\n let filename = prettify(basename(file), { mode: 'lowercase', removeIdx: true })\n\n if (filename === 'readme.md') {\n filename = 'introduction.md'\n }\n if (filename !== basename(file)) {\n renameSync(file, resolve(dirname(file), filename))\n }\n\n if (idx === arr.length - 1) {\n let sourceFile\n if (arr.length > 1) {\n sourceFile = resolve(repository.docpress.projectPath, 'sources.md')\n log(` Add sources for repository '${repository.name}'.`, 'info')\n addSources(repository.html_url, sourceFile)\n\n return generateSidebarPages(\n repository.name,\n parse(sourceFile).name,\n generateSidebarPages(repository.name, parse(filename).name, acc),\n )\n }\n sourceFile = resolve(repository.docpress.projectPath, filename)\n addSources(repository.html_url, sourceFile)\n }\n\n return generateSidebarPages(prettify(repository.name, { removeDot: true }), parse(filename).name, acc)\n }, [])\n\n sidebar.push(generateSidebarProject(prettify(repository.name, { removeDot: true }), sidebarItems))\n features.push(...generateFeatures(prettify(repository.name, { removeDot: true }), repository.description || ''))\n }\n\n log(` Generate index content.`, 'info')\n const index = generateIndex(features.toSorted((a, b) => a.title.localeCompare(b.title)), user, websiteInfos)\n return {\n sidebar: sidebar.toSorted((a, b) => a.text.localeCompare(b.text)),\n index,\n }\n}\n\nexport function addExtraPages(paths: string[]) {\n const files = getMdFiles(paths)\n const nav: Page[] = []\n\n log(` Add extras Vitepress headers pages.`, 'info')\n for (const file of files) {\n log(` Processing file '${file}'.`, 'debug')\n const src = resolve(process.cwd(), file)\n const dest = resolve(DOCS_DIR, prettify(basename(file), { mode: 'lowercase', removeIdx: true }))\n cpSync(src, dest)\n nav.push({\n text: prettify(parse(src).name, { replaceDash: true, removeIdx: true }),\n link: `/${prettify(parse(src).name, { removeIdx: true, mode: 'lowercase' })}`,\n })\n }\n return nav\n}\n\nexport function addContent(paths: string | string[], dir: string, fn?: () => void) {\n for (const path of Array.isArray(paths) ? paths : [paths]) {\n const absolutePath = resolve(process.cwd(), path)\n const files = extractFiles(absolutePath)\n\n for (const file of files) {\n const formattedFile = file.replace(absolutePath, '.')\n log(` Processing file '${formattedFile}' for entry '${path}'.`, 'debug')\n const src = resolve(process.cwd(), file)\n const dest = resolve(dir, formattedFile)\n if (fn) {\n fn()\n }\n cpSync(src, dest)\n }\n }\n}\n\nexport function addForkPage(forks: { repository: Awaited<ReturnType<typeof getInfos>>['repos'][number], contributions: number }[]) {\n const separator = '---\\n'\n const header = 'layout: fork-page\\nrepoList:\\n'\n const text = '\\n# External contributions\\n\\nThis gallery is a visual representation of the collaborative work done across a variety of open-source projects, each driven by a shared passion for innovation and community growth.\\n\\nEvery tile below represents a unique project where contributions have been made-ranging from code enhancements to documentation improvements. Each project includes a summary of its goals, features, and links to GitHub for direct access.\\n\\nThis page serves as both a portfolio of past work and a resource for revisiting projects that have made a meaningful impact.\\n'\n const frontmatter = forks.map(({ repository, contributions }) => {\n const { name, owner, html_url, description, stargazers_count } = repository\n return { name, owner: owner.login, html_url, description, stargazers_count, contributions }\n })\n log(` Generate forks page.`, 'info')\n writeFileSync(FORKS_FILE, separator.concat(header, YAML.stringify(frontmatter), separator, text))\n}\n\ntype Source = Required<Awaited<ReturnType<typeof getContributors>>['source']>\n\ntype AdaptedLicense = Omit<NonNullable<Source>['license'], 'spdx_id'> & { spdx_id?: string }\n\ntype AdaptedRepository = Omit<NonNullable<Source>, 'license'> & { license: AdaptedLicense }\n\nexport async function processForks(repositories: EnhancedRepository[], username: GlobalOpts['usernames'][number], token?: GlobalOpts['token']) {\n const forks = await Promise.all(\n repositories.map(async (repository) => {\n const { source, contributors } = await getContributors({ repository, token })\n return {\n contributions: contributors?.find(contributor => contributor.login === username)?.contributions ?? 0,\n repository: source as AdaptedRepository,\n }\n }),\n ).then(f => f.filter(({ repository, contributions }) => !!repository && contributions))\n\n addForkPage(forks)\n}\n\nexport async function parseVitepressConfig(path: string): Promise<Partial<ReturnType<typeof defineConfig>>> {\n const { config } = await import(resolve(process.cwd(), path)).catch(e => e)\n return config\n}\n\nexport async function parseVitepressIndex(path: string): Promise<Index> {\n const index = (await readFile(resolve(process.cwd(), path))).toString()\n return YAML.parse(index)\n}\n\nexport function generateVitepressFiles(vitepressConfig: Partial<ReturnType<typeof defineConfig>>, index: Index) {\n const separator = '---\\n'\n createDir(dirname(VITEPRESS_CONFIG))\n\n log(` Generate Vitepress config.`, 'info')\n writeFileSync(VITEPRESS_CONFIG, `export const config = ${JSON.stringify(vitepressConfig, null, 2)}\\n\\nexport default config\\n`)\n log(` Generate index file.`, 'info')\n writeFileSync(INDEX_FILE, separator.concat(YAML.stringify(index)))\n log(` Add Docpress theme files.`, 'info')\n return extractFiles(TEMPLATE_THEME).forEach((path) => {\n const relativePath = path.replace(`${TEMPLATE_THEME}/`, '')\n generateFile(path, resolve(VITEPRESS_THEME, relativePath))\n })\n}\n","import { dirname } from 'node:path'\nimport { createCommand, createOption } from 'commander'\nimport { configSchema } from '../schemas/global.js'\nimport { addOptions, parseOptions } from '../utils/commands.js'\nimport { prepareDoc } from '../lib/prepare.js'\nimport type { PrepareOpts } from '../schemas/prepare.js'\nimport { log } from '../utils/logger.js'\nimport { createDir } from '../utils/functions.js'\nimport { VITEPRESS_CONFIG } from '../utils/const.js'\nimport { globalOpts } from './global.js'\n\nconst cmdName = 'prepare'\n\nexport const prepareOpts = [\n createOption('-c, --extra-public-content <string>', configSchema.shape.extraPublicContent._def.description),\n createOption('-f, --forks', configSchema.shape.forks._def.description),\n createOption('-p, --extra-header-pages <string>', configSchema.shape.extraHeaderPages._def.description),\n createOption('-t, --extra-theme <string>', configSchema.shape.extraTheme._def.description),\n createOption('-v, --vitepress-config <string>', configSchema.shape.vitepressConfig._def.description),\n createOption('--website-title <string>', configSchema.shape.websiteTitle._def.description),\n createOption('--website-tagline <string>', configSchema.shape.websiteTagline._def.description),\n]\n\nexport const prepareCmd = addOptions(createCommand(cmdName), [...prepareOpts, ...globalOpts])\n .description('Transform doc to the target vitepress format.')\n .action(async (opts) => {\n const parsedOpts = parseOptions(cmdName, opts)\n await main(parsedOpts)\n })\n\nexport async function main(opts: PrepareOpts) {\n const { extraHeaderPages, extraPublicContent, extraTheme, vitepressConfig, forks, token, usernames, websiteTitle, websiteTagline } = opts\n log(`\\n-> Start transform files to prepare Vitepress build.`, 'info')\n\n createDir(dirname(VITEPRESS_CONFIG), { clean: true })\n for (const username of usernames) {\n await prepareDoc({ extraHeaderPages, extraPublicContent, extraTheme, vitepressConfig, forks, token, username, websiteTitle, websiteTagline })\n }\n}\n","import { Command } from 'commander'\nimport pkg from '../package.json' with { type: 'json' }\nimport { fetchCmd, main as fetchFn, fetchOpts } from './commands/fetch.js'\nimport { buildCmd, main as buildFn } from './commands/build.js'\nimport { prepareCmd, main as prepareFn, prepareOpts } from './commands/prepare.js'\nimport { addOptions, parseOptions } from './utils/commands.js'\nimport { globalOpts } from './commands/global.js'\n\nexport function getProgram() {\n const pm = new Command()\n .name('docpress')\n .description('Build your doc website faster than light ⚡️⚡️⚡️')\n .version(`${pkg.version}`)\n .action(async (opts, _cmd) => {\n const parsedOpts = parseOptions('global', opts)\n await fetchFn(parsedOpts)\n await prepareFn(parsedOpts)\n await buildFn()\n })\n .configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n showGlobalOptions: true,\n })\n .enablePositionalOptions()\n .passThroughOptions()\n .addCommand(fetchCmd)\n .addCommand(prepareCmd)\n .addCommand(buildCmd)\n\n addOptions(pm, [...fetchOpts, ...prepareOpts, ...globalOpts])\n\n return pm\n}\n\nexport function main() {\n const pm = getProgram()\n pm.parseAsync(process.argv)\n}\n"],"names":["DOCPRESS_DIR","resolve","DOCS_DIR","INDEX_FILE","FORKS_FILE","VITEPRESS_CONFIG","VITEPRESS_THEME","VITEPRESS_USER_THEME","TEMPLATE_THEME","checkHttpStatus","url","axios","error","prettify","s","opts","u","createDir","directory","clean","existsSync","rimrafSync","mkdirSync","err","isDir","path","statSync","isFile","extractFiles","paths","readdirSync","file","join","getMdFiles","basename","prettifyEnum","arr","acc","cur","idx","getUserInfos","username","readFileSync","getUserRepos","deepMerge","objects","obj","key","accValue","objValue","isObject","val","loadConfigFile","configPath","fullPath","fileContents","splitByComma","getLogLevel","colorMap","log","msg","type","color","computedMsg","chalk","computedType","providers","configSchema","z","applyGlobalOptsTransform","data","config","vitepressConfig","token","rest","loadedDPConfig","loadedVPConfig","defaultConfig","vpConfig","mergedConfig","fromZodError","cliSchema","globalOptsSchema","buildOptsSchema","fetchOptsSchema","prepareOptsSchema","options","parseOptions","cmd","res","addOptions","opt","getInfos","branch","octokit","Octokit","user","repos","getContributors","repository","message","repo","contributors","cloneRepo","name","projectDir","includes","git","simpleGit","item","appendFileSync","cpSync","rmSync","checkDoc","repoOwner","repoName","rootReadmeUrl","docsFolderUrl","docsReadmeUrl","rootReadmeStatus","docsFolderStatus","docsReadmeStatus","fetchDoc","reposFilter","generateInfos","getDoc","enhanceRepositories","enhancedRepos","computedBranch","projectPath","filtered","isRepoFiltered","getSparseCheckout","docsStatus","status","writeFileSync","hasOnlyExclusions","filter","isExcluded","isIncluded","isFiltered","globalOpts","createOption","cmdName","fetchOpts","fetchCmd","createCommand","parsedOpts","main","usernames","gitProvider","finalRF","rf","buildCmd","_opts","vitepressBuild","generateFile","src","dest","content","dirname","replaceRelativePath","updatedContent","_match","p1","p2","replaceReadmePath","_p2","p3","defaultVitepressConfig","getVitepressConfig","sidebar","nav","prepareDoc","extraHeaderPages","extraPublicContent","extraTheme","forks","websiteTitle","websiteTagline","repositories","internals","clone_url","privateRepo","fork","docpress","websiteInfos","index","transformDoc","finalSB","finalIndex","actualConfig","parseVitepressConfig","actualIndex","parseVitepressIndex","a","b","pages","addExtraPages","p","addContent","processForks","generateVitepressFiles","addSources","repoUrl","outputPath","sourcesContent","generateIndex","features","login","bio","title","tagline","generateFeatures","description","generateSidebarProject","sidebarPages","generateSidebarPages","fileName","sidebarItems","filename","renameSync","sourceFile","parse","files","dir","fn","absolutePath","formattedFile","addForkPage","separator","header","text","frontmatter","contributions","owner","html_url","stargazers_count","YAML","source","contributor","f","e","readFile","relativePath","prepareOpts","prepareCmd","getProgram","pm","Command","pkg","_cmd","fetchFn","prepareFn","buildFn"],"mappings":"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"}
@@ -19,7 +19,7 @@ const repositories = frontmatter.value.repoList || []
19
19
  class="repo-card VPFeature link"
20
20
  >
21
21
  <div class="repo-content">
22
- <span class="repo-name">{{ repo.name }}</span>
22
+ <span class="repo-name">{{ repo.owner }}/{{ repo.name }}</span>
23
23
  <p class="repo-description">{{ repo.description }}</p>
24
24
  <div class="repo-stats">
25
25
  <span class="repo-stars">
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tobi-or-not/docpress",
3
3
  "type": "module",
4
- "version": "0.6.0",
4
+ "version": "0.6.1",
5
5
  "homepage": "https://this-is-tobi.com/docpress/introduction",
6
6
  "repository": {
7
7
  "type": "git",