@dxos/echo 0.8.4-main.28f8d3d → 0.8.4-main.2c6827d
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-BIDAASFK.mjs +3727 -0
- package/dist/lib/browser/chunk-BIDAASFK.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZDLCWGEW.mjs +410 -0
- package/dist/lib/browser/chunk-ZDLCWGEW.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZFRJKT4A.mjs +585 -0
- package/dist/lib/browser/chunk-ZFRJKT4A.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +17 -4
- 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/query/index.mjs +13 -0
- package/dist/lib/browser/query/index.mjs.map +7 -0
- package/dist/lib/browser/testing/index.mjs +231 -34
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/chunk-3SVRRCUU.mjs +3727 -0
- package/dist/lib/node-esm/chunk-3SVRRCUU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-CGDHRZWH.mjs +585 -0
- package/dist/lib/node-esm/chunk-CGDHRZWH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HWS6VBQC.mjs +410 -0
- package/dist/lib/node-esm/chunk-HWS6VBQC.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +17 -4
- 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/query/index.mjs +13 -0
- package/dist/lib/node-esm/query/index.mjs.map +7 -0
- package/dist/lib/node-esm/testing/index.mjs +231 -34
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/Obj.d.ts +97 -9
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +1 -1
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +5 -4
- 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 +16 -17
- 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 +4 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/ast/annotation-helper.d.ts +8 -0
- package/dist/types/src/internal/ast/annotation-helper.d.ts.map +1 -0
- package/dist/types/src/internal/ast/annotations.d.ts +131 -0
- package/dist/types/src/internal/ast/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/ast/annotations.test.d.ts +2 -0
- package/dist/types/src/internal/ast/annotations.test.d.ts.map +1 -0
- package/dist/types/src/internal/ast/entity-kind.d.ts +10 -0
- package/dist/types/src/internal/ast/entity-kind.d.ts.map +1 -0
- package/dist/types/src/internal/ast/index.d.ts +5 -0
- package/dist/types/src/internal/ast/index.d.ts.map +1 -0
- package/dist/types/src/internal/ast/types.d.ts +6 -0
- package/dist/types/src/internal/ast/types.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 +30 -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 +15 -0
- package/dist/types/src/internal/index.d.ts.map +1 -0
- package/dist/types/src/internal/json/annotations.d.ts +19 -0
- package/dist/types/src/internal/json/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/json/effect-schema.test.d.ts +2 -0
- package/dist/types/src/internal/json/effect-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/json/index.d.ts +2 -0
- package/dist/types/src/internal/json/index.d.ts.map +1 -0
- package/dist/types/src/internal/json/json-schema.d.ts +28 -0
- package/dist/types/src/internal/json/json-schema.d.ts.map +1 -0
- package/dist/types/src/internal/json/json-schema.test.d.ts +2 -0
- package/dist/types/src/internal/json/json-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/index.d.ts +3 -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/object/accessors.d.ts +37 -0
- package/dist/types/src/internal/object/accessors.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.d.ts +40 -0
- package/dist/types/src/internal/object/create.d.ts.map +1 -0
- package/dist/types/src/internal/object/create.test.d.ts +2 -0
- package/dist/types/src/internal/object/create.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/entity.d.ts +33 -0
- package/dist/types/src/internal/object/entity.d.ts.map +1 -0
- package/dist/types/src/internal/object/expando.d.ts +14 -0
- package/dist/types/src/internal/object/expando.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 +16 -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 +32 -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/meta.d.ts +31 -0
- package/dist/types/src/internal/object/meta.d.ts.map +1 -0
- package/dist/types/src/internal/object/model.d.ts +117 -0
- package/dist/types/src/internal/object/model.d.ts.map +1 -0
- package/dist/types/src/internal/object/relation.d.ts +17 -0
- package/dist/types/src/internal/object/relation.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/object/typename.d.ts +15 -0
- package/dist/types/src/internal/object/typename.d.ts.map +1 -0
- package/dist/types/src/internal/object/version.d.ts +14 -0
- package/dist/types/src/internal/object/version.d.ts.map +1 -0
- package/dist/types/src/internal/projection/compose.d.ts +6 -0
- package/dist/types/src/internal/projection/compose.d.ts.map +1 -0
- package/dist/types/src/internal/projection/compose.test.d.ts +2 -0
- package/dist/types/src/internal/projection/compose.test.d.ts.map +1 -0
- package/dist/types/src/internal/projection/index.d.ts +2 -0
- package/dist/types/src/internal/projection/index.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/reactive-object.d.ts +15 -0
- package/dist/types/src/internal/proxy/reactive-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/query/index.d.ts +2 -0
- package/dist/types/src/internal/query/index.d.ts.map +1 -0
- package/dist/types/src/internal/query/query.d.ts +17 -0
- package/dist/types/src/internal/query/query.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 +206 -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/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 +7 -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/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/schema/stored-schema.d.ts +13 -0
- package/dist/types/src/internal/schema/stored-schema.d.ts.map +1 -0
- package/dist/types/src/internal/testing/index.d.ts +3 -0
- package/dist/types/src/internal/testing/index.d.ts.map +1 -0
- package/dist/types/src/internal/testing/types.d.ts +381 -0
- package/dist/types/src/internal/testing/types.d.ts.map +1 -0
- package/dist/types/src/internal/testing/utils.d.ts +10 -0
- package/dist/types/src/internal/testing/utils.d.ts.map +1 -0
- package/dist/types/src/internal/types/index.d.ts +3 -0
- package/dist/types/src/internal/types/index.d.ts.map +1 -0
- package/dist/types/src/internal/types/types.d.ts +79 -0
- package/dist/types/src/internal/types/types.d.ts.map +1 -0
- package/dist/types/src/internal/types/types.test.d.ts +2 -0
- package/dist/types/src/internal/types/types.test.d.ts.map +1 -0
- package/dist/types/src/internal/types/util.d.ts +5 -0
- package/dist/types/src/internal/types/util.d.ts.map +1 -0
- package/dist/types/src/query/index.d.ts +1 -1
- package/dist/types/src/query/index.d.ts.map +1 -1
- package/dist/types/src/query/{dsl.d.ts → query.d.ts} +52 -22
- 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/testing/echo-schema.d.ts +7 -0
- package/dist/types/src/testing/echo-schema.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/types.d.ts +170 -55
- package/dist/types/src/testing/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +29 -17
- package/src/Obj.ts +251 -17
- package/src/Ref.ts +1 -2
- package/src/Relation.ts +16 -5
- package/src/Tag.ts +39 -0
- package/src/Type.ts +29 -30
- package/src/errors.ts +18 -0
- package/src/index.ts +5 -1
- package/src/internal/ast/annotation-helper.ts +22 -0
- package/src/internal/ast/annotations.test.ts +98 -0
- package/src/internal/ast/annotations.ts +226 -0
- package/src/internal/ast/entity-kind.ts +15 -0
- package/src/internal/ast/index.ts +8 -0
- package/src/internal/ast/types.ts +17 -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 +52 -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 +175 -0
- package/src/internal/index.ts +22 -0
- package/src/internal/json/annotations.ts +50 -0
- package/src/internal/json/effect-schema.test.ts +143 -0
- package/src/internal/json/index.ts +5 -0
- package/src/internal/json/json-schema.test.ts +849 -0
- package/src/internal/json/json-schema.ts +519 -0
- package/src/internal/json-schema/index.ts +6 -0
- package/src/internal/json-schema/json-schema-normalize.ts +109 -0
- package/src/internal/json-schema/json-schema-type.ts +403 -0
- package/src/internal/object/accessors.ts +153 -0
- package/src/internal/object/common.ts +76 -0
- package/src/internal/object/create.test.ts +118 -0
- package/src/internal/object/create.ts +96 -0
- package/src/internal/object/deleted.ts +19 -0
- package/src/internal/object/entity.ts +248 -0
- package/src/internal/object/expando.ts +21 -0
- package/src/internal/object/ids.ts +12 -0
- package/src/internal/object/index.ts +19 -0
- package/src/internal/object/inspect.ts +48 -0
- package/src/internal/object/json-serializer.test.ts +99 -0
- package/src/internal/object/json-serializer.ts +225 -0
- package/src/internal/object/meta.ts +61 -0
- package/src/internal/object/model.ts +170 -0
- package/src/internal/object/relation.ts +24 -0
- package/src/internal/object/schema-validator.test.ts +186 -0
- package/src/internal/object/schema-validator.ts +241 -0
- package/src/internal/object/typed-object.test.ts +34 -0
- package/src/internal/object/typed-object.ts +88 -0
- package/src/internal/object/typename.ts +61 -0
- package/src/internal/object/version.ts +22 -0
- package/src/internal/projection/compose.test.ts +43 -0
- package/src/internal/projection/compose.ts +36 -0
- package/src/internal/projection/index.ts +5 -0
- package/src/internal/proxy/handler.test.ts +163 -0
- package/src/internal/proxy/reactive-object.ts +108 -0
- package/src/internal/proxy/schema.test.ts +136 -0
- package/src/internal/proxy/typed-handler.test.ts +102 -0
- package/src/internal/proxy/typed-handler.ts +228 -0
- package/src/internal/proxy/typed-object.test.ts +100 -0
- package/src/internal/query/index.ts +5 -0
- package/src/internal/query/query.ts +23 -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 +100 -0
- package/src/internal/ref/ref.ts +521 -0
- package/src/internal/schema/echo-schema.ts +383 -0
- package/src/internal/schema/index.ts +10 -0
- package/src/internal/schema/manipulation.ts +92 -0
- package/src/internal/schema/runtime-schema-registry.ts +78 -0
- package/src/internal/schema/snapshot.ts +25 -0
- package/src/internal/schema/stored-schema.ts +26 -0
- package/src/internal/testing/index.ts +6 -0
- package/src/internal/testing/types.ts +144 -0
- package/src/internal/testing/utils.ts +54 -0
- package/src/internal/types/index.ts +6 -0
- package/src/internal/types/types.test.ts +48 -0
- package/src/internal/types/types.ts +176 -0
- package/src/internal/types/util.ts +9 -0
- package/src/query/index.ts +2 -1
- package/src/query/query.test.ts +401 -0
- package/src/query/{dsl.ts → query.ts} +188 -45
- package/src/test/api.test.ts +16 -9
- package/src/testing/echo-schema.ts +39 -0
- package/src/testing/index.ts +2 -0
- package/src/testing/types.ts +40 -23
- package/dist/lib/browser/chunk-NLPBTYZV.mjs +0 -647
- package/dist/lib/browser/chunk-NLPBTYZV.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-BQZZRMFX.mjs +0 -647
- package/dist/lib/node-esm/chunk-BQZZRMFX.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.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/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/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/echo",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.2c6827d",
|
|
4
4
|
"description": "ECHO API",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"author": "info@dxos.org",
|
|
9
|
-
"sideEffects":
|
|
9
|
+
"sideEffects": false,
|
|
10
10
|
"type": "module",
|
|
11
11
|
"exports": {
|
|
12
12
|
".": {
|
|
@@ -39,9 +39,21 @@
|
|
|
39
39
|
"browser": "./dist/lib/browser/Ref.mjs",
|
|
40
40
|
"node": "./dist/lib/node-esm/Ref.mjs"
|
|
41
41
|
},
|
|
42
|
+
"./internal": {
|
|
43
|
+
"source": "./src/internal/index.ts",
|
|
44
|
+
"types": "./dist/types/src/internal/index.d.ts",
|
|
45
|
+
"browser": "./dist/lib/browser/internal/index.mjs",
|
|
46
|
+
"node": "./dist/lib/node-esm/internal/index.mjs"
|
|
47
|
+
},
|
|
48
|
+
"./query": {
|
|
49
|
+
"source": "./src/query/index.ts",
|
|
50
|
+
"types": "./dist/types/src/query/index.d.ts",
|
|
51
|
+
"browser": "./dist/lib/browser/query/index.mjs",
|
|
52
|
+
"node": "./dist/lib/node-esm/query/index.mjs"
|
|
53
|
+
},
|
|
42
54
|
"./testing": {
|
|
43
|
-
"source": "./src/testing/
|
|
44
|
-
"types": "./dist/types/src/testing/
|
|
55
|
+
"source": "./src/testing/index.ts",
|
|
56
|
+
"types": "./dist/types/src/testing/index.d.ts",
|
|
45
57
|
"browser": "./dist/lib/browser/testing/index.mjs",
|
|
46
58
|
"node": "./dist/lib/node-esm/testing/index.mjs"
|
|
47
59
|
}
|
|
@@ -71,19 +83,19 @@
|
|
|
71
83
|
"src"
|
|
72
84
|
],
|
|
73
85
|
"dependencies": {
|
|
74
|
-
"@preact/signals-core": "^1.
|
|
75
|
-
"effect": "3.
|
|
76
|
-
"@dxos/debug": "0.8.4-main.
|
|
77
|
-
"@dxos/
|
|
78
|
-
"@dxos/echo-
|
|
79
|
-
"@dxos/echo-
|
|
80
|
-
"@dxos/
|
|
81
|
-
"@dxos/
|
|
82
|
-
"@dxos/keys": "0.8.4-main.
|
|
83
|
-
"@dxos/
|
|
84
|
-
"@dxos/
|
|
85
|
-
"@dxos/
|
|
86
|
-
"@dxos/
|
|
86
|
+
"@preact/signals-core": "^1.12.1",
|
|
87
|
+
"effect": "3.18.3",
|
|
88
|
+
"@dxos/debug": "0.8.4-main.2c6827d",
|
|
89
|
+
"@dxos/effect": "0.8.4-main.2c6827d",
|
|
90
|
+
"@dxos/echo-protocol": "0.8.4-main.2c6827d",
|
|
91
|
+
"@dxos/echo-signals": "0.8.4-main.2c6827d",
|
|
92
|
+
"@dxos/errors": "0.8.4-main.2c6827d",
|
|
93
|
+
"@dxos/invariant": "0.8.4-main.2c6827d",
|
|
94
|
+
"@dxos/keys": "0.8.4-main.2c6827d",
|
|
95
|
+
"@dxos/log": "0.8.4-main.2c6827d",
|
|
96
|
+
"@dxos/node-std": "0.8.4-main.2c6827d",
|
|
97
|
+
"@dxos/util": "0.8.4-main.2c6827d",
|
|
98
|
+
"@dxos/live-object": "0.8.4-main.2c6827d"
|
|
87
99
|
},
|
|
88
100
|
"publishConfig": {
|
|
89
101
|
"access": "public"
|
package/src/Obj.ts
CHANGED
|
@@ -2,18 +2,19 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Function from 'effect/Function';
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
6
7
|
|
|
7
|
-
import * as EchoSchema from '@dxos/echo-schema';
|
|
8
8
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
9
9
|
import { type DXN } from '@dxos/keys';
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import { assumeType } from '@dxos/util';
|
|
10
|
+
import * as LiveObject from '@dxos/live-object';
|
|
11
|
+
import { assumeType, deepMapValues } from '@dxos/util';
|
|
13
12
|
|
|
13
|
+
import { live } from './internal';
|
|
14
|
+
import * as EchoSchema from './internal';
|
|
14
15
|
import type * as Ref from './Ref';
|
|
15
16
|
import type * as Relation from './Relation';
|
|
16
|
-
import
|
|
17
|
+
import * as Type from './Type';
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* NOTE: Don't export: Obj.Any and Obj.Obj form the public API.
|
|
@@ -27,33 +28,72 @@ export type Obj<Props> = BaseObj & Props;
|
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
30
|
* Base type for all ECHO objects.
|
|
31
|
+
* This type does not define any properties.
|
|
30
32
|
*/
|
|
31
33
|
export interface Any extends BaseObj {}
|
|
32
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Object with arbitrary properties.
|
|
37
|
+
*
|
|
38
|
+
* NOTE: Due to how typescript works, this type is not assignable to a specific schema type.
|
|
39
|
+
* In that case, use `Obj.instanceOf` to check if an object is of a specific type.
|
|
40
|
+
*/
|
|
41
|
+
export interface AnyProps extends BaseObj {
|
|
42
|
+
[key: string]: any;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const Any = Schema.Struct({}).pipe(
|
|
46
|
+
Type.Obj({
|
|
47
|
+
typename: 'dxos.org/types/Any',
|
|
48
|
+
version: '0.1.0',
|
|
49
|
+
}),
|
|
50
|
+
);
|
|
51
|
+
|
|
33
52
|
type Props<T = any> = { id?: EchoSchema.ObjectId } & Type.Properties<T>;
|
|
34
53
|
|
|
35
|
-
export type MakeProps<T extends Type.Obj.Any> = NoInfer<Props<Schema.Schema.Type<T
|
|
54
|
+
export type MakeProps<T extends Type.Obj.Any> = NoInfer<Props<Schema.Schema.Type<T>>> & {
|
|
55
|
+
[Meta]?: Partial<EchoSchema.ObjectMeta>;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const Meta: unique symbol = EchoSchema.MetaId as any;
|
|
59
|
+
|
|
60
|
+
const DEFAULT_META: EchoSchema.ObjectMeta = {
|
|
61
|
+
keys: [],
|
|
62
|
+
};
|
|
36
63
|
|
|
37
64
|
/**
|
|
38
65
|
* Creates new object.
|
|
66
|
+
* @param schema - Object schema.
|
|
67
|
+
* @param props - Object properties.
|
|
68
|
+
* @param meta - Object metadata (deprecated) -- pass with Obj.Meta.
|
|
69
|
+
*
|
|
70
|
+
* Meta can be passed as a symbol in `props`.
|
|
71
|
+
*
|
|
72
|
+
* Example:
|
|
73
|
+
* ```ts
|
|
74
|
+
* const obj = Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' });
|
|
75
|
+
* ```
|
|
39
76
|
*/
|
|
40
|
-
// TODO(dmaretskyi): Move meta into props.
|
|
41
77
|
export const make = <S extends Type.Obj.Any>(
|
|
42
78
|
schema: S,
|
|
43
79
|
props: MakeProps<S>,
|
|
44
|
-
meta?: EchoSchema.ObjectMeta
|
|
80
|
+
meta?: Partial<EchoSchema.ObjectMeta>,
|
|
45
81
|
): LiveObject.Live<Schema.Schema.Type<S>> => {
|
|
46
82
|
assertArgument(
|
|
47
83
|
EchoSchema.getTypeAnnotation(schema)?.kind === EchoSchema.EntityKind.Object,
|
|
84
|
+
'schema',
|
|
48
85
|
'Expected an object schema',
|
|
49
86
|
);
|
|
50
87
|
|
|
51
88
|
if (props[EchoSchema.MetaId] != null) {
|
|
52
|
-
meta
|
|
89
|
+
// Set default fields on meta on creation.
|
|
90
|
+
meta = { ...structuredClone(DEFAULT_META), ...props[EchoSchema.MetaId] };
|
|
53
91
|
delete props[EchoSchema.MetaId];
|
|
54
92
|
}
|
|
55
93
|
|
|
56
|
-
|
|
94
|
+
const filterUndefined = Object.fromEntries(Object.entries(props).filter(([_, v]) => v !== undefined));
|
|
95
|
+
|
|
96
|
+
return live<Schema.Schema.Type<S>>(schema, filterUndefined as any, { keys: [], ...meta });
|
|
57
97
|
};
|
|
58
98
|
|
|
59
99
|
export const isObject = (obj: unknown): obj is Any => {
|
|
@@ -69,7 +109,7 @@ export const isObject = (obj: unknown): obj is Any => {
|
|
|
69
109
|
* const johnIsPerson = Obj.instanceOf(Person)(john);
|
|
70
110
|
*
|
|
71
111
|
* const isPerson = Obj.instanceOf(Person);
|
|
72
|
-
* if(isPerson(john)) {
|
|
112
|
+
* if (isPerson(john)) {
|
|
73
113
|
* // john is Person
|
|
74
114
|
* }
|
|
75
115
|
* ```
|
|
@@ -91,7 +131,7 @@ export const getSchema = EchoSchema.getSchema;
|
|
|
91
131
|
|
|
92
132
|
// TODO(dmaretskyi): Allow returning undefined.
|
|
93
133
|
export const getDXN = (obj: Any | Relation.Any): DXN => {
|
|
94
|
-
assertArgument(!Schema.isSchema(obj), 'Object should not be a schema.');
|
|
134
|
+
assertArgument(!Schema.isSchema(obj), 'obj', 'Object should not be a schema.');
|
|
95
135
|
const dxn = EchoSchema.getObjectDXN(obj);
|
|
96
136
|
invariant(dxn != null, 'Invalid object.');
|
|
97
137
|
return dxn;
|
|
@@ -99,14 +139,14 @@ export const getDXN = (obj: Any | Relation.Any): DXN => {
|
|
|
99
139
|
|
|
100
140
|
/**
|
|
101
141
|
* @returns The DXN of the object's type.
|
|
102
|
-
* @example dxn:example.com/type/
|
|
142
|
+
* @example dxn:example.com/type/Person:1.0.0
|
|
103
143
|
*/
|
|
104
144
|
// TODO(burdon): Expando does not have a type.
|
|
105
145
|
export const getTypeDXN = EchoSchema.getType;
|
|
106
146
|
|
|
107
147
|
/**
|
|
108
148
|
* @returns The typename of the object's type.
|
|
109
|
-
* @example `example.com/type/
|
|
149
|
+
* @example `example.com/type/Person`
|
|
110
150
|
*/
|
|
111
151
|
export const getTypename = (obj: Any | Relation.Any): string | undefined => {
|
|
112
152
|
const schema = getSchema(obj);
|
|
@@ -125,6 +165,33 @@ export const getMeta = (obj: Any | Relation.Any): EchoSchema.ObjectMeta => {
|
|
|
125
165
|
return meta;
|
|
126
166
|
};
|
|
127
167
|
|
|
168
|
+
/**
|
|
169
|
+
* @returns Foreign keys for the object from the specified source.
|
|
170
|
+
*/
|
|
171
|
+
export const getKeys: {
|
|
172
|
+
(obj: Any | Relation.Any, source: string): EchoSchema.ForeignKey[];
|
|
173
|
+
(source: string): (obj: Any | Relation.Any) => EchoSchema.ForeignKey[];
|
|
174
|
+
} = Function.dual(2, (obj: Any | Relation.Any, source?: string): EchoSchema.ForeignKey[] => {
|
|
175
|
+
const meta = EchoSchema.getMeta(obj);
|
|
176
|
+
invariant(meta != null, 'Invalid object.');
|
|
177
|
+
return meta.keys.filter((key) => key.source === source);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Delete all keys from the object for the specified source.
|
|
182
|
+
* @param obj
|
|
183
|
+
* @param source
|
|
184
|
+
*/
|
|
185
|
+
export const deleteKeys = (obj: Any | Relation.Any, source: string) => {
|
|
186
|
+
const meta = EchoSchema.getMeta(obj);
|
|
187
|
+
for (let i = 0; i < meta.keys.length; i++) {
|
|
188
|
+
if (meta.keys[i].source === source) {
|
|
189
|
+
meta.keys.splice(i, 1);
|
|
190
|
+
i--;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
128
195
|
// TODO(dmaretskyi): Default to `false`.
|
|
129
196
|
export const isDeleted = (obj: Any | Relation.Any): boolean => {
|
|
130
197
|
const deleted = EchoSchema.isDeleted(obj);
|
|
@@ -132,7 +199,6 @@ export const isDeleted = (obj: Any | Relation.Any): boolean => {
|
|
|
132
199
|
return deleted;
|
|
133
200
|
};
|
|
134
201
|
|
|
135
|
-
// TODO(burdon): Rename "label"
|
|
136
202
|
export const getLabel = (obj: Any | Relation.Any): string | undefined => {
|
|
137
203
|
const schema = getSchema(obj);
|
|
138
204
|
if (schema != null) {
|
|
@@ -147,6 +213,68 @@ export const setLabel = (obj: Any | Relation.Any, label: string) => {
|
|
|
147
213
|
}
|
|
148
214
|
};
|
|
149
215
|
|
|
216
|
+
export const getDescription = (obj: Any | Relation.Any): string | undefined => {
|
|
217
|
+
const schema = getSchema(obj);
|
|
218
|
+
if (schema != null) {
|
|
219
|
+
return EchoSchema.getDescription(schema, obj);
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
export const setDescription = (obj: Any | Relation.Any, description: string) => {
|
|
224
|
+
const schema = getSchema(obj);
|
|
225
|
+
if (schema != null) {
|
|
226
|
+
EchoSchema.setDescription(schema, obj, description);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export const addTag = (obj: Any | Relation.Any, tag: string) => {
|
|
231
|
+
const meta = getMeta(obj);
|
|
232
|
+
meta.tags ??= [];
|
|
233
|
+
meta.tags.push(tag);
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
export const removeTag = (obj: Any | Relation.Any, tag: string) => {
|
|
237
|
+
const meta = getMeta(obj);
|
|
238
|
+
if (!meta.tags) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
for (let i = 0; i < meta.tags.length; i++) {
|
|
242
|
+
if (meta.tags[i] === tag) {
|
|
243
|
+
meta.tags.splice(i, 1);
|
|
244
|
+
i--;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
const compare = (a?: string, b?: string) => {
|
|
250
|
+
if (a == null) {
|
|
251
|
+
return b == null ? 0 : 1;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (b == null) {
|
|
255
|
+
return -1;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return a.localeCompare(b);
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
export type Comparator = (a: Any, b: Any) => number;
|
|
262
|
+
|
|
263
|
+
export const sortByLabel: Comparator = (a: Any, b: Any) => compare(getLabel(a), getLabel(b));
|
|
264
|
+
export const sortByTypename: Comparator = (a: Any, b: Any) => compare(getTypename(a), getTypename(b));
|
|
265
|
+
export const sort = (...comparators: Comparator[]): Comparator => {
|
|
266
|
+
return (a: Any, b: Any) => {
|
|
267
|
+
for (const comparator of comparators) {
|
|
268
|
+
const result = comparator(a, b);
|
|
269
|
+
if (result !== 0) {
|
|
270
|
+
return result;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return 0;
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
|
|
150
278
|
/**
|
|
151
279
|
* JSON representation of an object.
|
|
152
280
|
*/
|
|
@@ -172,6 +300,11 @@ export const toJSON = (obj: Any | Relation.Any): JSON => EchoSchema.objectToJSON
|
|
|
172
300
|
export const fromJSON: (json: unknown, options?: { refResolver?: Ref.Resolver; dxn?: DXN }) => Promise<Any> =
|
|
173
301
|
EchoSchema.objectFromJSON as any;
|
|
174
302
|
|
|
303
|
+
/**
|
|
304
|
+
* Returns an immutable snapshot of an object.
|
|
305
|
+
*/
|
|
306
|
+
export const getSnapshot: <T extends Any>(obj: Obj<T>) => T = LiveObject.getSnapshot;
|
|
307
|
+
|
|
175
308
|
export type CloneOptions = {
|
|
176
309
|
/**
|
|
177
310
|
* Retain the original object's ID.
|
|
@@ -189,9 +322,110 @@ export const clone = <T extends Any | Relation.Any>(obj: T, opts?: CloneOptions)
|
|
|
189
322
|
const { id, ...data } = obj;
|
|
190
323
|
const schema = getSchema(obj);
|
|
191
324
|
invariant(schema != null, 'Object should have a schema');
|
|
192
|
-
const props: any =
|
|
325
|
+
const props: any = deepMapValues(data, (value, recurse) => {
|
|
326
|
+
if (EchoSchema.Ref.isRef(value)) {
|
|
327
|
+
return value;
|
|
328
|
+
}
|
|
329
|
+
return recurse(value);
|
|
330
|
+
});
|
|
193
331
|
if (opts?.retainId) {
|
|
194
332
|
props.id = id;
|
|
195
333
|
}
|
|
334
|
+
const meta = getMeta(obj);
|
|
335
|
+
props[EchoSchema.MetaId] = deepMapValues(meta, (value, recurse) => {
|
|
336
|
+
if (EchoSchema.Ref.isRef(value)) {
|
|
337
|
+
return value;
|
|
338
|
+
}
|
|
339
|
+
return recurse(value);
|
|
340
|
+
});
|
|
196
341
|
return make(schema, props);
|
|
197
342
|
};
|
|
343
|
+
|
|
344
|
+
export const VersionTypeId = EchoSchema.VersionTypeId;
|
|
345
|
+
export type VersionType = typeof VersionTypeId;
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Represent object version.
|
|
349
|
+
* May be backed by Automerge.
|
|
350
|
+
* Objects with no history are not versioned.
|
|
351
|
+
*/
|
|
352
|
+
export interface Version {
|
|
353
|
+
[VersionTypeId]: {};
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Whether the object is versioned.
|
|
357
|
+
*/
|
|
358
|
+
versioned: boolean;
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Automerge heads.
|
|
362
|
+
*/
|
|
363
|
+
automergeHeads?: string[];
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const unversioned: Version = {
|
|
367
|
+
[VersionTypeId]: {},
|
|
368
|
+
versioned: false,
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Checks that `obj` is a version object.
|
|
373
|
+
*/
|
|
374
|
+
export const isVersion = (obj: unknown): obj is Version => {
|
|
375
|
+
return obj != null && typeof obj === 'object' && VersionTypeId in obj;
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Returns the version of the object.
|
|
380
|
+
*/
|
|
381
|
+
export const version = (obj: Any | Relation.Any): Version => {
|
|
382
|
+
const version = (obj as any)[EchoSchema.ObjectVersionId];
|
|
383
|
+
if (version === undefined) {
|
|
384
|
+
return unversioned;
|
|
385
|
+
}
|
|
386
|
+
return version;
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Checks that `version` is a valid version object.
|
|
391
|
+
*/
|
|
392
|
+
export const versionValid = (version: Version): boolean => {
|
|
393
|
+
assertArgument(isVersion(version), 'version', 'Invalid version object');
|
|
394
|
+
return !!version.versioned;
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Compares two versions.
|
|
401
|
+
* @param version1
|
|
402
|
+
* @param version2
|
|
403
|
+
* @returns 'unversioned' if either object is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
|
|
404
|
+
*/
|
|
405
|
+
export const compareVersions = (version1: Version, version2: Version): VersionCompareResult => {
|
|
406
|
+
assertArgument(isVersion(version1), 'version1', 'Invalid version object');
|
|
407
|
+
assertArgument(isVersion(version2), 'version2', 'Invalid version object');
|
|
408
|
+
|
|
409
|
+
if (!versionValid(version1) || !versionValid(version2)) {
|
|
410
|
+
return 'unversioned';
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
|
|
414
|
+
return 'different';
|
|
415
|
+
}
|
|
416
|
+
if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
|
|
417
|
+
return 'different';
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return 'equal';
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
export const encodeVersion = (version: Version): string => {
|
|
424
|
+
return JSON.stringify(version);
|
|
425
|
+
};
|
|
426
|
+
|
|
427
|
+
export const decodeVersion = (version: string): Version => {
|
|
428
|
+
const parsed = JSON.parse(version);
|
|
429
|
+
parsed[VersionTypeId] = {};
|
|
430
|
+
return parsed;
|
|
431
|
+
};
|
package/src/Ref.ts
CHANGED
package/src/Relation.ts
CHANGED
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
7
|
import { raise } from '@dxos/debug';
|
|
8
|
-
import * as EchoSchema from '@dxos/echo-schema';
|
|
9
8
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
10
9
|
import { DXN } from '@dxos/keys';
|
|
11
|
-
import { type Live
|
|
10
|
+
import { type Live } from '@dxos/live-object';
|
|
12
11
|
import { assumeType } from '@dxos/util';
|
|
13
12
|
|
|
14
|
-
import
|
|
15
|
-
import
|
|
13
|
+
import { live } from './internal';
|
|
14
|
+
import * as EchoSchema from './internal';
|
|
15
|
+
import * as Obj from './Obj';
|
|
16
|
+
import * as Type from './Type';
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* NOTE: Don't export: Relation.Relation and Relation.Any form the public API.
|
|
@@ -32,6 +33,15 @@ export type Relation<Source extends Obj.Any, Target extends Obj.Any, Props> = Ba
|
|
|
32
33
|
*/
|
|
33
34
|
export interface Any extends BaseRelation<Obj.Any, Obj.Any> {}
|
|
34
35
|
|
|
36
|
+
export const Any = Schema.Struct({}).pipe(
|
|
37
|
+
Type.Relation({
|
|
38
|
+
typename: 'dxos.org/types/Any',
|
|
39
|
+
version: '0.1.0',
|
|
40
|
+
source: Obj.Any,
|
|
41
|
+
target: Obj.Any,
|
|
42
|
+
}),
|
|
43
|
+
);
|
|
44
|
+
|
|
35
45
|
// TODO(dmaretskyi): Has to be `unique symbol`.
|
|
36
46
|
export const Source: unique symbol = EchoSchema.RelationSourceId as any;
|
|
37
47
|
export type Source = typeof Source;
|
|
@@ -60,6 +70,7 @@ export const make = <S extends Type.Relation.Any>(
|
|
|
60
70
|
): Live<Schema.Schema.Type<S> & Type.OfKind<EchoSchema.EntityKind.Relation>> => {
|
|
61
71
|
assertArgument(
|
|
62
72
|
EchoSchema.getTypeAnnotation(schema)?.kind === EchoSchema.EntityKind.Relation,
|
|
73
|
+
'schema',
|
|
63
74
|
'Expected a relation schema',
|
|
64
75
|
);
|
|
65
76
|
|
package/src/Tag.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { LabelAnnotation } from './internal';
|
|
8
|
+
import * as Obj from './Obj';
|
|
9
|
+
import * as Type from './Type';
|
|
10
|
+
|
|
11
|
+
export const Tag = Schema.Struct({
|
|
12
|
+
label: Schema.String,
|
|
13
|
+
hue: Schema.optional(Schema.String), // TODO(burdon): Color name?
|
|
14
|
+
}).pipe(
|
|
15
|
+
Type.Obj({
|
|
16
|
+
typename: 'dxos.org/type/Tag',
|
|
17
|
+
version: '0.1.0',
|
|
18
|
+
}),
|
|
19
|
+
LabelAnnotation.set(['label']),
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export type Tag = Schema.Schema.Type<typeof Tag>;
|
|
23
|
+
|
|
24
|
+
export const make = (props: Obj.MakeProps<typeof Tag>) => Obj.make(Tag, props);
|
|
25
|
+
|
|
26
|
+
// TODO(burdon): Rename Map.
|
|
27
|
+
export type Map = Record<string, Tag>;
|
|
28
|
+
|
|
29
|
+
export const sortTags = ({ label: a }: Tag, { label: b }: Tag) => a.localeCompare(b);
|
|
30
|
+
|
|
31
|
+
export const createTagList = (tags: Map): Tag[] =>
|
|
32
|
+
Object.entries(tags)
|
|
33
|
+
.map(([id, tag]) => ({ ...tag, id }))
|
|
34
|
+
.sort(sortTags);
|
|
35
|
+
|
|
36
|
+
export const findTagByLabel = (tags: Map | undefined, name: string): Tag | undefined => {
|
|
37
|
+
const entry = Object.entries(tags ?? {}).find(([_, tag]) => tag.label.toLowerCase() === name.toLowerCase());
|
|
38
|
+
return entry ? { ...entry[1], id: entry[0] } : undefined;
|
|
39
|
+
};
|