@opendocsdev/cli 0.2.5 → 0.2.6
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/bin/opendocs.js +9 -3
- package/dist/bin/opendocs.js.map +1 -1
- package/package.json +1 -1
package/dist/bin/opendocs.js
CHANGED
|
@@ -319,6 +319,7 @@ import { fileURLToPath as fileURLToPath3 } from "url";
|
|
|
319
319
|
import fs4 from "fs-extra";
|
|
320
320
|
import chalk5 from "chalk";
|
|
321
321
|
import ora2 from "ora";
|
|
322
|
+
import * as pagefind from "pagefind";
|
|
322
323
|
|
|
323
324
|
// src/utils/sitemap.ts
|
|
324
325
|
import fs3 from "fs-extra";
|
|
@@ -431,11 +432,16 @@ async function build() {
|
|
|
431
432
|
}
|
|
432
433
|
const pagefindSpinner = ora2("Generating search index with Pagefind...").start();
|
|
433
434
|
try {
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
435
|
+
const { index } = await pagefind.createIndex();
|
|
436
|
+
if (!index) {
|
|
437
|
+
throw new Error("Failed to create Pagefind index");
|
|
438
|
+
}
|
|
439
|
+
await index.addDirectory({ path: projectDistDir });
|
|
440
|
+
await index.writeFiles({ outputPath: path5.join(projectDistDir, "pagefind") });
|
|
441
|
+
await pagefind.close();
|
|
437
442
|
pagefindSpinner.succeed("Search index generated");
|
|
438
443
|
} catch (error) {
|
|
444
|
+
await pagefind.close();
|
|
439
445
|
pagefindSpinner.fail("Pagefind indexing failed");
|
|
440
446
|
logger.error(getErrorMessage(error));
|
|
441
447
|
process.exit(1);
|
package/dist/bin/opendocs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../bin/opendocs.ts","../../src/commands/init.ts","../../src/utils/logger.ts","../../src/utils/errors.ts","../../src/constants.ts","../../src/commands/dev.ts","../../src/utils/docs-config.ts","../../src/config/schema.ts","../../src/utils/process.ts","../../src/commands/build.ts","../../src/utils/sitemap.ts","../../src/commands/preview.ts","../../src/commands/deploy.ts","../../src/utils/format.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { init } from \"../src/commands/init.js\";\nimport { dev } from \"../src/commands/dev.js\";\nimport { build } from \"../src/commands/build.js\";\nimport { preview } from \"../src/commands/preview.js\";\nimport { deploy } from \"../src/commands/deploy.js\";\nimport { CLI_NAME, CLI_VERSION } from \"../src/constants.js\";\n\nconst program = new Command();\n\nprogram\n .name(CLI_NAME)\n .description(\"Beautiful docs with zero config. One codebase, deploy anywhere.\")\n .version(CLI_VERSION);\n\nprogram\n .command(\"init [name]\")\n .description(\"Initialize a new opendocs project\")\n .action(async (name?: string) => {\n await init(name);\n });\n\nprogram\n .command(\"dev\")\n .description(\"Start the development server with hot reload\")\n .option(\"-p, --port <port>\", \"Port to run the dev server on\", \"4321\")\n .action(async (options: { port: string }) => {\n await dev(options);\n });\n\nprogram\n .command(\"build\")\n .description(\"Build the documentation site for production\")\n .action(async () => {\n await build();\n });\n\nprogram\n .command(\"preview\")\n .description(\"Preview the production build locally\")\n .option(\"-p, --port <port>\", \"Port to run the preview server on\", \"4321\")\n .action(async (options: { port: string }) => {\n await preview(options);\n });\n\nprogram\n .command(\"deploy\")\n .description(\"Deploy documentation to the hosted platform\")\n .option(\"--skip-build\", \"Skip the build step (use existing dist folder)\")\n .action(async (options: { skipBuild?: boolean }) => {\n await deploy(options);\n });\n\nprogram.parse(process.argv);\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { fileURLToPath } from \"url\";\nimport { logger } from \"../utils/logger.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { DOCS_CONFIG_FILE } from \"../constants.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Get the path to the templates directory\n */\nfunction getTemplatesDir(): string {\n // In development, templates are in src/templates\n // In production (after build), they should be copied to dist/templates\n const devPath = path.join(__dirname, \"..\", \"templates\");\n const prodPath = path.join(__dirname, \"..\", \"..\", \"templates\");\n\n if (fs.existsSync(devPath)) {\n return devPath;\n }\n return prodPath;\n}\n\n/**\n * Read a template file and optionally replace placeholders\n */\nasync function readTemplate(filename: string, replacements?: Record<string, string>): Promise<string> {\n const templatesDir = getTemplatesDir();\n const filePath = path.join(templatesDir, filename);\n\n let content = await fs.readFile(filePath, \"utf-8\");\n\n if (replacements) {\n for (const [key, value] of Object.entries(replacements)) {\n content = content.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), value);\n }\n }\n\n return content;\n}\n\n/** Template files to scaffold, with optional replacements */\nconst TEMPLATE_FILES: Array<{\n template: string;\n output: string;\n replacements?: Record<string, string>;\n}> = [\n { template: \"introduction.mdx\", output: \"introduction.mdx\" },\n { template: \"quickstart.mdx\", output: \"quickstart.mdx\" },\n { template: \"components.mdx\", output: \"components.mdx\" },\n { template: \"configuration.mdx\", output: \"configuration.mdx\" },\n { template: \"writing-content.mdx\", output: \"writing-content.mdx\" },\n { template: \"api-reference.mdx\", output: \"api-reference.mdx\" },\n { template: \"logo.svg\", output: \"public/logo.svg\" },\n];\n\n/**\n * Initialize a new opendocs project\n * Scaffolds a docs project with default config and example files\n */\nexport async function init(name: string = \"my-docs\"): Promise<void> {\n const projectDir = path.resolve(process.cwd(), name);\n\n // Check if directory already exists\n if (await fs.pathExists(projectDir)) {\n logger.error(`Error: Directory \"${name}\" already exists.`);\n logger.info(chalk.gray(\"Please choose a different name or remove the existing directory.\"));\n process.exit(1);\n }\n\n const spinner = ora(`Creating new opendocs project: ${name}`).start();\n\n try {\n // Create project directory\n await fs.mkdir(projectDir, { recursive: true });\n\n // Create docs.json config\n spinner.text = `Creating ${DOCS_CONFIG_FILE} configuration...`;\n const docsConfig = await readTemplate(DOCS_CONFIG_FILE, { PROJECT_NAME: name });\n await fs.writeFile(path.join(projectDir, DOCS_CONFIG_FILE), docsConfig);\n\n // Create template files\n for (const { template, output } of TEMPLATE_FILES) {\n spinner.text = `Creating ${output}...`;\n const content = await readTemplate(template);\n const outputPath = path.join(projectDir, output);\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content);\n }\n\n spinner.succeed(chalk.green(`Successfully created \"${name}\"!`));\n\n // Show next steps\n logger.plain(\"\");\n logger.info(chalk.bold(\"Next steps:\"));\n logger.plain(\"\");\n logger.info(chalk.gray(\" 1.\") + ` cd ${name}`);\n logger.info(chalk.gray(\" 2.\") + \" opendocs dev\");\n logger.plain(\"\");\n logger.info(chalk.gray(\"Then open\") + \" \" + chalk.cyan(\"http://localhost:4321\") + \" \" + chalk.gray(\"in your browser.\"));\n logger.plain(\"\");\n logger.info(chalk.gray(\"Edit\") + \" \" + chalk.cyan(DOCS_CONFIG_FILE) + \" \" + chalk.gray(\"to customize your documentation.\"));\n } catch (error) {\n spinner.fail(chalk.red(\"Failed to create project\"));\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\n\ntype LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nlet currentLevel: LogLevel = \"info\";\n\nexport function setLogLevel(level: LogLevel): void {\n currentLevel = level;\n}\n\nexport function getLogLevel(): LogLevel {\n return currentLevel;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[currentLevel];\n}\n\nexport const logger = {\n debug(message: string, ...args: unknown[]): void {\n if (shouldLog(\"debug\")) {\n console.log(chalk.gray(`[debug] ${message}`), ...args);\n }\n },\n\n info(message: string, ...args: unknown[]): void {\n if (shouldLog(\"info\")) {\n console.log(message, ...args);\n }\n },\n\n warn(message: string, ...args: unknown[]): void {\n if (shouldLog(\"warn\")) {\n console.warn(chalk.yellow(message), ...args);\n }\n },\n\n error(message: string, ...args: unknown[]): void {\n if (shouldLog(\"error\")) {\n console.error(chalk.red(message), ...args);\n }\n },\n\n success(message: string, ...args: unknown[]): void {\n if (shouldLog(\"info\")) {\n console.log(chalk.green(message), ...args);\n }\n },\n\n plain(message: string, ...args: unknown[]): void {\n if (shouldLog(\"info\")) {\n console.log(message, ...args);\n }\n },\n};\n","/**\n * Safely extract an error message from an unknown thrown value\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","/**\n * Centralized magic strings for the opendocs CLI\n */\n\nexport const CLI_NAME = \"opendocs\";\nexport const CLI_VERSION = \"0.1.0\";\n\nexport const DOCS_CONFIG_FILE = \"docs.json\";\nexport const DEFAULT_PORT = \"4321\";\nexport const DEFAULT_SNIPPETS = [\"snippets\"];\nexport const ENGINE_RELATIVE_PATH = \"../../src/engine\";\nexport const DEFAULT_API_URL = \"https://app.opendocs.dev\";\nexport const DIST_DIR = \"dist\";\n","import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\nimport {\n requireDocsJson,\n loadDocsConfig,\n getSnippetsDirs,\n buildEngineEnv,\n resolveEngineDir,\n} from \"../utils/docs-config.js\";\nimport { attachProcessHandlers } from \"../utils/process.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Start the development server with hot reload\n * Runs Astro dev server with user's docs content\n *\n * Default port is 4321 (Astro's default) to avoid conflicts with:\n * - Dashboard on port 3000\n * - API server on port 3001\n */\nexport async function dev(options: { port: string }): Promise<void> {\n const cwd = process.cwd();\n\n const docsJsonPath = await requireDocsJson(cwd);\n const docsConfig = await loadDocsConfig(docsJsonPath);\n const snippets = getSnippetsDirs(docsConfig);\n const engineDir = resolveEngineDir(__dirname);\n const env = buildEngineEnv(cwd, snippets);\n\n logger.info(chalk.cyan(\"Starting development server...\"));\n logger.info(chalk.gray(`Project directory: ${cwd}`));\n logger.info(chalk.gray(`Port: ${options.port}`));\n logger.plain(\"\");\n\n // Spawn Astro dev server in the engine directory\n const child = spawn(\n \"npx\",\n [\"astro\", \"dev\", \"--port\", options.port, \"--root\", engineDir],\n {\n cwd: engineDir,\n env,\n stdio: \"inherit\",\n shell: true,\n }\n );\n\n attachProcessHandlers(child, \"development server\");\n}\n","import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport { docsConfigSchema, type DocsConfig } from \"../config/schema.js\";\nimport { DOCS_CONFIG_FILE, DEFAULT_SNIPPETS, ENGINE_RELATIVE_PATH } from \"../constants.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Validate that docs.json exists in the given directory; exit with helpful message if not.\n */\nexport async function requireDocsJson(cwd: string): Promise<string> {\n const docsJsonPath = path.join(cwd, DOCS_CONFIG_FILE);\n if (!(await fs.pathExists(docsJsonPath))) {\n logger.error(`Error: ${DOCS_CONFIG_FILE} not found in current directory.`);\n logger.info(chalk.gray(\"Make sure you're in an opendocs project directory or run:\"));\n logger.info(chalk.cyan(\" opendocs init my-docs\"));\n process.exit(1);\n }\n return docsJsonPath;\n}\n\n/**\n * Read and optionally validate docs.json. Warns on validation issues but does not break users.\n */\nexport async function loadDocsConfig(docsJsonPath: string): Promise<DocsConfig> {\n const raw = await fs.readJson(docsJsonPath);\n const result = docsConfigSchema.safeParse(raw);\n if (!result.success) {\n logger.warn(\n \"docs.json has validation issues: \" +\n result.error.issues.map((i) => i.message).join(\", \")\n );\n return raw as DocsConfig;\n }\n return result.data;\n}\n\n/**\n * Extract snippets directories from config with default fallback.\n */\nexport function getSnippetsDirs(config: DocsConfig): string[] {\n return Array.isArray(config.snippets) ? config.snippets : DEFAULT_SNIPPETS;\n}\n\n/**\n * Build environment variables for the Astro engine process.\n */\nexport function buildEngineEnv(cwd: string, snippets: string[]): NodeJS.ProcessEnv {\n return {\n ...process.env,\n OPENDOCS_PROJECT_DIR: cwd,\n OPENDOCS_SNIPPETS: JSON.stringify(snippets),\n };\n}\n\n/**\n * Resolve the engine directory from the caller's __dirname.\n */\nexport function resolveEngineDir(dirname: string): string {\n return path.resolve(dirname, ENGINE_RELATIVE_PATH);\n}\n","import { z } from \"zod\";\n\n/**\n * Logo can be either a single path string or an object with light/dark variants\n */\nconst logoSchema = z.union([\n z.string(),\n z.object({\n light: z.string(),\n dark: z.string(),\n }),\n]);\n\n/**\n * Page item can be:\n * - A simple string (page path)\n * - An object with page and children (legacy format)\n * - A nested group with group name and pages (Mintlify format)\n */\nconst pageItemSchema: z.ZodType<\n string | { page: string; children: string[] } | { group: string; pages: unknown[] }\n> = z.lazy(() =>\n z.union([\n z.string(),\n z.object({\n page: z.string(),\n children: z.array(z.string()),\n }),\n z.object({\n group: z.string(),\n pages: z.array(pageItemSchema),\n }),\n ])\n);\n\n/**\n * Navigation item representing a group with its pages\n */\nconst navigationItemSchema = z.object({\n group: z.string(),\n pages: z.array(pageItemSchema),\n});\n\n/**\n * Social links configuration\n */\nconst socialLinksSchema = z\n .object({\n github: z.string().url().optional(),\n twitter: z.string().url().optional(),\n discord: z.string().url().optional(),\n })\n .optional();\n\n/**\n * Theme configuration for docs styling\n */\nconst themeSchema = z.object({\n primaryColor: z.string().optional(),\n accentColor: z.string().optional(),\n darkMode: z.boolean().optional(),\n}).optional();\n\n/**\n * Features configuration (all optional booleans)\n */\nconst featuresSchema = z.object({\n search: z.boolean().optional(),\n feedback: z.boolean().optional(),\n analytics: z.boolean().optional(),\n}).optional();\n\n/**\n * Footer configuration\n */\nconst footerSchema = z.object({\n copyright: z.string().optional(),\n links: z.array(\n z.object({\n title: z.string(),\n url: z.string(),\n })\n ).optional(),\n}).optional();\n\n/**\n * Site metadata for SEO (Open Graph, Twitter Cards, canonical URLs)\n */\nconst metadataSchema = z.object({\n url: z.string().url().optional(),\n ogImage: z.string().optional(),\n}).optional();\n\n/**\n * Main docs.json configuration schema\n */\nexport const docsConfigSchema = z.object({\n // Required fields\n name: z.string(),\n\n // Optional content fields\n logo: logoSchema.optional(),\n favicon: z.string().optional(),\n\n // Navigation structure\n navigation: z.array(navigationItemSchema),\n\n // Styling\n theme: themeSchema,\n\n // Backend integration (optional - for analytics/feedback/deploy)\n backend: z.object({\n siteId: z.string(),\n apiUrl: z.string().url().optional(),\n }).optional(),\n\n // Feature flags\n features: featuresSchema,\n\n // Footer content\n footer: footerSchema,\n\n // Social links (GitHub, Twitter, etc.)\n socialLinks: socialLinksSchema,\n\n // SEO metadata\n metadata: metadataSchema,\n\n // Snippet folders configuration\n snippets: z.array(z.string()).optional().default([\"snippets\"]),\n});\n\n/**\n * TypeScript type inferred from the Zod schema\n */\nexport type DocsConfig = z.infer<typeof docsConfigSchema>;\n\n/**\n * Type for logo configuration\n */\nexport type LogoConfig = z.infer<typeof logoSchema>;\n\n/**\n * Type for navigation items\n */\nexport type NavigationItem = z.infer<typeof navigationItemSchema>;\n\n/**\n * Type for theme configuration\n */\nexport type ThemeConfig = z.infer<typeof themeSchema>;\n\n/**\n * Type for features configuration\n */\nexport type FeaturesConfig = z.infer<typeof featuresSchema>;\n\n/**\n * Type for footer configuration\n */\nexport type FooterConfig = z.infer<typeof footerSchema>;\n\n/**\n * Type for social links configuration\n */\nexport type SocialLinksConfig = z.infer<typeof socialLinksSchema>;\n\n/**\n * Type for metadata configuration\n */\nexport type MetadataConfig = z.infer<typeof metadataSchema>;\n\n/**\n * Type for page item (string, object with children, or nested group)\n */\nexport type PageItem =\n | string\n | { page: string; children: string[] }\n | { group: string; pages: PageItem[] };\n","import type { ChildProcess } from \"node:child_process\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Attach standard error/close/SIGINT/SIGTERM handlers to a spawned child process.\n */\nexport function attachProcessHandlers(child: ChildProcess, label: string): void {\n child.on(\"error\", (error) => {\n logger.error(`Failed to start ${label}: ${error.message}`);\n process.exit(1);\n });\n\n child.on(\"close\", (code) => {\n if (code !== 0 && code !== null) {\n process.exit(code);\n }\n });\n\n const cleanup = () => {\n child.kill(\"SIGTERM\");\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n}\n","import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { writeSitemap } from \"../utils/sitemap.js\";\nimport {\n requireDocsJson,\n loadDocsConfig,\n getSnippetsDirs,\n buildEngineEnv,\n resolveEngineDir,\n} from \"../utils/docs-config.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { DIST_DIR } from \"../constants.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Run a command and wait for it to complete\n */\nfunction runCommand(\n command: string,\n args: string[],\n options: { cwd: string; env?: NodeJS.ProcessEnv }\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env || process.env,\n stdio: \"inherit\",\n shell: true,\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command exited with code ${code}`));\n }\n });\n });\n}\n\n/**\n * Build the documentation site for production\n * Runs Astro build and generates search index with Pagefind\n */\nexport async function build(): Promise<void> {\n const cwd = process.cwd();\n\n const docsJsonPath = await requireDocsJson(cwd);\n const docsConfig = await loadDocsConfig(docsJsonPath);\n const snippets = getSnippetsDirs(docsConfig);\n const engineDir = resolveEngineDir(__dirname);\n const projectDistDir = path.join(cwd, DIST_DIR);\n const env = buildEngineEnv(cwd, snippets);\n\n logger.info(chalk.cyan(\"\\n\\u{1F4E6} Building documentation site...\\n\"));\n\n // Step 1: Remove existing dist folder\n const cleanSpinner = ora(\"Cleaning existing dist folder...\").start();\n try {\n if (await fs.pathExists(projectDistDir)) {\n await fs.remove(projectDistDir);\n }\n cleanSpinner.succeed(\"Cleaned dist folder\");\n } catch (error) {\n cleanSpinner.fail(\"Failed to clean dist folder\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Step 2: Run Astro build\n const buildSpinner = ora(\"Running Astro build...\").start();\n try {\n buildSpinner.text = \"Running Astro build (this may take a moment)...\";\n await runCommand(\"npx\", [\"astro\", \"build\", \"--root\", engineDir], {\n cwd: engineDir,\n env,\n });\n buildSpinner.succeed(\"Astro build completed\");\n } catch (error) {\n buildSpinner.fail(\"Astro build failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Step 3: Verify build output exists\n // Astro outputs directly to projectDir/dist via astro.config.ts outDir setting\n if (!(await fs.pathExists(projectDistDir))) {\n logger.error(\"Build output not found at: \" + projectDistDir);\n process.exit(1);\n }\n\n // Step 4: Run Pagefind to generate search index\n const pagefindSpinner = ora(\"Generating search index with Pagefind...\").start();\n try {\n await runCommand(\"npx\", [\"pagefind\", \"--site\", projectDistDir], {\n cwd: cwd,\n });\n pagefindSpinner.succeed(\"Search index generated\");\n } catch (error) {\n pagefindSpinner.fail(\"Pagefind indexing failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Step 5: Generate sitemap.xml\n const sitemapSpinner = ora(\"Generating sitemap.xml...\").start();\n try {\n const baseUrl = docsConfig.metadata?.url || (docsConfig as Record<string, unknown>).baseUrl as string || \"\";\n await writeSitemap(projectDistDir, baseUrl);\n sitemapSpinner.succeed(\"Sitemap generated\");\n } catch (error) {\n sitemapSpinner.fail(\"Sitemap generation failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Step 6: Generate robots.txt\n const robotsSpinner = ora(\"Generating robots.txt...\").start();\n try {\n const siteUrl = docsConfig.metadata?.url || \"\";\n const sitemapLine = siteUrl ? `\\nSitemap: ${siteUrl}/sitemap.xml` : \"\";\n const robotsTxt = `User-agent: *\\nAllow: /${sitemapLine}\\n`;\n await fs.writeFile(path.join(projectDistDir, \"robots.txt\"), robotsTxt, \"utf-8\");\n robotsSpinner.succeed(\"robots.txt generated\");\n } catch (error) {\n robotsSpinner.fail(\"robots.txt generation failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Success message\n logger.plain(\"\");\n logger.success(\"\\u2713 Build completed successfully!\");\n logger.plain(\"\");\n logger.info(chalk.gray(\"Output directory:\") + \" \" + chalk.cyan(projectDistDir));\n logger.plain(\"\");\n logger.info(chalk.gray(\"To preview the build locally, run:\"));\n logger.info(chalk.cyan(\" opendocs preview\"));\n logger.plain(\"\");\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\n\ninterface SitemapEntry {\n loc: string;\n lastmod: string;\n}\n\n/**\n * Generate a sitemap.xml file from built HTML files\n * @param distDir - The dist directory containing built HTML files\n * @param baseUrl - The base URL for the sitemap (e.g., \"https://example.com\")\n */\nexport async function generateSitemap(\n distDir: string,\n baseUrl: string = \"\"\n): Promise<string> {\n const htmlFiles = await fg(\"**/*.html\", {\n cwd: distDir,\n absolute: true,\n });\n\n // Generate sitemap entries\n const entries: SitemapEntry[] = await Promise.all(\n htmlFiles.map(async (filePath) => {\n const relativePath = path.relative(distDir, filePath);\n\n // Convert file path to URL path\n let urlPath = \"/\" + relativePath.replace(/\\\\/g, \"/\");\n\n // Remove index.html from the URL\n if (urlPath.endsWith(\"/index.html\")) {\n urlPath = urlPath.slice(0, -\"index.html\".length);\n } else if (urlPath.endsWith(\".html\")) {\n urlPath = urlPath.slice(0, -\".html\".length);\n }\n\n // Ensure the path ends with / for directories\n if (!urlPath.endsWith(\"/\") && !urlPath.includes(\".\")) {\n urlPath = urlPath + \"/\";\n }\n\n // Get the last modified date of the file\n const stats = await fs.stat(filePath);\n const lastmod = stats.mtime.toISOString().split(\"T\")[0];\n\n return {\n loc: `${baseUrl}${urlPath}`,\n lastmod,\n };\n })\n );\n\n // Sort entries by URL for consistent output\n entries.sort((a, b) => a.loc.localeCompare(b.loc));\n\n // Generate the XML content\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${entries.map((entry) => ` <url>\n <loc>${escapeXml(entry.loc)}</loc>\n <lastmod>${entry.lastmod}</lastmod>\n </url>`).join(\"\\n\")}\n</urlset>\n`;\n\n return xml;\n}\n\n/**\n * Escape special XML characters\n */\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Write sitemap.xml to the dist directory\n * @param distDir - The dist directory\n * @param baseUrl - The base URL for the sitemap\n */\nexport async function writeSitemap(\n distDir: string,\n baseUrl: string = \"\"\n): Promise<void> {\n const sitemapContent = await generateSitemap(distDir, baseUrl);\n const sitemapPath = path.join(distDir, \"sitemap.xml\");\n await fs.writeFile(sitemapPath, sitemapContent, \"utf-8\");\n}\n","import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport { attachProcessHandlers } from \"../utils/process.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { DIST_DIR } from \"../constants.js\";\n\n/**\n * Preview the production build locally\n * Serves the dist folder with a static file server\n */\nexport async function preview(options: { port: string }): Promise<void> {\n const cwd = process.cwd();\n const distDir = path.join(cwd, DIST_DIR);\n\n // Validate dist folder exists\n if (!(await fs.pathExists(distDir))) {\n logger.error(\"Error: dist folder not found.\");\n logger.info(chalk.gray(\"The production build has not been created yet.\"));\n logger.info(chalk.gray(\"Run the build command first:\"));\n logger.info(chalk.cyan(\" opendocs build\"));\n process.exit(1);\n }\n\n logger.info(chalk.cyan(\"Starting preview server...\"));\n logger.info(chalk.gray(`Serving: ${distDir}`));\n logger.info(chalk.gray(`Port: ${options.port}`));\n logger.plain(\"\");\n logger.success(` Local: http://localhost:${options.port}`);\n logger.plain(\"\");\n\n // Spawn serve to serve static files from dist\n // Note: Don't use -s (SPA mode) - this is a pre-rendered static site, not a SPA\n const child = spawn(\n \"npx\",\n [\"serve\", distDir, \"-l\", options.port],\n {\n cwd,\n stdio: \"inherit\",\n shell: true,\n }\n );\n\n attachProcessHandlers(child, \"preview server\");\n}\n","import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport * as tar from \"tar-stream\";\nimport { createGzip } from \"node:zlib\";\nimport { password } from \"@inquirer/prompts\";\nimport { build } from \"./build.js\";\nimport { requireDocsJson, loadDocsConfig } from \"../utils/docs-config.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { formatBytes } from \"../utils/format.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { DIST_DIR, DEFAULT_API_URL } from \"../constants.js\";\n\ninterface DeployOptions {\n skipBuild?: boolean;\n}\n\ninterface DeployResponse {\n id: string;\n version: number;\n status: string;\n fileCount: number;\n sizeBytes: number;\n url: string | null;\n message: string;\n}\n\n/**\n * Deploy documentation to the hosted platform\n */\nexport async function deploy(options: DeployOptions = {}): Promise<void> {\n const cwd = process.cwd();\n const distDir = path.join(cwd, DIST_DIR);\n\n const docsJsonPath = await requireDocsJson(cwd);\n const docsConfig = await loadDocsConfig(docsJsonPath);\n\n // Get site ID from config\n const siteId = docsConfig.backend?.siteId;\n if (!siteId) {\n logger.error(\"Error: No siteId configured in docs.json\");\n logger.info(chalk.gray(\"Add the following to your docs.json:\"));\n logger.info(\n chalk.cyan(` \"backend\": {\n \"siteId\": \"your-site-id\"\n }`)\n );\n process.exit(1);\n }\n\n // Prompt for deploy key\n logger.info(chalk.cyan(\"\\u{1F511} Authentication required\\n\"));\n\n let apiKey: string;\n try {\n apiKey = await password({\n message: \"Deploy key:\",\n mask: \"*\",\n });\n } catch (err) {\n logger.error(\"\\nPrompt error: \" + getErrorMessage(err));\n logger.info(chalk.yellow(\"Deployment cancelled.\"));\n process.exit(0);\n }\n\n if (!apiKey || !apiKey.trim()) {\n logger.error(\"\\nError: Deploy key is required.\");\n process.exit(1);\n }\n\n logger.plain(\"\"); // Add spacing\n\n // Build if needed\n if (!options.skipBuild) {\n await build();\n logger.plain(\"\"); // Add spacing after build\n }\n\n // Verify dist folder exists\n if (!(await fs.pathExists(distDir))) {\n logger.error(\"Error: dist folder not found.\");\n logger.info(\n chalk.gray(\"Run 'opendocs build' first or remove --skip-build.\")\n );\n process.exit(1);\n }\n\n logger.info(chalk.cyan(\"\\u{1F680} Deploying documentation...\\n\"));\n\n // Create tarball\n const tarballSpinner = ora(\"Creating deployment package...\").start();\n let tarballBuffer: Buffer;\n\n try {\n tarballBuffer = await createTarball(distDir);\n tarballSpinner.succeed(\n `Created deployment package (${formatBytes(tarballBuffer.length)})`\n );\n } catch (error) {\n tarballSpinner.fail(\"Failed to create deployment package\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Upload to server\n const uploadSpinner = ora(\"Uploading to server...\").start();\n\n try {\n const apiUrl = docsConfig.backend?.apiUrl || DEFAULT_API_URL;\n const deployUrl = `${apiUrl}/api/sites/${siteId}/deploy`;\n\n const response = await fetch(deployUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/gzip\",\n },\n body: new Uint8Array(tarballBuffer),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage = `Upload failed with status ${response.status}`;\n\n try {\n const errorJson = JSON.parse(errorBody);\n if (errorJson.error) {\n errorMessage = errorJson.error;\n }\n } catch {\n logger.error(\"Error: \" + errorBody);\n }\n\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as DeployResponse;\n uploadSpinner.succeed(\"Upload complete\");\n\n // Display results\n logger.plain(\"\");\n logger.success(\"\\u2713 Deployment successful!\");\n logger.plain(\"\");\n logger.info(\n chalk.gray(\"Version:\") + \" \" + chalk.cyan(`v${result.version}`)\n );\n logger.info(\n chalk.gray(\"Files:\") + \" \" + chalk.cyan(result.fileCount.toString())\n );\n logger.info(\n chalk.gray(\"Size:\") + \" \" + chalk.cyan(formatBytes(result.sizeBytes))\n );\n\n if (result.url) {\n logger.plain(\"\");\n logger.info(chalk.gray(\"Your docs are live at:\"));\n logger.info(chalk.cyan.bold(` ${result.url}`));\n } else {\n logger.plain(\"\");\n logger.info(\n chalk.yellow(\n \"Note: Configure a subdomain to access your docs publicly.\"\n )\n );\n }\n\n logger.plain(\"\");\n } catch (error) {\n uploadSpinner.fail(\"Deployment failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n}\n\n/**\n * Create a gzipped tarball of the dist directory\n */\nasync function createTarball(distDir: string): Promise<Buffer> {\n const pack = tar.pack();\n const gzip = createGzip();\n const chunks: Buffer[] = [];\n\n const bufferPromise = new Promise<Buffer>((resolve, reject) => {\n gzip.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n gzip.on(\"end\", () => {\n resolve(Buffer.concat(chunks));\n });\n\n gzip.on(\"error\", reject);\n pack.on(\"error\", reject);\n });\n\n // Pipe pack through gzip\n pack.pipe(gzip);\n\n // Walk directory and add files\n await addFilesToPack(pack, distDir, \"\");\n pack.finalize();\n\n return bufferPromise;\n}\n\n/**\n * Recursively add files from a directory to the tar pack\n */\nasync function addFilesToPack(\n pack: tar.Pack,\n baseDir: string,\n relativePath: string\n): Promise<void> {\n const fullPath = path.join(baseDir, relativePath);\n const entries = await fs.readdir(fullPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryRelativePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n await addFilesToPack(pack, baseDir, entryRelativePath);\n } else if (entry.isFile()) {\n const filePath = path.join(baseDir, entryRelativePath);\n const content = await fs.readFile(filePath);\n const stats = await fs.stat(filePath);\n\n // Add file to tar\n await new Promise<void>((resolve, reject) => {\n const entry = pack.entry(\n {\n name: entryRelativePath,\n size: content.length,\n mtime: stats.mtime,\n },\n (err) => {\n if (err) reject(err);\n else resolve();\n }\n );\n entry.end(content);\n });\n }\n }\n}\n","/**\n * Format bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n"],"mappings":"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","names":["chalk","__dirname","chalk","path","fileURLToPath","chalk","path","fs","chalk","path","fs","chalk","__filename","fileURLToPath","__dirname","path","chalk","spawn","path","fileURLToPath","fs","chalk","ora","fs","path","__filename","fileURLToPath","__dirname","path","spawn","chalk","ora","fs","spawn","path","fs","chalk","path","fs","chalk","spawn","path","fs","chalk","ora","path","chalk","fs","ora","pack","entry"]}
|
|
1
|
+
{"version":3,"sources":["../../bin/opendocs.ts","../../src/commands/init.ts","../../src/utils/logger.ts","../../src/utils/errors.ts","../../src/constants.ts","../../src/commands/dev.ts","../../src/utils/docs-config.ts","../../src/config/schema.ts","../../src/utils/process.ts","../../src/commands/build.ts","../../src/utils/sitemap.ts","../../src/commands/preview.ts","../../src/commands/deploy.ts","../../src/utils/format.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { init } from \"../src/commands/init.js\";\nimport { dev } from \"../src/commands/dev.js\";\nimport { build } from \"../src/commands/build.js\";\nimport { preview } from \"../src/commands/preview.js\";\nimport { deploy } from \"../src/commands/deploy.js\";\nimport { CLI_NAME, CLI_VERSION } from \"../src/constants.js\";\n\nconst program = new Command();\n\nprogram\n .name(CLI_NAME)\n .description(\"Beautiful docs with zero config. One codebase, deploy anywhere.\")\n .version(CLI_VERSION);\n\nprogram\n .command(\"init [name]\")\n .description(\"Initialize a new opendocs project\")\n .action(async (name?: string) => {\n await init(name);\n });\n\nprogram\n .command(\"dev\")\n .description(\"Start the development server with hot reload\")\n .option(\"-p, --port <port>\", \"Port to run the dev server on\", \"4321\")\n .action(async (options: { port: string }) => {\n await dev(options);\n });\n\nprogram\n .command(\"build\")\n .description(\"Build the documentation site for production\")\n .action(async () => {\n await build();\n });\n\nprogram\n .command(\"preview\")\n .description(\"Preview the production build locally\")\n .option(\"-p, --port <port>\", \"Port to run the preview server on\", \"4321\")\n .action(async (options: { port: string }) => {\n await preview(options);\n });\n\nprogram\n .command(\"deploy\")\n .description(\"Deploy documentation to the hosted platform\")\n .option(\"--skip-build\", \"Skip the build step (use existing dist folder)\")\n .action(async (options: { skipBuild?: boolean }) => {\n await deploy(options);\n });\n\nprogram.parse(process.argv);\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { fileURLToPath } from \"url\";\nimport { logger } from \"../utils/logger.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { DOCS_CONFIG_FILE } from \"../constants.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Get the path to the templates directory\n */\nfunction getTemplatesDir(): string {\n // In development, templates are in src/templates\n // In production (after build), they should be copied to dist/templates\n const devPath = path.join(__dirname, \"..\", \"templates\");\n const prodPath = path.join(__dirname, \"..\", \"..\", \"templates\");\n\n if (fs.existsSync(devPath)) {\n return devPath;\n }\n return prodPath;\n}\n\n/**\n * Read a template file and optionally replace placeholders\n */\nasync function readTemplate(filename: string, replacements?: Record<string, string>): Promise<string> {\n const templatesDir = getTemplatesDir();\n const filePath = path.join(templatesDir, filename);\n\n let content = await fs.readFile(filePath, \"utf-8\");\n\n if (replacements) {\n for (const [key, value] of Object.entries(replacements)) {\n content = content.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), value);\n }\n }\n\n return content;\n}\n\n/** Template files to scaffold, with optional replacements */\nconst TEMPLATE_FILES: Array<{\n template: string;\n output: string;\n replacements?: Record<string, string>;\n}> = [\n { template: \"introduction.mdx\", output: \"introduction.mdx\" },\n { template: \"quickstart.mdx\", output: \"quickstart.mdx\" },\n { template: \"components.mdx\", output: \"components.mdx\" },\n { template: \"configuration.mdx\", output: \"configuration.mdx\" },\n { template: \"writing-content.mdx\", output: \"writing-content.mdx\" },\n { template: \"api-reference.mdx\", output: \"api-reference.mdx\" },\n { template: \"logo.svg\", output: \"public/logo.svg\" },\n];\n\n/**\n * Initialize a new opendocs project\n * Scaffolds a docs project with default config and example files\n */\nexport async function init(name: string = \"my-docs\"): Promise<void> {\n const projectDir = path.resolve(process.cwd(), name);\n\n // Check if directory already exists\n if (await fs.pathExists(projectDir)) {\n logger.error(`Error: Directory \"${name}\" already exists.`);\n logger.info(chalk.gray(\"Please choose a different name or remove the existing directory.\"));\n process.exit(1);\n }\n\n const spinner = ora(`Creating new opendocs project: ${name}`).start();\n\n try {\n // Create project directory\n await fs.mkdir(projectDir, { recursive: true });\n\n // Create docs.json config\n spinner.text = `Creating ${DOCS_CONFIG_FILE} configuration...`;\n const docsConfig = await readTemplate(DOCS_CONFIG_FILE, { PROJECT_NAME: name });\n await fs.writeFile(path.join(projectDir, DOCS_CONFIG_FILE), docsConfig);\n\n // Create template files\n for (const { template, output } of TEMPLATE_FILES) {\n spinner.text = `Creating ${output}...`;\n const content = await readTemplate(template);\n const outputPath = path.join(projectDir, output);\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, content);\n }\n\n spinner.succeed(chalk.green(`Successfully created \"${name}\"!`));\n\n // Show next steps\n logger.plain(\"\");\n logger.info(chalk.bold(\"Next steps:\"));\n logger.plain(\"\");\n logger.info(chalk.gray(\" 1.\") + ` cd ${name}`);\n logger.info(chalk.gray(\" 2.\") + \" opendocs dev\");\n logger.plain(\"\");\n logger.info(chalk.gray(\"Then open\") + \" \" + chalk.cyan(\"http://localhost:4321\") + \" \" + chalk.gray(\"in your browser.\"));\n logger.plain(\"\");\n logger.info(chalk.gray(\"Edit\") + \" \" + chalk.cyan(DOCS_CONFIG_FILE) + \" \" + chalk.gray(\"to customize your documentation.\"));\n } catch (error) {\n spinner.fail(chalk.red(\"Failed to create project\"));\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\n\ntype LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nlet currentLevel: LogLevel = \"info\";\n\nexport function setLogLevel(level: LogLevel): void {\n currentLevel = level;\n}\n\nexport function getLogLevel(): LogLevel {\n return currentLevel;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[currentLevel];\n}\n\nexport const logger = {\n debug(message: string, ...args: unknown[]): void {\n if (shouldLog(\"debug\")) {\n console.log(chalk.gray(`[debug] ${message}`), ...args);\n }\n },\n\n info(message: string, ...args: unknown[]): void {\n if (shouldLog(\"info\")) {\n console.log(message, ...args);\n }\n },\n\n warn(message: string, ...args: unknown[]): void {\n if (shouldLog(\"warn\")) {\n console.warn(chalk.yellow(message), ...args);\n }\n },\n\n error(message: string, ...args: unknown[]): void {\n if (shouldLog(\"error\")) {\n console.error(chalk.red(message), ...args);\n }\n },\n\n success(message: string, ...args: unknown[]): void {\n if (shouldLog(\"info\")) {\n console.log(chalk.green(message), ...args);\n }\n },\n\n plain(message: string, ...args: unknown[]): void {\n if (shouldLog(\"info\")) {\n console.log(message, ...args);\n }\n },\n};\n","/**\n * Safely extract an error message from an unknown thrown value\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","/**\n * Centralized magic strings for the opendocs CLI\n */\n\nexport const CLI_NAME = \"opendocs\";\nexport const CLI_VERSION = \"0.1.0\";\n\nexport const DOCS_CONFIG_FILE = \"docs.json\";\nexport const DEFAULT_PORT = \"4321\";\nexport const DEFAULT_SNIPPETS = [\"snippets\"];\nexport const ENGINE_RELATIVE_PATH = \"../../src/engine\";\nexport const DEFAULT_API_URL = \"https://app.opendocs.dev\";\nexport const DIST_DIR = \"dist\";\n","import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\nimport {\n requireDocsJson,\n loadDocsConfig,\n getSnippetsDirs,\n buildEngineEnv,\n resolveEngineDir,\n} from \"../utils/docs-config.js\";\nimport { attachProcessHandlers } from \"../utils/process.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Start the development server with hot reload\n * Runs Astro dev server with user's docs content\n *\n * Default port is 4321 (Astro's default) to avoid conflicts with:\n * - Dashboard on port 3000\n * - API server on port 3001\n */\nexport async function dev(options: { port: string }): Promise<void> {\n const cwd = process.cwd();\n\n const docsJsonPath = await requireDocsJson(cwd);\n const docsConfig = await loadDocsConfig(docsJsonPath);\n const snippets = getSnippetsDirs(docsConfig);\n const engineDir = resolveEngineDir(__dirname);\n const env = buildEngineEnv(cwd, snippets);\n\n logger.info(chalk.cyan(\"Starting development server...\"));\n logger.info(chalk.gray(`Project directory: ${cwd}`));\n logger.info(chalk.gray(`Port: ${options.port}`));\n logger.plain(\"\");\n\n // Spawn Astro dev server in the engine directory\n const child = spawn(\n \"npx\",\n [\"astro\", \"dev\", \"--port\", options.port, \"--root\", engineDir],\n {\n cwd: engineDir,\n env,\n stdio: \"inherit\",\n shell: true,\n }\n );\n\n attachProcessHandlers(child, \"development server\");\n}\n","import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport { docsConfigSchema, type DocsConfig } from \"../config/schema.js\";\nimport { DOCS_CONFIG_FILE, DEFAULT_SNIPPETS, ENGINE_RELATIVE_PATH } from \"../constants.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Validate that docs.json exists in the given directory; exit with helpful message if not.\n */\nexport async function requireDocsJson(cwd: string): Promise<string> {\n const docsJsonPath = path.join(cwd, DOCS_CONFIG_FILE);\n if (!(await fs.pathExists(docsJsonPath))) {\n logger.error(`Error: ${DOCS_CONFIG_FILE} not found in current directory.`);\n logger.info(chalk.gray(\"Make sure you're in an opendocs project directory or run:\"));\n logger.info(chalk.cyan(\" opendocs init my-docs\"));\n process.exit(1);\n }\n return docsJsonPath;\n}\n\n/**\n * Read and optionally validate docs.json. Warns on validation issues but does not break users.\n */\nexport async function loadDocsConfig(docsJsonPath: string): Promise<DocsConfig> {\n const raw = await fs.readJson(docsJsonPath);\n const result = docsConfigSchema.safeParse(raw);\n if (!result.success) {\n logger.warn(\n \"docs.json has validation issues: \" +\n result.error.issues.map((i) => i.message).join(\", \")\n );\n return raw as DocsConfig;\n }\n return result.data;\n}\n\n/**\n * Extract snippets directories from config with default fallback.\n */\nexport function getSnippetsDirs(config: DocsConfig): string[] {\n return Array.isArray(config.snippets) ? config.snippets : DEFAULT_SNIPPETS;\n}\n\n/**\n * Build environment variables for the Astro engine process.\n */\nexport function buildEngineEnv(cwd: string, snippets: string[]): NodeJS.ProcessEnv {\n return {\n ...process.env,\n OPENDOCS_PROJECT_DIR: cwd,\n OPENDOCS_SNIPPETS: JSON.stringify(snippets),\n };\n}\n\n/**\n * Resolve the engine directory from the caller's __dirname.\n */\nexport function resolveEngineDir(dirname: string): string {\n return path.resolve(dirname, ENGINE_RELATIVE_PATH);\n}\n","import { z } from \"zod\";\n\n/**\n * Logo can be either a single path string or an object with light/dark variants\n */\nconst logoSchema = z.union([\n z.string(),\n z.object({\n light: z.string(),\n dark: z.string(),\n }),\n]);\n\n/**\n * Page item can be:\n * - A simple string (page path)\n * - An object with page and children (legacy format)\n * - A nested group with group name and pages (Mintlify format)\n */\nconst pageItemSchema: z.ZodType<\n string | { page: string; children: string[] } | { group: string; pages: unknown[] }\n> = z.lazy(() =>\n z.union([\n z.string(),\n z.object({\n page: z.string(),\n children: z.array(z.string()),\n }),\n z.object({\n group: z.string(),\n pages: z.array(pageItemSchema),\n }),\n ])\n);\n\n/**\n * Navigation item representing a group with its pages\n */\nconst navigationItemSchema = z.object({\n group: z.string(),\n pages: z.array(pageItemSchema),\n});\n\n/**\n * Social links configuration\n */\nconst socialLinksSchema = z\n .object({\n github: z.string().url().optional(),\n twitter: z.string().url().optional(),\n discord: z.string().url().optional(),\n })\n .optional();\n\n/**\n * Theme configuration for docs styling\n */\nconst themeSchema = z.object({\n primaryColor: z.string().optional(),\n accentColor: z.string().optional(),\n darkMode: z.boolean().optional(),\n}).optional();\n\n/**\n * Features configuration (all optional booleans)\n */\nconst featuresSchema = z.object({\n search: z.boolean().optional(),\n feedback: z.boolean().optional(),\n analytics: z.boolean().optional(),\n}).optional();\n\n/**\n * Footer configuration\n */\nconst footerSchema = z.object({\n copyright: z.string().optional(),\n links: z.array(\n z.object({\n title: z.string(),\n url: z.string(),\n })\n ).optional(),\n}).optional();\n\n/**\n * Site metadata for SEO (Open Graph, Twitter Cards, canonical URLs)\n */\nconst metadataSchema = z.object({\n url: z.string().url().optional(),\n ogImage: z.string().optional(),\n}).optional();\n\n/**\n * Main docs.json configuration schema\n */\nexport const docsConfigSchema = z.object({\n // Required fields\n name: z.string(),\n\n // Optional content fields\n logo: logoSchema.optional(),\n favicon: z.string().optional(),\n\n // Navigation structure\n navigation: z.array(navigationItemSchema),\n\n // Styling\n theme: themeSchema,\n\n // Backend integration (optional - for analytics/feedback/deploy)\n backend: z.object({\n siteId: z.string(),\n apiUrl: z.string().url().optional(),\n }).optional(),\n\n // Feature flags\n features: featuresSchema,\n\n // Footer content\n footer: footerSchema,\n\n // Social links (GitHub, Twitter, etc.)\n socialLinks: socialLinksSchema,\n\n // SEO metadata\n metadata: metadataSchema,\n\n // Snippet folders configuration\n snippets: z.array(z.string()).optional().default([\"snippets\"]),\n});\n\n/**\n * TypeScript type inferred from the Zod schema\n */\nexport type DocsConfig = z.infer<typeof docsConfigSchema>;\n\n/**\n * Type for logo configuration\n */\nexport type LogoConfig = z.infer<typeof logoSchema>;\n\n/**\n * Type for navigation items\n */\nexport type NavigationItem = z.infer<typeof navigationItemSchema>;\n\n/**\n * Type for theme configuration\n */\nexport type ThemeConfig = z.infer<typeof themeSchema>;\n\n/**\n * Type for features configuration\n */\nexport type FeaturesConfig = z.infer<typeof featuresSchema>;\n\n/**\n * Type for footer configuration\n */\nexport type FooterConfig = z.infer<typeof footerSchema>;\n\n/**\n * Type for social links configuration\n */\nexport type SocialLinksConfig = z.infer<typeof socialLinksSchema>;\n\n/**\n * Type for metadata configuration\n */\nexport type MetadataConfig = z.infer<typeof metadataSchema>;\n\n/**\n * Type for page item (string, object with children, or nested group)\n */\nexport type PageItem =\n | string\n | { page: string; children: string[] }\n | { group: string; pages: PageItem[] };\n","import type { ChildProcess } from \"node:child_process\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Attach standard error/close/SIGINT/SIGTERM handlers to a spawned child process.\n */\nexport function attachProcessHandlers(child: ChildProcess, label: string): void {\n child.on(\"error\", (error) => {\n logger.error(`Failed to start ${label}: ${error.message}`);\n process.exit(1);\n });\n\n child.on(\"close\", (code) => {\n if (code !== 0 && code !== null) {\n process.exit(code);\n }\n });\n\n const cleanup = () => {\n child.kill(\"SIGTERM\");\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n}\n","import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport * as pagefind from \"pagefind\";\nimport { writeSitemap } from \"../utils/sitemap.js\";\nimport {\n requireDocsJson,\n loadDocsConfig,\n getSnippetsDirs,\n buildEngineEnv,\n resolveEngineDir,\n} from \"../utils/docs-config.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { DIST_DIR } from \"../constants.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Run a command and wait for it to complete\n */\nfunction runCommand(\n command: string,\n args: string[],\n options: { cwd: string; env?: NodeJS.ProcessEnv }\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env || process.env,\n stdio: \"inherit\",\n shell: true,\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command exited with code ${code}`));\n }\n });\n });\n}\n\n/**\n * Build the documentation site for production\n * Runs Astro build and generates search index with Pagefind\n */\nexport async function build(): Promise<void> {\n const cwd = process.cwd();\n\n const docsJsonPath = await requireDocsJson(cwd);\n const docsConfig = await loadDocsConfig(docsJsonPath);\n const snippets = getSnippetsDirs(docsConfig);\n const engineDir = resolveEngineDir(__dirname);\n const projectDistDir = path.join(cwd, DIST_DIR);\n const env = buildEngineEnv(cwd, snippets);\n\n logger.info(chalk.cyan(\"\\n\\u{1F4E6} Building documentation site...\\n\"));\n\n // Step 1: Remove existing dist folder\n const cleanSpinner = ora(\"Cleaning existing dist folder...\").start();\n try {\n if (await fs.pathExists(projectDistDir)) {\n await fs.remove(projectDistDir);\n }\n cleanSpinner.succeed(\"Cleaned dist folder\");\n } catch (error) {\n cleanSpinner.fail(\"Failed to clean dist folder\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Step 2: Run Astro build\n const buildSpinner = ora(\"Running Astro build...\").start();\n try {\n buildSpinner.text = \"Running Astro build (this may take a moment)...\";\n await runCommand(\"npx\", [\"astro\", \"build\", \"--root\", engineDir], {\n cwd: engineDir,\n env,\n });\n buildSpinner.succeed(\"Astro build completed\");\n } catch (error) {\n buildSpinner.fail(\"Astro build failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Step 3: Verify build output exists\n // Astro outputs directly to projectDir/dist via astro.config.ts outDir setting\n if (!(await fs.pathExists(projectDistDir))) {\n logger.error(\"Build output not found at: \" + projectDistDir);\n process.exit(1);\n }\n\n // Step 4: Run Pagefind to generate search index\n const pagefindSpinner = ora(\"Generating search index with Pagefind...\").start();\n try {\n const { index } = await pagefind.createIndex();\n if (!index) {\n throw new Error(\"Failed to create Pagefind index\");\n }\n await index.addDirectory({ path: projectDistDir });\n await index.writeFiles({ outputPath: path.join(projectDistDir, \"pagefind\") });\n await pagefind.close();\n pagefindSpinner.succeed(\"Search index generated\");\n } catch (error) {\n await pagefind.close();\n pagefindSpinner.fail(\"Pagefind indexing failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Step 5: Generate sitemap.xml\n const sitemapSpinner = ora(\"Generating sitemap.xml...\").start();\n try {\n const baseUrl = docsConfig.metadata?.url || (docsConfig as Record<string, unknown>).baseUrl as string || \"\";\n await writeSitemap(projectDistDir, baseUrl);\n sitemapSpinner.succeed(\"Sitemap generated\");\n } catch (error) {\n sitemapSpinner.fail(\"Sitemap generation failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Step 6: Generate robots.txt\n const robotsSpinner = ora(\"Generating robots.txt...\").start();\n try {\n const siteUrl = docsConfig.metadata?.url || \"\";\n const sitemapLine = siteUrl ? `\\nSitemap: ${siteUrl}/sitemap.xml` : \"\";\n const robotsTxt = `User-agent: *\\nAllow: /${sitemapLine}\\n`;\n await fs.writeFile(path.join(projectDistDir, \"robots.txt\"), robotsTxt, \"utf-8\");\n robotsSpinner.succeed(\"robots.txt generated\");\n } catch (error) {\n robotsSpinner.fail(\"robots.txt generation failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Success message\n logger.plain(\"\");\n logger.success(\"\\u2713 Build completed successfully!\");\n logger.plain(\"\");\n logger.info(chalk.gray(\"Output directory:\") + \" \" + chalk.cyan(projectDistDir));\n logger.plain(\"\");\n logger.info(chalk.gray(\"To preview the build locally, run:\"));\n logger.info(chalk.cyan(\" opendocs preview\"));\n logger.plain(\"\");\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\n\ninterface SitemapEntry {\n loc: string;\n lastmod: string;\n}\n\n/**\n * Generate a sitemap.xml file from built HTML files\n * @param distDir - The dist directory containing built HTML files\n * @param baseUrl - The base URL for the sitemap (e.g., \"https://example.com\")\n */\nexport async function generateSitemap(\n distDir: string,\n baseUrl: string = \"\"\n): Promise<string> {\n const htmlFiles = await fg(\"**/*.html\", {\n cwd: distDir,\n absolute: true,\n });\n\n // Generate sitemap entries\n const entries: SitemapEntry[] = await Promise.all(\n htmlFiles.map(async (filePath) => {\n const relativePath = path.relative(distDir, filePath);\n\n // Convert file path to URL path\n let urlPath = \"/\" + relativePath.replace(/\\\\/g, \"/\");\n\n // Remove index.html from the URL\n if (urlPath.endsWith(\"/index.html\")) {\n urlPath = urlPath.slice(0, -\"index.html\".length);\n } else if (urlPath.endsWith(\".html\")) {\n urlPath = urlPath.slice(0, -\".html\".length);\n }\n\n // Ensure the path ends with / for directories\n if (!urlPath.endsWith(\"/\") && !urlPath.includes(\".\")) {\n urlPath = urlPath + \"/\";\n }\n\n // Get the last modified date of the file\n const stats = await fs.stat(filePath);\n const lastmod = stats.mtime.toISOString().split(\"T\")[0];\n\n return {\n loc: `${baseUrl}${urlPath}`,\n lastmod,\n };\n })\n );\n\n // Sort entries by URL for consistent output\n entries.sort((a, b) => a.loc.localeCompare(b.loc));\n\n // Generate the XML content\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${entries.map((entry) => ` <url>\n <loc>${escapeXml(entry.loc)}</loc>\n <lastmod>${entry.lastmod}</lastmod>\n </url>`).join(\"\\n\")}\n</urlset>\n`;\n\n return xml;\n}\n\n/**\n * Escape special XML characters\n */\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Write sitemap.xml to the dist directory\n * @param distDir - The dist directory\n * @param baseUrl - The base URL for the sitemap\n */\nexport async function writeSitemap(\n distDir: string,\n baseUrl: string = \"\"\n): Promise<void> {\n const sitemapContent = await generateSitemap(distDir, baseUrl);\n const sitemapPath = path.join(distDir, \"sitemap.xml\");\n await fs.writeFile(sitemapPath, sitemapContent, \"utf-8\");\n}\n","import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport { attachProcessHandlers } from \"../utils/process.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { DIST_DIR } from \"../constants.js\";\n\n/**\n * Preview the production build locally\n * Serves the dist folder with a static file server\n */\nexport async function preview(options: { port: string }): Promise<void> {\n const cwd = process.cwd();\n const distDir = path.join(cwd, DIST_DIR);\n\n // Validate dist folder exists\n if (!(await fs.pathExists(distDir))) {\n logger.error(\"Error: dist folder not found.\");\n logger.info(chalk.gray(\"The production build has not been created yet.\"));\n logger.info(chalk.gray(\"Run the build command first:\"));\n logger.info(chalk.cyan(\" opendocs build\"));\n process.exit(1);\n }\n\n logger.info(chalk.cyan(\"Starting preview server...\"));\n logger.info(chalk.gray(`Serving: ${distDir}`));\n logger.info(chalk.gray(`Port: ${options.port}`));\n logger.plain(\"\");\n logger.success(` Local: http://localhost:${options.port}`);\n logger.plain(\"\");\n\n // Spawn serve to serve static files from dist\n // Note: Don't use -s (SPA mode) - this is a pre-rendered static site, not a SPA\n const child = spawn(\n \"npx\",\n [\"serve\", distDir, \"-l\", options.port],\n {\n cwd,\n stdio: \"inherit\",\n shell: true,\n }\n );\n\n attachProcessHandlers(child, \"preview server\");\n}\n","import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport * as tar from \"tar-stream\";\nimport { createGzip } from \"node:zlib\";\nimport { password } from \"@inquirer/prompts\";\nimport { build } from \"./build.js\";\nimport { requireDocsJson, loadDocsConfig } from \"../utils/docs-config.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { formatBytes } from \"../utils/format.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { DIST_DIR, DEFAULT_API_URL } from \"../constants.js\";\n\ninterface DeployOptions {\n skipBuild?: boolean;\n}\n\ninterface DeployResponse {\n id: string;\n version: number;\n status: string;\n fileCount: number;\n sizeBytes: number;\n url: string | null;\n message: string;\n}\n\n/**\n * Deploy documentation to the hosted platform\n */\nexport async function deploy(options: DeployOptions = {}): Promise<void> {\n const cwd = process.cwd();\n const distDir = path.join(cwd, DIST_DIR);\n\n const docsJsonPath = await requireDocsJson(cwd);\n const docsConfig = await loadDocsConfig(docsJsonPath);\n\n // Get site ID from config\n const siteId = docsConfig.backend?.siteId;\n if (!siteId) {\n logger.error(\"Error: No siteId configured in docs.json\");\n logger.info(chalk.gray(\"Add the following to your docs.json:\"));\n logger.info(\n chalk.cyan(` \"backend\": {\n \"siteId\": \"your-site-id\"\n }`)\n );\n process.exit(1);\n }\n\n // Prompt for deploy key\n logger.info(chalk.cyan(\"\\u{1F511} Authentication required\\n\"));\n\n let apiKey: string;\n try {\n apiKey = await password({\n message: \"Deploy key:\",\n mask: \"*\",\n });\n } catch (err) {\n logger.error(\"\\nPrompt error: \" + getErrorMessage(err));\n logger.info(chalk.yellow(\"Deployment cancelled.\"));\n process.exit(0);\n }\n\n if (!apiKey || !apiKey.trim()) {\n logger.error(\"\\nError: Deploy key is required.\");\n process.exit(1);\n }\n\n logger.plain(\"\"); // Add spacing\n\n // Build if needed\n if (!options.skipBuild) {\n await build();\n logger.plain(\"\"); // Add spacing after build\n }\n\n // Verify dist folder exists\n if (!(await fs.pathExists(distDir))) {\n logger.error(\"Error: dist folder not found.\");\n logger.info(\n chalk.gray(\"Run 'opendocs build' first or remove --skip-build.\")\n );\n process.exit(1);\n }\n\n logger.info(chalk.cyan(\"\\u{1F680} Deploying documentation...\\n\"));\n\n // Create tarball\n const tarballSpinner = ora(\"Creating deployment package...\").start();\n let tarballBuffer: Buffer;\n\n try {\n tarballBuffer = await createTarball(distDir);\n tarballSpinner.succeed(\n `Created deployment package (${formatBytes(tarballBuffer.length)})`\n );\n } catch (error) {\n tarballSpinner.fail(\"Failed to create deployment package\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n\n // Upload to server\n const uploadSpinner = ora(\"Uploading to server...\").start();\n\n try {\n const apiUrl = docsConfig.backend?.apiUrl || DEFAULT_API_URL;\n const deployUrl = `${apiUrl}/api/sites/${siteId}/deploy`;\n\n const response = await fetch(deployUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/gzip\",\n },\n body: new Uint8Array(tarballBuffer),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage = `Upload failed with status ${response.status}`;\n\n try {\n const errorJson = JSON.parse(errorBody);\n if (errorJson.error) {\n errorMessage = errorJson.error;\n }\n } catch {\n logger.error(\"Error: \" + errorBody);\n }\n\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as DeployResponse;\n uploadSpinner.succeed(\"Upload complete\");\n\n // Display results\n logger.plain(\"\");\n logger.success(\"\\u2713 Deployment successful!\");\n logger.plain(\"\");\n logger.info(\n chalk.gray(\"Version:\") + \" \" + chalk.cyan(`v${result.version}`)\n );\n logger.info(\n chalk.gray(\"Files:\") + \" \" + chalk.cyan(result.fileCount.toString())\n );\n logger.info(\n chalk.gray(\"Size:\") + \" \" + chalk.cyan(formatBytes(result.sizeBytes))\n );\n\n if (result.url) {\n logger.plain(\"\");\n logger.info(chalk.gray(\"Your docs are live at:\"));\n logger.info(chalk.cyan.bold(` ${result.url}`));\n } else {\n logger.plain(\"\");\n logger.info(\n chalk.yellow(\n \"Note: Configure a subdomain to access your docs publicly.\"\n )\n );\n }\n\n logger.plain(\"\");\n } catch (error) {\n uploadSpinner.fail(\"Deployment failed\");\n logger.error(getErrorMessage(error));\n process.exit(1);\n }\n}\n\n/**\n * Create a gzipped tarball of the dist directory\n */\nasync function createTarball(distDir: string): Promise<Buffer> {\n const pack = tar.pack();\n const gzip = createGzip();\n const chunks: Buffer[] = [];\n\n const bufferPromise = new Promise<Buffer>((resolve, reject) => {\n gzip.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n gzip.on(\"end\", () => {\n resolve(Buffer.concat(chunks));\n });\n\n gzip.on(\"error\", reject);\n pack.on(\"error\", reject);\n });\n\n // Pipe pack through gzip\n pack.pipe(gzip);\n\n // Walk directory and add files\n await addFilesToPack(pack, distDir, \"\");\n pack.finalize();\n\n return bufferPromise;\n}\n\n/**\n * Recursively add files from a directory to the tar pack\n */\nasync function addFilesToPack(\n pack: tar.Pack,\n baseDir: string,\n relativePath: string\n): Promise<void> {\n const fullPath = path.join(baseDir, relativePath);\n const entries = await fs.readdir(fullPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryRelativePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n await addFilesToPack(pack, baseDir, entryRelativePath);\n } else if (entry.isFile()) {\n const filePath = path.join(baseDir, entryRelativePath);\n const content = await fs.readFile(filePath);\n const stats = await fs.stat(filePath);\n\n // Add file to tar\n await new Promise<void>((resolve, reject) => {\n const entry = pack.entry(\n {\n name: entryRelativePath,\n size: content.length,\n mtime: stats.mtime,\n },\n (err) => {\n if (err) reject(err);\n else resolve();\n }\n );\n entry.end(content);\n });\n }\n }\n}\n","/**\n * Format bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n"],"mappings":"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","names":["chalk","__dirname","chalk","path","fileURLToPath","chalk","path","fs","chalk","path","fs","chalk","__filename","fileURLToPath","__dirname","path","chalk","spawn","path","fileURLToPath","fs","chalk","ora","fs","path","__filename","fileURLToPath","__dirname","path","spawn","chalk","ora","fs","spawn","path","fs","chalk","path","fs","chalk","spawn","path","fs","chalk","ora","path","chalk","fs","ora","pack","entry"]}
|