diff --git a/packages/cli/cli/src/commands/docs-dev/devDocsWorkspace.ts b/packages/cli/cli/src/commands/docs-dev/devDocsWorkspace.ts index 237683a6b07..447b49f742d 100644 --- a/packages/cli/cli/src/commands/docs-dev/devDocsWorkspace.ts +++ b/packages/cli/cli/src/commands/docs-dev/devDocsWorkspace.ts @@ -1,6 +1,7 @@ import { runPreviewServer } from "@fern-api/docs-preview"; import { Project } from "@fern-api/project-loader"; import { CliContext } from "../../cli-context/CliContext"; +import { validateAPIWorkspaceWithoutExiting } from "../validate/validateAPIWorkspaceAndLogIssues"; import { validateDocsWorkspaceWithoutExiting } from "../validate/validateDocsWorkspaceAndLogIssues"; export async function previewDocsWorkspace({ @@ -37,9 +38,19 @@ export async function previewDocsWorkspace({ await validateDocsWorkspaceWithoutExiting({ workspace: docsWorkspace, context, - logWarnings: false, + logWarnings: true, logSummary: false }); + for (const apiWorkspace of project.apiWorkspaces) { + await cliContext.runTaskForWorkspace(apiWorkspace, async (apiWorkspaceContext) => { + await validateAPIWorkspaceWithoutExiting({ + workspace: await apiWorkspace.toFernWorkspace({ context }), + context: apiWorkspaceContext, + logWarnings: false, + logSummary: false + }); + }); + } }, context, port diff --git a/packages/cli/cli/src/commands/validate/validateAPIWorkspaceAndLogIssues.ts b/packages/cli/cli/src/commands/validate/validateAPIWorkspaceAndLogIssues.ts index 19bd7fec88e..31223c19460 100644 --- a/packages/cli/cli/src/commands/validate/validateAPIWorkspaceAndLogIssues.ts +++ b/packages/cli/cli/src/commands/validate/validateAPIWorkspaceAndLogIssues.ts @@ -4,6 +4,23 @@ import { FernWorkspace } from "@fern-api/workspace-loader"; import validatePackageName from "validate-npm-package-name"; import { logViolations } from "./logViolations"; +export async function validateAPIWorkspaceWithoutExiting({ + workspace, + context, + logWarnings, + logSummary = true +}: { + workspace: FernWorkspace; + context: TaskContext; + logWarnings: boolean; + logSummary?: boolean; +}): Promise<{ hasErrors: boolean }> { + const violations = await validateFernWorkspace(workspace, context.logger); + const { hasErrors } = logViolations({ violations, context, logWarnings, logSummary }); + + return { hasErrors }; +} + export async function validateAPIWorkspaceAndLogIssues({ workspace, context, @@ -17,8 +34,7 @@ export async function validateAPIWorkspaceAndLogIssues({ context.failAndThrow("API name is not valid."); } - const violations = await validateFernWorkspace(workspace, context.logger); - const { hasErrors } = logViolations({ violations, context, logWarnings }); + const { hasErrors } = await validateAPIWorkspaceWithoutExiting({ workspace, context, logWarnings }); if (hasErrors) { context.failAndThrow(); diff --git a/packages/cli/docs-preview/src/runPreviewServer.ts b/packages/cli/docs-preview/src/runPreviewServer.ts index b36aad323b0..5807397ff4d 100644 --- a/packages/cli/docs-preview/src/runPreviewServer.ts +++ b/packages/cli/docs-preview/src/runPreviewServer.ts @@ -88,10 +88,12 @@ export async function runPreviewServer({ let docsDefinition: DocsV1Read.DocsDefinition | undefined; const reloadDocsDefinition = async () => { - context.logger.info("Reloading docs"); + context.logger.info("Reloading docs..."); const startTime = Date.now(); try { project = await reloadProject(); + context.logger.info("Validating docs..."); + await validateProject(project); const newDocsDefinition = await getPreviewDocsDefinition({ domain: instance.host, project, @@ -100,8 +102,11 @@ export async function runPreviewServer({ context.logger.info(`Reload completed in ${Date.now() - startTime}ms`); return newDocsDefinition; } catch (err) { - context.logger.error("Failed to reload because of validation errors: "); - await validateProject(project); + if (docsDefinition == null) { + context.logger.error("Failed to read docs configuration. Rendering blank page."); + } else { + context.logger.error("Failed to read docs configuration. Rendering last successful configuration."); + } return docsDefinition; } }; diff --git a/packages/cli/workspace-loader/src/loadDocsWorkspace.ts b/packages/cli/workspace-loader/src/loadDocsWorkspace.ts index 01201076395..92a823a535f 100644 --- a/packages/cli/workspace-loader/src/loadDocsWorkspace.ts +++ b/packages/cli/workspace-loader/src/loadDocsWorkspace.ts @@ -6,6 +6,7 @@ import { readFile } from "fs/promises"; import yaml from "js-yaml"; import path from "path"; import { DocsWorkspace } from "./types/Workspace"; +import { APIWorkspace } from "./workspaces"; export async function loadDocsWorkspace({ fernDirectory, diff --git a/packages/cli/workspace-loader/src/workspaces/FernWorkspace.ts b/packages/cli/workspace-loader/src/workspaces/FernWorkspace.ts index b965cb65c90..276d9c5ffc0 100644 --- a/packages/cli/workspace-loader/src/workspaces/FernWorkspace.ts +++ b/packages/cli/workspace-loader/src/workspaces/FernWorkspace.ts @@ -147,6 +147,8 @@ export class LazyFernWorkspace extends AbstractAPIWorkspace