From 3d088d73ec50e736f3cda528b9a77531d3394215 Mon Sep 17 00:00:00 2001
From: Deep Singhvi <deep@buildwithfern.com>
Date: Wed, 7 Aug 2024 11:59:02 -0400
Subject: [PATCH] (fix): reload docs preview server on specs outside of the
 fern folder (#4227)

---
 packages/cli/docs-preview/src/runPreviewServer.ts      |  4 +++-
 .../src/workspaces/AbstractAPIWorkspace.ts             |  6 ++++++
 .../workspace-loader/src/workspaces/FernWorkspace.ts   |  8 ++++++++
 .../workspace-loader/src/workspaces/OSSWorkspace.ts    | 10 ++++++++++
 4 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/packages/cli/docs-preview/src/runPreviewServer.ts b/packages/cli/docs-preview/src/runPreviewServer.ts
index 5807397ff4d..6fdbf772ebc 100644
--- a/packages/cli/docs-preview/src/runPreviewServer.ts
+++ b/packages/cli/docs-preview/src/runPreviewServer.ts
@@ -114,7 +114,9 @@ export async function runPreviewServer({
     // initialize docs definition
     docsDefinition = await reloadDocsDefinition();
 
-    const watcher = new Watcher(absoluteFilePathToFern, {
+    const additionalFilepaths = project.apiWorkspaces.flatMap((workspace) => workspace.getAbsoluteFilepaths());
+
+    const watcher = new Watcher([absoluteFilePathToFern, ...additionalFilepaths], {
         recursive: true,
         ignoreInitial: true,
         debounce: 1000,
diff --git a/packages/cli/workspace-loader/src/workspaces/AbstractAPIWorkspace.ts b/packages/cli/workspace-loader/src/workspaces/AbstractAPIWorkspace.ts
index 5f9039780a2..477102c0be7 100644
--- a/packages/cli/workspace-loader/src/workspaces/AbstractAPIWorkspace.ts
+++ b/packages/cli/workspace-loader/src/workspaces/AbstractAPIWorkspace.ts
@@ -1,3 +1,4 @@
+import { AbsoluteFilePath } from "@fern-api/fs-utils";
 import { TaskContext } from "@fern-api/task-context";
 import { FernDefinition } from "../types/Workspace";
 import { FernWorkspace } from "./FernWorkspace";
@@ -19,4 +20,9 @@ export abstract class AbstractAPIWorkspace<Settings> {
         { context }: { context?: TaskContext },
         settings?: Settings
     ): Promise<FernWorkspace>;
+
+    /**
+     * @returns all filepaths related to this workspace
+     */
+    public abstract getAbsoluteFilepaths(): AbsoluteFilePath[];
 }
diff --git a/packages/cli/workspace-loader/src/workspaces/FernWorkspace.ts b/packages/cli/workspace-loader/src/workspaces/FernWorkspace.ts
index 182c25379ca..c77e3c07981 100644
--- a/packages/cli/workspace-loader/src/workspaces/FernWorkspace.ts
+++ b/packages/cli/workspace-loader/src/workspaces/FernWorkspace.ts
@@ -51,6 +51,10 @@ export class FernWorkspace extends AbstractAPIWorkspace<void> {
     public async toFernWorkspace(): Promise<FernWorkspace> {
         return this;
     }
+
+    public getAbsoluteFilepaths(): AbsoluteFilePath[] {
+        return [this.absoluteFilepath];
+    }
 }
 
 export declare namespace LazyFernWorkspace {
@@ -166,4 +170,8 @@ export class LazyFernWorkspace extends AbstractAPIWorkspace<OSSWorkspace.Setting
 
         return workspace;
     }
+
+    public getAbsoluteFilepaths(): AbsoluteFilePath[] {
+        return [this.absoluteFilepath];
+    }
 }
diff --git a/packages/cli/workspace-loader/src/workspaces/OSSWorkspace.ts b/packages/cli/workspace-loader/src/workspaces/OSSWorkspace.ts
index ae0404524b1..2637a01c32c 100644
--- a/packages/cli/workspace-loader/src/workspaces/OSSWorkspace.ts
+++ b/packages/cli/workspace-loader/src/workspaces/OSSWorkspace.ts
@@ -1,4 +1,5 @@
 import { FERN_PACKAGE_MARKER_FILENAME, generatorsYml } from "@fern-api/configuration";
+import { isNonNullish } from "@fern-api/core-utils";
 import { AbsoluteFilePath, RelativeFilePath } from "@fern-api/fs-utils";
 import { convert } from "@fern-api/openapi-ir-to-fern";
 import { parse, ParseOpenAPIOptions } from "@fern-api/openapi-parser";
@@ -119,6 +120,15 @@ export class OSSWorkspace extends AbstractAPIWorkspace<OSSWorkspace.Settings> {
             changelog: this.changelog
         });
     }
+
+    public getAbsoluteFilepaths(): AbsoluteFilePath[] {
+        return [
+            this.absoluteFilepath,
+            ...this.specs
+                .flatMap((spec) => [spec.absoluteFilepath, spec.absoluteFilepathToOverrides])
+                .filter(isNonNullish)
+        ];
+    }
 }
 
 export function getOSSWorkspaceSettingsFromGeneratorInvocation(