@dxos/echo-generator 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@dxos/echo-generator",
3
- "version": "0.8.4-main.ae835ea",
3
+ "version": "0.8.4-main.bc674ce",
4
4
  "description": "ECHO data generator for testing.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/dxos/dxos"
10
+ },
7
11
  "license": "MIT",
8
12
  "author": "info@dxos.org",
9
- "sideEffects": true,
13
+ "sideEffects": false,
10
14
  "type": "module",
11
15
  "exports": {
12
16
  ".": {
@@ -25,23 +29,22 @@
25
29
  "src"
26
30
  ],
27
31
  "dependencies": {
28
- "@automerge/automerge": "3.1.2",
29
- "effect": "3.18.3",
30
- "@dxos/client": "0.8.4-main.ae835ea",
31
- "@dxos/echo": "0.8.4-main.ae835ea",
32
- "@dxos/echo-db": "0.8.4-main.ae835ea",
33
- "@dxos/invariant": "0.8.4-main.ae835ea",
34
- "@dxos/live-object": "0.8.4-main.ae835ea",
35
- "@dxos/log": "0.8.4-main.ae835ea",
36
- "@dxos/node-std": "0.8.4-main.ae835ea",
37
- "@dxos/util": "0.8.4-main.ae835ea"
32
+ "@automerge/automerge": "3.2.3",
33
+ "effect": "3.19.11",
34
+ "@dxos/client": "0.8.4-main.bc674ce",
35
+ "@dxos/echo": "0.8.4-main.bc674ce",
36
+ "@dxos/echo-db": "0.8.4-main.bc674ce",
37
+ "@dxos/invariant": "0.8.4-main.bc674ce",
38
+ "@dxos/log": "0.8.4-main.bc674ce",
39
+ "@dxos/node-std": "0.8.4-main.bc674ce",
40
+ "@dxos/util": "0.8.4-main.bc674ce"
38
41
  },
39
42
  "devDependencies": {
40
- "@dxos/random": "0.8.4-main.ae835ea"
43
+ "@dxos/random": "0.8.4-main.bc674ce"
41
44
  },
42
45
  "peerDependencies": {
43
- "effect": "^3.13.3",
44
- "@dxos/random": "0.8.4-main.ae835ea"
46
+ "effect": "3.19.11",
47
+ "@dxos/random": "0.8.4-main.bc674ce"
45
48
  },
46
49
  "publishConfig": {
47
50
  "access": "public"
package/src/data.ts CHANGED
@@ -5,8 +5,9 @@
5
5
  import { next as A } from '@automerge/automerge';
6
6
  import * as Schema from 'effect/Schema';
7
7
 
8
- import { type Space, createDocAccessor } from '@dxos/client/echo';
9
- import { EchoObject, Ref } from '@dxos/echo/internal';
8
+ import { type Space } from '@dxos/client/echo';
9
+ import { Ref, Type } from '@dxos/echo';
10
+ import { createDocAccessor } from '@dxos/echo-db';
10
11
  import { faker } from '@dxos/random';
11
12
 
12
13
  import { SpaceObjectGenerator, TestObjectGenerator } from './generator';
@@ -26,7 +27,7 @@ export const Priority = [1, 2, 3, 4, 5];
26
27
  export enum TestSchemaType {
27
28
  document = 'example.com/type/Document',
28
29
  organization = 'example.com/type/Organization',
29
- contact = 'example.com/type/Contact',
30
+ contact = 'example.com/type/Person',
30
31
  project = 'example.com/type/Project',
31
32
  }
32
33
 
@@ -37,21 +38,21 @@ const testSchemas = (): TestSchemaMap<TestSchemaType> => {
37
38
  const document = Schema.Struct({
38
39
  title: Schema.String.annotations({ description: 'title of the document' }),
39
40
  content: Schema.String,
40
- }).pipe(EchoObject({ typename: TestSchemaType.document, version: '0.1.0' }));
41
+ }).pipe(Type.object({ typename: TestSchemaType.document, version: '0.1.0' }));
41
42
 
42
43
  const organization = Schema.Struct({
43
44
  name: Schema.String.annotations({ description: 'name of the company or organization' }),
44
45
  website: Schema.optional(Schema.String.annotations({ description: 'public website URL' })),
45
46
  description: Schema.String.annotations({ description: 'short summary of the company' }),
46
- }).pipe(EchoObject({ typename: TestSchemaType.organization, version: '0.1.0' }));
47
+ }).pipe(Type.object({ typename: TestSchemaType.organization, version: '0.1.0' }));
47
48
 
