diff --git a/src/core/safe-clone-deep.ts b/src/core/safe-clone-deep.ts index c9fd00dd5c..41e63a7f45 100644 --- a/src/core/safe-clone-deep.ts +++ b/src/core/safe-clone-deep.ts @@ -6,6 +6,8 @@ * Copyright (C) 2025 Posit Software, PBC */ +// This is used to create new interfaces that extend the Cloneable interface +// to make the object having a clone method for specific cloning behavior in safeCloneDeep. export interface Cloneable { clone(): T; } diff --git a/src/project/project-context.ts b/src/project/project-context.ts index b661c56b01..4348e57eeb 100644 --- a/src/project/project-context.ts +++ b/src/project/project-context.ts @@ -275,6 +275,7 @@ export async function projectContext( }); const fileInformationCache = new FileInformationCacheMap(); const result: ProjectContext = { + clone: () => result, resolveBrand: async (fileName?: string) => projectResolveBrand(result, fileName), resolveFullMarkdownForFile: ( @@ -371,6 +372,7 @@ export async function projectContext( }); const fileInformationCache = new FileInformationCacheMap(); const result: ProjectContext = { + clone: () => result, resolveBrand: async (fileName?: string) => projectResolveBrand(result, fileName), resolveFullMarkdownForFile: ( @@ -446,6 +448,7 @@ export async function projectContext( }); const fileInformationCache = new FileInformationCacheMap(); const context: ProjectContext = { + clone: () => context, resolveBrand: async (fileName?: string) => projectResolveBrand(context, fileName), resolveFullMarkdownForFile: ( diff --git a/src/project/types.ts b/src/project/types.ts index 74b682e37c..7f456d2ae0 100644 --- a/src/project/types.ts +++ b/src/project/types.ts @@ -22,6 +22,7 @@ import { import { ProjectEnvironment } from "./project-environment-types.ts"; import { ProjectCache } from "../core/cache/cache-types.ts"; import { TempContext } from "../core/temp-types.ts"; +import { Cloneable } from "../core/safe-clone-deep.ts"; export { type NavigationItem as NavItem, @@ -58,7 +59,7 @@ export type FileInformation = { brand?: LightDarkBrand; }; -export interface ProjectContext { +export interface ProjectContext extends Cloneable { dir: string; engines: string[]; files: ProjectFiles; diff --git a/src/project/types/single-file/single-file.ts b/src/project/types/single-file/single-file.ts index cd5b6c0e28..9f4f415f43 100644 --- a/src/project/types/single-file/single-file.ts +++ b/src/project/types/single-file/single-file.ts @@ -41,6 +41,7 @@ export async function singleFileProjectContext( const projectCacheBaseDir = temp.createDir(); const result: ProjectContext = { + clone: () => result, resolveBrand: (fileName?: string) => projectResolveBrand(result, fileName), dir: normalizePath(dirname(source)), engines: [],