@dxos/echo-generator 0.8.4-main.ef1bc66f44 → 0.8.4-main.effb148878
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/LICENSE +102 -5
- package/README.md +1 -1
- package/dist/lib/neutral/index.mjs +54 -92
- package/dist/lib/neutral/index.mjs.map +3 -3
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/types/src/data.d.ts +4 -4
- package/dist/types/src/data.d.ts.map +1 -1
- package/dist/types/src/generator.d.ts +6 -9
- package/dist/types/src/generator.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +1 -1
- package/dist/types/src/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -17
- package/src/data.ts +29 -29
- package/src/generator.test.ts +14 -18
- package/src/generator.ts +13 -14
- package/src/types.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/echo-generator",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.effb148878",
|
|
4
4
|
"description": "ECHO data generator for testing.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "https://github.com/dxos/dxos"
|
|
10
10
|
},
|
|
11
|
-
"license": "
|
|
11
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
12
12
|
"author": "info@dxos.org",
|
|
13
13
|
"sideEffects": false,
|
|
14
14
|
"type": "module",
|
|
@@ -20,30 +20,28 @@
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"types": "dist/types/src/index.d.ts",
|
|
23
|
-
"typesVersions": {
|
|
24
|
-
"*": {}
|
|
25
|
-
},
|
|
26
23
|
"files": [
|
|
27
24
|
"dist",
|
|
28
25
|
"src"
|
|
29
26
|
],
|
|
30
27
|
"dependencies": {
|
|
31
|
-
"@automerge/automerge": "3.2.
|
|
32
|
-
"effect": "3.
|
|
33
|
-
"@dxos/client": "0.8.4-main.
|
|
34
|
-
"@dxos/
|
|
35
|
-
"@dxos/
|
|
36
|
-
"@dxos/echo-db": "0.8.4-main.
|
|
37
|
-
"@dxos/
|
|
38
|
-
"@dxos/
|
|
39
|
-
"@dxos/
|
|
28
|
+
"@automerge/automerge": "3.2.6",
|
|
29
|
+
"effect": "3.20.0",
|
|
30
|
+
"@dxos/client": "0.8.4-main.effb148878",
|
|
31
|
+
"@dxos/context": "0.8.4-main.effb148878",
|
|
32
|
+
"@dxos/echo": "0.8.4-main.effb148878",
|
|
33
|
+
"@dxos/echo-db": "0.8.4-main.effb148878",
|
|
34
|
+
"@dxos/invariant": "0.8.4-main.effb148878",
|
|
35
|
+
"@dxos/node-std": "0.8.4-main.effb148878",
|
|
36
|
+
"@dxos/util": "0.8.4-main.effb148878",
|
|
37
|
+
"@dxos/log": "0.8.4-main.effb148878"
|
|
40
38
|
},
|
|
41
39
|
"devDependencies": {
|
|
42
|
-
"@dxos/random": "0.8.4-main.
|
|
40
|
+
"@dxos/random": "0.8.4-main.effb148878"
|
|
43
41
|
},
|
|
44
42
|
"peerDependencies": {
|
|
45
|
-
"effect": "3.
|
|
46
|
-
"@dxos/random": "0.8.4-main.
|
|
43
|
+
"effect": "3.20.0",
|
|
44
|
+
"@dxos/random": "0.8.4-main.effb148878"
|
|
47
45
|
},
|
|
48
46
|
"publishConfig": {
|
|
49
47
|
"access": "public"
|
package/src/data.ts
CHANGED
|
@@ -6,9 +6,9 @@ import { next as A } from '@automerge/automerge';
|
|
|
6
6
|
import * as Schema from 'effect/Schema';
|
|
7
7
|
|
|
8
8
|
import { type Space } from '@dxos/client/echo';
|
|
9
|
-
import { Ref, Type } from '@dxos/echo';
|
|
9
|
+
import { DXN, Ref, Type } from '@dxos/echo';
|
|
10
10
|
import { createDocAccessor } from '@dxos/echo-db';
|
|
11
|
-
import {
|
|
11
|
+
import { random } from '@dxos/random';
|
|
12
12
|
|
|
13
13
|
import { SpaceObjectGenerator, TestObjectGenerator } from './generator';
|
|
14
14
|
import { type TestGeneratorMap, type TestMutationsMap, type TestSchemaMap } from './types';
|
|
@@ -25,10 +25,10 @@ export const Priority = [1, 2, 3, 4, 5];
|
|
|
25
25
|
* @deprecated
|
|
26
26
|
*/
|
|
27
27
|
export enum TestSchemaType {
|
|
28
|
-
document = 'example.
|
|
29
|
-
organization = 'example.
|
|
30
|
-
contact = 'example.
|
|
31
|
-
project = 'example.
|
|
28
|
+
document = 'com.example.type.document',
|
|
29
|
+
organization = 'com.example.type.organization',
|
|
30
|
+
contact = 'com.example.type.person',
|
|
31
|
+
project = 'com.example.type.project',
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
/**
|
|
@@ -38,21 +38,21 @@ const testSchemas = (): TestSchemaMap<TestSchemaType> => {
|
|
|
38
38
|
const document = Schema.Struct({
|
|
39
39
|
title: Schema.String.annotations({ description: 'title of the document' }),
|
|
40
40
|
content: Schema.String,
|
|
41
|
-
}).pipe(Type.
|
|
41
|
+
}).pipe(Type.makeObject(DXN.make(TestSchemaType.document, '0.1.0')));
|
|
42
42
|
|
|
43
43
|
const organization = Schema.Struct({
|
|
44
44
|
name: Schema.String.annotations({ description: 'name of the company or organization' }),
|
|
45
45
|
website: Schema.optional(Schema.String.annotations({ description: 'public website URL' })),
|
|
46
46
|
description: Schema.String.annotations({ description: 'short summary of the company' }),
|
|
47
|
-
}).pipe(Type.
|
|
47
|
+
}).pipe(Type.makeObject(DXN.make(TestSchemaType.organization, '0.1.0')));
|
|
48
48
|
|
|
49
49
|
const contact = Schema.Struct({
|
|
50
50
|
name: Schema.String.annotations({ description: 'name of the person' }),
|
|
51
51
|
email: Schema.optional(Schema.String),
|
|
52
|
-
org: Schema.optional(
|
|
52
|
+
org: Schema.optional(Ref.Ref(organization)),
|
|
53
53
|
lat: Schema.optional(Schema.Number),
|
|
54
54
|
lng: Schema.optional(Schema.Number),
|
|
55
|
-
}).pipe(Type.
|
|
55
|
+
}).pipe(Type.makeObject(DXN.make(TestSchemaType.contact, '0.1.0')));
|
|
56
56
|
|
|
57
57
|
const project = Schema.Struct({
|
|
58
58
|
name: Schema.String.annotations({ description: 'name of the project' }),
|
|
@@ -62,8 +62,8 @@ const testSchemas = (): TestSchemaMap<TestSchemaType> => {
|
|
|
62
62
|
status: Schema.String,
|
|
63
63
|
priority: Schema.Number,
|
|
64
64
|
active: Schema.Boolean,
|
|
65
|
-
org: Schema.optional(
|
|
66
|
-
}).pipe(Type.
|
|
65
|
+
org: Schema.optional(Ref.Ref(organization)),
|
|
66
|
+
}).pipe(Type.makeObject(DXN.make(TestSchemaType.project, '0.1.0')));
|
|
67
67
|
|
|
68
68
|
return {
|
|
69
69
|
[TestSchemaType.document]: document,
|
|
@@ -75,39 +75,39 @@ const testSchemas = (): TestSchemaMap<TestSchemaType> => {
|
|
|
75
75
|
|
|
76
76
|
const testObjectGenerators: TestGeneratorMap<TestSchemaType> = {
|
|
77
77
|
[TestSchemaType.document]: async () => ({
|
|
78
|
-
title:
|
|
79
|
-
content:
|
|
78
|
+
title: random.lorem.sentence(3),
|
|
79
|
+
content: random.lorem.sentences({ min: 1, max: random.number.int({ min: 1, max: 3 }) }),
|
|
80
80
|
}),
|
|
81
81
|
|
|
82
82
|
[TestSchemaType.organization]: async () => ({
|
|
83
|
-
name:
|
|
84
|
-
website:
|
|
85
|
-
description:
|
|
83
|
+
name: random.company.name(),
|
|
84
|
+
website: random.datatype.boolean({ probability: 0.3 }) ? random.internet.url() : undefined,
|
|
85
|
+
description: random.lorem.sentences(),
|
|
86
86
|
}),
|
|
87
87
|
|
|
88
88
|
[TestSchemaType.contact]: async (provider) => {
|
|
89
89
|
const organizations = await provider?.(TestSchemaType.organization);
|
|
90
|
-
const location =
|
|
90
|
+
const location = random.datatype.boolean() ? random.geo.airport() : {};
|
|
91
91
|
|
|
92
92
|
return {
|
|
93
|
-
name:
|
|
94
|
-
email:
|
|
93
|
+
name: random.person.fullName(),
|
|
94
|
+
email: random.datatype.boolean({ probability: 0.5 }) ? random.internet.email() : undefined,
|
|
95
95
|
org:
|
|
96
|
-
organizations?.length &&
|
|
97
|
-
? Ref.make(
|
|
96
|
+
organizations?.length && random.datatype.boolean({ probability: 0.8 })
|
|
97
|
+
? Ref.make(random.helpers.arrayElement(organizations))
|
|
98
98
|
: undefined,
|
|
99
99
|
...location,
|
|
100
100
|
};
|
|
101
101
|
},
|
|
102
102
|
|
|
103
103
|
[TestSchemaType.project]: async () => ({
|
|
104
|
-
name:
|
|
105
|
-
repo:
|
|
106
|
-
status:
|
|
107
|
-
description:
|
|
108
|
-
website:
|
|
109
|
-
priority:
|
|
110
|
-
active:
|
|
104
|
+
name: random.commerce.productName(),
|
|
105
|
+
repo: random.internet.url(),
|
|
106
|
+
status: random.helpers.arrayElement(Status),
|
|
107
|
+
description: random.lorem.sentences(),
|
|
108
|
+
website: random.internet.url(),
|
|
109
|
+
priority: random.helpers.arrayElement(Priority),
|
|
110
|
+
active: random.datatype.boolean(),
|
|
111
111
|
}),
|
|
112
112
|
};
|
|
113
113
|
|
package/src/generator.test.ts
CHANGED
|
@@ -7,14 +7,14 @@ 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 { Obj, Type } from '@dxos/echo';
|
|
10
|
+
import { DXN, Obj, Type } from '@dxos/echo';
|
|
11
11
|
import { getObjectCore } from '@dxos/echo-db';
|
|
12
|
-
import {
|
|
12
|
+
import { random } from '@dxos/random';
|
|
13
13
|
|
|
14
14
|
import { TestSchemaType, createSpaceObjectGenerator, createTestObjectGenerator } from './data';
|
|
15
15
|
import { SpaceObjectGenerator } from './generator';
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
random.seed(3);
|
|
18
18
|
|
|
19
19
|
describe('TestObjectGenerator', () => {
|
|
20
20
|
// TODO(burdon): Use TestBuilder.
|
|
@@ -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(Obj.
|
|
46
|
+
expect(Obj.getTypeURI(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,26 +59,27 @@ 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(Obj.
|
|
62
|
+
schemaId.push(Obj.getTypeURI(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(Obj.
|
|
69
|
+
schemaId.push(Obj.getTypeURI(organization)!.toString());
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
expect(schemaId[0]).not.to.be.undefined;
|
|
73
73
|
expect(schemaId[0]).to.eq(schemaId[1]);
|
|
74
74
|
});
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
// flaky
|
|
77
|
+
test.skip('mutations', async () => {
|
|
77
78
|
const { space } = await setupTest();
|
|
78
79
|
const generator = createSpaceObjectGenerator(space);
|
|
79
80
|
await generator.addSchemas();
|
|
80
81
|
const document = await generator.createObject({ types: [TestSchemaType.document] });
|
|
81
|
-
expect(Obj.
|
|
82
|
+
expect(Obj.getTypeURI(document)).to.exist;
|
|
82
83
|
|
|
83
84
|
const beforeChangesCount = A.getAllChanges(getObjectCore(document).docHandle!.doc()).length;
|
|
84
85
|
|
|
@@ -94,15 +95,10 @@ describe('TestObjectGenerator', () => {
|
|
|
94
95
|
test('create object with in memory schema', async () => {
|
|
95
96
|
const Task = Schema.Struct({
|
|
96
97
|
name: Schema.optional(Schema.String),
|
|
97
|
-
}).pipe(
|
|
98
|
-
Type.object({
|
|
99
|
-
typename: 'example.org/type/Task',
|
|
100
|
-
version: '0.1.0',
|
|
101
|
-
}),
|
|
102
|
-
);
|
|
98
|
+
}).pipe(Type.makeObject(DXN.make('com.example.type.task', '0.1.0')));
|
|
103
99
|
|
|
104
100
|
enum Types {
|
|
105
|
-
task = 'example.
|
|
101
|
+
task = 'com.example.type.task',
|
|
106
102
|
}
|
|
107
103
|
|
|
108
104
|
const { space } = await setupTest();
|
|
@@ -117,7 +113,7 @@ describe('TestObjectGenerator', () => {
|
|
|
117
113
|
{
|
|
118
114
|
[Types.task]: async (task, params) => {
|
|
119
115
|
for (const _ in Array.from({ length: params.count })) {
|
|
120
|
-
task.name =
|
|
116
|
+
task.name = random.lorem.sentence();
|
|
121
117
|
}
|
|
122
118
|
},
|
|
123
119
|
},
|
|
@@ -125,7 +121,7 @@ describe('TestObjectGenerator', () => {
|
|
|
125
121
|
await generator.addSchemas();
|
|
126
122
|
|
|
127
123
|
const todo = await generator.createObject({ types: [Types.task] });
|
|
128
|
-
expect(Obj.
|
|
124
|
+
expect(Obj.getTypeURI(todo)).to.exist;
|
|
129
125
|
});
|
|
130
126
|
|
|
131
127
|
test('references', async () => {
|
|
@@ -145,7 +141,7 @@ describe('TestObjectGenerator', () => {
|
|
|
145
141
|
test('create project', async () => {
|
|
146
142
|
const generator = createTestObjectGenerator();
|
|
147
143
|
const project = await generator.createObject({ types: [TestSchemaType.project] });
|
|
148
|
-
expect(Obj.
|
|
144
|
+
expect(Obj.getTypeURI(project)).to.exist;
|
|
149
145
|
});
|
|
150
146
|
|
|
151
147
|
test('create object with not type', async () => {
|
package/src/generator.ts
CHANGED
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import { Obj,
|
|
7
|
-
import { EchoSchema, getTypeAnnotation } from '@dxos/echo/internal';
|
|
5
|
+
import { type Space } from '@dxos/client/echo';
|
|
6
|
+
import { Filter, Obj, Type } from '@dxos/echo';
|
|
8
7
|
import { isProxy } from '@dxos/echo/internal';
|
|
9
8
|
import { invariant } from '@dxos/invariant';
|
|
10
|
-
import {
|
|
9
|
+
import { random } from '@dxos/random';
|
|
11
10
|
import { entries, range } from '@dxos/util';
|
|
12
11
|
|
|
13
12
|
import { type TestSchemaType } from './data';
|
|
@@ -31,20 +30,20 @@ export class TestObjectGenerator<T extends string = TestSchemaType> {
|
|
|
31
30
|
private readonly _provider?: TestObjectProvider<T>,
|
|
32
31
|
) {}
|
|
33
32
|
|
|
34
|
-
get schemas(): Type.
|
|
33
|
+
get schemas(): Type.AnyObj[] {
|
|
35
34
|
return Object.values(this._schemas);
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
getSchema(type: T): Type.
|
|
39
|
-
return this.schemas.find((schema) =>
|
|
37
|
+
getSchema(type: T): Type.AnyObj | undefined {
|
|
38
|
+
return this.schemas.find((schema) => Type.getTypename(schema) === type);
|
|
40
39
|
}
|
|
41
40
|
|
|
42
|
-
protected setSchema(type: T, schema: Type.
|
|
41
|
+
protected setSchema(type: T, schema: Type.AnyEntity): void {
|
|
43
42
|
this._schemas[type] = schema;
|
|
44
43
|
}
|
|
45
44
|
|
|
46
45
|
async createObject({ types }: { types?: T[] } = {}): Promise<any> {
|
|
47
|
-
const type =
|
|
46
|
+
const type = random.helpers.arrayElement(types ?? (Object.keys(this._schemas) as T[]));
|
|
48
47
|
const data = await this._generators[type](this._provider);
|
|
49
48
|
if (isProxy(data)) {
|
|
50
49
|
return data;
|
|
@@ -90,9 +89,9 @@ export class SpaceObjectGenerator<T extends string> extends TestObjectGenerator<
|
|
|
90
89
|
}
|
|
91
90
|
|
|
92
91
|
async addSchemas() {
|
|
93
|
-
const result: Type.
|
|
92
|
+
const result: Type.AnyEntity[] = [];
|
|
94
93
|
for (const [typename, schema] of Object.entries(this._schemas)) {
|
|
95
|
-
const echoSchema = await this._maybeRegisterSchema(typename, schema as Type.
|
|
94
|
+
const echoSchema = await this._maybeRegisterSchema(typename, schema as Type.AnyObj);
|
|
96
95
|
this.setSchema(typename as T, echoSchema);
|
|
97
96
|
result.push(echoSchema);
|
|
98
97
|
}
|
|
@@ -108,8 +107,8 @@ export class SpaceObjectGenerator<T extends string> extends TestObjectGenerator<
|
|
|
108
107
|
return this._space.db.add(await super.createObject({ types }));
|
|
109
108
|
}
|
|
110
109
|
|
|
111
|
-
private async _maybeRegisterSchema(typename: string, schema: Type.
|
|
112
|
-
if (schema
|
|
110
|
+
private async _maybeRegisterSchema(typename: string, schema: Type.AnyEntity): Promise<Type.AnyEntity> {
|
|
111
|
+
if (Type.getDatabase(schema) != null) {
|
|
113
112
|
const existingSchema = this._space.internal.db.schemaRegistry.getSchema(typename);
|
|
114
113
|
if (existingSchema != null) {
|
|
115
114
|
return existingSchema;
|
|
@@ -128,7 +127,7 @@ export class SpaceObjectGenerator<T extends string> extends TestObjectGenerator<
|
|
|
128
127
|
|
|
129
128
|
async mutateObject(object: Obj.Any, params: MutationsProviderProps): Promise<void> {
|
|
130
129
|
invariant(this._mutations, 'Mutations not defined.');
|
|
131
|
-
const type =
|
|
130
|
+
const type = Type.getTypename(Obj.getType(object)!) as T;
|
|
132
131
|
invariant(type && this._mutations?.[type], 'Invalid object type.');
|
|
133
132
|
|
|
134
133
|
await this._mutations;
|
package/src/types.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { type Obj, type Type } from '@dxos/echo';
|
|
|
7
7
|
// TODO(burdon): Use echo-schema types.
|
|
8
8
|
export type TestObject = { id: string } & Record<string, any>;
|
|
9
9
|
|
|
10
|
-
export type TestSchemaMap<T extends string = string> = Record<T, Type.
|
|
10
|
+
export type TestSchemaMap<T extends string = string> = Record<T, Type.AnyEntity>;
|
|
11
11
|
|
|
12
12
|
export type TestObjectProvider<T extends string = string> = (type: T) => Promise<any[]>;
|
|
13
13
|
|