From 387dc077587cfb5fe1bb02a02a0e3e1282ff931b Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Mon, 26 May 2025 12:57:42 +0200 Subject: [PATCH] make the whole projectContext still a reference after safeCloneDeep projectContext should not be deep cloned. Only reference needs to be passed in the codebase. --- src/core/safe-clone-deep.ts | 2 ++ src/project/project-context.ts | 3 +++ src/project/types.ts | 3 ++- src/project/types/single-file/single-file.ts | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) 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: [],