48
49
  const contact = Schema.Struct({
49
50
  name: Schema.String.annotations({ description: 'name of the person' }),
50
51
  email: Schema.optional(Schema.String),
51
- org: Schema.optional(Ref(organization)),
52
+ org: Schema.optional(Type.Ref(organization)),
52
53
  lat: Schema.optional(Schema.Number),
53
54
  lng: Schema.optional(Schema.Number),
54
- }).pipe(EchoObject({ typename: TestSchemaType.contact, version: '0.1.0' }));
55
+ }).pipe(Type.object({ typename: TestSchemaType.contact, version: '0.1.0' }));
55
56
 
56
57
  const project = Schema.Struct({
57
58
  name: Schema.String.annotations({ description: 'name of the project' }),
@@ -61,8 +62,8 @@ const testSchemas = (): TestSchemaMap<TestSchemaType> => {
61
62
  status: Schema.String,
62
63
  priority: Schema.Number,
63
64
  active: Schema.Boolean,
64
- org: Schema.optional(Ref(organization)),
65
- }).pipe(EchoObject({ typename: TestSchemaType.project, version: '0.1.0' }));
65
+ org: Schema.optional(Type.Ref(organization)),
66
+ }).pipe(Type.object({ typename: TestSchemaType.project, version: '0.1.0' }));
66
67
 
