Skip to content

Commit c953483

Browse files
schema definition
1 parent 7e3af04 commit c953483

4 files changed

Lines changed: 27 additions & 64 deletions

File tree

packages/schema/src/main.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
import { Schema } from "effect";
22
import { LoroDoc, LoroList, LoroMap } from "loro-crdt";
3-
import { ActivitySchema, AnyLoroDocSchema } from "./schema";
3+
import { AnyLoroDocSchema, CurrentSchema, Table } from "./schema";
44
import type { Version } from "./versioning";
55

6-
export const VERSION = 3 satisfies Version;
6+
export const VERSION = 1 satisfies Version;
77

88
export const Metadata = Schema.Struct({ version: Schema.Number });
9-
export const Activity = ActivitySchema[VERSION];
109

1110
export type LoroSchema = {
1211
metadata: LoroMap<typeof Metadata.Encoded>;
13-
activity: LoroList<LoroMap<typeof Activity.Encoded>>;
12+
food: LoroList<LoroMap<typeof CurrentSchema.fields.food.value.Encoded>>;
13+
meal: LoroList<LoroMap<typeof CurrentSchema.fields.meal.value.Encoded>>;
1414
};
1515

1616
export class SnapshotSchema extends Schema.Class<SnapshotSchema>(
1717
"SnapshotSchema"
1818
)({
1919
metadata: Metadata,
20-
activity: Schema.Array(Activity),
20+
...CurrentSchema.fields,
2121
}) {
2222
static readonly EmptyDoc = () => {
2323
const doc = new LoroDoc<LoroSchema>();
2424
doc.getMap("metadata").set("version", VERSION);
25-
doc.getList("activity");
25+
Table.literals.map((key) => {
26+
doc.getList(key);
27+
});
2628
return doc;
2729
};
2830
}

packages/schema/src/migrations.ts

Lines changed: 4 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,11 @@
11
import { ParseResult, Schema } from "effect";
2-
import { LoroDoc, LoroMap } from "loro-crdt";
3-
import { VERSION } from "./main";
4-
import { AnyLoroDocSchema, type ActivityV1, type ActivityV2 } from "./schema";
2+
import { LoroDoc } from "loro-crdt";
3+
import { SnapshotSchema } from "./main";
4+
import { AnyLoroDocSchema } from "./schema";
55
import { Version } from "./versioning";
66

77
const migrations = {
8-
1: (doc) => {
9-
doc.getMap("metadata").set("version", VERSION);
10-
doc.getList("activity");
11-
return doc;
12-
},
13-
14-
2: (doc) => {
15-
doc.getMap("metadata").set("version", 2);
16-
17-
const activity = doc.getList("activity");
18-
for (let i = 0; i < activity.length; i++) {
19-
const item = activity.get(i) as LoroMap<typeof ActivityV1.Encoded>;
20-
const map = new LoroMap();
21-
const [firstName, lastName] = item.get("name").split(" ");
22-
map.set("id", item.get("id"));
23-
map.set("firstName", firstName);
24-
map.set("lastName", lastName);
25-
activity.insertContainer(i, map);
26-
}
27-
28-
return doc;
29-
},
30-
31-
3: (doc) => {
32-
doc.getMap("metadata").set("version", 3);
33-
34-
const activity = doc.getList("activity");
35-
for (let i = 0; i < activity.length; i++) {
36-
const item = activity.get(i) as LoroMap<typeof ActivityV2.Encoded>;
37-
const map = new LoroMap();
38-
map.set("id", item.get("id"));
39-
map.set("firstName", item.get("firstName"));
40-
map.set("lastName", item.get("lastName"));
41-
map.set("age", undefined);
42-
activity.insertContainer(i, map);
43-
}
44-
45-
return doc;
46-
},
8+
1: (_) => SnapshotSchema.EmptyDoc(),
479
} satisfies Record<Version, (doc: LoroDoc) => LoroDoc>;
4810

4911
export const LoroDocMigration = AnyLoroDocSchema.pipe(

packages/schema/src/schema.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
import { Schema } from "effect";
22
import { LoroDoc } from "loro-crdt";
3+
import { VERSION } from "./main";
34
import { type Version } from "./versioning";
45

56
export const AnyLoroDocSchema = Schema.instanceOf(LoroDoc);
67

7-
export class ActivityV1 extends Schema.Class<ActivityV1>("ActivityV1")({
8+
export class FoodV1 extends Schema.Class<FoodV1>("FoodV1")({
89
id: Schema.UUID,
910
name: Schema.String,
11+
calories: Schema.Number.pipe(Schema.positive()),
1012
}) {}
1113

12-
export class ActivityV2 extends Schema.Class<ActivityV2>("ActivityV2")({
14+
export class MealV1 extends Schema.Class<MealV1>("MealV1")({
1315
id: Schema.UUID,
14-
firstName: Schema.String,
15-
lastName: Schema.String,
16+
foodId: FoodV1.fields.id,
17+
quantity: Schema.Number.pipe(Schema.positive()),
1618
}) {}
1719

18-
export class ActivityV3 extends Schema.Class<ActivityV3>("ActivityV3")({
19-
id: Schema.UUID,
20-
firstName: Schema.String,
21-
lastName: Schema.String,
22-
age: Schema.UndefinedOr(Schema.Number),
23-
}) {}
24-
25-
export const ActivitySchema = {
26-
1: ActivityV1,
27-
2: ActivityV2,
28-
3: ActivityV3,
20+
export const Table = Schema.Literal("food", "meal");
21+
const VersioningSchema = {
22+
1: Schema.Struct({
23+
[Table.literals[0]]: Schema.Array(FoodV1),
24+
[Table.literals[1]]: Schema.Array(MealV1),
25+
}),
2926
} as const satisfies Record<Version, Schema.Schema.AnyNoContext>;
27+
28+
export const CurrentSchema = VersioningSchema[VERSION];

packages/schema/src/versioning.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
export const Version = [1, 2, 3] as const;
1+
export const Version = [1] as const;
22
export type Version = (typeof Version)[number];

0 commit comments

Comments
 (0)