@@ -281,9 +281,10 @@ class FileSystemBackupService {
281281 }
282282
283283 const account = await this . dataSerializer . serializeUserData ( user . id ) ;
284- const projects = localProjects . map ( ( project ) =>
285- this . unifiedService . convertProjectToMetadata ( project , "backup" ) ,
286- ) ;
284+
285+ // Read existing projects from filesystem and merge with new ones
286+ const existingData = await this . readExistingBackupData ( ) ;
287+ const mergedProjects = this . mergeProjectsData ( existingData . projects , localProjects ) ;
287288
288289 const projectData = new Map ( ) ;
289290 for ( const project of localProjects ) {
@@ -304,14 +305,68 @@ class FileSystemBackupService {
304305 } ) ;
305306 }
306307
308+ // Merge existing project data with new project data
309+ const mergedProjectData = this . mergeProjectData ( existingData . projectData , projectData ) ;
310+
307311 return {
308312 manifest : this . unifiedService . createManifest ( "backup" ) ,
309313 account,
310- projects,
311- projectData,
314+ projects : mergedProjects ,
315+ projectData : mergedProjectData ,
312316 } ;
313317 }
314318
319+ private async readExistingBackupData ( ) : Promise < {
320+ projects : any [ ] ;
321+ projectData : Map < string , any > ;
322+ } > {
323+ if ( ! this . rootHandle ) {
324+ return { projects : [ ] , projectData : new Map ( ) } ;
325+ }
326+
327+ try {
328+ const adapter = new DirectoryAdapter ( this . rootHandle ) ;
329+
330+ if ( ! ( await adapter . exists ( this . unifiedService . getPaths ( ) . MANIFEST ) ) ) {
331+ return { projects : [ ] , projectData : new Map ( ) } ;
332+ }
333+
334+ const existingData = await this . fileSystemManager . readUnifiedStructure ( adapter ) ;
335+ return {
336+ projects : existingData . projects || [ ] ,
337+ projectData : existingData . projectData || new Map ( ) ,
338+ } ;
339+ } catch ( error ) {
340+ console . warn ( "Could not read existing backup data:" , error ) ;
341+ return { projects : [ ] , projectData : new Map ( ) } ;
342+ }
343+ }
344+
345+ private mergeProjectsData ( existingProjects : any [ ] , newProjects : Project [ ] ) : any [ ] {
346+ const existingProjectsMap = new Map ( ) ;
347+ existingProjects . forEach ( project => {
348+ existingProjectsMap . set ( project . docUrl , project ) ;
349+ } ) ;
350+
351+ // Convert new projects to metadata and update/add them
352+ newProjects . forEach ( project => {
353+ const metadata = this . unifiedService . convertProjectToMetadata ( project , "backup" ) ;
354+ existingProjectsMap . set ( project . docUrl , metadata ) ;
355+ } ) ;
356+
357+ return Array . from ( existingProjectsMap . values ( ) ) ;
358+ }
359+
360+ private mergeProjectData ( existingProjectData : Map < string , any > , newProjectData : Map < string , any > ) : Map < string , any > {
361+ const mergedData = new Map ( existingProjectData ) ;
362+
363+ for ( const [ projectId , data ] of newProjectData ) {
364+ mergedData . set ( projectId , data ) ;
365+ }
366+
367+ return mergedData ;
368+ }
369+
315370 private async processImport (
316371 filesystemData : any ,
317372 projectId ?: string ,
0 commit comments