11import { ParseResult , Schema } from "effect" ;
22import { LoroDoc , LoroList , LoroMap } from "loro-crdt" ;
3- import { ActivitySchema , ActivityV1 } from "./schema" ;
3+ import { ActivitySchema , ActivityV1 , type ActivityV2 } from "./schema" ;
44
5- export const VERSION = 2 ;
5+ const Version = [ 1 , 2 , 3 ] as const ;
6+ export type Version = ( typeof Version ) [ number ] ;
7+
8+ export const VERSION = 3 satisfies Version ;
69
710const AnyLoroDocSchema = Schema . instanceOf ( LoroDoc ) ;
811
@@ -32,7 +35,7 @@ export class SnapshotSchema extends Schema.Class<SnapshotSchema>(
3235 } ;
3336}
3437
35- const migrations : Record < number , ( doc : LoroDoc ) => LoroDoc > = {
38+ const migrations = {
3639 1 : ( doc ) => {
3740 const metadata = doc . getMap ( "metadata" ) ;
3841 metadata . set ( "version" , VERSION ) ;
@@ -58,7 +61,24 @@ const migrations: Record<number, (doc: LoroDoc) => LoroDoc> = {
5861
5962 return doc ;
6063 } ,
61- } ;
64+ "3" : ( doc ) => {
65+ const metadata = doc . getMap ( "metadata" ) ;
66+ metadata . set ( "version" , 3 ) ;
67+
68+ const activity = doc . getList ( "activity" ) ;
69+ for ( let i = 0 ; i < activity . length ; i ++ ) {
70+ const item = activity . get ( i ) as LoroMap < typeof ActivityV2 . Encoded > ;
71+ const map = new LoroMap ( ) ;
72+ map . set ( "id" , item . get ( "id" ) ) ;
73+ map . set ( "firstName" , item . get ( "firstName" ) ) ;
74+ map . set ( "lastName" , item . get ( "lastName" ) ) ;
75+ map . set ( "age" , undefined ) ;
76+ activity . insertContainer ( i , map ) ;
77+ }
78+
79+ return doc ;
80+ } ,
81+ } satisfies Record < Version , ( doc : LoroDoc ) => LoroDoc > ;
6282
6383export const LoroDocMigration = AnyLoroDocSchema . pipe (
6484 Schema . transformOrFail ( AnyLoroDocSchema , {
@@ -69,20 +89,9 @@ export const LoroDocMigration = AnyLoroDocSchema.pipe(
6989 const currentVersion = metadata . get ( "version" ) ;
7090
7191 if ( typeof currentVersion === "number" ) {
72- for ( let version = currentVersion + 1 ; version <= VERSION ; version ++ ) {
73- const migration = migrations [ version ] ;
74- if ( migration === undefined ) {
75- return ParseResult . fail (
76- new ParseResult . Type (
77- ast ,
78- from ,
79- `Migration from version ${ version - 1 } to ${ version } not found`
80- )
81- ) ;
82- }
83-
84- doc . import ( migration ( doc ) . export ( { mode : "snapshot" } ) ) ;
85- }
92+ Version . forEach ( ( version ) => {
93+ doc . import ( migrations [ version ] ( doc ) . export ( { mode : "snapshot" } ) ) ;
94+ } ) ;
8695 } else {
8796 return ParseResult . fail (
8897 new ParseResult . Type ( ast , from , "Invalid version number in metadata" )
0 commit comments