67
68
  return {
68
69
  [TestSchemaType.document]: document,
@@ -7,7 +7,7 @@ import * as Schema from 'effect/Schema';
7
7
  import { describe, expect, onTestFinished, test } from 'vitest';
8
8
 
9
9
  import { Client } from '@dxos/client';
10
- import { TypedObject, getType } from '@dxos/echo/internal';
10
+ import { Obj, Type } from '@dxos/echo';
11
11
  import { getObjectCore } from '@dxos/echo-db';
12
12
  import { faker } from '@dxos/random';
13
13
 
@@ -43,7 +43,7 @@ describe('TestObjectGenerator', () => {
43
43
 
44
44
  // Create org object.
45
45
  const organization = await generator.createObject({ types: [TestSchemaType.organization] });
46
- expect(getType(organization)).to.exist;
46
+ expect(Obj.getTypeDXN(organization)).to.exist;
47
47
 
48
48
  // Expect at least one person object with a linked org reference.
49
49
  const objects = await generator.createObjects({ [TestSchemaType.contact]: 10 });
@@ -59,14 +59,14 @@ describe('TestObjectGenerator', () => {
59
59
  const generator = createSpaceObjectGenerator(space);
60
60
  await generator.addSchemas();
61
61
  const organization = await generator.createObject({ types: [TestSchemaType.organization] });
62
- schemaId.push(getType(organization)!.toString());
62
+ schemaId.push(Obj.getTypeDXN(organization)!.toString());
63
63
  }
64
64
 
65
65
  {
66
66
  const generator = createSpaceObjectGenerator(space);
67
67
  await generator.addSchemas();
68
68
  const organization = await generator.createObject({ types: [TestSchemaType.organization] });
69
- schemaId.push(getType(organization)!.toString());
69
+ schemaId.push(Obj.getTypeDXN(organization)!.toString());
70
70
  }
71
71
 
72
72
  expect(schemaId[0]).not.to.be.undefined;
@@ -78,7 +78,7 @@ describe('TestObjectGenerator', () => {
78
78
  const generator = createSpaceObjectGenerator(space);
79
79
  await generator.addSchemas();
80
80
  const document = await generator.createObject({ types: [TestSchemaType.document] });
81
- expect(getType(document)).to.exist;
81
+ expect(Obj.getTypeDXN(document)).to.exist;
82
82
 
83
83
  const beforeChangesCount = A.getAllChanges(getObjectCore(document).docHandle!.doc()).length;
84
84
 
@@ -92,12 +92,14 @@ describe('TestObjectGenerator', () => {
92
92
  });
93
93
 
94
94
  test('create object with in memory schema', async () => {
95
- class Task extends TypedObject({
96
- typename: 'example.org/type/Task',
97
- version: '0.1.0',
98
- })({
95
+ const Task = Schema.Struct({
99
96
  name: Schema.optional(Schema.String),
100
- }) {}
97
+ }).pipe(
98
+ Type.object({
99
+ typename: 'example.org/type/Task',
100
+ version: '0.1.0',
101
+ }),
102
+ );
101
103
 
102
104
  enum Types {
103
105
  task = 'example.org/type/Task',
@@ -106,7 +108,9 @@ describe('TestObjectGenerator', () => {
106
108
  const { space } = await setupTest();
107
109
  const generator = new SpaceObjectGenerator<Types>(
108
110
  space,
109
- { [Types.task]: Task },
111
+ {
112
+ [Types.task]: Task,
113
+ },
110
114
  {
111
115
  [Types.task]: () => ({ name: 'Default' }),
112
116
  },
@@ -121,7 +125,7 @@ describe('TestObjectGenerator', () => {
121
125
  await generator.addSchemas();
122
126
 
123
127
  const todo = await generator.createObject({ types: [Types.task] });
124
- expect(getType(todo)).to.exist;
128
+ expect(Obj.getTypeDXN(todo)).to.exist;
125
129
  });
126
130
 
127
131
  test('references', async () => {
@@ -141,7 +145,7 @@ describe('TestObjectGenerator', () => {
141
145
  test('create project', async () => {
142
146
  const generator = createTestObjectGenerator();
143
147
  const project = await generator.createObject({ types: [TestSchemaType.project] });
144
- expect(getType(project)).to.exist;
148
+ expect(Obj.getTypeDXN(project)).to.exist;
145
149
  });
146
150
 
147
151
  test('create object with not type', async () => {
package/src/generator.ts CHANGED
@@ -2,20 +2,17 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import type * as Schema from 'effect/Schema';
6
-
7
5
  import { Filter, type Space } from '@dxos/client/echo';
8
- import { Obj } from '@dxos/echo';
9
- import { EchoSchema, getSchema, getTypeAnnotation } from '@dxos/echo/internal';
10
- import { type AnyLiveObject } from '@dxos/echo-db';
6
+ import { Obj, type Type } from '@dxos/echo';
7
+ import { EchoSchema, getTypeAnnotation } from '@dxos/echo/internal';
8
+ import { isProxy } from '@dxos/echo/internal';
11
9
  import { invariant } from '@dxos/invariant';
12
- import { type Live, isLiveObject, live } from '@dxos/live-object';
13
10
  import { faker } from '@dxos/random';
14
11
  import { entries, range } from '@dxos/util';
15
12
 
16
13
  import { type TestSchemaType } from './data';
17
14
  import {
18
- type MutationsProviderParams,
15
+ type MutationsProviderProps,
19
16
  type TestGeneratorMap,
20
17
  type TestMutationsMap,
21
18
  type TestObjectProvider,
@@ -29,37 +26,38 @@ import {
29
26
  export class TestObjectGenerator<T extends string = TestSchemaType> {
30
27
  // prettier-ignore
31
28
  constructor(
32
- protected readonly _schemas: TestSchemaMap<T>,
33
- private readonly _generators: TestGeneratorMap<T>,
34
- private readonly _provider?: TestObjectProvider<T>,
35
- ) {}
29
+ protected readonly _schemas: TestSchemaMap<T>,
30
+ private readonly _generators: TestGeneratorMap<T>,
31
+ private readonly _provider?: TestObjectProvider<T>,
32
+ ) {}
36
33
 
37
- get schemas(): (EchoSchema | Schema.Schema.AnyNoContext)[] {
34
+ get schemas(): Type.Obj.Any[] {
38
35
  return Object.values(this._schemas);
39
36
  }
40
37
 
41
- getSchema(type: T): EchoSchema | Schema.Schema.AnyNoContext | undefined {
38
+ getSchema(type: T): Type.Obj.Any | undefined {
42
39
  return this.schemas.find((schema) => getTypeAnnotation(schema)!.typename === type);
43
40
  }
44
41
 
45
- protected setSchema(type: T, schema: EchoSchema | Schema.Schema.AnyNoContext): void {
42
+ protected setSchema(type: T, schema: Type.Obj.Any): void {
46
43
  this._schemas[type] = schema;
47
44
  }
48
45
 
49
- async createObject({ types }: { types?: T[] } = {}): Promise<Live<any>> {
46
+ async createObject({ types }: { types?: T[] } = {}): Promise<any> {
50
47
  const type = faker.helpers.arrayElement(types ?? (Object.keys(this._schemas) as T[]));
51
48
  const data = await this._generators[type](this._provider);
52
- if (isLiveObject(data)) {
49
+ if (isProxy(data)) {
53
50
  return data;
54
51
  }
55
52
 
56
53
  const schema = this.getSchema(type);
57
- return schema ? Obj.make(schema, data) : live(data);
54
+ invariant(schema, `Schema is required for type: ${type}. Register a schema for this type.`);
55
+ return Obj.make(schema, data);
58
56
  }
59
57
 
60
58
  // TODO(burdon): Based on dependencies (e.g., organization before contact).
61
59
  async createObjects(map: Partial<Record<T, number>>) {
62
- const results: Live<any>[] = [];
60
+ const results: any[] = [];
63
61
  for (const [type, count] of entries(map)) {
64
62
  results.push(...(await Promise.all(range(count ?? 0, () => this.createObject({ types: [type as T] })))));
65
63
  }
@@ -86,15 +84,15 @@ export class SpaceObjectGenerator<T extends string> extends TestObjectGenerator<
86
84
  ) {
87
85
  super(schemaMap, generators, async (type: T) => {
88
86
  const schema = this.getSchema(type);
89
- const { objects } = await this._space.db.query(schema ? Filter.type(schema) : Filter.nothing()).run();
87
+ const objects = await this._space.db.query(schema ? Filter.type(schema) : Filter.nothing()).run();
90
88
  return objects;
91
89
  });
92
90
  }
93
91
 
94
92
  async addSchemas() {
95
- const result: (EchoSchema | Schema.Schema.AnyNoContext)[] = [];
93
+ const result: Type.Obj.Any[] = [];
96
94
  for (const [typename, schema] of Object.entries(this._schemas)) {
97
- const echoSchema = await this._maybeRegisterSchema(typename, schema as EchoSchema | Schema.Schema.AnyNoContext);
95
+ const echoSchema = await this._maybeRegisterSchema(typename, schema as Type.Obj.Any);
98
96
  this.setSchema(typename as T, echoSchema);
99
97
  result.push(echoSchema);
100
98
  }
@@ -102,40 +100,41 @@ export class SpaceObjectGenerator<T extends string> extends TestObjectGenerator<
102
100
  return result;
103
101
  }
104
102
 
105
- override async createObject({ types }: { types?: T[] } = {}): Promise<AnyLiveObject<any>> {
103
+ override async createObject({
104
+ types,
105
+ }: {
106
+ types?: T[];
107
+ } = {}): Promise<Obj.Any> {
106
108
  return this._space.db.add(await super.createObject({ types }));
107
109
  }
108
110
 
109
- private async _maybeRegisterSchema(
110
- typename: string,
111
- schema: EchoSchema | Schema.Schema.AnyNoContext,
112
- ): Promise<EchoSchema | Schema.Schema.AnyNoContext> {
111
+ private async _maybeRegisterSchema(typename: string, schema: Type.Obj.Any): Promise<Type.Obj.Any> {
113
112
  if (schema instanceof EchoSchema) {
114
- const existingSchema = this._space.db.schemaRegistry.getSchema(typename);
113
+ const existingSchema = this._space.internal.db.schemaRegistry.getSchema(typename);
115
114
  if (existingSchema != null) {
116
115
  return existingSchema;
117
116
  }
118
- const [registeredSchema] = await this._space.db.schemaRegistry.register([schema]);
117
+ const [registeredSchema] = await this._space.internal.db.schemaRegistry.register([schema]);
119
118
  return registeredSchema;
120
119
  } else {
121
- const existingSchema = this._space.db.graph.schemaRegistry.getSchema(typename);
120
+ const existingSchema = this._space.internal.db.graph.schemaRegistry.getSchema(typename);
122
121
  if (existingSchema != null) {
123
122
  return existingSchema;
124
123
  }
125
- this._space.db.graph.schemaRegistry.addSchema([schema]);
124
+ await this._space.internal.db.graph.schemaRegistry.register([schema]);
126
125
  return schema;
127
126
  }
128
127
  }
129
128
 
130
- async mutateObject(object: AnyLiveObject<any>, params: MutationsProviderParams): Promise<void> {
129
+ async mutateObject(object: Obj.Any, params: MutationsProviderProps): Promise<void> {
131
130
  invariant(this._mutations, 'Mutations not defined.');
132
- const type = getTypeAnnotation(getSchema(object)!)!.typename as T;
131
+ const type = getTypeAnnotation(Obj.getSchema(object)!)!.typename as T;
133
132
  invariant(type && this._mutations?.[type], 'Invalid object type.');
134
133
 
135
134
  await this._mutations![type](object, params);
136
135
  }
137
136
 
138
- async mutateObjects(objects: AnyLiveObject<any>[], params: MutationsProviderParams): Promise<void> {
137
+ async mutateObjects(objects: Obj.Any[], params: MutationsProviderProps): Promise<void> {
139
138
  for (const object of objects) {
140
139
  await this.mutateObject(object, params);
141
140
  }
package/src/types.ts CHANGED
@@ -2,18 +2,14 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import type * as Schema from 'effect/Schema';
6
-
7
- import { type EchoSchema } from '@dxos/echo/internal';
8
- import { type AnyLiveObject } from '@dxos/echo-db';
9
- import { type Live } from '@dxos/live-object';
5
+ import { type Obj, type Type } from '@dxos/echo';
10
6
 
11
7
  // TODO(burdon): Use echo-schema types.
12
8
  export type TestObject = { id: string } & Record<string, any>;
13
9
 
14
- export type TestSchemaMap<T extends string = string> = Record<T, EchoSchema | Schema.Schema.AnyNoContext>;
10
+ export type TestSchemaMap<T extends string = string> = Record<T, Type.Obj.Any>;
15
11
 
16
- export type TestObjectProvider<T extends string = string> = (type: T) => Promise<Live<any>[]>;
12
+ export type TestObjectProvider<T extends string = string> = (type: T) => Promise<any[]>;
17
13
 
18
14
  export type TestGeneratorMap<T extends string = string> = Record<
19
15
  T,
@@ -22,10 +18,10 @@ export type TestGeneratorMap<T extends string = string> = Record<
22
18
 
23
19
  export type TestMutationsMap<T extends string = string> = Record<T, TestObjectMutators>;
24
20
 
25
- export type MutationsProviderParams = {
21
+ export type MutationsProviderProps = {
26
22
  count: number;
27
23
  mutationSize: number;
28
24
  maxContentLength: number;
29
25
  };
30
26
 
31
- export type TestObjectMutators = (object: AnyLiveObject<any>, params: MutationsProviderParams) => Promise<void>;
27
+ export type TestObjectMutators = (object: Obj.Any, params: MutationsProviderProps) => Promise<void>;