@clarify-labs/cli 0.10.0 → 0.10.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/output/cli.cjs +14 -9
- package/output/cli.cjs.map +1 -1
- package/output/cli.js +14 -9
- package/output/cli.js.map +1 -1
- package/output/core/engine/phases.d.ts +5 -5
- package/output/core/plugin/hooks.d.ts +2 -2
- package/output/core/runtime/ssg.d.ts +1 -1
- package/output/core/runtime/virtual-modules.d.ts +1 -0
- package/output/{engine-I04EZzjg.cjs → engine-5bdNX2Oo.cjs} +449 -247
- package/output/engine-5bdNX2Oo.cjs.map +1 -0
- package/output/{engine-3f5Tpa-6.js → engine-Ca_2MCj9.js} +449 -247
- package/output/engine-Ca_2MCj9.js.map +1 -0
- package/output/index.cjs +1 -1
- package/output/index.d.ts +1 -1
- package/output/index.js +1 -1
- package/output/parsers/routes/routes.d.ts +2 -1
- package/output/parsers/routes/routes.test-utils.d.ts +18 -1
- package/output/plugins/openapi/parser.d.ts +1 -0
- package/output/plugins/openapi/virtual-modules.d.ts +4 -3
- package/output/plugins/source-links/source-links.d.ts +2 -2
- package/output/types.d.ts +108 -44
- package/package.json +3 -3
- package/output/engine-3f5Tpa-6.js.map +0 -1
- package/output/engine-I04EZzjg.cjs.map +0 -1
package/output/cli.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const require_engine = require("./engine-
|
|
2
|
+
const require_engine = require("./engine-5bdNX2Oo.cjs");
|
|
3
3
|
let node_path = require("node:path");
|
|
4
4
|
let node_fs_promises = require("node:fs/promises");
|
|
5
5
|
let node_fs = require("node:fs");
|
|
@@ -173,6 +173,11 @@ async function createViteConfig(options, env, engine) {
|
|
|
173
173
|
test: /node_modules[\\/](@headlessui|framer-motion)[\\/]/,
|
|
174
174
|
priority: 30
|
|
175
175
|
},
|
|
176
|
+
{
|
|
177
|
+
name: "mermaid-viewer-vendor",
|
|
178
|
+
test: /node_modules[\\/]react-zoom-pan-pinch[\\/]/,
|
|
179
|
+
priority: 25
|
|
180
|
+
},
|
|
176
181
|
{
|
|
177
182
|
name: "mermaid-vendor",
|
|
178
183
|
test: /node_modules[\\/](mermaid|@mermaid-js|cytoscape|cytoscape-[^\\/]+|dagre-d3-es|@dagrejs|dagre|graphlib|elkjs|katex|d3|d3-[^\\/]+|internmap|delaunator|robust-predicates|roughjs|points-on-curve|points-on-path|path-data-parser|@braintree[\\/]sanitize-url|dompurify|khroma|ts-dedent|stylis|cose-base|layout-base)[\\/]/,
|
|
@@ -244,7 +249,7 @@ function isLocalHref(href) {
|
|
|
244
249
|
async function resolveLocalFileLink(href, route, contentRoot) {
|
|
245
250
|
const [withoutHashOrQuery] = href.split(/[?#]/);
|
|
246
251
|
if (!withoutHashOrQuery || withoutHashOrQuery.startsWith("/")) return false;
|
|
247
|
-
const target = (0, node_path.resolve)((0, node_path.dirname)(route.filePath), withoutHashOrQuery);
|
|
252
|
+
const target = (0, node_path.resolve)((0, node_path.dirname)(route.source.filePath), withoutHashOrQuery);
|
|
248
253
|
const relativeTarget = (0, node_path.relative)(contentRoot, target);
|
|
249
254
|
if (relativeTarget.startsWith("..") || (0, node_path.isAbsolute)(relativeTarget)) return false;
|
|
250
255
|
if (await pathExists(target)) return true;
|
|
@@ -279,8 +284,8 @@ function checkDuplicateRoutes(routes, result) {
|
|
|
279
284
|
for (const route of duplicated) addDiagnostic(result, {
|
|
280
285
|
level: "error",
|
|
281
286
|
code: "duplicate-route",
|
|
282
|
-
message: `Route "${route.path}" is defined by multiple files: ${duplicated.map((route) => (0, node_path.relative)(process.cwd(), route.filePath)).join(", ")}`,
|
|
283
|
-
filePath: route.filePath,
|
|
287
|
+
message: `Route "${route.path}" is defined by multiple files: ${duplicated.map((route) => (0, node_path.relative)(process.cwd(), route.source.filePath)).join(", ")}`,
|
|
288
|
+
filePath: route.source.filePath,
|
|
284
289
|
routePath: route.path
|
|
285
290
|
});
|
|
286
291
|
}
|
|
@@ -291,8 +296,8 @@ function checkFallbackRoutes(routes, result) {
|
|
|
291
296
|
addDiagnostic(result, {
|
|
292
297
|
level: "warning",
|
|
293
298
|
code: "i18n-fallback-route",
|
|
294
|
-
message: `Route "${route.path}" falls back to ${route.locale ?? "default"} content from ${(0, node_path.relative)(process.cwd(), route.filePath)}`,
|
|
295
|
-
filePath: route.filePath,
|
|
299
|
+
message: `Route "${route.path}" falls back to ${route.locale ?? "default"} content from ${(0, node_path.relative)(process.cwd(), route.source.filePath)}`,
|
|
300
|
+
filePath: route.source.filePath,
|
|
296
301
|
routePath: route.path
|
|
297
302
|
});
|
|
298
303
|
}
|
|
@@ -300,8 +305,8 @@ function checkFallbackRoutes(routes, result) {
|
|
|
300
305
|
async function checkLocalLinks(routes, contentRoot, result) {
|
|
301
306
|
const routePaths = new Set(routes.map((route) => route.path));
|
|
302
307
|
for (const route of routes) {
|
|
303
|
-
if (route.kind !== "mdx" || !route.content) continue;
|
|
304
|
-
for (const match of route.content.matchAll(LOCAL_LINK_PATTERN)) {
|
|
308
|
+
if (route.kind !== "mdx" || !route.source.content) continue;
|
|
309
|
+
for (const match of route.source.content.matchAll(LOCAL_LINK_PATTERN)) {
|
|
305
310
|
const href = match[1] ?? match[2];
|
|
306
311
|
if (!href || !isLocalHref(href)) continue;
|
|
307
312
|
if (routePathCandidates(href, route).some((candidate) => routePaths.has(candidate))) continue;
|
|
@@ -310,7 +315,7 @@ async function checkLocalLinks(routes, contentRoot, result) {
|
|
|
310
315
|
level: "error",
|
|
311
316
|
code: "broken-link",
|
|
312
317
|
message: `Broken local link "${href}" in route "${route.path}"`,
|
|
313
|
-
filePath: route.filePath,
|
|
318
|
+
filePath: route.source.filePath,
|
|
314
319
|
routePath: route.path
|
|
315
320
|
});
|
|
316
321
|
}
|
package/output/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","names":[],"sources":["../source/core/runtime/log.ts","../source/core/runtime/vite-config.ts","../source/cli/commands/build.ts","../source/cli/commands/check.ts","../source/cli/commands/dev.ts","../source/cli/spawn.ts","../source/cli/commands/init.ts","../source/cli/options.ts","../source/cli/program.ts","../source/cli/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\n\nconst LOG_FILE_NAME = '.clarify.log'\nconst DEFAULT_LOG_ENTRIES = 50\nconst ENTRY_SEPARATOR = '\\n\\n---\\n\\n'\n\nfunction getMaxLogEntries(): number {\n const envValue = process.env.CLARIFY_LOG_MAX_ENTRIES\n if (!envValue) return DEFAULT_LOG_ENTRIES\n const parsed = Number(envValue)\n return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_LOG_ENTRIES\n}\n\nfunction normalizeErrorMessage(error: unknown): string {\n if (error === undefined) return 'undefined'\n if (error === null) return 'null'\n if (error instanceof Error) return error.message\n if (typeof error === 'object') {\n if ('message' in error && typeof (error as { message?: unknown }).message === 'string') {\n return (error as { message: string }).message\n }\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n }\n return String(error)\n}\n\nfunction normalizeErrorStack(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.stack\n }\n return undefined\n}\n\nfunction formatLogEntry(root: string, error: unknown): string {\n const timestamp = new Date().toISOString()\n const message = normalizeErrorMessage(error)\n const stack = normalizeErrorStack(error)\n\n return [`=== Clarify build error ===`, `Timestamp: ${timestamp}`, `Project root: ${root}`, `Error: ${message}`, stack ? `Stack:\\n${stack}` : undefined]\n .filter(Boolean)\n .join('\\n')\n}\n\ntype LogEntryReader = (logPath: string) => Promise<string> | string\ntype LogEntryWriter = (logPath: string, content: string) => Promise<void> | void\n\nfunction collectLogEntries(entries: string[], entry: string, max: number): string[] {\n const next = [...entries, entry]\n return next.length > max ? next.slice(-max) : next\n}\n\nfunction readExistingEntries(content: string): string[] {\n return content\n .split(ENTRY_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean)\n}\n\nasync function writeLogEntry(root: string, error: unknown, maxEntries: number | undefined, read: LogEntryReader, write: LogEntryWriter): Promise<void> {\n const logPath = join(root, LOG_FILE_NAME)\n const entry = formatLogEntry(root, error)\n const max = maxEntries ?? getMaxLogEntries()\n\n let entries: string[] = []\n if (existsSync(logPath)) {\n try {\n entries = readExistingEntries(await read(logPath))\n } catch {\n entries = []\n }\n }\n\n entries = collectLogEntries(entries, entry, max)\n\n mkdirSync(dirname(logPath), { recursive: true })\n await write(logPath, entries.join(ENTRY_SEPARATOR) + '\\n')\n}\n\nexport async function logBuildError(root: string, error: unknown, maxEntries?: number): Promise<void> {\n await writeLogEntry(root, error, maxEntries, (path) => readFile(path, 'utf8'), (path, content) => writeFile(path, content, 'utf8'))\n}\n\nexport function logBuildErrorSync(root: string, error: unknown, maxEntries?: number): void {\n void writeLogEntry(root, error, maxEntries, (path) => readFileSync(path, 'utf8'), (path, content) => writeFileSync(path, content, 'utf8'))\n}\n","import { existsSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { createLogger } from 'vite'\nimport type { ConfigEnv, InlineConfig, Plugin, LogLevel, Logger, LogOptions, LogErrorOptions, LogType } from 'vite'\n\nimport { createViteAdapter } from '../adapters.js'\nimport type { ClarifyEngine } from '../engine/engine.js'\nimport { createClarifyTempDir } from '../project/temp-dir.js'\n\nimport { logBuildErrorSync } from './log.js'\nimport { createClarifyRuntimeAliases } from './runtime-deps.js'\n\nexport type ClarifyViteConfigOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nconst DEFAULT_HTML = '<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /><title>Clarify</title></head><body><div id=\"root\"></div></body></html>'\n\nfunction ensureHtmlEntry(root: string): string {\n const projectHtmlPath = resolve(root, 'index.html')\n if (existsSync(projectHtmlPath)) return projectHtmlPath\n\n const generatedHtmlPath = resolve(createClarifyTempDir('html'), 'index.html')\n writeFileSync(generatedHtmlPath, DEFAULT_HTML, 'utf-8')\n return generatedHtmlPath\n}\n\nfunction createClarifyLogger(root: string, env: ConfigEnv, level: LogLevel): Logger | undefined {\n if (env.command !== 'build') return undefined\n\n const baseLogger = createLogger(level, { allowClearScreen: true })\n\n return {\n info(msg: string, options?: LogOptions) {\n baseLogger.info(msg, options)\n },\n warn(msg: string, options?: LogOptions) {\n baseLogger.warn(msg, options)\n },\n warnOnce(msg: string, options?: LogOptions) {\n baseLogger.warnOnce(msg, options)\n },\n error(msg: string, options?: LogErrorOptions) {\n baseLogger.error(msg, options)\n if (options?.error) {\n logBuildErrorSync(root, options.error)\n } else {\n logBuildErrorSync(root, typeof msg === 'string' ? new Error(msg) : msg)\n }\n },\n clearScreen(type: LogType) {\n baseLogger.clearScreen(type)\n },\n hasErrorLogged(error: Error | unknown) {\n return baseLogger.hasErrorLogged(error as Error)\n },\n get hasWarned() {\n return baseLogger.hasWarned\n },\n }\n}\n\nfunction createHtmlFallbackPlugin(): Plugin {\n return {\n name: 'clarify:cli-html-fallback',\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const requestPath = req.url?.split('?')[0] ?? '/'\n const acceptsHtml = req.headers.accept?.includes('text/html') ?? false\n const hasFileExtension = /\\.[^/]+$/.test(requestPath)\n if (!acceptsHtml || hasFileExtension) {\n next()\n return\n }\n\n try {\n const html = await server.transformIndexHtml(requestPath, DEFAULT_HTML)\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(html)\n } catch (error) {\n next(error)\n }\n })\n },\n }\n}\n\nexport async function createViteConfig(options: ClarifyViteConfigOptions, env: ConfigEnv, engine: ClarifyEngine): Promise<InlineConfig> {\n const entryHtmlPath = ensureHtmlEntry(options.root)\n\n return {\n root: options.root,\n configFile: false,\n appType: 'custom',\n resolve: {\n alias: createClarifyRuntimeAliases(),\n },\n customLogger: createClarifyLogger(options.root, env, 'info'),\n plugins: [\n createViteAdapter(engine),\n createHtmlFallbackPlugin(),\n ],\n server: {\n host: options.host,\n port: options.port,\n open: options.open,\n },\n build: {\n outDir: options.output,\n rolldownOptions: {\n input: {\n index: entryHtmlPath,\n },\n checks: {\n pluginTimings: false,\n },\n output: {\n codeSplitting: {\n groups: [\n {\n name: 'react-vendor',\n test: /node_modules[\\\\/](react|react-dom|react-router|react-router-dom)[\\\\/]/,\n priority: 40,\n },\n {\n name: 'icons-vendor',\n test: /node_modules[\\\\/]lucide-react[\\\\/]/,\n priority: 35,\n },\n {\n name: 'ui-vendor',\n test: /node_modules[\\\\/](@headlessui|framer-motion)[\\\\/]/,\n priority: 30,\n },\n {\n // Keep mermaid and its heavy diagram/render dependencies out of\n // the eager `vendor` chunk so they stay lazily loaded only on\n // pages that actually render a diagram.\n name: 'mermaid-vendor',\n test: /node_modules[\\\\/](mermaid|@mermaid-js|cytoscape|cytoscape-[^\\\\/]+|dagre-d3-es|@dagrejs|dagre|graphlib|elkjs|katex|d3|d3-[^\\\\/]+|internmap|delaunator|robust-predicates|roughjs|points-on-curve|points-on-path|path-data-parser|@braintree[\\\\/]sanitize-url|dompurify|khroma|ts-dedent|stylis|cose-base|layout-base)[\\\\/]/,\n priority: 20,\n },\n {\n name: 'vendor',\n test: /node_modules[\\\\/]/,\n priority: 10\n },\n ],\n },\n },\n },\n },\n }\n}\n","import { build as viteBuild } from 'vite'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport { logBuildError } from '../../core/runtime/log.js'\nimport { createViteConfig } from '../../core/runtime/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runBuild(options: ResolvedCliOptions): Promise<void> {\n const env = { command: 'build' as const, mode: 'production' }\n const engine = createClarifyEngine({\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n try {\n await engine.prepare(env)\n await viteBuild(await createViteConfig(options, env, engine))\n } catch (error) {\n await logBuildError(options.root, error)\n throw error\n }\n}\n","import { lstat, stat } from 'node:fs/promises'\nimport { dirname, extname, isAbsolute, join, normalize, relative, resolve } from 'node:path'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport type { ContentRoute } from '../../types.js'\nimport type { CliOptions } from '../options.js'\n\nexport type CheckCommandOptions = CliOptions & {\n strict?: boolean\n format?: 'text' | 'json' | string\n}\n\ntype CheckLevel = 'error' | 'warning'\n\ntype CheckDiagnostic = {\n level: CheckLevel\n code: string\n message: string\n filePath?: string\n routePath?: string\n}\n\ntype CheckResult = {\n errors: CheckDiagnostic[]\n warnings: CheckDiagnostic[]\n}\n\nconst LOCAL_LINK_PATTERN = /(?<!!)(?:\\[[^\\]]*\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)|<a\\s+[^>]*href=[\"']([^\"']+)[\"'])/gi\nconst ROUTE_EXTENSIONS = new Set(['.md', '.mdx'])\nconst IGNORED_SCHEMES = /^[a-z][a-z0-9+.-]*:/i\n\nfunction addDiagnostic(result: CheckResult, diagnostic: CheckDiagnostic): void {\n if (diagnostic.level === 'error') result.errors.push(diagnostic)\n else result.warnings.push(diagnostic)\n}\n\nfunction normalizeRoutePath(path: string): string {\n const [withoutHash] = path.split('#')\n const clean = withoutHash.replace(/\\/index$/, '') || '/'\n return clean.startsWith('/') ? clean : `/${clean}`\n}\n\nfunction routePathCandidates(href: string, route: ContentRoute): string[] {\n const [withoutHashOrQuery] = href.split(/[?#]/)\n if (!withoutHashOrQuery || withoutHashOrQuery.startsWith('#')) return []\n if (withoutHashOrQuery.startsWith('/')) return [normalizeRoutePath(withoutHashOrQuery)]\n\n const routeDir = dirname(route.path)\n const joined = normalize(join(routeDir, withoutHashOrQuery)).replaceAll('\\\\', '/')\n const extension = extname(joined)\n const base = ROUTE_EXTENSIONS.has(extension) ? joined.slice(0, -extension.length) : joined\n return [normalizeRoutePath(base)]\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath)\n return true\n } catch {\n return false\n }\n}\n\nfunction isLocalHref(href: string): boolean {\n return Boolean(href) && !href.startsWith('#') && !href.startsWith('//') && !IGNORED_SCHEMES.test(href)\n}\n\nasync function resolveLocalFileLink(href: string, route: ContentRoute, contentRoot: string): Promise<boolean> {\n const [withoutHashOrQuery] = href.split(/[?#]/)\n if (!withoutHashOrQuery || withoutHashOrQuery.startsWith('/')) return false\n\n const target = resolve(dirname(route.filePath), withoutHashOrQuery)\n const relativeTarget = relative(contentRoot, target)\n if (relativeTarget.startsWith('..') || isAbsolute(relativeTarget)) return false\n if (await pathExists(target)) return true\n\n if (!extname(target)) {\n return pathExists(`${target}.md`) || pathExists(`${target}.mdx`) || pathExists(join(target, 'index.md')) || pathExists(join(target, 'index.mdx'))\n }\n return false\n}\n\nasync function checkContentDirectory(contentRoot: string, result: CheckResult): Promise<void> {\n try {\n const stats = await lstat(contentRoot)\n if (!stats.isDirectory()) {\n addDiagnostic(result, {\n level: 'error',\n code: 'content-not-directory',\n message: `Content path is not a directory: ${contentRoot}`,\n filePath: contentRoot,\n })\n }\n } catch {\n addDiagnostic(result, {\n level: 'error',\n code: 'content-missing',\n message: `Content directory does not exist: ${contentRoot}`,\n filePath: contentRoot,\n })\n }\n}\n\nfunction checkDuplicateRoutes(routes: ContentRoute[], result: CheckResult): void {\n const byPath = new Map<string, ContentRoute[]>()\n for (const route of routes) {\n const key = `${route.locale ?? ''}:${route.path}`\n byPath.set(key, [...(byPath.get(key) ?? []), route])\n }\n\n for (const duplicated of byPath.values()) {\n if (duplicated.length < 2) continue\n for (const route of duplicated) {\n addDiagnostic(result, {\n level: 'error',\n code: 'duplicate-route',\n message: `Route \"${route.path}\" is defined by multiple files: ${duplicated.map(route => relative(process.cwd(), route.filePath)).join(', ')}`,\n filePath: route.filePath,\n routePath: route.path,\n })\n }\n }\n}\n\nfunction checkFallbackRoutes(routes: ContentRoute[], result: CheckResult): void {\n for (const route of routes) {\n if (!route.isFallback) continue\n addDiagnostic(result, {\n level: 'warning',\n code: 'i18n-fallback-route',\n message: `Route \"${route.path}\" falls back to ${route.locale ?? 'default'} content from ${relative(process.cwd(), route.filePath)}`,\n filePath: route.filePath,\n routePath: route.path,\n })\n }\n}\n\nasync function checkLocalLinks(routes: ContentRoute[], contentRoot: string, result: CheckResult): Promise<void> {\n const routePaths = new Set(routes.map(route => route.path))\n\n for (const route of routes) {\n if (route.kind !== 'mdx' || !route.content) continue\n for (const match of route.content.matchAll(LOCAL_LINK_PATTERN)) {\n const href = match[1] ?? match[2]\n if (!href || !isLocalHref(href)) continue\n const candidates = routePathCandidates(href, route)\n if (candidates.some(candidate => routePaths.has(candidate))) continue\n if (await resolveLocalFileLink(href, route, contentRoot)) continue\n\n addDiagnostic(result, {\n level: 'error',\n code: 'broken-link',\n message: `Broken local link \"${href}\" in route \"${route.path}\"`,\n filePath: route.filePath,\n routePath: route.path,\n })\n }\n }\n}\n\nfunction printTextResult(result: CheckResult, strict: boolean): void {\n const diagnostics = [...result.errors, ...result.warnings]\n if (diagnostics.length === 0) {\n console.log('✓ Clarify check passed')\n return\n }\n\n for (const diagnostic of diagnostics) {\n const location = diagnostic.filePath ? ` ${relative(process.cwd(), diagnostic.filePath)}` : ''\n const route = diagnostic.routePath ? ` (${diagnostic.routePath})` : ''\n console.log(`${diagnostic.level.toUpperCase()} ${diagnostic.code}${location}${route}`)\n console.log(` ${diagnostic.message}`)\n }\n\n const warningExit = strict && result.warnings.length > 0\n console.log(`\\n${result.errors.length} error(s), ${result.warnings.length} warning(s)${warningExit ? ' (--strict treats warnings as failures)' : ''}`)\n}\n\nexport async function runCheck(options: CheckCommandOptions = {}): Promise<void> {\n const root = resolve(options.root ?? process.cwd())\n const engine = createClarifyEngine({\n projectRoot: root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n await engine.prepare(undefined, undefined, { htmlShell: false, skipModules: true, skipHints: true })\n\n const result: CheckResult = { errors: [], warnings: [] }\n await checkContentDirectory(engine.contentRoot, result)\n checkDuplicateRoutes(engine.routes, result)\n checkFallbackRoutes(engine.routes, result)\n await checkLocalLinks(engine.routes, engine.contentRoot, result)\n\n if (options.format === 'json') {\n console.log(JSON.stringify(result, null, 2))\n } else {\n printTextResult(result, Boolean(options.strict))\n }\n\n if (result.errors.length > 0 || (options.strict && result.warnings.length > 0)) {\n process.exitCode = 1\n }\n}\n","import { createServer } from 'vite'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport { createViteConfig } from '../../core/runtime/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runDev(options: ResolvedCliOptions): Promise<void> {\n const env = { command: 'serve' as const, mode: 'development' }\n const engine = createClarifyEngine({\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n await engine.prepare(env)\n const server = await createServer(await createViteConfig(options, env, engine))\n await server.listen()\n server.printUrls()\n server.bindCLIShortcuts({ print: true })\n}\n","import { spawnSync as nodeSpawnSync, SpawnSyncOptions } from 'node:child_process'\n\ntype SpawnOptions = { cwd?: string; stdio?: 'inherit' | 'ignore' | Array<string> }\n\nexport function spawnSync(command: string, args: string[], options: SpawnOptions) {\n return nodeSpawnSync(command, args, options as SpawnSyncOptions)\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { copyTemplateDirectory, getTemplateDirectory, resolveTemplate } from '@clarify-labs/templates'\n\nimport type { ResolvedCliOptions } from '../options.js'\nimport { cliPackageVersionWithCaret } from '../package.js'\nimport { spawnSync } from '../spawn.js'\n\nconst require = createRequire(import.meta.url)\n\nfunction findTemplatesPackagePath(): string {\n try {\n return require.resolve('@clarify-labs/templates/package.json')\n } catch {\n const currentDirectory = dirname(fileURLToPath(import.meta.url))\n const workspacePackagePath = resolve(currentDirectory, '../../../../templates/package.json')\n if (existsSync(workspacePackagePath)) return workspacePackagePath\n throw new Error('[clarify] Templates package not found.')\n }\n}\n\nconst templatesPackagePath = findTemplatesPackagePath()\nconst templatesDirectory = dirname(templatesPackagePath)\n\nfunction commandExists(program: string): boolean {\n const result = spawnSync(program, ['--version'], { stdio: 'ignore' })\n return result.status === 0 && result.error === undefined\n}\n\ntype InstallCommand = { command: string; args: string[] }\n\nfunction getInstallCommand(): InstallCommand {\n if (commandExists('pnpm')) return { command: 'pnpm', args: ['install'] }\n if (commandExists('npm')) return { command: 'npm', args: ['install'] }\n if (commandExists('yarn')) return { command: 'yarn', args: ['install'] }\n return { command: 'npm', args: ['install'] }\n}\n\nfunction installDependencies(root: string): void {\n const { command, args } = getInstallCommand()\n console.log(`[clarify] Installing dependencies with ${command}...`)\n const result = spawnSync(command, args, { cwd: root, stdio: 'inherit' })\n if (result.status !== 0) {\n throw new Error(`[clarify] Dependency install failed with ${command}`)\n }\n}\n\nfunction getSuggestedInstallCommand(): string {\n if (commandExists('pnpm')) return 'pnpm install'\n if (commandExists('npm')) return 'npm install'\n if (commandExists('yarn')) return 'yarn install'\n return 'npm install'\n}\n\nfunction getSuggestedRunCommand(): string {\n if (commandExists('pnpm')) return 'pnpm dev'\n if (commandExists('yarn')) return 'yarn dev'\n return 'npm run dev'\n}\n\nfunction updatePackageJson(root: string, force: boolean): boolean {\n const packageJsonPath = resolve(root, 'package.json')\n const packageJson = existsSync(packageJsonPath)\n ? JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as Record<string, unknown>\n : { type: 'module' }\n\n const scripts = typeof packageJson.scripts === 'object' && packageJson.scripts !== null\n ? packageJson.scripts as Record<string, string>\n : {}\n\n if (force || !scripts.dev) scripts.dev = 'clarify dev'\n if (force || !scripts.build) scripts.build = 'clarify build'\n packageJson.scripts = scripts\n\n const devDependencies = typeof packageJson.devDependencies === 'object' && packageJson.devDependencies !== null\n ? packageJson.devDependencies as Record<string, string>\n : {}\n if (!devDependencies['@clarify-labs/cli']) devDependencies['@clarify-labs/cli'] = cliPackageVersionWithCaret\n packageJson.devDependencies = devDependencies\n\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf-8')\n return true\n}\n\nexport function runInit(options: ResolvedCliOptions, force: boolean, template?: string, install = false): void {\n const selectedTemplate = resolveTemplate(template)\n const templateDirectory = getTemplateDirectory(templatesDirectory, selectedTemplate)\n const { created } = copyTemplateDirectory(templateDirectory, options.root, {\n contentDir: options.content,\n force,\n })\n\n const packageJsonUpdated = updatePackageJson(options.root, force)\n if (packageJsonUpdated) created.push('package.json')\n\n console.log(`[clarify] Project scaffold created using the ${selectedTemplate} template.`)\n if (created.length > 0) {\n console.log(`[clarify] Created or updated ${created.length} ${created.length === 1 ? 'file' : 'files'}: ${created.join(', ')}`)\n }\n\n if (install) {\n installDependencies(options.root)\n const suggestedRun = getSuggestedRunCommand()\n console.log('[clarify] Dependencies installed successfully.')\n console.log(`[clarify] You can now run \\`${suggestedRun}\\` to start the local documentation server.`)\n return\n }\n\n const suggestedInstall = getSuggestedInstallCommand()\n const suggestedRun = getSuggestedRunCommand()\n console.log('[clarify] Next steps:')\n console.log(' 1. Change into your new project directory:')\n console.log(` cd ${options.root}`)\n console.log(' 2. Install dependencies:')\n console.log(` ${suggestedInstall}`)\n console.log(' 3. Start the local documentation server:')\n console.log(` ${suggestedRun}`)\n}\n","import { resolve } from 'node:path'\n\nexport type CliOptions = {\n root?: string\n content?: string\n output?: string\n host?: string | boolean\n port?: string | number\n open?: boolean | string\n}\n\nexport type ResolvedCliOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nfunction resolvePort(port: CliOptions['port']): number | undefined {\n if (port === undefined) return undefined\n\n const parsedPort = typeof port === 'string' ? Number(port) : port\n if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > 65535) {\n throw new Error('[clarify] --port must be an integer between 1 and 65535')\n }\n\n return parsedPort\n}\n\nexport function resolveCliOptions(options: CliOptions): ResolvedCliOptions {\n return {\n root: resolve(options.root ?? process.cwd()),\n content: options.content ?? 'source',\n output: options.output ?? 'output',\n host: options.host,\n port: resolvePort(options.port),\n open: options.open,\n }\n}\n","import { cac } from 'cac'\n\nimport { runBuild } from './commands/build.js'\nimport { runCheck, type CheckCommandOptions } from './commands/check.js'\nimport { runDev } from './commands/dev.js'\nimport { runInit } from './commands/init.js'\nimport { resolveCliOptions, type CliOptions, type ResolvedCliOptions } from './options.js'\nimport { cliPackageVersion } from './package.js'\n\ntype InitCommandOptions = CliOptions & {\n force?: boolean\n template?: string\n install?: boolean\n}\n\nfunction withBuildOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--content <dir>', 'Content directory relative to root')\n}\n\nfunction resolveInitOptions(directory: string | undefined, options: InitCommandOptions): ResolvedCliOptions {\n return resolveOptions({\n ...options,\n root: directory,\n })\n}\n\nfunction withSharedOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--root <dir>', 'Project root directory')\n .option('--content <dir>', 'Content directory relative to root')\n .option('--output <dir>', 'Build output directory relative to root')\n}\n\nfunction resolveOptions(options: CliOptions): ResolvedCliOptions {\n return resolveCliOptions(options)\n}\n\nexport function createCli() {\n const cli = cac('clarify')\n\n cli\n .version(cliPackageVersion)\n .help()\n\n withSharedOptions(cli.command('dev', 'Start the local documentation server'))\n .option('--host [host]', 'Dev server host')\n .option('--port <port>', 'Dev server port')\n .option('--open [path]', 'Open the dev server in a browser')\n .action(async (options: CliOptions) => {\n await runDev(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('build', 'Build the static documentation site'))\n .action(async (options: CliOptions) => {\n await runBuild(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('check', 'Validate the documentation project'))\n .option('--strict', 'Treat warnings as failures')\n .option('--format <format>', 'Output format: text or json')\n .action(async (options: CheckCommandOptions) => {\n await runCheck(options)\n })\n\n withBuildOptions(cli.command('init [directory]', 'Create a Clarify project scaffold'))\n .option('--force', 'Overwrite files created by init')\n .option('--template <name>', 'Template to use: minimal, standard, or complete')\n .option('--install', 'Install dependencies after init')\n .action((directory: string | undefined, options: InitCommandOptions) => {\n runInit(resolveInitOptions(directory, options), options.force === true, options.template, options.install === true)\n })\n\n return cli\n}\n\nexport async function main(argv = process.argv): Promise<void> {\n const cli = createCli()\n const args = argv.slice(2)\n cli.parse(argv, { run: false })\n\n if (args.length === 0) {\n cli.outputHelp()\n return\n }\n\n await cli.runMatchedCommand()\n}\n","#!/usr/bin/env node\nimport { main } from './program.js'\n\nmain().catch(error => {\n console.error(error instanceof Error ? error.stack ?? error.message : String(error))\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.cjs","names":[],"sources":["../source/core/runtime/log.ts","../source/core/runtime/vite-config.ts","../source/cli/commands/build.ts","../source/cli/commands/check.ts","../source/cli/commands/dev.ts","../source/cli/spawn.ts","../source/cli/commands/init.ts","../source/cli/options.ts","../source/cli/program.ts","../source/cli/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\n\nconst LOG_FILE_NAME = '.clarify.log'\nconst DEFAULT_LOG_ENTRIES = 50\nconst ENTRY_SEPARATOR = '\\n\\n---\\n\\n'\n\nfunction getMaxLogEntries(): number {\n const envValue = process.env.CLARIFY_LOG_MAX_ENTRIES\n if (!envValue) return DEFAULT_LOG_ENTRIES\n const parsed = Number(envValue)\n return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_LOG_ENTRIES\n}\n\nfunction normalizeErrorMessage(error: unknown): string {\n if (error === undefined) return 'undefined'\n if (error === null) return 'null'\n if (error instanceof Error) return error.message\n if (typeof error === 'object') {\n if ('message' in error && typeof (error as { message?: unknown }).message === 'string') {\n return (error as { message: string }).message\n }\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n }\n return String(error)\n}\n\nfunction normalizeErrorStack(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.stack\n }\n return undefined\n}\n\nfunction formatLogEntry(root: string, error: unknown): string {\n const timestamp = new Date().toISOString()\n const message = normalizeErrorMessage(error)\n const stack = normalizeErrorStack(error)\n\n return [`=== Clarify build error ===`, `Timestamp: ${timestamp}`, `Project root: ${root}`, `Error: ${message}`, stack ? `Stack:\\n${stack}` : undefined]\n .filter(Boolean)\n .join('\\n')\n}\n\ntype LogEntryReader = (logPath: string) => Promise<string> | string\ntype LogEntryWriter = (logPath: string, content: string) => Promise<void> | void\n\nfunction collectLogEntries(entries: string[], entry: string, max: number): string[] {\n const next = [...entries, entry]\n return next.length > max ? next.slice(-max) : next\n}\n\nfunction readExistingEntries(content: string): string[] {\n return content\n .split(ENTRY_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean)\n}\n\nasync function writeLogEntry(root: string, error: unknown, maxEntries: number | undefined, read: LogEntryReader, write: LogEntryWriter): Promise<void> {\n const logPath = join(root, LOG_FILE_NAME)\n const entry = formatLogEntry(root, error)\n const max = maxEntries ?? getMaxLogEntries()\n\n let entries: string[] = []\n if (existsSync(logPath)) {\n try {\n entries = readExistingEntries(await read(logPath))\n } catch {\n entries = []\n }\n }\n\n entries = collectLogEntries(entries, entry, max)\n\n mkdirSync(dirname(logPath), { recursive: true })\n await write(logPath, entries.join(ENTRY_SEPARATOR) + '\\n')\n}\n\nexport async function logBuildError(root: string, error: unknown, maxEntries?: number): Promise<void> {\n await writeLogEntry(root, error, maxEntries, (path) => readFile(path, 'utf8'), (path, content) => writeFile(path, content, 'utf8'))\n}\n\nexport function logBuildErrorSync(root: string, error: unknown, maxEntries?: number): void {\n void writeLogEntry(root, error, maxEntries, (path) => readFileSync(path, 'utf8'), (path, content) => writeFileSync(path, content, 'utf8'))\n}\n","import { existsSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { createLogger } from 'vite'\nimport type { ConfigEnv, InlineConfig, Plugin, LogLevel, Logger, LogOptions, LogErrorOptions, LogType } from 'vite'\n\nimport { createViteAdapter } from '../adapters.js'\nimport type { ClarifyEngine } from '../engine/engine.js'\nimport { createClarifyTempDir } from '../project/temp-dir.js'\n\nimport { logBuildErrorSync } from './log.js'\nimport { createClarifyRuntimeAliases } from './runtime-deps.js'\n\nexport type ClarifyViteConfigOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nconst DEFAULT_HTML = '<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /><title>Clarify</title></head><body><div id=\"root\"></div></body></html>'\n\nfunction ensureHtmlEntry(root: string): string {\n const projectHtmlPath = resolve(root, 'index.html')\n if (existsSync(projectHtmlPath)) return projectHtmlPath\n\n const generatedHtmlPath = resolve(createClarifyTempDir('html'), 'index.html')\n writeFileSync(generatedHtmlPath, DEFAULT_HTML, 'utf-8')\n return generatedHtmlPath\n}\n\nfunction createClarifyLogger(root: string, env: ConfigEnv, level: LogLevel): Logger | undefined {\n if (env.command !== 'build') return undefined\n\n const baseLogger = createLogger(level, { allowClearScreen: true })\n\n return {\n info(msg: string, options?: LogOptions) {\n baseLogger.info(msg, options)\n },\n warn(msg: string, options?: LogOptions) {\n baseLogger.warn(msg, options)\n },\n warnOnce(msg: string, options?: LogOptions) {\n baseLogger.warnOnce(msg, options)\n },\n error(msg: string, options?: LogErrorOptions) {\n baseLogger.error(msg, options)\n if (options?.error) {\n logBuildErrorSync(root, options.error)\n } else {\n logBuildErrorSync(root, typeof msg === 'string' ? new Error(msg) : msg)\n }\n },\n clearScreen(type: LogType) {\n baseLogger.clearScreen(type)\n },\n hasErrorLogged(error: Error | unknown) {\n return baseLogger.hasErrorLogged(error as Error)\n },\n get hasWarned() {\n return baseLogger.hasWarned\n },\n }\n}\n\nfunction createHtmlFallbackPlugin(): Plugin {\n return {\n name: 'clarify:cli-html-fallback',\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const requestPath = req.url?.split('?')[0] ?? '/'\n const acceptsHtml = req.headers.accept?.includes('text/html') ?? false\n const hasFileExtension = /\\.[^/]+$/.test(requestPath)\n if (!acceptsHtml || hasFileExtension) {\n next()\n return\n }\n\n try {\n const html = await server.transformIndexHtml(requestPath, DEFAULT_HTML)\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(html)\n } catch (error) {\n next(error)\n }\n })\n },\n }\n}\n\nexport async function createViteConfig(options: ClarifyViteConfigOptions, env: ConfigEnv, engine: ClarifyEngine): Promise<InlineConfig> {\n const entryHtmlPath = ensureHtmlEntry(options.root)\n\n return {\n root: options.root,\n configFile: false,\n appType: 'custom',\n resolve: {\n alias: createClarifyRuntimeAliases(),\n },\n customLogger: createClarifyLogger(options.root, env, 'info'),\n plugins: [\n createViteAdapter(engine),\n createHtmlFallbackPlugin(),\n ],\n server: {\n host: options.host,\n port: options.port,\n open: options.open,\n },\n build: {\n outDir: options.output,\n rolldownOptions: {\n input: {\n index: entryHtmlPath,\n },\n checks: {\n pluginTimings: false,\n },\n output: {\n codeSplitting: {\n groups: [\n {\n name: 'react-vendor',\n test: /node_modules[\\\\/](react|react-dom|react-router|react-router-dom)[\\\\/]/,\n priority: 40,\n },\n {\n name: 'icons-vendor',\n test: /node_modules[\\\\/]lucide-react[\\\\/]/,\n priority: 35,\n },\n {\n name: 'ui-vendor',\n test: /node_modules[\\\\/](@headlessui|framer-motion)[\\\\/]/,\n priority: 30,\n },\n {\n name: 'mermaid-viewer-vendor',\n test: /node_modules[\\\\/]react-zoom-pan-pinch[\\\\/]/,\n priority: 25,\n },\n {\n // Keep mermaid and its heavy diagram/render dependencies out of\n // the eager `vendor` chunk so they stay lazily loaded only on\n // pages that actually render a diagram.\n name: 'mermaid-vendor',\n test: /node_modules[\\\\/](mermaid|@mermaid-js|cytoscape|cytoscape-[^\\\\/]+|dagre-d3-es|@dagrejs|dagre|graphlib|elkjs|katex|d3|d3-[^\\\\/]+|internmap|delaunator|robust-predicates|roughjs|points-on-curve|points-on-path|path-data-parser|@braintree[\\\\/]sanitize-url|dompurify|khroma|ts-dedent|stylis|cose-base|layout-base)[\\\\/]/,\n priority: 20,\n },\n {\n name: 'vendor',\n test: /node_modules[\\\\/]/,\n priority: 10\n },\n ],\n },\n },\n },\n },\n }\n}\n","import { build as viteBuild } from 'vite'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport { logBuildError } from '../../core/runtime/log.js'\nimport { createViteConfig } from '../../core/runtime/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runBuild(options: ResolvedCliOptions): Promise<void> {\n const env = { command: 'build' as const, mode: 'production' }\n const engine = createClarifyEngine({\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n try {\n await engine.prepare(env)\n await viteBuild(await createViteConfig(options, env, engine))\n } catch (error) {\n await logBuildError(options.root, error)\n throw error\n }\n}\n","import { lstat, stat } from 'node:fs/promises'\nimport { dirname, extname, isAbsolute, join, normalize, relative, resolve } from 'node:path'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport type { ContentRoute } from '../../types.js'\nimport type { CliOptions } from '../options.js'\n\nexport type CheckCommandOptions = CliOptions & {\n strict?: boolean\n format?: 'text' | 'json' | string\n}\n\ntype CheckLevel = 'error' | 'warning'\n\ntype CheckDiagnostic = {\n level: CheckLevel\n code: string\n message: string\n filePath?: string\n routePath?: string\n}\n\ntype CheckResult = {\n errors: CheckDiagnostic[]\n warnings: CheckDiagnostic[]\n}\n\nconst LOCAL_LINK_PATTERN = /(?<!!)(?:\\[[^\\]]*\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)|<a\\s+[^>]*href=[\"']([^\"']+)[\"'])/gi\nconst ROUTE_EXTENSIONS = new Set(['.md', '.mdx'])\nconst IGNORED_SCHEMES = /^[a-z][a-z0-9+.-]*:/i\n\nfunction addDiagnostic(result: CheckResult, diagnostic: CheckDiagnostic): void {\n if (diagnostic.level === 'error') result.errors.push(diagnostic)\n else result.warnings.push(diagnostic)\n}\n\nfunction normalizeRoutePath(path: string): string {\n const [withoutHash] = path.split('#')\n const clean = withoutHash.replace(/\\/index$/, '') || '/'\n return clean.startsWith('/') ? clean : `/${clean}`\n}\n\nfunction routePathCandidates(href: string, route: ContentRoute): string[] {\n const [withoutHashOrQuery] = href.split(/[?#]/)\n if (!withoutHashOrQuery || withoutHashOrQuery.startsWith('#')) return []\n if (withoutHashOrQuery.startsWith('/')) return [normalizeRoutePath(withoutHashOrQuery)]\n\n const routeDir = dirname(route.path)\n const joined = normalize(join(routeDir, withoutHashOrQuery)).replaceAll('\\\\', '/')\n const extension = extname(joined)\n const base = ROUTE_EXTENSIONS.has(extension) ? joined.slice(0, -extension.length) : joined\n return [normalizeRoutePath(base)]\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath)\n return true\n } catch {\n return false\n }\n}\n\nfunction isLocalHref(href: string): boolean {\n return Boolean(href) && !href.startsWith('#') && !href.startsWith('//') && !IGNORED_SCHEMES.test(href)\n}\n\nasync function resolveLocalFileLink(href: string, route: ContentRoute, contentRoot: string): Promise<boolean> {\n const [withoutHashOrQuery] = href.split(/[?#]/)\n if (!withoutHashOrQuery || withoutHashOrQuery.startsWith('/')) return false\n\n const target = resolve(dirname(route.source.filePath), withoutHashOrQuery)\n const relativeTarget = relative(contentRoot, target)\n if (relativeTarget.startsWith('..') || isAbsolute(relativeTarget)) return false\n if (await pathExists(target)) return true\n\n if (!extname(target)) {\n return pathExists(`${target}.md`) || pathExists(`${target}.mdx`) || pathExists(join(target, 'index.md')) || pathExists(join(target, 'index.mdx'))\n }\n return false\n}\n\nasync function checkContentDirectory(contentRoot: string, result: CheckResult): Promise<void> {\n try {\n const stats = await lstat(contentRoot)\n if (!stats.isDirectory()) {\n addDiagnostic(result, {\n level: 'error',\n code: 'content-not-directory',\n message: `Content path is not a directory: ${contentRoot}`,\n filePath: contentRoot,\n })\n }\n } catch {\n addDiagnostic(result, {\n level: 'error',\n code: 'content-missing',\n message: `Content directory does not exist: ${contentRoot}`,\n filePath: contentRoot,\n })\n }\n}\n\nfunction checkDuplicateRoutes(routes: ContentRoute[], result: CheckResult): void {\n const byPath = new Map<string, ContentRoute[]>()\n for (const route of routes) {\n const key = `${route.locale ?? ''}:${route.path}`\n byPath.set(key, [...(byPath.get(key) ?? []), route])\n }\n\n for (const duplicated of byPath.values()) {\n if (duplicated.length < 2) continue\n for (const route of duplicated) {\n addDiagnostic(result, {\n level: 'error',\n code: 'duplicate-route',\n message: `Route \"${route.path}\" is defined by multiple files: ${duplicated.map(route => relative(process.cwd(), route.source.filePath)).join(', ')}`,\n filePath: route.source.filePath,\n routePath: route.path,\n })\n }\n }\n}\n\nfunction checkFallbackRoutes(routes: ContentRoute[], result: CheckResult): void {\n for (const route of routes) {\n if (!route.isFallback) continue\n addDiagnostic(result, {\n level: 'warning',\n code: 'i18n-fallback-route',\n message: `Route \"${route.path}\" falls back to ${route.locale ?? 'default'} content from ${relative(process.cwd(), route.source.filePath)}`,\n filePath: route.source.filePath,\n routePath: route.path,\n })\n }\n}\n\nasync function checkLocalLinks(routes: ContentRoute[], contentRoot: string, result: CheckResult): Promise<void> {\n const routePaths = new Set(routes.map(route => route.path))\n\n for (const route of routes) {\n if (route.kind !== 'mdx' || !route.source.content) continue\n for (const match of route.source.content.matchAll(LOCAL_LINK_PATTERN)) {\n const href = match[1] ?? match[2]\n if (!href || !isLocalHref(href)) continue\n const candidates = routePathCandidates(href, route)\n if (candidates.some(candidate => routePaths.has(candidate))) continue\n if (await resolveLocalFileLink(href, route, contentRoot)) continue\n\n addDiagnostic(result, {\n level: 'error',\n code: 'broken-link',\n message: `Broken local link \"${href}\" in route \"${route.path}\"`,\n filePath: route.source.filePath,\n routePath: route.path,\n })\n }\n }\n}\n\nfunction printTextResult(result: CheckResult, strict: boolean): void {\n const diagnostics = [...result.errors, ...result.warnings]\n if (diagnostics.length === 0) {\n console.log('✓ Clarify check passed')\n return\n }\n\n for (const diagnostic of diagnostics) {\n const location = diagnostic.filePath ? ` ${relative(process.cwd(), diagnostic.filePath)}` : ''\n const route = diagnostic.routePath ? ` (${diagnostic.routePath})` : ''\n console.log(`${diagnostic.level.toUpperCase()} ${diagnostic.code}${location}${route}`)\n console.log(` ${diagnostic.message}`)\n }\n\n const warningExit = strict && result.warnings.length > 0\n console.log(`\\n${result.errors.length} error(s), ${result.warnings.length} warning(s)${warningExit ? ' (--strict treats warnings as failures)' : ''}`)\n}\n\nexport async function runCheck(options: CheckCommandOptions = {}): Promise<void> {\n const root = resolve(options.root ?? process.cwd())\n const engine = createClarifyEngine({\n projectRoot: root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n await engine.prepare(undefined, undefined, { htmlShell: false, skipModules: true, skipHints: true })\n\n const result: CheckResult = { errors: [], warnings: [] }\n await checkContentDirectory(engine.contentRoot, result)\n checkDuplicateRoutes(engine.routes, result)\n checkFallbackRoutes(engine.routes, result)\n await checkLocalLinks(engine.routes, engine.contentRoot, result)\n\n if (options.format === 'json') {\n console.log(JSON.stringify(result, null, 2))\n } else {\n printTextResult(result, Boolean(options.strict))\n }\n\n if (result.errors.length > 0 || (options.strict && result.warnings.length > 0)) {\n process.exitCode = 1\n }\n}\n","import { createServer } from 'vite'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport { createViteConfig } from '../../core/runtime/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runDev(options: ResolvedCliOptions): Promise<void> {\n const env = { command: 'serve' as const, mode: 'development' }\n const engine = createClarifyEngine({\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n await engine.prepare(env)\n const server = await createServer(await createViteConfig(options, env, engine))\n await server.listen()\n server.printUrls()\n server.bindCLIShortcuts({ print: true })\n}\n","import { spawnSync as nodeSpawnSync, SpawnSyncOptions } from 'node:child_process'\n\ntype SpawnOptions = { cwd?: string; stdio?: 'inherit' | 'ignore' | Array<string> }\n\nexport function spawnSync(command: string, args: string[], options: SpawnOptions) {\n return nodeSpawnSync(command, args, options as SpawnSyncOptions)\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { copyTemplateDirectory, getTemplateDirectory, resolveTemplate } from '@clarify-labs/templates'\n\nimport type { ResolvedCliOptions } from '../options.js'\nimport { cliPackageVersionWithCaret } from '../package.js'\nimport { spawnSync } from '../spawn.js'\n\nconst require = createRequire(import.meta.url)\n\nfunction findTemplatesPackagePath(): string {\n try {\n return require.resolve('@clarify-labs/templates/package.json')\n } catch {\n const currentDirectory = dirname(fileURLToPath(import.meta.url))\n const workspacePackagePath = resolve(currentDirectory, '../../../../templates/package.json')\n if (existsSync(workspacePackagePath)) return workspacePackagePath\n throw new Error('[clarify] Templates package not found.')\n }\n}\n\nconst templatesPackagePath = findTemplatesPackagePath()\nconst templatesDirectory = dirname(templatesPackagePath)\n\nfunction commandExists(program: string): boolean {\n const result = spawnSync(program, ['--version'], { stdio: 'ignore' })\n return result.status === 0 && result.error === undefined\n}\n\ntype InstallCommand = { command: string; args: string[] }\n\nfunction getInstallCommand(): InstallCommand {\n if (commandExists('pnpm')) return { command: 'pnpm', args: ['install'] }\n if (commandExists('npm')) return { command: 'npm', args: ['install'] }\n if (commandExists('yarn')) return { command: 'yarn', args: ['install'] }\n return { command: 'npm', args: ['install'] }\n}\n\nfunction installDependencies(root: string): void {\n const { command, args } = getInstallCommand()\n console.log(`[clarify] Installing dependencies with ${command}...`)\n const result = spawnSync(command, args, { cwd: root, stdio: 'inherit' })\n if (result.status !== 0) {\n throw new Error(`[clarify] Dependency install failed with ${command}`)\n }\n}\n\nfunction getSuggestedInstallCommand(): string {\n if (commandExists('pnpm')) return 'pnpm install'\n if (commandExists('npm')) return 'npm install'\n if (commandExists('yarn')) return 'yarn install'\n return 'npm install'\n}\n\nfunction getSuggestedRunCommand(): string {\n if (commandExists('pnpm')) return 'pnpm dev'\n if (commandExists('yarn')) return 'yarn dev'\n return 'npm run dev'\n}\n\nfunction updatePackageJson(root: string, force: boolean): boolean {\n const packageJsonPath = resolve(root, 'package.json')\n const packageJson = existsSync(packageJsonPath)\n ? JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as Record<string, unknown>\n : { type: 'module' }\n\n const scripts = typeof packageJson.scripts === 'object' && packageJson.scripts !== null\n ? packageJson.scripts as Record<string, string>\n : {}\n\n if (force || !scripts.dev) scripts.dev = 'clarify dev'\n if (force || !scripts.build) scripts.build = 'clarify build'\n packageJson.scripts = scripts\n\n const devDependencies = typeof packageJson.devDependencies === 'object' && packageJson.devDependencies !== null\n ? packageJson.devDependencies as Record<string, string>\n : {}\n if (!devDependencies['@clarify-labs/cli']) devDependencies['@clarify-labs/cli'] = cliPackageVersionWithCaret\n packageJson.devDependencies = devDependencies\n\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf-8')\n return true\n}\n\nexport function runInit(options: ResolvedCliOptions, force: boolean, template?: string, install = false): void {\n const selectedTemplate = resolveTemplate(template)\n const templateDirectory = getTemplateDirectory(templatesDirectory, selectedTemplate)\n const { created } = copyTemplateDirectory(templateDirectory, options.root, {\n contentDir: options.content,\n force,\n })\n\n const packageJsonUpdated = updatePackageJson(options.root, force)\n if (packageJsonUpdated) created.push('package.json')\n\n console.log(`[clarify] Project scaffold created using the ${selectedTemplate} template.`)\n if (created.length > 0) {\n console.log(`[clarify] Created or updated ${created.length} ${created.length === 1 ? 'file' : 'files'}: ${created.join(', ')}`)\n }\n\n if (install) {\n installDependencies(options.root)\n const suggestedRun = getSuggestedRunCommand()\n console.log('[clarify] Dependencies installed successfully.')\n console.log(`[clarify] You can now run \\`${suggestedRun}\\` to start the local documentation server.`)\n return\n }\n\n const suggestedInstall = getSuggestedInstallCommand()\n const suggestedRun = getSuggestedRunCommand()\n console.log('[clarify] Next steps:')\n console.log(' 1. Change into your new project directory:')\n console.log(` cd ${options.root}`)\n console.log(' 2. Install dependencies:')\n console.log(` ${suggestedInstall}`)\n console.log(' 3. Start the local documentation server:')\n console.log(` ${suggestedRun}`)\n}\n","import { resolve } from 'node:path'\n\nexport type CliOptions = {\n root?: string\n content?: string\n output?: string\n host?: string | boolean\n port?: string | number\n open?: boolean | string\n}\n\nexport type ResolvedCliOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nfunction resolvePort(port: CliOptions['port']): number | undefined {\n if (port === undefined) return undefined\n\n const parsedPort = typeof port === 'string' ? Number(port) : port\n if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > 65535) {\n throw new Error('[clarify] --port must be an integer between 1 and 65535')\n }\n\n return parsedPort\n}\n\nexport function resolveCliOptions(options: CliOptions): ResolvedCliOptions {\n return {\n root: resolve(options.root ?? process.cwd()),\n content: options.content ?? 'source',\n output: options.output ?? 'output',\n host: options.host,\n port: resolvePort(options.port),\n open: options.open,\n }\n}\n","import { cac } from 'cac'\n\nimport { runBuild } from './commands/build.js'\nimport { runCheck, type CheckCommandOptions } from './commands/check.js'\nimport { runDev } from './commands/dev.js'\nimport { runInit } from './commands/init.js'\nimport { resolveCliOptions, type CliOptions, type ResolvedCliOptions } from './options.js'\nimport { cliPackageVersion } from './package.js'\n\ntype InitCommandOptions = CliOptions & {\n force?: boolean\n template?: string\n install?: boolean\n}\n\nfunction withBuildOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--content <dir>', 'Content directory relative to root')\n}\n\nfunction resolveInitOptions(directory: string | undefined, options: InitCommandOptions): ResolvedCliOptions {\n return resolveOptions({\n ...options,\n root: directory,\n })\n}\n\nfunction withSharedOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--root <dir>', 'Project root directory')\n .option('--content <dir>', 'Content directory relative to root')\n .option('--output <dir>', 'Build output directory relative to root')\n}\n\nfunction resolveOptions(options: CliOptions): ResolvedCliOptions {\n return resolveCliOptions(options)\n}\n\nexport function createCli() {\n const cli = cac('clarify')\n\n cli\n .version(cliPackageVersion)\n .help()\n\n withSharedOptions(cli.command('dev', 'Start the local documentation server'))\n .option('--host [host]', 'Dev server host')\n .option('--port <port>', 'Dev server port')\n .option('--open [path]', 'Open the dev server in a browser')\n .action(async (options: CliOptions) => {\n await runDev(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('build', 'Build the static documentation site'))\n .action(async (options: CliOptions) => {\n await runBuild(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('check', 'Validate the documentation project'))\n .option('--strict', 'Treat warnings as failures')\n .option('--format <format>', 'Output format: text or json')\n .action(async (options: CheckCommandOptions) => {\n await runCheck(options)\n })\n\n withBuildOptions(cli.command('init [directory]', 'Create a Clarify project scaffold'))\n .option('--force', 'Overwrite files created by init')\n .option('--template <name>', 'Template to use: minimal, standard, or complete')\n .option('--install', 'Install dependencies after init')\n .action((directory: string | undefined, options: InitCommandOptions) => {\n runInit(resolveInitOptions(directory, options), options.force === true, options.template, options.install === true)\n })\n\n return cli\n}\n\nexport async function main(argv = process.argv): Promise<void> {\n const cli = createCli()\n const args = argv.slice(2)\n cli.parse(argv, { run: false })\n\n if (args.length === 0) {\n cli.outputHelp()\n return\n }\n\n await cli.runMatchedCommand()\n}\n","#!/usr/bin/env node\nimport { main } from './program.js'\n\nmain().catch(error => {\n console.error(error instanceof Error ? error.stack ?? error.message : String(error))\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
package/output/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as cliPackageVersion, i as createClarifyTempDir, n as createClarifyEngine, o as cliPackageVersionWithCaret, r as createClarifyRuntimeAliases, s as createViteAdapter } from "./engine-
|
|
2
|
+
import { a as cliPackageVersion, i as createClarifyTempDir, n as createClarifyEngine, o as cliPackageVersionWithCaret, r as createClarifyRuntimeAliases, s as createViteAdapter } from "./engine-Ca_2MCj9.js";
|
|
3
3
|
import { dirname, extname, isAbsolute, join, normalize, relative, resolve } from "node:path";
|
|
4
4
|
import { lstat, readFile, stat, writeFile } from "node:fs/promises";
|
|
5
5
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
@@ -173,6 +173,11 @@ async function createViteConfig(options, env, engine) {
|
|
|
173
173
|
test: /node_modules[\\/](@headlessui|framer-motion)[\\/]/,
|
|
174
174
|
priority: 30
|
|
175
175
|
},
|
|
176
|
+
{
|
|
177
|
+
name: "mermaid-viewer-vendor",
|
|
178
|
+
test: /node_modules[\\/]react-zoom-pan-pinch[\\/]/,
|
|
179
|
+
priority: 25
|
|
180
|
+
},
|
|
176
181
|
{
|
|
177
182
|
name: "mermaid-vendor",
|
|
178
183
|
test: /node_modules[\\/](mermaid|@mermaid-js|cytoscape|cytoscape-[^\\/]+|dagre-d3-es|@dagrejs|dagre|graphlib|elkjs|katex|d3|d3-[^\\/]+|internmap|delaunator|robust-predicates|roughjs|points-on-curve|points-on-path|path-data-parser|@braintree[\\/]sanitize-url|dompurify|khroma|ts-dedent|stylis|cose-base|layout-base)[\\/]/,
|
|
@@ -244,7 +249,7 @@ function isLocalHref(href) {
|
|
|
244
249
|
async function resolveLocalFileLink(href, route, contentRoot) {
|
|
245
250
|
const [withoutHashOrQuery] = href.split(/[?#]/);
|
|
246
251
|
if (!withoutHashOrQuery || withoutHashOrQuery.startsWith("/")) return false;
|
|
247
|
-
const target = resolve(dirname(route.filePath), withoutHashOrQuery);
|
|
252
|
+
const target = resolve(dirname(route.source.filePath), withoutHashOrQuery);
|
|
248
253
|
const relativeTarget = relative(contentRoot, target);
|
|
249
254
|
if (relativeTarget.startsWith("..") || isAbsolute(relativeTarget)) return false;
|
|
250
255
|
if (await pathExists(target)) return true;
|
|
@@ -279,8 +284,8 @@ function checkDuplicateRoutes(routes, result) {
|
|
|
279
284
|
for (const route of duplicated) addDiagnostic(result, {
|
|
280
285
|
level: "error",
|
|
281
286
|
code: "duplicate-route",
|
|
282
|
-
message: `Route "${route.path}" is defined by multiple files: ${duplicated.map((route) => relative(process.cwd(), route.filePath)).join(", ")}`,
|
|
283
|
-
filePath: route.filePath,
|
|
287
|
+
message: `Route "${route.path}" is defined by multiple files: ${duplicated.map((route) => relative(process.cwd(), route.source.filePath)).join(", ")}`,
|
|
288
|
+
filePath: route.source.filePath,
|
|
284
289
|
routePath: route.path
|
|
285
290
|
});
|
|
286
291
|
}
|
|
@@ -291,8 +296,8 @@ function checkFallbackRoutes(routes, result) {
|
|
|
291
296
|
addDiagnostic(result, {
|
|
292
297
|
level: "warning",
|
|
293
298
|
code: "i18n-fallback-route",
|
|
294
|
-
message: `Route "${route.path}" falls back to ${route.locale ?? "default"} content from ${relative(process.cwd(), route.filePath)}`,
|
|
295
|
-
filePath: route.filePath,
|
|
299
|
+
message: `Route "${route.path}" falls back to ${route.locale ?? "default"} content from ${relative(process.cwd(), route.source.filePath)}`,
|
|
300
|
+
filePath: route.source.filePath,
|
|
296
301
|
routePath: route.path
|
|
297
302
|
});
|
|
298
303
|
}
|
|
@@ -300,8 +305,8 @@ function checkFallbackRoutes(routes, result) {
|
|
|
300
305
|
async function checkLocalLinks(routes, contentRoot, result) {
|
|
301
306
|
const routePaths = new Set(routes.map((route) => route.path));
|
|
302
307
|
for (const route of routes) {
|
|
303
|
-
if (route.kind !== "mdx" || !route.content) continue;
|
|
304
|
-
for (const match of route.content.matchAll(LOCAL_LINK_PATTERN)) {
|
|
308
|
+
if (route.kind !== "mdx" || !route.source.content) continue;
|
|
309
|
+
for (const match of route.source.content.matchAll(LOCAL_LINK_PATTERN)) {
|
|
305
310
|
const href = match[1] ?? match[2];
|
|
306
311
|
if (!href || !isLocalHref(href)) continue;
|
|
307
312
|
if (routePathCandidates(href, route).some((candidate) => routePaths.has(candidate))) continue;
|
|
@@ -310,7 +315,7 @@ async function checkLocalLinks(routes, contentRoot, result) {
|
|
|
310
315
|
level: "error",
|
|
311
316
|
code: "broken-link",
|
|
312
317
|
message: `Broken local link "${href}" in route "${route.path}"`,
|
|
313
|
-
filePath: route.filePath,
|
|
318
|
+
filePath: route.source.filePath,
|
|
314
319
|
routePath: route.path
|
|
315
320
|
});
|
|
316
321
|
}
|
package/output/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":[],"sources":["../source/core/runtime/log.ts","../source/core/runtime/vite-config.ts","../source/cli/commands/build.ts","../source/cli/commands/check.ts","../source/cli/commands/dev.ts","../source/cli/spawn.ts","../source/cli/commands/init.ts","../source/cli/options.ts","../source/cli/program.ts","../source/cli/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\n\nconst LOG_FILE_NAME = '.clarify.log'\nconst DEFAULT_LOG_ENTRIES = 50\nconst ENTRY_SEPARATOR = '\\n\\n---\\n\\n'\n\nfunction getMaxLogEntries(): number {\n const envValue = process.env.CLARIFY_LOG_MAX_ENTRIES\n if (!envValue) return DEFAULT_LOG_ENTRIES\n const parsed = Number(envValue)\n return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_LOG_ENTRIES\n}\n\nfunction normalizeErrorMessage(error: unknown): string {\n if (error === undefined) return 'undefined'\n if (error === null) return 'null'\n if (error instanceof Error) return error.message\n if (typeof error === 'object') {\n if ('message' in error && typeof (error as { message?: unknown }).message === 'string') {\n return (error as { message: string }).message\n }\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n }\n return String(error)\n}\n\nfunction normalizeErrorStack(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.stack\n }\n return undefined\n}\n\nfunction formatLogEntry(root: string, error: unknown): string {\n const timestamp = new Date().toISOString()\n const message = normalizeErrorMessage(error)\n const stack = normalizeErrorStack(error)\n\n return [`=== Clarify build error ===`, `Timestamp: ${timestamp}`, `Project root: ${root}`, `Error: ${message}`, stack ? `Stack:\\n${stack}` : undefined]\n .filter(Boolean)\n .join('\\n')\n}\n\ntype LogEntryReader = (logPath: string) => Promise<string> | string\ntype LogEntryWriter = (logPath: string, content: string) => Promise<void> | void\n\nfunction collectLogEntries(entries: string[], entry: string, max: number): string[] {\n const next = [...entries, entry]\n return next.length > max ? next.slice(-max) : next\n}\n\nfunction readExistingEntries(content: string): string[] {\n return content\n .split(ENTRY_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean)\n}\n\nasync function writeLogEntry(root: string, error: unknown, maxEntries: number | undefined, read: LogEntryReader, write: LogEntryWriter): Promise<void> {\n const logPath = join(root, LOG_FILE_NAME)\n const entry = formatLogEntry(root, error)\n const max = maxEntries ?? getMaxLogEntries()\n\n let entries: string[] = []\n if (existsSync(logPath)) {\n try {\n entries = readExistingEntries(await read(logPath))\n } catch {\n entries = []\n }\n }\n\n entries = collectLogEntries(entries, entry, max)\n\n mkdirSync(dirname(logPath), { recursive: true })\n await write(logPath, entries.join(ENTRY_SEPARATOR) + '\\n')\n}\n\nexport async function logBuildError(root: string, error: unknown, maxEntries?: number): Promise<void> {\n await writeLogEntry(root, error, maxEntries, (path) => readFile(path, 'utf8'), (path, content) => writeFile(path, content, 'utf8'))\n}\n\nexport function logBuildErrorSync(root: string, error: unknown, maxEntries?: number): void {\n void writeLogEntry(root, error, maxEntries, (path) => readFileSync(path, 'utf8'), (path, content) => writeFileSync(path, content, 'utf8'))\n}\n","import { existsSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { createLogger } from 'vite'\nimport type { ConfigEnv, InlineConfig, Plugin, LogLevel, Logger, LogOptions, LogErrorOptions, LogType } from 'vite'\n\nimport { createViteAdapter } from '../adapters.js'\nimport type { ClarifyEngine } from '../engine/engine.js'\nimport { createClarifyTempDir } from '../project/temp-dir.js'\n\nimport { logBuildErrorSync } from './log.js'\nimport { createClarifyRuntimeAliases } from './runtime-deps.js'\n\nexport type ClarifyViteConfigOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nconst DEFAULT_HTML = '<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /><title>Clarify</title></head><body><div id=\"root\"></div></body></html>'\n\nfunction ensureHtmlEntry(root: string): string {\n const projectHtmlPath = resolve(root, 'index.html')\n if (existsSync(projectHtmlPath)) return projectHtmlPath\n\n const generatedHtmlPath = resolve(createClarifyTempDir('html'), 'index.html')\n writeFileSync(generatedHtmlPath, DEFAULT_HTML, 'utf-8')\n return generatedHtmlPath\n}\n\nfunction createClarifyLogger(root: string, env: ConfigEnv, level: LogLevel): Logger | undefined {\n if (env.command !== 'build') return undefined\n\n const baseLogger = createLogger(level, { allowClearScreen: true })\n\n return {\n info(msg: string, options?: LogOptions) {\n baseLogger.info(msg, options)\n },\n warn(msg: string, options?: LogOptions) {\n baseLogger.warn(msg, options)\n },\n warnOnce(msg: string, options?: LogOptions) {\n baseLogger.warnOnce(msg, options)\n },\n error(msg: string, options?: LogErrorOptions) {\n baseLogger.error(msg, options)\n if (options?.error) {\n logBuildErrorSync(root, options.error)\n } else {\n logBuildErrorSync(root, typeof msg === 'string' ? new Error(msg) : msg)\n }\n },\n clearScreen(type: LogType) {\n baseLogger.clearScreen(type)\n },\n hasErrorLogged(error: Error | unknown) {\n return baseLogger.hasErrorLogged(error as Error)\n },\n get hasWarned() {\n return baseLogger.hasWarned\n },\n }\n}\n\nfunction createHtmlFallbackPlugin(): Plugin {\n return {\n name: 'clarify:cli-html-fallback',\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const requestPath = req.url?.split('?')[0] ?? '/'\n const acceptsHtml = req.headers.accept?.includes('text/html') ?? false\n const hasFileExtension = /\\.[^/]+$/.test(requestPath)\n if (!acceptsHtml || hasFileExtension) {\n next()\n return\n }\n\n try {\n const html = await server.transformIndexHtml(requestPath, DEFAULT_HTML)\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(html)\n } catch (error) {\n next(error)\n }\n })\n },\n }\n}\n\nexport async function createViteConfig(options: ClarifyViteConfigOptions, env: ConfigEnv, engine: ClarifyEngine): Promise<InlineConfig> {\n const entryHtmlPath = ensureHtmlEntry(options.root)\n\n return {\n root: options.root,\n configFile: false,\n appType: 'custom',\n resolve: {\n alias: createClarifyRuntimeAliases(),\n },\n customLogger: createClarifyLogger(options.root, env, 'info'),\n plugins: [\n createViteAdapter(engine),\n createHtmlFallbackPlugin(),\n ],\n server: {\n host: options.host,\n port: options.port,\n open: options.open,\n },\n build: {\n outDir: options.output,\n rolldownOptions: {\n input: {\n index: entryHtmlPath,\n },\n checks: {\n pluginTimings: false,\n },\n output: {\n codeSplitting: {\n groups: [\n {\n name: 'react-vendor',\n test: /node_modules[\\\\/](react|react-dom|react-router|react-router-dom)[\\\\/]/,\n priority: 40,\n },\n {\n name: 'icons-vendor',\n test: /node_modules[\\\\/]lucide-react[\\\\/]/,\n priority: 35,\n },\n {\n name: 'ui-vendor',\n test: /node_modules[\\\\/](@headlessui|framer-motion)[\\\\/]/,\n priority: 30,\n },\n {\n // Keep mermaid and its heavy diagram/render dependencies out of\n // the eager `vendor` chunk so they stay lazily loaded only on\n // pages that actually render a diagram.\n name: 'mermaid-vendor',\n test: /node_modules[\\\\/](mermaid|@mermaid-js|cytoscape|cytoscape-[^\\\\/]+|dagre-d3-es|@dagrejs|dagre|graphlib|elkjs|katex|d3|d3-[^\\\\/]+|internmap|delaunator|robust-predicates|roughjs|points-on-curve|points-on-path|path-data-parser|@braintree[\\\\/]sanitize-url|dompurify|khroma|ts-dedent|stylis|cose-base|layout-base)[\\\\/]/,\n priority: 20,\n },\n {\n name: 'vendor',\n test: /node_modules[\\\\/]/,\n priority: 10\n },\n ],\n },\n },\n },\n },\n }\n}\n","import { build as viteBuild } from 'vite'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport { logBuildError } from '../../core/runtime/log.js'\nimport { createViteConfig } from '../../core/runtime/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runBuild(options: ResolvedCliOptions): Promise<void> {\n const env = { command: 'build' as const, mode: 'production' }\n const engine = createClarifyEngine({\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n try {\n await engine.prepare(env)\n await viteBuild(await createViteConfig(options, env, engine))\n } catch (error) {\n await logBuildError(options.root, error)\n throw error\n }\n}\n","import { lstat, stat } from 'node:fs/promises'\nimport { dirname, extname, isAbsolute, join, normalize, relative, resolve } from 'node:path'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport type { ContentRoute } from '../../types.js'\nimport type { CliOptions } from '../options.js'\n\nexport type CheckCommandOptions = CliOptions & {\n strict?: boolean\n format?: 'text' | 'json' | string\n}\n\ntype CheckLevel = 'error' | 'warning'\n\ntype CheckDiagnostic = {\n level: CheckLevel\n code: string\n message: string\n filePath?: string\n routePath?: string\n}\n\ntype CheckResult = {\n errors: CheckDiagnostic[]\n warnings: CheckDiagnostic[]\n}\n\nconst LOCAL_LINK_PATTERN = /(?<!!)(?:\\[[^\\]]*\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)|<a\\s+[^>]*href=[\"']([^\"']+)[\"'])/gi\nconst ROUTE_EXTENSIONS = new Set(['.md', '.mdx'])\nconst IGNORED_SCHEMES = /^[a-z][a-z0-9+.-]*:/i\n\nfunction addDiagnostic(result: CheckResult, diagnostic: CheckDiagnostic): void {\n if (diagnostic.level === 'error') result.errors.push(diagnostic)\n else result.warnings.push(diagnostic)\n}\n\nfunction normalizeRoutePath(path: string): string {\n const [withoutHash] = path.split('#')\n const clean = withoutHash.replace(/\\/index$/, '') || '/'\n return clean.startsWith('/') ? clean : `/${clean}`\n}\n\nfunction routePathCandidates(href: string, route: ContentRoute): string[] {\n const [withoutHashOrQuery] = href.split(/[?#]/)\n if (!withoutHashOrQuery || withoutHashOrQuery.startsWith('#')) return []\n if (withoutHashOrQuery.startsWith('/')) return [normalizeRoutePath(withoutHashOrQuery)]\n\n const routeDir = dirname(route.path)\n const joined = normalize(join(routeDir, withoutHashOrQuery)).replaceAll('\\\\', '/')\n const extension = extname(joined)\n const base = ROUTE_EXTENSIONS.has(extension) ? joined.slice(0, -extension.length) : joined\n return [normalizeRoutePath(base)]\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath)\n return true\n } catch {\n return false\n }\n}\n\nfunction isLocalHref(href: string): boolean {\n return Boolean(href) && !href.startsWith('#') && !href.startsWith('//') && !IGNORED_SCHEMES.test(href)\n}\n\nasync function resolveLocalFileLink(href: string, route: ContentRoute, contentRoot: string): Promise<boolean> {\n const [withoutHashOrQuery] = href.split(/[?#]/)\n if (!withoutHashOrQuery || withoutHashOrQuery.startsWith('/')) return false\n\n const target = resolve(dirname(route.filePath), withoutHashOrQuery)\n const relativeTarget = relative(contentRoot, target)\n if (relativeTarget.startsWith('..') || isAbsolute(relativeTarget)) return false\n if (await pathExists(target)) return true\n\n if (!extname(target)) {\n return pathExists(`${target}.md`) || pathExists(`${target}.mdx`) || pathExists(join(target, 'index.md')) || pathExists(join(target, 'index.mdx'))\n }\n return false\n}\n\nasync function checkContentDirectory(contentRoot: string, result: CheckResult): Promise<void> {\n try {\n const stats = await lstat(contentRoot)\n if (!stats.isDirectory()) {\n addDiagnostic(result, {\n level: 'error',\n code: 'content-not-directory',\n message: `Content path is not a directory: ${contentRoot}`,\n filePath: contentRoot,\n })\n }\n } catch {\n addDiagnostic(result, {\n level: 'error',\n code: 'content-missing',\n message: `Content directory does not exist: ${contentRoot}`,\n filePath: contentRoot,\n })\n }\n}\n\nfunction checkDuplicateRoutes(routes: ContentRoute[], result: CheckResult): void {\n const byPath = new Map<string, ContentRoute[]>()\n for (const route of routes) {\n const key = `${route.locale ?? ''}:${route.path}`\n byPath.set(key, [...(byPath.get(key) ?? []), route])\n }\n\n for (const duplicated of byPath.values()) {\n if (duplicated.length < 2) continue\n for (const route of duplicated) {\n addDiagnostic(result, {\n level: 'error',\n code: 'duplicate-route',\n message: `Route \"${route.path}\" is defined by multiple files: ${duplicated.map(route => relative(process.cwd(), route.filePath)).join(', ')}`,\n filePath: route.filePath,\n routePath: route.path,\n })\n }\n }\n}\n\nfunction checkFallbackRoutes(routes: ContentRoute[], result: CheckResult): void {\n for (const route of routes) {\n if (!route.isFallback) continue\n addDiagnostic(result, {\n level: 'warning',\n code: 'i18n-fallback-route',\n message: `Route \"${route.path}\" falls back to ${route.locale ?? 'default'} content from ${relative(process.cwd(), route.filePath)}`,\n filePath: route.filePath,\n routePath: route.path,\n })\n }\n}\n\nasync function checkLocalLinks(routes: ContentRoute[], contentRoot: string, result: CheckResult): Promise<void> {\n const routePaths = new Set(routes.map(route => route.path))\n\n for (const route of routes) {\n if (route.kind !== 'mdx' || !route.content) continue\n for (const match of route.content.matchAll(LOCAL_LINK_PATTERN)) {\n const href = match[1] ?? match[2]\n if (!href || !isLocalHref(href)) continue\n const candidates = routePathCandidates(href, route)\n if (candidates.some(candidate => routePaths.has(candidate))) continue\n if (await resolveLocalFileLink(href, route, contentRoot)) continue\n\n addDiagnostic(result, {\n level: 'error',\n code: 'broken-link',\n message: `Broken local link \"${href}\" in route \"${route.path}\"`,\n filePath: route.filePath,\n routePath: route.path,\n })\n }\n }\n}\n\nfunction printTextResult(result: CheckResult, strict: boolean): void {\n const diagnostics = [...result.errors, ...result.warnings]\n if (diagnostics.length === 0) {\n console.log('✓ Clarify check passed')\n return\n }\n\n for (const diagnostic of diagnostics) {\n const location = diagnostic.filePath ? ` ${relative(process.cwd(), diagnostic.filePath)}` : ''\n const route = diagnostic.routePath ? ` (${diagnostic.routePath})` : ''\n console.log(`${diagnostic.level.toUpperCase()} ${diagnostic.code}${location}${route}`)\n console.log(` ${diagnostic.message}`)\n }\n\n const warningExit = strict && result.warnings.length > 0\n console.log(`\\n${result.errors.length} error(s), ${result.warnings.length} warning(s)${warningExit ? ' (--strict treats warnings as failures)' : ''}`)\n}\n\nexport async function runCheck(options: CheckCommandOptions = {}): Promise<void> {\n const root = resolve(options.root ?? process.cwd())\n const engine = createClarifyEngine({\n projectRoot: root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n await engine.prepare(undefined, undefined, { htmlShell: false, skipModules: true, skipHints: true })\n\n const result: CheckResult = { errors: [], warnings: [] }\n await checkContentDirectory(engine.contentRoot, result)\n checkDuplicateRoutes(engine.routes, result)\n checkFallbackRoutes(engine.routes, result)\n await checkLocalLinks(engine.routes, engine.contentRoot, result)\n\n if (options.format === 'json') {\n console.log(JSON.stringify(result, null, 2))\n } else {\n printTextResult(result, Boolean(options.strict))\n }\n\n if (result.errors.length > 0 || (options.strict && result.warnings.length > 0)) {\n process.exitCode = 1\n }\n}\n","import { createServer } from 'vite'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport { createViteConfig } from '../../core/runtime/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runDev(options: ResolvedCliOptions): Promise<void> {\n const env = { command: 'serve' as const, mode: 'development' }\n const engine = createClarifyEngine({\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n await engine.prepare(env)\n const server = await createServer(await createViteConfig(options, env, engine))\n await server.listen()\n server.printUrls()\n server.bindCLIShortcuts({ print: true })\n}\n","import { spawnSync as nodeSpawnSync, SpawnSyncOptions } from 'node:child_process'\n\ntype SpawnOptions = { cwd?: string; stdio?: 'inherit' | 'ignore' | Array<string> }\n\nexport function spawnSync(command: string, args: string[], options: SpawnOptions) {\n return nodeSpawnSync(command, args, options as SpawnSyncOptions)\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { copyTemplateDirectory, getTemplateDirectory, resolveTemplate } from '@clarify-labs/templates'\n\nimport type { ResolvedCliOptions } from '../options.js'\nimport { cliPackageVersionWithCaret } from '../package.js'\nimport { spawnSync } from '../spawn.js'\n\nconst require = createRequire(import.meta.url)\n\nfunction findTemplatesPackagePath(): string {\n try {\n return require.resolve('@clarify-labs/templates/package.json')\n } catch {\n const currentDirectory = dirname(fileURLToPath(import.meta.url))\n const workspacePackagePath = resolve(currentDirectory, '../../../../templates/package.json')\n if (existsSync(workspacePackagePath)) return workspacePackagePath\n throw new Error('[clarify] Templates package not found.')\n }\n}\n\nconst templatesPackagePath = findTemplatesPackagePath()\nconst templatesDirectory = dirname(templatesPackagePath)\n\nfunction commandExists(program: string): boolean {\n const result = spawnSync(program, ['--version'], { stdio: 'ignore' })\n return result.status === 0 && result.error === undefined\n}\n\ntype InstallCommand = { command: string; args: string[] }\n\nfunction getInstallCommand(): InstallCommand {\n if (commandExists('pnpm')) return { command: 'pnpm', args: ['install'] }\n if (commandExists('npm')) return { command: 'npm', args: ['install'] }\n if (commandExists('yarn')) return { command: 'yarn', args: ['install'] }\n return { command: 'npm', args: ['install'] }\n}\n\nfunction installDependencies(root: string): void {\n const { command, args } = getInstallCommand()\n console.log(`[clarify] Installing dependencies with ${command}...`)\n const result = spawnSync(command, args, { cwd: root, stdio: 'inherit' })\n if (result.status !== 0) {\n throw new Error(`[clarify] Dependency install failed with ${command}`)\n }\n}\n\nfunction getSuggestedInstallCommand(): string {\n if (commandExists('pnpm')) return 'pnpm install'\n if (commandExists('npm')) return 'npm install'\n if (commandExists('yarn')) return 'yarn install'\n return 'npm install'\n}\n\nfunction getSuggestedRunCommand(): string {\n if (commandExists('pnpm')) return 'pnpm dev'\n if (commandExists('yarn')) return 'yarn dev'\n return 'npm run dev'\n}\n\nfunction updatePackageJson(root: string, force: boolean): boolean {\n const packageJsonPath = resolve(root, 'package.json')\n const packageJson = existsSync(packageJsonPath)\n ? JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as Record<string, unknown>\n : { type: 'module' }\n\n const scripts = typeof packageJson.scripts === 'object' && packageJson.scripts !== null\n ? packageJson.scripts as Record<string, string>\n : {}\n\n if (force || !scripts.dev) scripts.dev = 'clarify dev'\n if (force || !scripts.build) scripts.build = 'clarify build'\n packageJson.scripts = scripts\n\n const devDependencies = typeof packageJson.devDependencies === 'object' && packageJson.devDependencies !== null\n ? packageJson.devDependencies as Record<string, string>\n : {}\n if (!devDependencies['@clarify-labs/cli']) devDependencies['@clarify-labs/cli'] = cliPackageVersionWithCaret\n packageJson.devDependencies = devDependencies\n\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf-8')\n return true\n}\n\nexport function runInit(options: ResolvedCliOptions, force: boolean, template?: string, install = false): void {\n const selectedTemplate = resolveTemplate(template)\n const templateDirectory = getTemplateDirectory(templatesDirectory, selectedTemplate)\n const { created } = copyTemplateDirectory(templateDirectory, options.root, {\n contentDir: options.content,\n force,\n })\n\n const packageJsonUpdated = updatePackageJson(options.root, force)\n if (packageJsonUpdated) created.push('package.json')\n\n console.log(`[clarify] Project scaffold created using the ${selectedTemplate} template.`)\n if (created.length > 0) {\n console.log(`[clarify] Created or updated ${created.length} ${created.length === 1 ? 'file' : 'files'}: ${created.join(', ')}`)\n }\n\n if (install) {\n installDependencies(options.root)\n const suggestedRun = getSuggestedRunCommand()\n console.log('[clarify] Dependencies installed successfully.')\n console.log(`[clarify] You can now run \\`${suggestedRun}\\` to start the local documentation server.`)\n return\n }\n\n const suggestedInstall = getSuggestedInstallCommand()\n const suggestedRun = getSuggestedRunCommand()\n console.log('[clarify] Next steps:')\n console.log(' 1. Change into your new project directory:')\n console.log(` cd ${options.root}`)\n console.log(' 2. Install dependencies:')\n console.log(` ${suggestedInstall}`)\n console.log(' 3. Start the local documentation server:')\n console.log(` ${suggestedRun}`)\n}\n","import { resolve } from 'node:path'\n\nexport type CliOptions = {\n root?: string\n content?: string\n output?: string\n host?: string | boolean\n port?: string | number\n open?: boolean | string\n}\n\nexport type ResolvedCliOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nfunction resolvePort(port: CliOptions['port']): number | undefined {\n if (port === undefined) return undefined\n\n const parsedPort = typeof port === 'string' ? Number(port) : port\n if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > 65535) {\n throw new Error('[clarify] --port must be an integer between 1 and 65535')\n }\n\n return parsedPort\n}\n\nexport function resolveCliOptions(options: CliOptions): ResolvedCliOptions {\n return {\n root: resolve(options.root ?? process.cwd()),\n content: options.content ?? 'source',\n output: options.output ?? 'output',\n host: options.host,\n port: resolvePort(options.port),\n open: options.open,\n }\n}\n","import { cac } from 'cac'\n\nimport { runBuild } from './commands/build.js'\nimport { runCheck, type CheckCommandOptions } from './commands/check.js'\nimport { runDev } from './commands/dev.js'\nimport { runInit } from './commands/init.js'\nimport { resolveCliOptions, type CliOptions, type ResolvedCliOptions } from './options.js'\nimport { cliPackageVersion } from './package.js'\n\ntype InitCommandOptions = CliOptions & {\n force?: boolean\n template?: string\n install?: boolean\n}\n\nfunction withBuildOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--content <dir>', 'Content directory relative to root')\n}\n\nfunction resolveInitOptions(directory: string | undefined, options: InitCommandOptions): ResolvedCliOptions {\n return resolveOptions({\n ...options,\n root: directory,\n })\n}\n\nfunction withSharedOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--root <dir>', 'Project root directory')\n .option('--content <dir>', 'Content directory relative to root')\n .option('--output <dir>', 'Build output directory relative to root')\n}\n\nfunction resolveOptions(options: CliOptions): ResolvedCliOptions {\n return resolveCliOptions(options)\n}\n\nexport function createCli() {\n const cli = cac('clarify')\n\n cli\n .version(cliPackageVersion)\n .help()\n\n withSharedOptions(cli.command('dev', 'Start the local documentation server'))\n .option('--host [host]', 'Dev server host')\n .option('--port <port>', 'Dev server port')\n .option('--open [path]', 'Open the dev server in a browser')\n .action(async (options: CliOptions) => {\n await runDev(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('build', 'Build the static documentation site'))\n .action(async (options: CliOptions) => {\n await runBuild(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('check', 'Validate the documentation project'))\n .option('--strict', 'Treat warnings as failures')\n .option('--format <format>', 'Output format: text or json')\n .action(async (options: CheckCommandOptions) => {\n await runCheck(options)\n })\n\n withBuildOptions(cli.command('init [directory]', 'Create a Clarify project scaffold'))\n .option('--force', 'Overwrite files created by init')\n .option('--template <name>', 'Template to use: minimal, standard, or complete')\n .option('--install', 'Install dependencies after init')\n .action((directory: string | undefined, options: InitCommandOptions) => {\n runInit(resolveInitOptions(directory, options), options.force === true, options.template, options.install === true)\n })\n\n return cli\n}\n\nexport async function main(argv = process.argv): Promise<void> {\n const cli = createCli()\n const args = argv.slice(2)\n cli.parse(argv, { run: false })\n\n if (args.length === 0) {\n cli.outputHelp()\n return\n }\n\n await cli.runMatchedCommand()\n}\n","#!/usr/bin/env node\nimport { main } from './program.js'\n\nmain().catch(error => {\n console.error(error instanceof Error ? error.stack ?? error.message : String(error))\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","names":[],"sources":["../source/core/runtime/log.ts","../source/core/runtime/vite-config.ts","../source/cli/commands/build.ts","../source/cli/commands/check.ts","../source/cli/commands/dev.ts","../source/cli/spawn.ts","../source/cli/commands/init.ts","../source/cli/options.ts","../source/cli/program.ts","../source/cli/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\n\nconst LOG_FILE_NAME = '.clarify.log'\nconst DEFAULT_LOG_ENTRIES = 50\nconst ENTRY_SEPARATOR = '\\n\\n---\\n\\n'\n\nfunction getMaxLogEntries(): number {\n const envValue = process.env.CLARIFY_LOG_MAX_ENTRIES\n if (!envValue) return DEFAULT_LOG_ENTRIES\n const parsed = Number(envValue)\n return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_LOG_ENTRIES\n}\n\nfunction normalizeErrorMessage(error: unknown): string {\n if (error === undefined) return 'undefined'\n if (error === null) return 'null'\n if (error instanceof Error) return error.message\n if (typeof error === 'object') {\n if ('message' in error && typeof (error as { message?: unknown }).message === 'string') {\n return (error as { message: string }).message\n }\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n }\n return String(error)\n}\n\nfunction normalizeErrorStack(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.stack\n }\n return undefined\n}\n\nfunction formatLogEntry(root: string, error: unknown): string {\n const timestamp = new Date().toISOString()\n const message = normalizeErrorMessage(error)\n const stack = normalizeErrorStack(error)\n\n return [`=== Clarify build error ===`, `Timestamp: ${timestamp}`, `Project root: ${root}`, `Error: ${message}`, stack ? `Stack:\\n${stack}` : undefined]\n .filter(Boolean)\n .join('\\n')\n}\n\ntype LogEntryReader = (logPath: string) => Promise<string> | string\ntype LogEntryWriter = (logPath: string, content: string) => Promise<void> | void\n\nfunction collectLogEntries(entries: string[], entry: string, max: number): string[] {\n const next = [...entries, entry]\n return next.length > max ? next.slice(-max) : next\n}\n\nfunction readExistingEntries(content: string): string[] {\n return content\n .split(ENTRY_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean)\n}\n\nasync function writeLogEntry(root: string, error: unknown, maxEntries: number | undefined, read: LogEntryReader, write: LogEntryWriter): Promise<void> {\n const logPath = join(root, LOG_FILE_NAME)\n const entry = formatLogEntry(root, error)\n const max = maxEntries ?? getMaxLogEntries()\n\n let entries: string[] = []\n if (existsSync(logPath)) {\n try {\n entries = readExistingEntries(await read(logPath))\n } catch {\n entries = []\n }\n }\n\n entries = collectLogEntries(entries, entry, max)\n\n mkdirSync(dirname(logPath), { recursive: true })\n await write(logPath, entries.join(ENTRY_SEPARATOR) + '\\n')\n}\n\nexport async function logBuildError(root: string, error: unknown, maxEntries?: number): Promise<void> {\n await writeLogEntry(root, error, maxEntries, (path) => readFile(path, 'utf8'), (path, content) => writeFile(path, content, 'utf8'))\n}\n\nexport function logBuildErrorSync(root: string, error: unknown, maxEntries?: number): void {\n void writeLogEntry(root, error, maxEntries, (path) => readFileSync(path, 'utf8'), (path, content) => writeFileSync(path, content, 'utf8'))\n}\n","import { existsSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { createLogger } from 'vite'\nimport type { ConfigEnv, InlineConfig, Plugin, LogLevel, Logger, LogOptions, LogErrorOptions, LogType } from 'vite'\n\nimport { createViteAdapter } from '../adapters.js'\nimport type { ClarifyEngine } from '../engine/engine.js'\nimport { createClarifyTempDir } from '../project/temp-dir.js'\n\nimport { logBuildErrorSync } from './log.js'\nimport { createClarifyRuntimeAliases } from './runtime-deps.js'\n\nexport type ClarifyViteConfigOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nconst DEFAULT_HTML = '<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /><title>Clarify</title></head><body><div id=\"root\"></div></body></html>'\n\nfunction ensureHtmlEntry(root: string): string {\n const projectHtmlPath = resolve(root, 'index.html')\n if (existsSync(projectHtmlPath)) return projectHtmlPath\n\n const generatedHtmlPath = resolve(createClarifyTempDir('html'), 'index.html')\n writeFileSync(generatedHtmlPath, DEFAULT_HTML, 'utf-8')\n return generatedHtmlPath\n}\n\nfunction createClarifyLogger(root: string, env: ConfigEnv, level: LogLevel): Logger | undefined {\n if (env.command !== 'build') return undefined\n\n const baseLogger = createLogger(level, { allowClearScreen: true })\n\n return {\n info(msg: string, options?: LogOptions) {\n baseLogger.info(msg, options)\n },\n warn(msg: string, options?: LogOptions) {\n baseLogger.warn(msg, options)\n },\n warnOnce(msg: string, options?: LogOptions) {\n baseLogger.warnOnce(msg, options)\n },\n error(msg: string, options?: LogErrorOptions) {\n baseLogger.error(msg, options)\n if (options?.error) {\n logBuildErrorSync(root, options.error)\n } else {\n logBuildErrorSync(root, typeof msg === 'string' ? new Error(msg) : msg)\n }\n },\n clearScreen(type: LogType) {\n baseLogger.clearScreen(type)\n },\n hasErrorLogged(error: Error | unknown) {\n return baseLogger.hasErrorLogged(error as Error)\n },\n get hasWarned() {\n return baseLogger.hasWarned\n },\n }\n}\n\nfunction createHtmlFallbackPlugin(): Plugin {\n return {\n name: 'clarify:cli-html-fallback',\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const requestPath = req.url?.split('?')[0] ?? '/'\n const acceptsHtml = req.headers.accept?.includes('text/html') ?? false\n const hasFileExtension = /\\.[^/]+$/.test(requestPath)\n if (!acceptsHtml || hasFileExtension) {\n next()\n return\n }\n\n try {\n const html = await server.transformIndexHtml(requestPath, DEFAULT_HTML)\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(html)\n } catch (error) {\n next(error)\n }\n })\n },\n }\n}\n\nexport async function createViteConfig(options: ClarifyViteConfigOptions, env: ConfigEnv, engine: ClarifyEngine): Promise<InlineConfig> {\n const entryHtmlPath = ensureHtmlEntry(options.root)\n\n return {\n root: options.root,\n configFile: false,\n appType: 'custom',\n resolve: {\n alias: createClarifyRuntimeAliases(),\n },\n customLogger: createClarifyLogger(options.root, env, 'info'),\n plugins: [\n createViteAdapter(engine),\n createHtmlFallbackPlugin(),\n ],\n server: {\n host: options.host,\n port: options.port,\n open: options.open,\n },\n build: {\n outDir: options.output,\n rolldownOptions: {\n input: {\n index: entryHtmlPath,\n },\n checks: {\n pluginTimings: false,\n },\n output: {\n codeSplitting: {\n groups: [\n {\n name: 'react-vendor',\n test: /node_modules[\\\\/](react|react-dom|react-router|react-router-dom)[\\\\/]/,\n priority: 40,\n },\n {\n name: 'icons-vendor',\n test: /node_modules[\\\\/]lucide-react[\\\\/]/,\n priority: 35,\n },\n {\n name: 'ui-vendor',\n test: /node_modules[\\\\/](@headlessui|framer-motion)[\\\\/]/,\n priority: 30,\n },\n {\n name: 'mermaid-viewer-vendor',\n test: /node_modules[\\\\/]react-zoom-pan-pinch[\\\\/]/,\n priority: 25,\n },\n {\n // Keep mermaid and its heavy diagram/render dependencies out of\n // the eager `vendor` chunk so they stay lazily loaded only on\n // pages that actually render a diagram.\n name: 'mermaid-vendor',\n test: /node_modules[\\\\/](mermaid|@mermaid-js|cytoscape|cytoscape-[^\\\\/]+|dagre-d3-es|@dagrejs|dagre|graphlib|elkjs|katex|d3|d3-[^\\\\/]+|internmap|delaunator|robust-predicates|roughjs|points-on-curve|points-on-path|path-data-parser|@braintree[\\\\/]sanitize-url|dompurify|khroma|ts-dedent|stylis|cose-base|layout-base)[\\\\/]/,\n priority: 20,\n },\n {\n name: 'vendor',\n test: /node_modules[\\\\/]/,\n priority: 10\n },\n ],\n },\n },\n },\n },\n }\n}\n","import { build as viteBuild } from 'vite'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport { logBuildError } from '../../core/runtime/log.js'\nimport { createViteConfig } from '../../core/runtime/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runBuild(options: ResolvedCliOptions): Promise<void> {\n const env = { command: 'build' as const, mode: 'production' }\n const engine = createClarifyEngine({\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n try {\n await engine.prepare(env)\n await viteBuild(await createViteConfig(options, env, engine))\n } catch (error) {\n await logBuildError(options.root, error)\n throw error\n }\n}\n","import { lstat, stat } from 'node:fs/promises'\nimport { dirname, extname, isAbsolute, join, normalize, relative, resolve } from 'node:path'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport type { ContentRoute } from '../../types.js'\nimport type { CliOptions } from '../options.js'\n\nexport type CheckCommandOptions = CliOptions & {\n strict?: boolean\n format?: 'text' | 'json' | string\n}\n\ntype CheckLevel = 'error' | 'warning'\n\ntype CheckDiagnostic = {\n level: CheckLevel\n code: string\n message: string\n filePath?: string\n routePath?: string\n}\n\ntype CheckResult = {\n errors: CheckDiagnostic[]\n warnings: CheckDiagnostic[]\n}\n\nconst LOCAL_LINK_PATTERN = /(?<!!)(?:\\[[^\\]]*\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)|<a\\s+[^>]*href=[\"']([^\"']+)[\"'])/gi\nconst ROUTE_EXTENSIONS = new Set(['.md', '.mdx'])\nconst IGNORED_SCHEMES = /^[a-z][a-z0-9+.-]*:/i\n\nfunction addDiagnostic(result: CheckResult, diagnostic: CheckDiagnostic): void {\n if (diagnostic.level === 'error') result.errors.push(diagnostic)\n else result.warnings.push(diagnostic)\n}\n\nfunction normalizeRoutePath(path: string): string {\n const [withoutHash] = path.split('#')\n const clean = withoutHash.replace(/\\/index$/, '') || '/'\n return clean.startsWith('/') ? clean : `/${clean}`\n}\n\nfunction routePathCandidates(href: string, route: ContentRoute): string[] {\n const [withoutHashOrQuery] = href.split(/[?#]/)\n if (!withoutHashOrQuery || withoutHashOrQuery.startsWith('#')) return []\n if (withoutHashOrQuery.startsWith('/')) return [normalizeRoutePath(withoutHashOrQuery)]\n\n const routeDir = dirname(route.path)\n const joined = normalize(join(routeDir, withoutHashOrQuery)).replaceAll('\\\\', '/')\n const extension = extname(joined)\n const base = ROUTE_EXTENSIONS.has(extension) ? joined.slice(0, -extension.length) : joined\n return [normalizeRoutePath(base)]\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath)\n return true\n } catch {\n return false\n }\n}\n\nfunction isLocalHref(href: string): boolean {\n return Boolean(href) && !href.startsWith('#') && !href.startsWith('//') && !IGNORED_SCHEMES.test(href)\n}\n\nasync function resolveLocalFileLink(href: string, route: ContentRoute, contentRoot: string): Promise<boolean> {\n const [withoutHashOrQuery] = href.split(/[?#]/)\n if (!withoutHashOrQuery || withoutHashOrQuery.startsWith('/')) return false\n\n const target = resolve(dirname(route.source.filePath), withoutHashOrQuery)\n const relativeTarget = relative(contentRoot, target)\n if (relativeTarget.startsWith('..') || isAbsolute(relativeTarget)) return false\n if (await pathExists(target)) return true\n\n if (!extname(target)) {\n return pathExists(`${target}.md`) || pathExists(`${target}.mdx`) || pathExists(join(target, 'index.md')) || pathExists(join(target, 'index.mdx'))\n }\n return false\n}\n\nasync function checkContentDirectory(contentRoot: string, result: CheckResult): Promise<void> {\n try {\n const stats = await lstat(contentRoot)\n if (!stats.isDirectory()) {\n addDiagnostic(result, {\n level: 'error',\n code: 'content-not-directory',\n message: `Content path is not a directory: ${contentRoot}`,\n filePath: contentRoot,\n })\n }\n } catch {\n addDiagnostic(result, {\n level: 'error',\n code: 'content-missing',\n message: `Content directory does not exist: ${contentRoot}`,\n filePath: contentRoot,\n })\n }\n}\n\nfunction checkDuplicateRoutes(routes: ContentRoute[], result: CheckResult): void {\n const byPath = new Map<string, ContentRoute[]>()\n for (const route of routes) {\n const key = `${route.locale ?? ''}:${route.path}`\n byPath.set(key, [...(byPath.get(key) ?? []), route])\n }\n\n for (const duplicated of byPath.values()) {\n if (duplicated.length < 2) continue\n for (const route of duplicated) {\n addDiagnostic(result, {\n level: 'error',\n code: 'duplicate-route',\n message: `Route \"${route.path}\" is defined by multiple files: ${duplicated.map(route => relative(process.cwd(), route.source.filePath)).join(', ')}`,\n filePath: route.source.filePath,\n routePath: route.path,\n })\n }\n }\n}\n\nfunction checkFallbackRoutes(routes: ContentRoute[], result: CheckResult): void {\n for (const route of routes) {\n if (!route.isFallback) continue\n addDiagnostic(result, {\n level: 'warning',\n code: 'i18n-fallback-route',\n message: `Route \"${route.path}\" falls back to ${route.locale ?? 'default'} content from ${relative(process.cwd(), route.source.filePath)}`,\n filePath: route.source.filePath,\n routePath: route.path,\n })\n }\n}\n\nasync function checkLocalLinks(routes: ContentRoute[], contentRoot: string, result: CheckResult): Promise<void> {\n const routePaths = new Set(routes.map(route => route.path))\n\n for (const route of routes) {\n if (route.kind !== 'mdx' || !route.source.content) continue\n for (const match of route.source.content.matchAll(LOCAL_LINK_PATTERN)) {\n const href = match[1] ?? match[2]\n if (!href || !isLocalHref(href)) continue\n const candidates = routePathCandidates(href, route)\n if (candidates.some(candidate => routePaths.has(candidate))) continue\n if (await resolveLocalFileLink(href, route, contentRoot)) continue\n\n addDiagnostic(result, {\n level: 'error',\n code: 'broken-link',\n message: `Broken local link \"${href}\" in route \"${route.path}\"`,\n filePath: route.source.filePath,\n routePath: route.path,\n })\n }\n }\n}\n\nfunction printTextResult(result: CheckResult, strict: boolean): void {\n const diagnostics = [...result.errors, ...result.warnings]\n if (diagnostics.length === 0) {\n console.log('✓ Clarify check passed')\n return\n }\n\n for (const diagnostic of diagnostics) {\n const location = diagnostic.filePath ? ` ${relative(process.cwd(), diagnostic.filePath)}` : ''\n const route = diagnostic.routePath ? ` (${diagnostic.routePath})` : ''\n console.log(`${diagnostic.level.toUpperCase()} ${diagnostic.code}${location}${route}`)\n console.log(` ${diagnostic.message}`)\n }\n\n const warningExit = strict && result.warnings.length > 0\n console.log(`\\n${result.errors.length} error(s), ${result.warnings.length} warning(s)${warningExit ? ' (--strict treats warnings as failures)' : ''}`)\n}\n\nexport async function runCheck(options: CheckCommandOptions = {}): Promise<void> {\n const root = resolve(options.root ?? process.cwd())\n const engine = createClarifyEngine({\n projectRoot: root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n await engine.prepare(undefined, undefined, { htmlShell: false, skipModules: true, skipHints: true })\n\n const result: CheckResult = { errors: [], warnings: [] }\n await checkContentDirectory(engine.contentRoot, result)\n checkDuplicateRoutes(engine.routes, result)\n checkFallbackRoutes(engine.routes, result)\n await checkLocalLinks(engine.routes, engine.contentRoot, result)\n\n if (options.format === 'json') {\n console.log(JSON.stringify(result, null, 2))\n } else {\n printTextResult(result, Boolean(options.strict))\n }\n\n if (result.errors.length > 0 || (options.strict && result.warnings.length > 0)) {\n process.exitCode = 1\n }\n}\n","import { createServer } from 'vite'\n\nimport { createClarifyEngine } from '../../core/engine/engine.js'\nimport { createViteConfig } from '../../core/runtime/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runDev(options: ResolvedCliOptions): Promise<void> {\n const env = { command: 'serve' as const, mode: 'development' }\n const engine = createClarifyEngine({\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n })\n await engine.prepare(env)\n const server = await createServer(await createViteConfig(options, env, engine))\n await server.listen()\n server.printUrls()\n server.bindCLIShortcuts({ print: true })\n}\n","import { spawnSync as nodeSpawnSync, SpawnSyncOptions } from 'node:child_process'\n\ntype SpawnOptions = { cwd?: string; stdio?: 'inherit' | 'ignore' | Array<string> }\n\nexport function spawnSync(command: string, args: string[], options: SpawnOptions) {\n return nodeSpawnSync(command, args, options as SpawnSyncOptions)\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { copyTemplateDirectory, getTemplateDirectory, resolveTemplate } from '@clarify-labs/templates'\n\nimport type { ResolvedCliOptions } from '../options.js'\nimport { cliPackageVersionWithCaret } from '../package.js'\nimport { spawnSync } from '../spawn.js'\n\nconst require = createRequire(import.meta.url)\n\nfunction findTemplatesPackagePath(): string {\n try {\n return require.resolve('@clarify-labs/templates/package.json')\n } catch {\n const currentDirectory = dirname(fileURLToPath(import.meta.url))\n const workspacePackagePath = resolve(currentDirectory, '../../../../templates/package.json')\n if (existsSync(workspacePackagePath)) return workspacePackagePath\n throw new Error('[clarify] Templates package not found.')\n }\n}\n\nconst templatesPackagePath = findTemplatesPackagePath()\nconst templatesDirectory = dirname(templatesPackagePath)\n\nfunction commandExists(program: string): boolean {\n const result = spawnSync(program, ['--version'], { stdio: 'ignore' })\n return result.status === 0 && result.error === undefined\n}\n\ntype InstallCommand = { command: string; args: string[] }\n\nfunction getInstallCommand(): InstallCommand {\n if (commandExists('pnpm')) return { command: 'pnpm', args: ['install'] }\n if (commandExists('npm')) return { command: 'npm', args: ['install'] }\n if (commandExists('yarn')) return { command: 'yarn', args: ['install'] }\n return { command: 'npm', args: ['install'] }\n}\n\nfunction installDependencies(root: string): void {\n const { command, args } = getInstallCommand()\n console.log(`[clarify] Installing dependencies with ${command}...`)\n const result = spawnSync(command, args, { cwd: root, stdio: 'inherit' })\n if (result.status !== 0) {\n throw new Error(`[clarify] Dependency install failed with ${command}`)\n }\n}\n\nfunction getSuggestedInstallCommand(): string {\n if (commandExists('pnpm')) return 'pnpm install'\n if (commandExists('npm')) return 'npm install'\n if (commandExists('yarn')) return 'yarn install'\n return 'npm install'\n}\n\nfunction getSuggestedRunCommand(): string {\n if (commandExists('pnpm')) return 'pnpm dev'\n if (commandExists('yarn')) return 'yarn dev'\n return 'npm run dev'\n}\n\nfunction updatePackageJson(root: string, force: boolean): boolean {\n const packageJsonPath = resolve(root, 'package.json')\n const packageJson = existsSync(packageJsonPath)\n ? JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as Record<string, unknown>\n : { type: 'module' }\n\n const scripts = typeof packageJson.scripts === 'object' && packageJson.scripts !== null\n ? packageJson.scripts as Record<string, string>\n : {}\n\n if (force || !scripts.dev) scripts.dev = 'clarify dev'\n if (force || !scripts.build) scripts.build = 'clarify build'\n packageJson.scripts = scripts\n\n const devDependencies = typeof packageJson.devDependencies === 'object' && packageJson.devDependencies !== null\n ? packageJson.devDependencies as Record<string, string>\n : {}\n if (!devDependencies['@clarify-labs/cli']) devDependencies['@clarify-labs/cli'] = cliPackageVersionWithCaret\n packageJson.devDependencies = devDependencies\n\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf-8')\n return true\n}\n\nexport function runInit(options: ResolvedCliOptions, force: boolean, template?: string, install = false): void {\n const selectedTemplate = resolveTemplate(template)\n const templateDirectory = getTemplateDirectory(templatesDirectory, selectedTemplate)\n const { created } = copyTemplateDirectory(templateDirectory, options.root, {\n contentDir: options.content,\n force,\n })\n\n const packageJsonUpdated = updatePackageJson(options.root, force)\n if (packageJsonUpdated) created.push('package.json')\n\n console.log(`[clarify] Project scaffold created using the ${selectedTemplate} template.`)\n if (created.length > 0) {\n console.log(`[clarify] Created or updated ${created.length} ${created.length === 1 ? 'file' : 'files'}: ${created.join(', ')}`)\n }\n\n if (install) {\n installDependencies(options.root)\n const suggestedRun = getSuggestedRunCommand()\n console.log('[clarify] Dependencies installed successfully.')\n console.log(`[clarify] You can now run \\`${suggestedRun}\\` to start the local documentation server.`)\n return\n }\n\n const suggestedInstall = getSuggestedInstallCommand()\n const suggestedRun = getSuggestedRunCommand()\n console.log('[clarify] Next steps:')\n console.log(' 1. Change into your new project directory:')\n console.log(` cd ${options.root}`)\n console.log(' 2. Install dependencies:')\n console.log(` ${suggestedInstall}`)\n console.log(' 3. Start the local documentation server:')\n console.log(` ${suggestedRun}`)\n}\n","import { resolve } from 'node:path'\n\nexport type CliOptions = {\n root?: string\n content?: string\n output?: string\n host?: string | boolean\n port?: string | number\n open?: boolean | string\n}\n\nexport type ResolvedCliOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nfunction resolvePort(port: CliOptions['port']): number | undefined {\n if (port === undefined) return undefined\n\n const parsedPort = typeof port === 'string' ? Number(port) : port\n if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > 65535) {\n throw new Error('[clarify] --port must be an integer between 1 and 65535')\n }\n\n return parsedPort\n}\n\nexport function resolveCliOptions(options: CliOptions): ResolvedCliOptions {\n return {\n root: resolve(options.root ?? process.cwd()),\n content: options.content ?? 'source',\n output: options.output ?? 'output',\n host: options.host,\n port: resolvePort(options.port),\n open: options.open,\n }\n}\n","import { cac } from 'cac'\n\nimport { runBuild } from './commands/build.js'\nimport { runCheck, type CheckCommandOptions } from './commands/check.js'\nimport { runDev } from './commands/dev.js'\nimport { runInit } from './commands/init.js'\nimport { resolveCliOptions, type CliOptions, type ResolvedCliOptions } from './options.js'\nimport { cliPackageVersion } from './package.js'\n\ntype InitCommandOptions = CliOptions & {\n force?: boolean\n template?: string\n install?: boolean\n}\n\nfunction withBuildOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--content <dir>', 'Content directory relative to root')\n}\n\nfunction resolveInitOptions(directory: string | undefined, options: InitCommandOptions): ResolvedCliOptions {\n return resolveOptions({\n ...options,\n root: directory,\n })\n}\n\nfunction withSharedOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--root <dir>', 'Project root directory')\n .option('--content <dir>', 'Content directory relative to root')\n .option('--output <dir>', 'Build output directory relative to root')\n}\n\nfunction resolveOptions(options: CliOptions): ResolvedCliOptions {\n return resolveCliOptions(options)\n}\n\nexport function createCli() {\n const cli = cac('clarify')\n\n cli\n .version(cliPackageVersion)\n .help()\n\n withSharedOptions(cli.command('dev', 'Start the local documentation server'))\n .option('--host [host]', 'Dev server host')\n .option('--port <port>', 'Dev server port')\n .option('--open [path]', 'Open the dev server in a browser')\n .action(async (options: CliOptions) => {\n await runDev(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('build', 'Build the static documentation site'))\n .action(async (options: CliOptions) => {\n await runBuild(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('check', 'Validate the documentation project'))\n .option('--strict', 'Treat warnings as failures')\n .option('--format <format>', 'Output format: text or json')\n .action(async (options: CheckCommandOptions) => {\n await runCheck(options)\n })\n\n withBuildOptions(cli.command('init [directory]', 'Create a Clarify project scaffold'))\n .option('--force', 'Overwrite files created by init')\n .option('--template <name>', 'Template to use: minimal, standard, or complete')\n .option('--install', 'Install dependencies after init')\n .action((directory: string | undefined, options: InitCommandOptions) => {\n runInit(resolveInitOptions(directory, options), options.force === true, options.template, options.install === true)\n })\n\n return cli\n}\n\nexport async function main(argv = process.argv): Promise<void> {\n const cli = createCli()\n const args = argv.slice(2)\n cli.parse(argv, { run: false })\n\n if (args.length === 0) {\n cli.outputHelp()\n return\n }\n\n await cli.runMatchedCommand()\n}\n","#!/usr/bin/env node\nimport { main } from './program.js'\n\nmain().catch(error => {\n console.error(error instanceof Error ? error.stack ?? error.message : String(error))\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { ClarifyHookContext, ClarifyPlugin } from '../../types.js';
|
|
1
|
+
import { ClarifyCollectorHook, ClarifyHookContext, ClarifyInterceptHook, ClarifyPipelineHook, ClarifyPlugin, ClarifyTapHook } from '../../types.js';
|
|
2
2
|
export type PhaseName = 'config:load' | 'config:resolve' | 'plugins:load' | 'site:discover' | 'content:process' | 'modules:build' | 'build' | 'ssg' | 'dev:server';
|
|
3
3
|
export type TapPhaseName = `before:${PhaseName}` | `after:${PhaseName}`;
|
|
4
|
-
export type TapHook =
|
|
5
|
-
export type InterceptHook =
|
|
6
|
-
export type PipelineHook<Input> =
|
|
7
|
-
export type CollectorHook<Result> =
|
|
4
|
+
export type TapHook = ClarifyTapHook;
|
|
5
|
+
export type InterceptHook = ClarifyInterceptHook;
|
|
6
|
+
export type PipelineHook<Input> = ClarifyPipelineHook<Input>;
|
|
7
|
+
export type CollectorHook<Result> = ClarifyCollectorHook<Result>;
|
|
8
8
|
export declare function runTapHooks(plugins: ClarifyPlugin[], hookName: TapPhaseName, ctx: ClarifyHookContext): Promise<void>;
|
|
9
9
|
export declare function runInterceptHooks(plugins: ClarifyPlugin[], hookName: 'build:shouldRun' | 'ssg:shouldRun', ctx: ClarifyHookContext): Promise<boolean>;
|
|
10
10
|
export declare function runPhase<T>(plugins: ClarifyPlugin[], phase: PhaseName, ctx: ClarifyHookContext, task: () => Promise<T> | T): Promise<T>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ViteDevServer } from 'vite';
|
|
2
|
-
import { ClarifyEmitAsset, ClarifyHookContext,
|
|
3
|
-
export declare function runHooks<K extends
|
|
2
|
+
import { ClarifyEmitAsset, ClarifyHookContext, ClarifyPipelineHooks, ClarifyPlugin } from '../../types.js';
|
|
3
|
+
export declare function runHooks<K extends keyof ClarifyPipelineHooks>(plugins: ClarifyPlugin[], hookName: K, input: Parameters<NonNullable<ClarifyPipelineHooks[K]>>[0], ctx: ClarifyHookContext): Promise<Parameters<NonNullable<ClarifyPipelineHooks[K]>>[0]>;
|
|
4
4
|
export declare function runDevConfigureServerHooks(plugins: ClarifyPlugin[], server: ViteDevServer, ctx: ClarifyHookContext): Promise<void>;
|
|
5
5
|
export declare function runCollectorHooks<T>(plugins: ClarifyPlugin[], hookName: string, ctx: ClarifyHookContext): Promise<T[]>;
|
|
6
6
|
export declare function runBuildAssetsHooks(plugins: ClarifyPlugin[], ctx: ClarifyHookContext): Promise<ClarifyEmitAsset[]>;
|
|
@@ -4,7 +4,7 @@ export { injectSSRIntoTemplate } from './html-template.js';
|
|
|
4
4
|
export declare function readIndexHtml(outputDirectory: string): string | undefined;
|
|
5
5
|
export declare function isNotFoundRoute(route: ContentRoute): boolean;
|
|
6
6
|
export declare function routeOutputFiles(outputDirectory: string, route: ContentRoute): string[];
|
|
7
|
-
export declare const SSR_ENTRY_CODE = "import { renderToHTML } from '@clarify-labs/renderer/server';\nimport { routes, navigation } from 'virtual:clarify/routes/server';\nimport { config } from 'virtual:clarify/config';\nimport {
|
|
7
|
+
export declare const SSR_ENTRY_CODE = "import { renderToHTML } from '@clarify-labs/renderer/server';\nimport { routes, navigation } from 'virtual:clarify/routes/server';\nimport { config } from 'virtual:clarify/config';\nimport { openApiSpecs } from 'virtual:clarify/openapi/server';\nimport { runtimeSlots } from 'virtual:clarify/slots';\n\nexport async function render(url) {\n // Pre-resolve every slot component factory so renderToString can use\n // them synchronously (renderToString has no Suspense support).\n const entries = Object.values(runtimeSlots).flat()\n await Promise.all(entries.map(async (entry) => {\n const mod = await entry.loadComponent()\n entry._resolved = mod.default\n }))\n return renderToHTML({ config, routes, navigation, openApiSpecs, runtimeSlots, url, themeEditor: config.theme.editor });\n}";
|
|
8
8
|
export declare function createTempEntryFile(content: string): string;
|
|
9
9
|
export declare function buildSSRBundle(root: string, ssrEntry: string, ssrOutDir: string, plugins: Plugin[]): Promise<void>;
|
|
10
10
|
export declare function renderSSGRoutes(routes: ContentRoute[], contextOrConfig: ClarifyProjectContext | ResolvedProjectConfig, outputDirectory: string, ssrBundlePath: string, failOnError?: boolean): Promise<void>;
|
|
@@ -3,6 +3,7 @@ export declare const VIRTUAL_CONFIG = "virtual:clarify/config";
|
|
|
3
3
|
export declare const VIRTUAL_ROUTES = "virtual:clarify/routes";
|
|
4
4
|
export declare const VIRTUAL_SERVER_ROUTES = "virtual:clarify/routes/server";
|
|
5
5
|
export declare const VIRTUAL_OPENAPI = "virtual:clarify/openapi";
|
|
6
|
+
export declare const VIRTUAL_OPENAPI_SERVER = "virtual:clarify/openapi/server";
|
|
6
7
|
export declare const VIRTUAL_SLOTS = "virtual:clarify/slots";
|
|
7
8
|
export declare const VIRTUAL_SLOT = "virtual:clarify/slot";
|
|
8
9
|
export declare const VIRTUAL_CLIENT_ENTRY = "virtual:clarify/entry-client";
|