@dxos/echo 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d
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/dist/lib/browser/chunk-7GH6RXJ3.mjs +3683 -0
- package/dist/lib/browser/chunk-7GH6RXJ3.mjs.map +7 -0
- package/dist/lib/browser/chunk-E4UTVJNF.mjs +1111 -0
- package/dist/lib/browser/chunk-E4UTVJNF.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +24 -1
- package/dist/lib/browser/internal/index.mjs +336 -0
- package/dist/lib/browser/internal/index.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +289 -31
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +1111 -0
- package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-M4B6BMD2.mjs +3683 -0
- package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +24 -1
- package/dist/lib/node-esm/internal/index.mjs +336 -0
- package/dist/lib/node-esm/internal/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +289 -31
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/Annotation.d.ts +2 -0
- package/dist/types/src/Annotation.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +137 -0
- package/dist/types/src/Database.d.ts.map +1 -0
- package/dist/types/src/Entity.d.ts +36 -0
- package/dist/types/src/Entity.d.ts.map +1 -0
- package/dist/types/src/Format.d.ts +4 -0
- package/dist/types/src/Format.d.ts.map +1 -0
- package/dist/types/src/JsonSchema.d.ts +9 -0
- package/dist/types/src/JsonSchema.d.ts.map +1 -0
- package/dist/types/src/Key.d.ts +1 -0
- package/dist/types/src/Key.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +121 -50
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +10 -10
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +18 -14
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Tag.d.ts +17 -0
- package/dist/types/src/Tag.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +39 -50
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts +68 -0
- package/dist/types/src/errors.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +9 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/annotations/annotations.d.ts +174 -0
- package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/annotations/annotations.test.d.ts +2 -0
- package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
- package/dist/types/src/internal/annotations/index.d.ts +3 -0
- package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
- package/dist/types/src/internal/annotations/util.d.ts +26 -0
- package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
- package/dist/types/src/internal/entities/entity.d.ts +10 -0
- package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
- package/dist/types/src/internal/entities/expando.d.ts +16 -0
- package/dist/types/src/internal/entities/expando.d.ts.map +1 -0
- package/dist/types/src/internal/entities/index.d.ts +6 -0
- package/dist/types/src/internal/entities/index.d.ts.map +1 -0
- package/dist/types/src/internal/entities/model.d.ts +70 -0
- package/dist/types/src/internal/entities/model.d.ts.map +1 -0
- package/dist/types/src/internal/entities/object.d.ts +11 -0
- package/dist/types/src/internal/entities/object.d.ts.map +1 -0
- package/dist/types/src/internal/entities/relation.d.ts +55 -0
- package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
- package/dist/types/src/internal/entities/util.d.ts +2 -0
- package/dist/types/src/internal/entities/util.d.ts.map +1 -0
- package/dist/types/src/internal/formats/date.d.ts +63 -0
- package/dist/types/src/internal/formats/date.d.ts.map +1 -0
- package/dist/types/src/internal/formats/date.test.d.ts +2 -0
- package/dist/types/src/internal/formats/date.test.d.ts.map +1 -0
- package/dist/types/src/internal/formats/format.d.ts +32 -0
- package/dist/types/src/internal/formats/format.d.ts.map +1 -0
- package/dist/types/src/internal/formats/format.test.d.ts +2 -0
- package/dist/types/src/internal/formats/format.test.d.ts.map +1 -0
- package/dist/types/src/internal/formats/index.d.ts +8 -0
- package/dist/types/src/internal/formats/index.d.ts.map +1 -0
- package/dist/types/src/internal/formats/number.d.ts +31 -0
- package/dist/types/src/internal/formats/number.d.ts.map +1 -0
- package/dist/types/src/internal/formats/object.d.ts +35 -0
- package/dist/types/src/internal/formats/object.d.ts.map +1 -0
- package/dist/types/src/internal/formats/select.d.ts +11 -0
- package/dist/types/src/internal/formats/select.d.ts.map +1 -0
- package/dist/types/src/internal/formats/string.d.ts +38 -0
- package/dist/types/src/internal/formats/string.d.ts.map +1 -0
- package/dist/types/src/internal/formats/types.d.ts +68 -0
- package/dist/types/src/internal/formats/types.d.ts.map +1 -0
- package/dist/types/src/internal/index.d.ts +11 -0
- package/dist/types/src/internal/index.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/annotations.d.ts +19 -0
- package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/effect-schema.test.d.ts +2 -0
- package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/index.d.ts +5 -0
- package/dist/types/src/internal/json-schema/index.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts +7 -0
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts +250 -0
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema.d.ts +29 -0
- package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema.test.d.ts +2 -0
- package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/common.d.ts +18 -0
- package/dist/types/src/internal/object/common.d.ts.map +1 -0
- package/dist/types/src/internal/object/create-object.d.ts +39 -0
- package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
- package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
- package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/deleted.d.ts +6 -0
- package/dist/types/src/internal/object/deleted.d.ts.map +1 -0
- package/dist/types/src/internal/object/ids.d.ts +6 -0
- package/dist/types/src/internal/object/ids.d.ts.map +1 -0
- package/dist/types/src/internal/object/index.d.ts +8 -0
- package/dist/types/src/internal/object/index.d.ts.map +1 -0
- package/dist/types/src/internal/object/inspect.d.ts +2 -0
- package/dist/types/src/internal/object/inspect.d.ts.map +1 -0
- package/dist/types/src/internal/object/json-serializer.d.ts +31 -0
- package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/object/json-serializer.test.d.ts +2 -0
- package/dist/types/src/internal/object/json-serializer.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/schema-validator.d.ts +15 -0
- package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/object/schema-validator.test.d.ts +2 -0
- package/dist/types/src/internal/object/schema-validator.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/typed-object.d.ts +31 -0
- package/dist/types/src/internal/object/typed-object.d.ts.map +1 -0
- package/dist/types/src/internal/object/typed-object.test.d.ts +2 -0
- package/dist/types/src/internal/object/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/handler.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/index.d.ts +3 -0
- package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/make-object.d.ts +16 -0
- package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/schema.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-handler.d.ts +44 -0
- package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-handler.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-object.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/ref/index.d.ts +3 -0
- package/dist/types/src/internal/ref/index.d.ts.map +1 -0
- package/dist/types/src/internal/ref/ref-array.d.ts +21 -0
- package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -0
- package/dist/types/src/internal/ref/ref.d.ts +209 -0
- package/dist/types/src/internal/ref/ref.d.ts.map +1 -0
- package/dist/types/src/internal/ref/ref.test.d.ts +2 -0
- package/dist/types/src/internal/ref/ref.test.d.ts.map +1 -0
- package/dist/types/src/internal/schema/compose.d.ts +6 -0
- package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
- package/dist/types/src/internal/schema/compose.test.d.ts +2 -0
- package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
- package/dist/types/src/internal/schema/echo-schema.d.ts +168 -0
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -0
- package/dist/types/src/internal/schema/index.d.ts +6 -0
- package/dist/types/src/internal/schema/index.d.ts.map +1 -0
- package/dist/types/src/internal/schema/manipulation.d.ts +10 -0
- package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -0
- package/dist/types/src/internal/schema/persistent-schema.d.ts +18 -0
- package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +18 -0
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +1 -0
- package/dist/types/src/internal/schema/snapshot.d.ts +6 -0
- package/dist/types/src/internal/schema/snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/types/base.d.ts +37 -0
- package/dist/types/src/internal/types/base.d.ts.map +1 -0
- package/dist/types/src/internal/types/entity.d.ts +12 -0
- package/dist/types/src/internal/types/entity.d.ts.map +1 -0
- package/dist/types/src/internal/types/index.d.ts +6 -0
- package/dist/types/src/internal/types/index.d.ts.map +1 -0
- package/dist/types/src/internal/types/meta.d.ts +40 -0
- package/dist/types/src/internal/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/types/typename.d.ts +13 -0
- package/dist/types/src/internal/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/types/version.d.ts +15 -0
- package/dist/types/src/internal/types/version.d.ts.map +1 -0
- package/dist/types/src/query/filter.d.ts +167 -0
- package/dist/types/src/query/filter.d.ts.map +1 -0
- package/dist/types/src/query/index.d.ts +4 -1
- package/dist/types/src/query/index.d.ts.map +1 -1
- package/dist/types/src/query/order.d.ts +12 -0
- package/dist/types/src/query/order.d.ts.map +1 -0
- package/dist/types/src/query/query.d.ts +112 -0
- package/dist/types/src/query/query.d.ts.map +1 -0
- package/dist/types/src/query/query.test.d.ts +2 -0
- package/dist/types/src/query/query.test.d.ts.map +1 -0
- package/dist/types/src/query/testing.d.ts +51 -0
- package/dist/types/src/query/testing.d.ts.map +1 -0
- package/dist/types/src/query/types.d.ts +17 -0
- package/dist/types/src/query/types.d.ts.map +1 -0
- package/dist/types/src/query/util.d.ts +8 -0
- package/dist/types/src/query/util.d.ts.map +1 -0
- package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +3 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-data.d.ts +18 -0
- package/dist/types/src/testing/test-data.d.ts.map +1 -0
- package/dist/types/src/testing/test-schema.d.ts +337 -0
- package/dist/types/src/testing/test-schema.d.ts.map +1 -0
- package/dist/types/src/testing/util.d.ts +16 -0
- package/dist/types/src/testing/util.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +49 -29
- package/src/Annotation.ts +17 -0
- package/src/Database.ts +189 -0
- package/src/Entity.ts +51 -0
- package/src/Format.ts +11 -0
- package/src/JsonSchema.ts +16 -0
- package/src/Key.ts +3 -0
- package/src/Obj.ts +353 -107
- package/src/Ref.ts +9 -10
- package/src/Relation.ts +68 -43
- package/src/Tag.ts +40 -0
- package/src/Type.ts +97 -85
- package/src/errors.ts +18 -0
- package/src/index.ts +13 -4
- package/src/internal/README.md +83 -0
- package/src/internal/annotations/annotations.test.ts +96 -0
- package/src/internal/annotations/annotations.ts +463 -0
- package/src/internal/annotations/index.ts +6 -0
- package/src/internal/annotations/util.ts +70 -0
- package/src/internal/entities/entity.ts +109 -0
- package/src/internal/entities/expando.ts +23 -0
- package/src/internal/entities/index.ts +9 -0
- package/src/internal/entities/model.ts +129 -0
- package/src/internal/entities/object.ts +45 -0
- package/src/internal/entities/relation.ts +155 -0
- package/src/internal/entities/util.ts +33 -0
- package/src/internal/formats/date.test.ts +56 -0
- package/src/internal/formats/date.ts +217 -0
- package/src/internal/formats/format.test.ts +77 -0
- package/src/internal/formats/format.ts +55 -0
- package/src/internal/formats/index.ts +12 -0
- package/src/internal/formats/number.ts +89 -0
- package/src/internal/formats/object.ts +80 -0
- package/src/internal/formats/select.ts +16 -0
- package/src/internal/formats/string.ts +76 -0
- package/src/internal/formats/types.ts +180 -0
- package/src/internal/index.ts +38 -0
- package/src/internal/json-schema/annotations.ts +50 -0
- package/src/internal/json-schema/effect-schema.test.ts +143 -0
- package/src/internal/json-schema/index.ts +8 -0
- package/src/internal/json-schema/json-schema-normalize.ts +109 -0
- package/src/internal/json-schema/json-schema-type.ts +404 -0
- package/src/internal/json-schema/json-schema.test.ts +859 -0
- package/src/internal/json-schema/json-schema.ts +528 -0
- package/src/internal/object/common.ts +75 -0
- package/src/internal/object/create-object.test.ts +116 -0
- package/src/internal/object/create-object.ts +95 -0
- package/src/internal/object/deleted.ts +19 -0
- package/src/internal/object/ids.ts +12 -0
- package/src/internal/object/index.ts +11 -0
- package/src/internal/object/inspect.ts +46 -0
- package/src/internal/object/json-serializer.test.ts +94 -0
- package/src/internal/object/json-serializer.ts +230 -0
- package/src/internal/object/schema-validator.test.ts +186 -0
- package/src/internal/object/schema-validator.ts +242 -0
- package/src/internal/object/typed-object.test.ts +34 -0
- package/src/internal/object/typed-object.ts +94 -0
- package/src/internal/proxy/handler.test.ts +173 -0
- package/src/internal/proxy/index.ts +6 -0
- package/src/internal/proxy/make-object.ts +113 -0
- package/src/internal/proxy/schema.test.ts +137 -0
- package/src/internal/proxy/typed-handler.test.ts +102 -0
- package/src/internal/proxy/typed-handler.ts +233 -0
- package/src/internal/proxy/typed-object.test.ts +105 -0
- package/src/internal/ref/index.ts +6 -0
- package/src/internal/ref/ref-array.ts +39 -0
- package/src/internal/ref/ref.test.ts +101 -0
- package/src/internal/ref/ref.ts +525 -0
- package/src/internal/schema/compose.test.ts +42 -0
- package/src/internal/schema/compose.ts +37 -0
- package/src/internal/schema/echo-schema.ts +385 -0
- package/src/internal/schema/index.ts +9 -0
- package/src/internal/schema/manipulation.ts +92 -0
- package/src/internal/schema/persistent-schema.ts +28 -0
- package/src/internal/schema/runtime-schema-registry.ts +78 -0
- package/src/internal/schema/snapshot.ts +25 -0
- package/src/internal/types/base.ts +58 -0
- package/src/internal/types/entity.ts +23 -0
- package/src/internal/types/index.ts +9 -0
- package/src/internal/types/meta.ts +76 -0
- package/src/internal/types/typename.ts +45 -0
- package/src/internal/types/version.ts +20 -0
- package/src/query/filter.ts +455 -0
- package/src/query/index.ts +5 -1
- package/src/query/order.ts +34 -0
- package/src/query/query.test.ts +334 -0
- package/src/query/query.ts +303 -0
- package/src/query/testing.ts +64 -0
- package/src/query/types.ts +23 -0
- package/src/query/util.ts +25 -0
- package/src/testing/api.test.ts +100 -0
- package/src/testing/index.ts +3 -1
- package/src/testing/test-data.ts +130 -0
- package/src/testing/test-schema.ts +213 -0
- package/src/testing/util.ts +78 -0
- package/dist/lib/browser/chunk-2KNTYMIW.mjs +0 -697
- package/dist/lib/browser/chunk-2KNTYMIW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-EXNNC62J.mjs +0 -697
- package/dist/lib/node-esm/chunk-EXNNC62J.mjs.map +0 -7
- package/dist/types/src/experimental/database.d.ts +0 -8
- package/dist/types/src/experimental/database.d.ts.map +0 -1
- package/dist/types/src/experimental/index.d.ts +0 -1
- package/dist/types/src/experimental/index.d.ts.map +0 -1
- package/dist/types/src/experimental/queue.d.ts +0 -8
- package/dist/types/src/experimental/queue.d.ts.map +0 -1
- package/dist/types/src/experimental/space.d.ts +0 -8
- package/dist/types/src/experimental/space.d.ts.map +0 -1
- package/dist/types/src/query/dsl.d.ts +0 -218
- package/dist/types/src/query/dsl.d.ts.map +0 -1
- package/dist/types/src/query/dsl.test.d.ts +0 -2
- package/dist/types/src/query/dsl.test.d.ts.map +0 -1
- package/dist/types/src/testing/types.d.ts +0 -113
- package/dist/types/src/testing/types.d.ts.map +0 -1
- package/src/experimental/database.ts +0 -11
- package/src/experimental/index.ts +0 -7
- package/src/experimental/queue.ts +0 -11
- package/src/experimental/space.ts +0 -11
- package/src/query/dsl.test.ts +0 -324
- package/src/query/dsl.ts +0 -646
- package/src/test/api.test.ts +0 -173
- package/src/testing/types.ts +0 -91
- /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
package/src/Obj.ts
CHANGED
|
@@ -2,24 +2,61 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
import
|
|
5
|
+
import * as Function from 'effect/Function';
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
7
|
|
|
8
|
-
import
|
|
8
|
+
import { type ForeignKey } from '@dxos/echo-protocol';
|
|
9
9
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
10
|
-
import { type DXN } from '@dxos/keys';
|
|
11
|
-
import
|
|
12
|
-
import { live } from '@dxos/live-object';
|
|
10
|
+
import { type DXN, ObjectId } from '@dxos/keys';
|
|
11
|
+
import { getSnapshot as getSnapshot$ } from '@dxos/live-object';
|
|
13
12
|
import { assumeType, deepMapValues } from '@dxos/util';
|
|
14
13
|
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
|
|
14
|
+
import * as Entity from './Entity';
|
|
15
|
+
import {
|
|
16
|
+
type AnyEchoObject,
|
|
17
|
+
type AnyProperties,
|
|
18
|
+
type InternalObjectProps,
|
|
19
|
+
MetaId,
|
|
20
|
+
type ObjectJSON,
|
|
21
|
+
type ObjectMeta,
|
|
22
|
+
ObjectVersionId,
|
|
23
|
+
VersionTypeId,
|
|
24
|
+
getDescription as getDescription$,
|
|
25
|
+
getLabel as getLabel$,
|
|
26
|
+
getMeta as getMeta$,
|
|
27
|
+
getObjectDXN,
|
|
28
|
+
getSchema as getSchema$,
|
|
29
|
+
getSchemaTypename,
|
|
30
|
+
getTypeAnnotation,
|
|
31
|
+
getTypeDXN as getTypeDXN$,
|
|
32
|
+
isDeleted as isDeleted$,
|
|
33
|
+
isInstanceOf,
|
|
34
|
+
makeObject,
|
|
35
|
+
objectFromJSON,
|
|
36
|
+
objectToJSON,
|
|
37
|
+
setDescription as setDescription$,
|
|
38
|
+
setLabel as setLabel$,
|
|
39
|
+
} from './internal';
|
|
40
|
+
import * as Ref from './Ref';
|
|
41
|
+
import * as Type from './Type';
|
|
18
42
|
|
|
19
43
|
/**
|
|
20
|
-
*
|
|
44
|
+
* Base type for all ECHO objects.
|
|
45
|
+
* @private
|
|
21
46
|
*/
|
|
22
|
-
interface BaseObj extends
|
|
47
|
+
interface BaseObj extends AnyEchoObject, Entity.OfKind<typeof Entity.Kind.Object> {}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Base type for all Obj objects.
|
|
51
|
+
*/
|
|
52
|
+
export interface Any extends BaseObj {}
|
|
53
|
+
|
|
54
|
+
export const Any = Schema.Struct({}).pipe(
|
|
55
|
+
Type.Obj({
|
|
56
|
+
typename: 'dxos.org/type/Any',
|
|
57
|
+
version: '0.1.0',
|
|
58
|
+
}),
|
|
59
|
+
);
|
|
23
60
|
|
|
24
61
|
/**
|
|
25
62
|
* Object type with specific properties.
|
|
@@ -27,22 +64,30 @@ interface BaseObj extends EchoSchema.HasId, Type.OfKind<EchoSchema.EntityKind.Ob
|
|
|
27
64
|
export type Obj<Props> = BaseObj & Props;
|
|
28
65
|
|
|
29
66
|
/**
|
|
30
|
-
*
|
|
67
|
+
* Object with arbitrary properties.
|
|
68
|
+
*
|
|
69
|
+
* NOTE: Due to how typescript works, this type is not assignable to a specific schema type.
|
|
70
|
+
* In that case, use `Obj.instanceOf` to check if an object is of a specific type.
|
|
31
71
|
*/
|
|
32
|
-
export interface
|
|
33
|
-
|
|
34
|
-
type Props<T = any> = { id?: EchoSchema.ObjectId } & Type.Properties<T>;
|
|
72
|
+
export interface AnyProps extends BaseObj, AnyProperties {}
|
|
35
73
|
|
|
36
|
-
|
|
37
|
-
[
|
|
74
|
+
const defaultMeta: ObjectMeta = {
|
|
75
|
+
keys: [],
|
|
38
76
|
};
|
|
39
77
|
|
|
40
|
-
|
|
78
|
+
type Props<T = any> = {
|
|
79
|
+
id?: ObjectId;
|
|
80
|
+
[Meta]?: Partial<ObjectMeta>;
|
|
81
|
+
} & Type.Properties<T>;
|
|
41
82
|
|
|
42
|
-
// TODO(
|
|
83
|
+
// TODO(burdon): Should we allow the caller to set the id?
|
|
84
|
+
export type MakeProps<T extends Schema.Schema.AnyNoContext> = {
|
|
85
|
+
id?: ObjectId;
|
|
86
|
+
[Meta]?: Partial<ObjectMeta>;
|
|
87
|
+
} & NoInfer<Props<Schema.Schema.Type<T>>>;
|
|
43
88
|
|
|
44
89
|
/**
|
|
45
|
-
* Creates new object.
|
|
90
|
+
* Creates a new object of the given types.
|
|
46
91
|
* @param schema - Object schema.
|
|
47
92
|
* @param props - Object properties.
|
|
48
93
|
* @param meta - Object metadata (deprecated) -- pass with Obj.Meta.
|
|
@@ -54,89 +99,157 @@ export const Meta: unique symbol = EchoSchema.MetaId as any;
|
|
|
54
99
|
* const obj = Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' });
|
|
55
100
|
* ```
|
|
56
101
|
*/
|
|
57
|
-
export const make = <S extends
|
|
102
|
+
export const make = <S extends Schema.Schema.AnyNoContext>(
|
|
58
103
|
schema: S,
|
|
59
104
|
props: MakeProps<S>,
|
|
60
|
-
meta?:
|
|
61
|
-
):
|
|
62
|
-
assertArgument(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
meta = props[EchoSchema.MetaId] as any;
|
|
69
|
-
delete props[EchoSchema.MetaId];
|
|
105
|
+
meta?: Partial<ObjectMeta>,
|
|
106
|
+
): Obj<Schema.Schema.Type<S>> => {
|
|
107
|
+
assertArgument(getTypeAnnotation(schema)?.kind === Entity.Kind.Object, 'schema', 'Expected an object schema');
|
|
108
|
+
|
|
109
|
+
// Set default fields on meta on creation.
|
|
110
|
+
if (props[MetaId] != null) {
|
|
111
|
+
meta = { ...structuredClone(defaultMeta), ...props[MetaId] };
|
|
112
|
+
delete props[MetaId];
|
|
70
113
|
}
|
|
71
114
|
|
|
72
|
-
|
|
115
|
+
// Filter undefined values.
|
|
116
|
+
const filterUndefined = Object.fromEntries(Object.entries(props).filter(([_, v]) => v !== undefined));
|
|
117
|
+
|
|
118
|
+
return makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
|
|
119
|
+
...defaultMeta,
|
|
120
|
+
...meta,
|
|
121
|
+
});
|
|
73
122
|
};
|
|
74
123
|
|
|
124
|
+
/**
|
|
125
|
+
* Determine if object is an ECHO object.
|
|
126
|
+
*/
|
|
75
127
|
export const isObject = (obj: unknown): obj is Any => {
|
|
76
|
-
assumeType<
|
|
77
|
-
return typeof obj === 'object' && obj !== null && obj[
|
|
128
|
+
assumeType<InternalObjectProps>(obj);
|
|
129
|
+
return typeof obj === 'object' && obj !== null && obj[Entity.KindId] === Entity.Kind.Object;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
//
|
|
133
|
+
// Snapshot
|
|
134
|
+
//
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Returns an immutable snapshot of an object.
|
|
138
|
+
*/
|
|
139
|
+
export const getSnapshot: <T extends Any>(obj: Obj<T>) => T = getSnapshot$;
|
|
140
|
+
|
|
141
|
+
export type CloneOptions = {
|
|
142
|
+
/**
|
|
143
|
+
* Retain the original object's ID.
|
|
144
|
+
* @default false
|
|
145
|
+
*/
|
|
146
|
+
retainId?: boolean;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Clones an object or relation.
|
|
151
|
+
* This does not clone referenced objects, only the properties in the object.
|
|
152
|
+
* @returns A new object with the same schema and properties.
|
|
153
|
+
*/
|
|
154
|
+
export const clone = <T extends Any>(obj: T, opts?: CloneOptions): T => {
|
|
155
|
+
const { id, ...data } = obj;
|
|
156
|
+
const schema = getSchema$(obj);
|
|
157
|
+
invariant(schema != null, 'Object should have a schema');
|
|
158
|
+
const props: any = deepMapValues(data, (value, recurse) => {
|
|
159
|
+
if (Ref.isRef(value)) {
|
|
160
|
+
return value;
|
|
161
|
+
}
|
|
162
|
+
return recurse(value);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
if (opts?.retainId) {
|
|
166
|
+
props.id = id;
|
|
167
|
+
}
|
|
168
|
+
const meta = getMeta(obj);
|
|
169
|
+
props[MetaId] = deepMapValues(meta, (value, recurse) => {
|
|
170
|
+
if (Ref.isRef(value)) {
|
|
171
|
+
return value;
|
|
172
|
+
}
|
|
173
|
+
return recurse(value);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
return make(schema as Type.Obj.Any, props);
|
|
78
177
|
};
|
|
79
178
|
|
|
179
|
+
//
|
|
180
|
+
// Type
|
|
181
|
+
//
|
|
182
|
+
|
|
183
|
+
// TODO(burdon): To discuss: prefer over ObjectId or Key.ObjectId or Type.ID?
|
|
184
|
+
export const ID = ObjectId;
|
|
185
|
+
export type ID = ObjectId;
|
|
186
|
+
|
|
80
187
|
/**
|
|
81
188
|
* Test if object or relation is an instance of a schema.
|
|
82
189
|
* @example
|
|
83
190
|
* ```ts
|
|
84
191
|
* const john = Obj.make(Person, { name: 'John' });
|
|
85
|
-
* const johnIsPerson = Obj.instanceOf(Person)(john);
|
|
86
|
-
*
|
|
87
192
|
* const isPerson = Obj.instanceOf(Person);
|
|
88
|
-
* if(isPerson(john)) {
|
|
193
|
+
* if (isPerson(john)) {
|
|
89
194
|
* // john is Person
|
|
90
195
|
* }
|
|
91
196
|
* ```
|
|
92
197
|
*/
|
|
93
198
|
export const instanceOf: {
|
|
94
|
-
<S extends Type.
|
|
95
|
-
<S extends Type.
|
|
96
|
-
} = ((
|
|
97
|
-
...args: [schema: Type.Relation.Any | Type.Obj.Any, value: unknown] | [schema: Type.Relation.Any | Type.Obj.Any]
|
|
98
|
-
) => {
|
|
199
|
+
<S extends Type.Entity.Any>(schema: S): (value: unknown) => value is Schema.Schema.Type<S>;
|
|
200
|
+
<S extends Type.Entity.Any>(schema: S, value: unknown): value is Schema.Schema.Type<S>;
|
|
201
|
+
} = ((...args: [schema: Type.Entity.Any, value: unknown] | [schema: Type.Entity.Any]) => {
|
|
99
202
|
if (args.length === 1) {
|
|
100
|
-
return (
|
|
203
|
+
return (entity: unknown) => isInstanceOf(args[0], entity);
|
|
101
204
|
}
|
|
102
205
|
|
|
103
|
-
return
|
|
206
|
+
return isInstanceOf(args[0], args[1]);
|
|
104
207
|
}) as any;
|
|
105
208
|
|
|
106
|
-
export const getSchema = EchoSchema.getSchema;
|
|
107
|
-
|
|
108
209
|
// TODO(dmaretskyi): Allow returning undefined.
|
|
109
|
-
export const getDXN = (
|
|
110
|
-
assertArgument(!Schema.isSchema(
|
|
111
|
-
const dxn =
|
|
210
|
+
export const getDXN = (entity: Entity.Unknown): DXN => {
|
|
211
|
+
assertArgument(!Schema.isSchema(entity), 'obj', 'Object should not be a schema.');
|
|
212
|
+
const dxn = getObjectDXN(entity);
|
|
112
213
|
invariant(dxn != null, 'Invalid object.');
|
|
113
214
|
return dxn;
|
|
114
215
|
};
|
|
115
216
|
|
|
116
217
|
/**
|
|
117
218
|
* @returns The DXN of the object's type.
|
|
118
|
-
* @example dxn:example.com/type/
|
|
219
|
+
* @example dxn:example.com/type/Person:1.0.0
|
|
220
|
+
*/
|
|
221
|
+
// TODO(burdon): Must define and return type for expando.
|
|
222
|
+
export const getTypeDXN = getTypeDXN$;
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Get the schema of the object.
|
|
119
226
|
*/
|
|
120
|
-
|
|
121
|
-
export const getTypeDXN = EchoSchema.getType;
|
|
227
|
+
export const getSchema = getSchema$;
|
|
122
228
|
|
|
123
229
|
/**
|
|
124
230
|
* @returns The typename of the object's type.
|
|
125
|
-
* @example `example.com/type/
|
|
231
|
+
* @example `example.com/type/Person`
|
|
126
232
|
*/
|
|
127
|
-
export const getTypename = (
|
|
128
|
-
const schema = getSchema(
|
|
233
|
+
export const getTypename = (entity: Entity.Unknown): string | undefined => {
|
|
234
|
+
const schema = getSchema$(entity);
|
|
129
235
|
if (schema == null) {
|
|
130
236
|
// Try to extract typename from DXN.
|
|
131
|
-
return
|
|
237
|
+
return getTypeDXN$(entity)?.asTypeDXN()?.type;
|
|
132
238
|
}
|
|
133
239
|
|
|
134
|
-
return
|
|
240
|
+
return getSchemaTypename(schema);
|
|
135
241
|
};
|
|
136
242
|
|
|
243
|
+
//
|
|
244
|
+
// Meta
|
|
245
|
+
//
|
|
246
|
+
|
|
247
|
+
export const Meta: unique symbol = MetaId as any;
|
|
248
|
+
|
|
249
|
+
// TODO(burdon): Narrow type.
|
|
137
250
|
// TODO(dmaretskyi): Allow returning undefined.
|
|
138
|
-
export const getMeta = (
|
|
139
|
-
const meta =
|
|
251
|
+
export const getMeta = (entity: AnyProperties): ObjectMeta => {
|
|
252
|
+
const meta = getMeta$(entity);
|
|
140
253
|
invariant(meta != null, 'Invalid object.');
|
|
141
254
|
return meta;
|
|
142
255
|
};
|
|
@@ -145,21 +258,21 @@ export const getMeta = (obj: Any | Relation.Any): EchoSchema.ObjectMeta => {
|
|
|
145
258
|
* @returns Foreign keys for the object from the specified source.
|
|
146
259
|
*/
|
|
147
260
|
export const getKeys: {
|
|
148
|
-
(
|
|
149
|
-
(source: string): (
|
|
150
|
-
} = dual(2, (
|
|
151
|
-
const meta =
|
|
261
|
+
(entity: Entity.Unknown, source: string): ForeignKey[];
|
|
262
|
+
(source: string): (entity: Entity.Unknown) => ForeignKey[];
|
|
263
|
+
} = Function.dual(2, (entity: Entity.Unknown, source?: string): ForeignKey[] => {
|
|
264
|
+
const meta = getMeta(entity);
|
|
152
265
|
invariant(meta != null, 'Invalid object.');
|
|
153
266
|
return meta.keys.filter((key) => key.source === source);
|
|
154
267
|
});
|
|
155
268
|
|
|
156
269
|
/**
|
|
157
270
|
* Delete all keys from the object for the specified source.
|
|
158
|
-
* @param
|
|
271
|
+
* @param entity
|
|
159
272
|
* @param source
|
|
160
273
|
*/
|
|
161
|
-
export const deleteKeys = (
|
|
162
|
-
const meta =
|
|
274
|
+
export const deleteKeys = (entity: Entity.Unknown, source: string) => {
|
|
275
|
+
const meta = getMeta(entity);
|
|
163
276
|
for (let i = 0; i < meta.keys.length; i++) {
|
|
164
277
|
if (meta.keys[i].source === source) {
|
|
165
278
|
meta.keys.splice(i, 1);
|
|
@@ -168,85 +281,218 @@ export const deleteKeys = (obj: Any | Relation.Any, source: string) => {
|
|
|
168
281
|
}
|
|
169
282
|
};
|
|
170
283
|
|
|
284
|
+
export const addTag = (entity: Entity.Unknown, tag: string) => {
|
|
285
|
+
const meta = getMeta(entity);
|
|
286
|
+
meta.tags ??= [];
|
|
287
|
+
meta.tags.push(tag);
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
export const removeTag = (entity: Entity.Unknown, tag: string) => {
|
|
291
|
+
const meta = getMeta(entity);
|
|
292
|
+
if (!meta.tags) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
for (let i = 0; i < meta.tags.length; i++) {
|
|
296
|
+
if (meta.tags[i] === tag) {
|
|
297
|
+
meta.tags.splice(i, 1);
|
|
298
|
+
i--;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
|
|
171
303
|
// TODO(dmaretskyi): Default to `false`.
|
|
172
|
-
export const isDeleted = (
|
|
173
|
-
const deleted =
|
|
304
|
+
export const isDeleted = (entity: Entity.Unknown): boolean => {
|
|
305
|
+
const deleted = isDeleted$(entity);
|
|
174
306
|
invariant(typeof deleted === 'boolean', 'Invalid object.');
|
|
175
307
|
return deleted;
|
|
176
308
|
};
|
|
177
309
|
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
|
|
310
|
+
//
|
|
311
|
+
// Annotations
|
|
312
|
+
//
|
|
313
|
+
|
|
314
|
+
export const getLabel = (entity: Entity.Unknown): string | undefined => {
|
|
315
|
+
const schema = getSchema$(entity);
|
|
181
316
|
if (schema != null) {
|
|
182
|
-
return
|
|
317
|
+
return getLabel$(schema, entity);
|
|
183
318
|
}
|
|
184
319
|
};
|
|
185
320
|
|
|
186
|
-
export const setLabel = (
|
|
187
|
-
const schema = getSchema(
|
|
321
|
+
export const setLabel = (entity: Entity.Unknown, label: string) => {
|
|
322
|
+
const schema = getSchema$(entity);
|
|
188
323
|
if (schema != null) {
|
|
189
|
-
|
|
324
|
+
setLabel$(schema, entity, label);
|
|
190
325
|
}
|
|
191
326
|
};
|
|
192
327
|
|
|
328
|
+
export const getDescription = (entity: Entity.Unknown): string | undefined => {
|
|
329
|
+
const schema = getSchema$(entity);
|
|
330
|
+
if (schema != null) {
|
|
331
|
+
return getDescription$(schema, entity);
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
export const setDescription = (entity: Entity.Unknown, description: string) => {
|
|
336
|
+
const schema = getSchema$(entity);
|
|
337
|
+
if (schema != null) {
|
|
338
|
+
setDescription$(schema, entity, description);
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
//
|
|
343
|
+
// JSON
|
|
344
|
+
//
|
|
345
|
+
|
|
193
346
|
/**
|
|
194
347
|
* JSON representation of an object.
|
|
195
348
|
*/
|
|
196
|
-
export type JSON =
|
|
349
|
+
export type JSON = ObjectJSON;
|
|
197
350
|
|
|
198
351
|
/**
|
|
199
352
|
* Converts object to its JSON representation.
|
|
200
353
|
*
|
|
201
354
|
* The same algorithm is used when calling the standard `JSON.stringify(obj)` function.
|
|
202
355
|
*/
|
|
203
|
-
|
|
204
|
-
export const toJSON = (obj: Any | Relation.Any): JSON => EchoSchema.objectToJSON(obj);
|
|
356
|
+
export const toJSON = (entity: Entity.Unknown): JSON => objectToJSON(entity);
|
|
205
357
|
|
|
206
358
|
/**
|
|
207
359
|
* Creates an object from its json representation, performing schema validation.
|
|
208
360
|
* References and schemas will be resolvable if the `refResolver` is provided.
|
|
209
361
|
*
|
|
210
|
-
* The function
|
|
362
|
+
* The function must be async to support resolving the schema as well as the relation endpoints.
|
|
211
363
|
*
|
|
212
364
|
* @param options.refResolver - Resolver for references. Produces hydrated references that can be resolved.
|
|
213
365
|
* @param options.dxn - Override object DXN. Changes the result of `Obj.getDXN`.
|
|
214
366
|
*/
|
|
215
367
|
export const fromJSON: (json: unknown, options?: { refResolver?: Ref.Resolver; dxn?: DXN }) => Promise<Any> =
|
|
216
|
-
|
|
368
|
+
objectFromJSON as any;
|
|
369
|
+
|
|
370
|
+
//
|
|
371
|
+
// Sorting
|
|
372
|
+
//
|
|
373
|
+
|
|
374
|
+
const compare = (a?: string, b?: string) => {
|
|
375
|
+
if (a == null) {
|
|
376
|
+
return b == null ? 0 : 1;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (b == null) {
|
|
380
|
+
return -1;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return a.localeCompare(b);
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
export type Comparator = (a: Entity.Unknown, b: Entity.Unknown) => number;
|
|
387
|
+
|
|
388
|
+
export const sortByLabel: Comparator = (a: Entity.Unknown, b: Entity.Unknown) => compare(getLabel(a), getLabel(b));
|
|
389
|
+
export const sortByTypename: Comparator = (a: Entity.Unknown, b: Entity.Unknown) =>
|
|
390
|
+
compare(getTypename(a), getTypename(b));
|
|
391
|
+
export const sort = (...comparators: Comparator[]): Comparator => {
|
|
392
|
+
return (a: Entity.Unknown, b: Entity.Unknown) => {
|
|
393
|
+
for (const comparator of comparators) {
|
|
394
|
+
const result = comparator(a, b);
|
|
395
|
+
if (result !== 0) {
|
|
396
|
+
return result;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
return 0;
|
|
401
|
+
};
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
//
|
|
405
|
+
// Version
|
|
406
|
+
//
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Unique symbol for version type identification.
|
|
410
|
+
*/
|
|
411
|
+
export { VersionTypeId };
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Represent object version.
|
|
415
|
+
* May be backed by Automerge.
|
|
416
|
+
* Objects with no history are not versioned.
|
|
417
|
+
*/
|
|
418
|
+
export interface Version {
|
|
419
|
+
[VersionTypeId]: {};
|
|
217
420
|
|
|
218
|
-
export type CloneOptions = {
|
|
219
421
|
/**
|
|
220
|
-
*
|
|
221
|
-
* @default false
|
|
422
|
+
* Whether the object is versioned.
|
|
222
423
|
*/
|
|
223
|
-
|
|
424
|
+
versioned: boolean;
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Automerge heads.
|
|
428
|
+
*/
|
|
429
|
+
automergeHeads?: string[];
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const unversioned: Version = {
|
|
433
|
+
[VersionTypeId]: {},
|
|
434
|
+
versioned: false,
|
|
224
435
|
};
|
|
225
436
|
|
|
226
437
|
/**
|
|
227
|
-
*
|
|
228
|
-
* This does not clone referenced objects, only the properties in the object.
|
|
229
|
-
* @returns A new object with the same schema and properties.
|
|
438
|
+
* Checks that `obj` is a version object.
|
|
230
439
|
*/
|
|
231
|
-
export const
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
props.id = id;
|
|
440
|
+
export const isVersion = (entity: unknown): entity is Version => {
|
|
441
|
+
return entity != null && typeof entity === 'object' && VersionTypeId in entity;
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Returns the version of the object.
|
|
446
|
+
*/
|
|
447
|
+
export const version = (entity: Entity.Unknown): Version => {
|
|
448
|
+
const version = (entity as any)[ObjectVersionId];
|
|
449
|
+
if (version === undefined) {
|
|
450
|
+
return unversioned;
|
|
243
451
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
452
|
+
|
|
453
|
+
return version;
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Checks that `version` is a valid version object.
|
|
458
|
+
*/
|
|
459
|
+
export const versionValid = (version: Version): boolean => {
|
|
460
|
+
assertArgument(isVersion(version), 'version', 'Invalid version object');
|
|
461
|
+
return !!version.versioned;
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Compares two versions.
|
|
468
|
+
* @param version1
|
|
469
|
+
* @param version2
|
|
470
|
+
* @returns 'unversioned' if either object is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
|
|
471
|
+
*/
|
|
472
|
+
export const compareVersions = (version1: Version, version2: Version): VersionCompareResult => {
|
|
473
|
+
assertArgument(isVersion(version1), 'version1', 'Invalid version object');
|
|
474
|
+
assertArgument(isVersion(version2), 'version2', 'Invalid version object');
|
|
475
|
+
|
|
476
|
+
if (!versionValid(version1) || !versionValid(version2)) {
|
|
477
|
+
return 'unversioned';
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
|
|
481
|
+
return 'different';
|
|
482
|
+
}
|
|
483
|
+
if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
|
|
484
|
+
return 'different';
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
return 'equal';
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
export const encodeVersion = (version: Version): string => {
|
|
491
|
+
return JSON.stringify(version);
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
export const decodeVersion = (version: string): Version => {
|
|
495
|
+
const parsed = JSON.parse(version);
|
|
496
|
+
parsed[VersionTypeId] = {};
|
|
497
|
+
return parsed;
|
|
252
498
|
};
|
package/src/Ref.ts
CHANGED
|
@@ -2,28 +2,27 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
|
|
5
|
+
import { Ref as Ref$, RefArray, type RefResolver } from './internal';
|
|
7
6
|
import type * as Obj from './Obj';
|
|
8
7
|
|
|
9
|
-
export type Ref<T> =
|
|
10
|
-
export type Any =
|
|
8
|
+
export type Ref<T> = Ref$<T>;
|
|
9
|
+
export type Any = Ref$<Obj.Any>;
|
|
11
10
|
|
|
12
|
-
export const Array =
|
|
11
|
+
export const Array = RefArray;
|
|
13
12
|
|
|
14
13
|
/**
|
|
15
14
|
* Extract reference target.
|
|
16
15
|
*/
|
|
17
|
-
export type Target<R extends Any> = R extends
|
|
16
|
+
export type Target<R extends Any> = R extends Ref$<infer T> ? T : never;
|
|
18
17
|
|
|
19
18
|
/**
|
|
20
19
|
* Reference resolver.
|
|
21
20
|
*/
|
|
22
|
-
export type Resolver =
|
|
21
|
+
export type Resolver = RefResolver;
|
|
23
22
|
|
|
24
|
-
export const isRef: (value: unknown) => value is Any =
|
|
23
|
+
export const isRef: (value: unknown) => value is Any = Ref$.isRef;
|
|
25
24
|
|
|
26
|
-
export const make =
|
|
25
|
+
export const make = Ref$.make;
|
|
27
26
|
|
|
28
27
|
// TODO(dmaretskyi): Consider just allowing `make` to accept DXN.
|
|
29
|
-
export const fromDXN =
|
|
28
|
+
export const fromDXN = Ref$.fromDXN;
|