@dxos/echo 0.8.4-main.3eb6e50203 → 0.8.4-main.3fbcb4aa9b
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/README.md +4 -4
- package/dist/lib/neutral/Annotation.mjs +7 -3
- package/dist/lib/neutral/Database.mjs +8 -4
- package/dist/lib/neutral/Entity.mjs +24 -14
- package/dist/lib/neutral/Err.mjs +1 -1
- package/dist/lib/neutral/Extension.mjs +18 -0
- package/dist/lib/neutral/Extension.mjs.map +7 -0
- package/dist/lib/neutral/Feed.mjs +50 -0
- package/dist/lib/neutral/Feed.mjs.map +7 -0
- package/dist/lib/neutral/Filter.mjs +21 -10
- package/dist/lib/neutral/Format.mjs +3 -3
- package/dist/lib/neutral/JsonSchema.mjs +9 -9
- package/dist/lib/neutral/Key.mjs +1 -1
- package/dist/lib/neutral/Migration.mjs +17 -0
- package/dist/lib/neutral/Migration.mjs.map +7 -0
- package/dist/lib/neutral/Obj.mjs +26 -17
- package/dist/lib/neutral/Order.mjs +1 -1
- package/dist/lib/neutral/Query.mjs +21 -9
- package/dist/lib/neutral/QueryResult.mjs +1 -1
- package/dist/lib/neutral/Ref.mjs +9 -7
- package/dist/lib/neutral/Relation.mjs +23 -13
- package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
- package/dist/lib/neutral/Tag.mjs +14 -10
- package/dist/lib/neutral/Type.mjs +13 -23
- package/dist/lib/neutral/{chunk-N2QNHMT5.mjs → chunk-44HT3MEC.mjs} +2 -2
- package/dist/lib/neutral/{chunk-N2QNHMT5.mjs.map → chunk-44HT3MEC.mjs.map} +1 -1
- package/dist/lib/neutral/{chunk-XAJMXQ4H.mjs → chunk-5SL5LDLD.mjs} +6 -2
- package/dist/lib/neutral/chunk-5SL5LDLD.mjs.map +7 -0
- package/dist/lib/neutral/chunk-6VIJV543.mjs +34 -0
- package/dist/lib/neutral/chunk-6VIJV543.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7RVZT53K.mjs} +1 -1
- package/dist/lib/neutral/{chunk-4L6DOFXP.mjs → chunk-BICZKPQG.mjs} +1 -1
- package/dist/lib/neutral/{chunk-4L6DOFXP.mjs.map → chunk-BICZKPQG.mjs.map} +1 -1
- package/dist/lib/neutral/{chunk-B4FLOYG7.mjs → chunk-FHYIM4RD.mjs} +18 -20
- package/dist/lib/neutral/chunk-FHYIM4RD.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FZHVQEHN.mjs +81 -0
- package/dist/lib/neutral/chunk-FZHVQEHN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
- package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-EXAYCLIM.mjs → chunk-HPNQTEEQ.mjs} +5 -5
- package/dist/lib/neutral/chunk-HPNQTEEQ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-YPIP3WGI.mjs → chunk-LVGOVFDV.mjs} +40 -12
- package/dist/lib/neutral/chunk-LVGOVFDV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-MPAI2MHO.mjs +346 -0
- package/dist/lib/neutral/chunk-MPAI2MHO.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-KB7RIVLK.mjs → chunk-N4B7FHQT.mjs} +4 -4
- package/dist/lib/neutral/{chunk-KB7RIVLK.mjs.map → chunk-N4B7FHQT.mjs.map} +2 -2
- package/dist/lib/neutral/chunk-O5LRY6CO.mjs +734 -0
- package/dist/lib/neutral/chunk-O5LRY6CO.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-VYEWMV5U.mjs → chunk-QGMIH2SN.mjs} +8 -4
- package/dist/lib/neutral/chunk-QGMIH2SN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QXIANHKU.mjs +206 -0
- package/dist/lib/neutral/chunk-QXIANHKU.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-UMECVTXM.mjs → chunk-RF7ZBZ4A.mjs} +72 -5
- package/dist/lib/neutral/chunk-RF7ZBZ4A.mjs.map +7 -0
- package/dist/lib/neutral/chunk-S7IMFVTB.mjs +132 -0
- package/dist/lib/neutral/chunk-S7IMFVTB.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SJKBWMJY.mjs +2436 -0
- package/dist/lib/neutral/chunk-SJKBWMJY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SUZMWP3Y.mjs +36 -0
- package/dist/lib/neutral/chunk-SUZMWP3Y.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-HQXQWXLH.mjs → chunk-SW5CUSBY.mjs} +183 -32
- package/dist/lib/neutral/chunk-SW5CUSBY.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-RIMHNJ3E.mjs → chunk-TNBK56IN.mjs} +98 -44
- package/dist/lib/neutral/chunk-TNBK56IN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-7WE7SBA2.mjs → chunk-TRPZU2HV.mjs} +13 -13
- package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ROKO4RKJ.mjs → chunk-TTCSATUD.mjs} +2 -2
- package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-V72DY6LU.mjs} +1 -1
- package/dist/lib/neutral/chunk-VGKLHHRT.mjs +318 -0
- package/dist/lib/neutral/chunk-VGKLHHRT.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TMLVKIMX.mjs → chunk-VYAGNFSJ.mjs} +8 -3
- package/dist/lib/neutral/chunk-VYAGNFSJ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-7YWDDFPH.mjs → chunk-WRVRDZDA.mjs} +77 -58
- package/dist/lib/neutral/chunk-WRVRDZDA.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-MXQJZCPY.mjs → chunk-ZISMEVKD.mjs} +1 -1
- package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +51 -28
- package/dist/lib/neutral/internal/index.mjs +52 -38
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/testing/index.mjs +199 -136
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/types/src/Annotation.d.ts +3 -3
- package/dist/types/src/Annotation.d.ts.map +1 -1
- package/dist/types/src/Collection.d.ts +16 -0
- package/dist/types/src/Collection.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +20 -35
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Dataset.d.ts +19 -0
- package/dist/types/src/Dataset.d.ts.map +1 -0
- package/dist/types/src/Entity.d.ts +54 -22
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +18 -18
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Extension.d.ts +80 -0
- package/dist/types/src/Extension.d.ts.map +1 -0
- package/dist/types/src/Extension.test.d.ts +2 -0
- package/dist/types/src/Extension.test.d.ts.map +1 -0
- package/dist/types/src/Feed.d.ts +182 -0
- package/dist/types/src/Feed.d.ts.map +1 -0
- package/dist/types/src/Filter.d.ts +34 -5
- package/dist/types/src/Filter.d.ts.map +1 -1
- package/dist/types/src/Filter.test.d.ts +2 -0
- package/dist/types/src/Filter.test.d.ts.map +1 -0
- package/dist/types/src/Format.d.ts +3 -3
- package/dist/types/src/Format.d.ts.map +1 -1
- package/dist/types/src/Hypergraph.d.ts +8 -3
- package/dist/types/src/Hypergraph.d.ts.map +1 -1
- package/dist/types/src/Json.d.ts +33 -0
- package/dist/types/src/Json.d.ts.map +1 -0
- package/dist/types/src/Json.test.d.ts +2 -0
- package/dist/types/src/Json.test.d.ts.map +1 -0
- package/dist/types/src/JsonSchema.d.ts +11 -4
- package/dist/types/src/JsonSchema.d.ts.map +1 -1
- package/dist/types/src/Migration.d.ts +57 -0
- package/dist/types/src/Migration.d.ts.map +1 -0
- package/dist/types/src/Obj.d.ts +109 -60
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Order.d.ts.map +1 -1
- package/dist/types/src/Query.d.ts +105 -17
- package/dist/types/src/Query.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +58 -10
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +86 -40
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/SchemaRegistry.d.ts +4 -4
- package/dist/types/src/SchemaRegistry.d.ts.map +1 -1
- package/dist/types/src/Tag.d.ts +2 -1
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts +51 -180
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/View.d.ts +68 -0
- package/dist/types/src/View.d.ts.map +1 -0
- package/dist/types/src/exemplars.test.d.ts +2 -0
- package/dist/types/src/exemplars.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +7 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +65 -2
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/index.d.ts +4 -0
- package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
- package/dist/types/src/internal/{api → Annotation}/sorting.d.ts +1 -1
- package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
- package/dist/types/src/internal/{annotations → Annotation}/util.d.ts +2 -2
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
- package/dist/types/src/internal/{api/entity.d.ts → Entity/api.d.ts} +2 -2
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
- package/dist/types/src/internal/{entities → Entity}/entity.d.ts +3 -3
- package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
- package/dist/types/src/internal/{entities → Entity}/index.d.ts +2 -0
- package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
- package/dist/types/src/internal/{entities → Entity}/model.d.ts +2 -26
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
- package/dist/types/src/internal/{entities → Entity}/object.d.ts +2 -2
- package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
- package/dist/types/src/internal/{entities → Entity}/relation.d.ts +3 -30
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
- package/dist/types/src/internal/{api → Entity}/version.d.ts +1 -1
- package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
- package/dist/types/src/internal/Format/date.d.ts.map +1 -0
- package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
- package/dist/types/src/internal/Format/format.d.ts.map +1 -0
- package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
- package/dist/types/src/internal/Format/index.d.ts.map +1 -0
- package/dist/types/src/internal/Format/number.d.ts.map +1 -0
- package/dist/types/src/internal/Format/object.d.ts.map +1 -0
- package/dist/types/src/internal/Format/select.d.ts.map +1 -0
- package/dist/types/src/internal/Format/string.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/types.d.ts +1 -1
- package/dist/types/src/internal/Format/types.d.ts.map +1 -0
- package/dist/types/src/internal/{json-schema → JsonSchema}/annotations.d.ts +1 -1
- package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
- package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-type.d.ts +37 -37
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
- package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.d.ts +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/create-object.d.ts +2 -2
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/deleted.d.ts +1 -1
- package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/json-serializer.d.ts +13 -5
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
- package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/set-value.d.ts +2 -2
- package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/typed-object.d.ts +4 -4
- package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/Query.d.ts +10 -0
- package/dist/types/src/internal/Query.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
- package/dist/types/src/internal/{ref → Ref}/ref-array.d.ts +1 -1
- package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
- package/dist/types/src/internal/{ref → Ref}/ref.d.ts +15 -2
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
- package/dist/types/src/internal/{schema → Type}/compose.d.ts +1 -1
- package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
- package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
- package/dist/types/src/internal/{schema → Type}/echo-schema.d.ts +7 -7
- package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
- package/dist/types/src/internal/Type/index.d.ts.map +1 -0
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
- package/dist/types/src/internal/{schema → Type}/persistent-schema.d.ts +2 -2
- package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
- package/dist/types/src/internal/{api → common/api}/index.d.ts +0 -4
- package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
- package/dist/types/src/internal/{api → common/api}/meta.d.ts +3 -3
- package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
- package/dist/types/src/internal/common/index.d.ts +4 -0
- package/dist/types/src/internal/common/index.d.ts.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/change-context.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/errors.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/reactive-array.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts +2 -2
- package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/base.d.ts +1 -0
- package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/entity.d.ts +5 -5
- package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/index.d.ts +1 -0
- package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/meta.d.ts +2 -1
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/version.d.ts +2 -2
- package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
- package/dist/types/src/internal/index.d.ts +9 -10
- package/dist/types/src/internal/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-data.d.ts +8 -8
- package/dist/types/src/testing/test-data.d.ts.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +47 -46
- package/dist/types/src/testing/test-schema.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +29 -14
- package/src/Annotation.ts +7 -3
- package/src/Collection.ts +37 -0
- package/src/Database.ts +63 -64
- package/src/Dataset.ts +26 -0
- package/src/Entity.ts +87 -61
- package/src/Err.ts +2 -0
- package/src/Extension.test.ts +235 -0
- package/src/Extension.ts +122 -0
- package/src/Feed.ts +304 -0
- package/src/Filter.test.ts +90 -0
- package/src/Filter.ts +85 -7
- package/src/Format.ts +3 -3
- package/src/Hypergraph.ts +9 -4
- package/src/Json.test.ts +175 -0
- package/src/Json.ts +102 -0
- package/src/JsonSchema.ts +14 -4
- package/src/Migration.ts +94 -0
- package/src/Obj.test.ts +112 -15
- package/src/Obj.ts +302 -166
- package/src/Order.ts +3 -1
- package/src/Query.test.ts +372 -15
- package/src/Query.ts +269 -26
- package/src/Ref.ts +64 -11
- package/src/Relation.test.ts +8 -2
- package/src/Relation.ts +183 -147
- package/src/SchemaRegistry.ts +5 -4
- package/src/Tag.ts +6 -5
- package/src/Type.test.ts +10 -10
- package/src/Type.ts +70 -303
- package/src/View.ts +107 -0
- package/src/exemplars.test.ts +21 -0
- package/src/index.ts +8 -0
- package/src/internal/{annotations → Annotation}/annotations.test.ts +56 -7
- package/src/internal/{annotations → Annotation}/annotations.ts +122 -19
- package/src/internal/{annotations → Annotation}/index.ts +1 -0
- package/src/internal/{api → Annotation}/sorting.ts +2 -4
- package/src/internal/{annotations → Annotation}/util.ts +1 -1
- package/src/internal/{api/entity.ts → Entity/api.ts} +3 -2
- package/src/internal/{entities → Entity}/entity.ts +6 -4
- package/src/internal/{entities → Entity}/index.ts +2 -0
- package/src/internal/{entities → Entity}/model.ts +13 -42
- package/src/internal/{entities → Entity}/object.ts +2 -3
- package/src/internal/{entities → Entity}/relation.ts +19 -36
- package/src/internal/{api → Entity}/version.ts +2 -2
- package/src/internal/{formats → Format}/date.test.ts +1 -2
- package/src/internal/{formats → Format}/format.test.ts +1 -2
- package/src/internal/{formats → Format}/types.ts +2 -2
- package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
- package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +4 -4
- package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +48 -49
- package/src/internal/{json-schema → JsonSchema}/json-schema.ts +6 -5
- package/src/internal/{object → Obj}/clone.ts +3 -3
- package/src/internal/{object → Obj}/common.ts +2 -2
- package/src/internal/{object → Obj}/create-object.test.ts +5 -7
- package/src/internal/{object → Obj}/create-object.ts +5 -6
- package/src/internal/{object → Obj}/deleted.ts +2 -2
- package/src/internal/{object → Obj}/inspect.ts +2 -2
- package/src/internal/{object → Obj}/json-serializer.test.ts +31 -9
- package/src/internal/{object → Obj}/json-serializer.ts +52 -27
- package/src/internal/{object → Obj}/schema-validator.ts +1 -1
- package/src/internal/{object → Obj}/set-value.test.ts +24 -24
- package/src/internal/{object → Obj}/set-value.ts +3 -3
- package/src/internal/{object → Obj}/snapshot.ts +35 -23
- package/src/internal/{object → Obj}/typed-object.test.ts +3 -3
- package/src/internal/{object → Obj}/typed-object.ts +4 -4
- package/src/internal/Query.ts +137 -0
- package/src/internal/{ref → Ref}/ref-array.ts +1 -2
- package/src/internal/{ref → Ref}/ref.test.ts +4 -5
- package/src/internal/{ref → Ref}/ref.ts +20 -3
- package/src/internal/{schema → Type}/compose.test.ts +5 -6
- package/src/internal/{schema → Type}/compose.ts +1 -1
- package/src/internal/{schema → Type}/echo-schema.ts +9 -10
- package/src/internal/{schema → Type}/manipulation.ts +1 -1
- package/src/internal/{schema → Type}/persistent-schema.ts +9 -4
- package/src/internal/{README.md → common/README.md} +2 -2
- package/src/internal/{api → common/api}/index.ts +0 -4
- package/src/internal/{api → common/api}/meta.ts +3 -3
- package/src/internal/common/index.ts +7 -0
- package/src/internal/{proxy → common/proxy}/change-context.ts +1 -1
- package/src/internal/{proxy → common/proxy}/change.test.ts +97 -97
- package/src/internal/{proxy → common/proxy}/errors.ts +2 -2
- package/src/internal/{proxy → common/proxy}/handler.test.ts +2 -4
- package/src/internal/{proxy → common/proxy}/json-serializer.ts +6 -3
- package/src/internal/{proxy → common/proxy}/make-object.ts +1 -2
- package/src/internal/{proxy → common/proxy}/ownership.ts +0 -1
- package/src/internal/{proxy → common/proxy}/reactive-array.ts +1 -1
- package/src/internal/common/proxy/reactive.test.ts +54 -0
- package/src/internal/{proxy → common/proxy}/reactive.ts +12 -4
- package/src/internal/{proxy → common/proxy}/schema.test.ts +10 -10
- package/src/internal/{proxy → common/proxy}/typed-handler.test.ts +6 -7
- package/src/internal/{proxy → common/proxy}/typed-handler.ts +10 -13
- package/src/internal/{proxy → common/proxy}/typed-object.test.ts +5 -6
- package/src/internal/{types → common/types}/base.ts +1 -1
- package/src/internal/{types → common/types}/entity.ts +2 -2
- package/src/internal/{types → common/types}/index.ts +1 -0
- package/src/internal/{types → common/types}/meta.ts +3 -1
- package/src/internal/common/types/model-symbols.ts +69 -0
- package/src/internal/{types → common/types}/version.ts +2 -3
- package/src/internal/index.ts +9 -31
- package/src/testing/api.test.ts +4 -5
- package/src/testing/test-data.ts +157 -98
- package/src/testing/test-schema.ts +20 -18
- package/dist/lib/neutral/chunk-7WE7SBA2.mjs.map +0 -7
- package/dist/lib/neutral/chunk-7YWDDFPH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-B4FLOYG7.mjs.map +0 -7
- package/dist/lib/neutral/chunk-EXAYCLIM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-F6BTBXL7.mjs +0 -171
- package/dist/lib/neutral/chunk-F6BTBXL7.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HQXQWXLH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-MXQJZCPY.mjs.map +0 -7
- package/dist/lib/neutral/chunk-RCBBZLVM.mjs +0 -142
- package/dist/lib/neutral/chunk-RCBBZLVM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-RIMHNJ3E.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TMLVKIMX.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UMECVTXM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VJ2H5MOJ.mjs +0 -3905
- package/dist/lib/neutral/chunk-VJ2H5MOJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VYEWMV5U.mjs.map +0 -7
- package/dist/lib/neutral/chunk-X2MPMYYN.mjs +0 -13
- package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XAJMXQ4H.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YPIP3WGI.mjs.map +0 -7
- package/dist/types/src/internal/annotations/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/annotations.test.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/index.d.ts +0 -3
- package/dist/types/src/internal/annotations/index.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/util.d.ts.map +0 -1
- package/dist/types/src/internal/api/annotations.d.ts +0 -23
- package/dist/types/src/internal/api/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/api/entity.d.ts.map +0 -1
- package/dist/types/src/internal/api/index.d.ts.map +0 -1
- package/dist/types/src/internal/api/meta.d.ts.map +0 -1
- package/dist/types/src/internal/api/sorting.d.ts.map +0 -1
- package/dist/types/src/internal/api/version.d.ts.map +0 -1
- package/dist/types/src/internal/entities/entity.d.ts.map +0 -1
- package/dist/types/src/internal/entities/index.d.ts.map +0 -1
- package/dist/types/src/internal/entities/model.d.ts.map +0 -1
- package/dist/types/src/internal/entities/object.d.ts.map +0 -1
- package/dist/types/src/internal/entities/relation.d.ts.map +0 -1
- package/dist/types/src/internal/entities/util.d.ts.map +0 -1
- package/dist/types/src/internal/formats/date.d.ts.map +0 -1
- package/dist/types/src/internal/formats/date.test.d.ts.map +0 -1
- package/dist/types/src/internal/formats/format.d.ts.map +0 -1
- package/dist/types/src/internal/formats/format.test.d.ts.map +0 -1
- package/dist/types/src/internal/formats/index.d.ts.map +0 -1
- package/dist/types/src/internal/formats/number.d.ts.map +0 -1
- package/dist/types/src/internal/formats/object.d.ts.map +0 -1
- package/dist/types/src/internal/formats/select.d.ts.map +0 -1
- package/dist/types/src/internal/formats/string.d.ts.map +0 -1
- package/dist/types/src/internal/formats/types.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/index.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/clone.d.ts.map +0 -1
- package/dist/types/src/internal/object/common.d.ts.map +0 -1
- package/dist/types/src/internal/object/create-object.d.ts.map +0 -1
- package/dist/types/src/internal/object/create-object.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
- package/dist/types/src/internal/object/ids.d.ts.map +0 -1
- package/dist/types/src/internal/object/index.d.ts.map +0 -1
- package/dist/types/src/internal/object/inspect.d.ts.map +0 -1
- package/dist/types/src/internal/object/json-serializer.d.ts.map +0 -1
- package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/schema-validator.d.ts +0 -2
- package/dist/types/src/internal/object/schema-validator.d.ts.map +0 -1
- package/dist/types/src/internal/object/schema-validator.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/set-value.d.ts.map +0 -1
- package/dist/types/src/internal/object/set-value.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/snapshot.d.ts.map +0 -1
- package/dist/types/src/internal/object/typed-object.d.ts.map +0 -1
- package/dist/types/src/internal/object/typed-object.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/change-context.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/change.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/errors.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/event-batch.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/index.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/json-serializer.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/make-object.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/ownership.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/proxy-types.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/reactive-array.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/schema-validator.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/symbols.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/typed-handler.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +0 -1
- package/dist/types/src/internal/ref/index.d.ts.map +0 -1
- package/dist/types/src/internal/ref/ref-array.d.ts.map +0 -1
- package/dist/types/src/internal/ref/ref.d.ts.map +0 -1
- package/dist/types/src/internal/ref/ref.test.d.ts.map +0 -1
- package/dist/types/src/internal/schema/compose.d.ts.map +0 -1
- package/dist/types/src/internal/schema/compose.test.d.ts.map +0 -1
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
- package/dist/types/src/internal/schema/index.d.ts.map +0 -1
- package/dist/types/src/internal/schema/manipulation.d.ts.map +0 -1
- package/dist/types/src/internal/schema/persistent-schema.d.ts.map +0 -1
- package/dist/types/src/internal/types/base.d.ts.map +0 -1
- package/dist/types/src/internal/types/entity.d.ts.map +0 -1
- package/dist/types/src/internal/types/index.d.ts.map +0 -1
- package/dist/types/src/internal/types/meta.d.ts.map +0 -1
- package/dist/types/src/internal/types/typename.d.ts.map +0 -1
- package/dist/types/src/internal/types/version.d.ts.map +0 -1
- package/src/internal/api/annotations.ts +0 -60
- /package/dist/lib/neutral/{chunk-ANHVGJI4.mjs.map → chunk-7RVZT53K.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-OMUPQMLR.mjs.map → chunk-V72DY6LU.mjs.map} +0 -0
- /package/dist/types/src/internal/{annotations → Annotation}/annotations.test.d.ts +0 -0
- /package/dist/types/src/internal/{entities → Entity}/util.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/date.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/date.test.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/format.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/format.test.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/index.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/number.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/select.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/string.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/effect-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/index.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-normalize.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/clone.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/create-object.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/ids.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/index.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/inspect.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/json-serializer.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/schema-validator.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/set-value.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/snapshot.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/typed-object.test.d.ts +0 -0
- /package/dist/types/src/internal/{ref → Ref}/index.d.ts +0 -0
- /package/dist/types/src/internal/{ref → Ref}/ref.test.d.ts +0 -0
- /package/dist/types/src/internal/{schema → Type}/compose.test.d.ts +0 -0
- /package/dist/types/src/internal/{schema → Type}/index.d.ts +0 -0
- /package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/change.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/define-hidden-property.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/event-batch.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/index.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/json-serializer.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/make-object.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/ownership.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/proxy-types.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/proxy-utils.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/schema-validator.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/symbols.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.d.ts +0 -0
- /package/dist/types/src/internal/{types → common/types}/typename.d.ts +0 -0
- /package/src/internal/{entities → Entity}/util.ts +0 -0
- /package/src/internal/{formats → Format}/date.ts +0 -0
- /package/src/internal/{formats → Format}/format.ts +0 -0
- /package/src/internal/{formats → Format}/index.ts +0 -0
- /package/src/internal/{formats → Format}/number.ts +0 -0
- /package/src/internal/{formats → Format}/object.ts +0 -0
- /package/src/internal/{formats → Format}/select.ts +0 -0
- /package/src/internal/{formats → Format}/string.ts +0 -0
- /package/src/internal/{json-schema → JsonSchema}/effect-schema.test.ts +0 -0
- /package/src/internal/{json-schema → JsonSchema}/index.ts +0 -0
- /package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +0 -0
- /package/src/internal/{object → Obj}/ids.ts +0 -0
- /package/src/internal/{object → Obj}/index.ts +0 -0
- /package/src/internal/{object → Obj}/schema-validator.test.ts +0 -0
- /package/src/internal/{ref → Ref}/index.ts +0 -0
- /package/src/internal/{schema → Type}/index.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/define-hidden-property.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/event-batch.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/index.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/proxy-types.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/proxy-utils.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/schema-validator.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/symbols.ts +0 -0
- /package/src/internal/{types → common/types}/typename.ts +0 -0
package/src/Obj.ts
CHANGED
|
@@ -2,86 +2,39 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
// @import-as-namespace
|
|
6
|
+
|
|
5
7
|
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as Equal from 'effect/Equal';
|
|
6
9
|
import * as Function from 'effect/Function';
|
|
7
10
|
import * as Option from 'effect/Option';
|
|
8
11
|
import * as Schema from 'effect/Schema';
|
|
12
|
+
import * as Utils from 'effect/Utils';
|
|
9
13
|
|
|
10
14
|
import type { ForeignKey } from '@dxos/echo-protocol';
|
|
11
|
-
import { createJsonPath
|
|
12
|
-
import { assertArgument } from '@dxos/invariant';
|
|
15
|
+
import { createJsonPath } from '@dxos/effect';
|
|
16
|
+
import { assertArgument, invariant } from '@dxos/invariant';
|
|
13
17
|
import { type DXN, ObjectId } from '@dxos/keys';
|
|
14
|
-
import { assumeType } from '@dxos/util';
|
|
18
|
+
import { assumeType, deepMapValues } from '@dxos/util';
|
|
15
19
|
|
|
16
20
|
import type * as Database from './Database';
|
|
17
21
|
import * as Entity from './Entity';
|
|
18
22
|
import * as Err from './Err';
|
|
19
|
-
import
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
type Comparator as ApiComparator,
|
|
24
|
-
type Meta as ApiMeta,
|
|
25
|
-
type ReadonlyMeta as ApiReadonlyMeta,
|
|
26
|
-
type EntityVersion as ApiVersion,
|
|
27
|
-
type ChangeCallback,
|
|
28
|
-
type InternalObjectProps,
|
|
29
|
-
type KindId,
|
|
30
|
-
MetaId,
|
|
31
|
-
type Mutable,
|
|
32
|
-
type ObjectMeta,
|
|
33
|
-
// TODO(dmaretskyi): Export ParentId?
|
|
34
|
-
ParentId,
|
|
35
|
-
SnapshotKindId,
|
|
36
|
-
type VersionCompareResult,
|
|
37
|
-
VersionTypeId,
|
|
38
|
-
addTag as addTag$,
|
|
39
|
-
change as change$,
|
|
40
|
-
clone as clone$,
|
|
41
|
-
compareVersions,
|
|
42
|
-
decodeVersion,
|
|
43
|
-
deleteKeys as deleteKeys$,
|
|
44
|
-
encodeVersion,
|
|
45
|
-
getDXN as getDXN$,
|
|
46
|
-
getDatabase as getDatabase$,
|
|
47
|
-
getDescription as getDescription$,
|
|
48
|
-
getKeys as getKeys$,
|
|
49
|
-
getLabel as getLabel$,
|
|
50
|
-
getMetaChecked as getMeta$,
|
|
51
|
-
getSchema as getSchema$,
|
|
52
|
-
getSnapshot as getSnapshot$,
|
|
53
|
-
getTypeAnnotation,
|
|
54
|
-
getTypeDXN as getTypeDXN$,
|
|
55
|
-
getTypename as getTypename$,
|
|
56
|
-
isDeleted as isDeleted$,
|
|
57
|
-
isInstanceOf,
|
|
58
|
-
isVersion,
|
|
59
|
-
makeObject,
|
|
60
|
-
objectFromJSON,
|
|
61
|
-
removeTag as removeTag$,
|
|
62
|
-
setDescription as setDescription$,
|
|
63
|
-
setLabel as setLabel$,
|
|
64
|
-
setValue as setValue$,
|
|
65
|
-
sort as sort$,
|
|
66
|
-
sortByLabel as sortByLabel$,
|
|
67
|
-
sortByTypename as sortByTypename$,
|
|
68
|
-
subscribe as subscribe$,
|
|
69
|
-
objectToJSON as toJSON$,
|
|
70
|
-
version as version$,
|
|
71
|
-
versionValid,
|
|
72
|
-
} from './internal';
|
|
73
|
-
import type * as Ref from './Ref';
|
|
23
|
+
import * as internal from './internal';
|
|
24
|
+
import { getProxyTarget, isProxy } from './internal/common/proxy/proxy-utils';
|
|
25
|
+
import * as objInternal from './internal/Obj';
|
|
26
|
+
import * as Ref from './Ref';
|
|
74
27
|
import type * as Type from './Type';
|
|
75
28
|
|
|
76
29
|
/**
|
|
77
30
|
* Base type for all ECHO objects.
|
|
78
31
|
*/
|
|
79
|
-
interface BaseObj extends AnyEntity, Entity.OfKind<typeof Entity.Kind.Object> {}
|
|
32
|
+
interface BaseObj extends internal.AnyEntity, Entity.OfKind<typeof Entity.Kind.Object> {}
|
|
80
33
|
|
|
81
34
|
/**
|
|
82
35
|
* Object type with specific properties.
|
|
83
36
|
*/
|
|
84
|
-
export type
|
|
37
|
+
export type OfShape<Props> = BaseObj & Props;
|
|
85
38
|
|
|
86
39
|
/**
|
|
87
40
|
* Object with no known properties beyond id and kind.
|
|
@@ -93,6 +46,44 @@ export type Obj<Props> = BaseObj & Props;
|
|
|
93
46
|
*/
|
|
94
47
|
export interface Unknown extends BaseObj {}
|
|
95
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Runtime Effect schema for any ECHO object.
|
|
51
|
+
* Use for validation, parsing, or as a reference target for collections.
|
|
52
|
+
*
|
|
53
|
+
* NOTE: `Schema.is(Type.Obj)` does STRUCTURAL validation only (checks for `id` field).
|
|
54
|
+
* Use `Obj.isObject()` for proper ECHO instance type guards that check the KindId brand.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* // Structural type guard (accepts any object with id field)
|
|
59
|
+
* if (Schema.is(Type.Obj)(unknownValue)) { ... }
|
|
60
|
+
*
|
|
61
|
+
* // ECHO instance type guard (checks KindId brand)
|
|
62
|
+
* if (Obj.isObject(unknownValue)) { ... }
|
|
63
|
+
*
|
|
64
|
+
* // Reference to any object type
|
|
65
|
+
* const Collection = Schema.Struct({
|
|
66
|
+
* objects: Schema.Array(Ref.Ref(Obj.Unknown)),
|
|
67
|
+
* }).pipe(Type.object({ typename: 'Collection', version: '0.1.0' }));
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
// TODO(wittjosiah): Investigate if Schema.filter can validate KindId on ECHO instances.
|
|
71
|
+
// Effect Schema normalizes proxy objects to plain objects before calling filter predicates.
|
|
72
|
+
// Possible approaches: custom Schema.declare, AST manipulation, or upstream contribution.
|
|
73
|
+
export const Unknown: Type.Obj<Unknown> = Schema.Struct({
|
|
74
|
+
id: Schema.String,
|
|
75
|
+
}).pipe(
|
|
76
|
+
Schema.extend(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
|
|
77
|
+
// TODO(dmaretskyi): Clean this up.
|
|
78
|
+
// NOTE: The EchoObjectSchema annotation is required for Ref.Ref(Obj.Unknown) to work.
|
|
79
|
+
// The typename/version only satisfy ECHO schema machinery for reference targets.
|
|
80
|
+
internal.EchoObjectSchema({ typename: internal.ANY_OBJECT_TYPENAME, version: internal.ANY_OBJECT_VERSION }),
|
|
81
|
+
(schema) =>
|
|
82
|
+
Object.assign(schema, {
|
|
83
|
+
[internal.SchemaKindId]: (schema as any)[internal.SchemaKindId],
|
|
84
|
+
}) as unknown as Type.Obj<Unknown>,
|
|
85
|
+
);
|
|
86
|
+
|
|
96
87
|
/**
|
|
97
88
|
* Object with arbitrary properties.
|
|
98
89
|
*
|
|
@@ -101,13 +92,13 @@ export interface Unknown extends BaseObj {}
|
|
|
101
92
|
*
|
|
102
93
|
* Prefer using `Obj.Unknown` when you don't need to access arbitrary properties.
|
|
103
94
|
*/
|
|
104
|
-
export interface Any extends BaseObj, AnyProperties {}
|
|
95
|
+
export interface Any extends BaseObj, internal.AnyProperties {}
|
|
105
96
|
|
|
106
97
|
/**
|
|
107
98
|
* Base type for snapshot objects (has SnapshotKindId instead of KindId).
|
|
108
99
|
*/
|
|
109
|
-
interface BaseSnapshot extends AnyEntity {
|
|
110
|
-
readonly [SnapshotKindId]: typeof Entity.Kind.Object;
|
|
100
|
+
interface BaseSnapshot extends internal.AnyEntity {
|
|
101
|
+
readonly [Entity.SnapshotKindId]: typeof Entity.Kind.Object;
|
|
111
102
|
readonly id: ObjectId;
|
|
112
103
|
}
|
|
113
104
|
|
|
@@ -120,16 +111,23 @@ interface BaseSnapshot extends AnyEntity {
|
|
|
120
111
|
* Snapshots are structurally identical to reactive objects but have a different brand,
|
|
121
112
|
* making them distinguishable at the TypeScript level. Neither is assignable to the other.
|
|
122
113
|
*/
|
|
123
|
-
export type Snapshot<T extends Unknown = Unknown> = Omit<T, KindId> & BaseSnapshot;
|
|
114
|
+
export type Snapshot<T extends Unknown = Unknown> = Omit<T, Entity.KindId> & BaseSnapshot;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* JSON-encoded properties for objects.
|
|
118
|
+
*/
|
|
119
|
+
export interface BaseObjJson {
|
|
120
|
+
id: string;
|
|
121
|
+
}
|
|
124
122
|
|
|
125
|
-
const defaultMeta: ObjectMeta = {
|
|
123
|
+
const defaultMeta: internal.ObjectMeta = {
|
|
126
124
|
keys: [],
|
|
127
125
|
};
|
|
128
126
|
|
|
129
|
-
type
|
|
127
|
+
type MakePropsInternal<T extends Unknown> = {
|
|
130
128
|
id?: ObjectId;
|
|
131
|
-
[Meta]?: Partial<ObjectMeta>;
|
|
132
|
-
} &
|
|
129
|
+
[Meta]?: Partial<internal.ObjectMeta>;
|
|
130
|
+
} & Entity.Properties<T>;
|
|
133
131
|
|
|
134
132
|
// TODO(burdon): Should we allow the caller to set the id?
|
|
135
133
|
/**
|
|
@@ -137,9 +135,9 @@ type Props<T = any> = {
|
|
|
137
135
|
*/
|
|
138
136
|
export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
|
|
139
137
|
id?: ObjectId;
|
|
140
|
-
[Meta]?: Partial<ObjectMeta>;
|
|
138
|
+
[Meta]?: Partial<internal.ObjectMeta>;
|
|
141
139
|
[Parent]?: Unknown;
|
|
142
|
-
} &
|
|
140
|
+
} & MakePropsInternal<Schema.Schema.Type<S>>;
|
|
143
141
|
|
|
144
142
|
/**
|
|
145
143
|
* Creates a new echo object of the given schema.
|
|
@@ -156,23 +154,22 @@ export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
|
|
|
156
154
|
*
|
|
157
155
|
* Note: Only accepts object schemas, not relation schemas. Use `Relation.make` for relations.
|
|
158
156
|
*/
|
|
159
|
-
export const make
|
|
160
|
-
<S extends Type.Obj.Any>(schema: S, props: MakeProps<S>): Obj<Schema.Schema.Type<S>>;
|
|
161
|
-
/**
|
|
162
|
-
* @deprecated Pass meta as in the example: `Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' })`.
|
|
163
|
-
*/
|
|
164
|
-
<S extends Type.Obj.Any>(schema: S, props: MakeProps<S>, meta: Partial<ObjectMeta>): Obj<Schema.Schema.Type<S>>;
|
|
165
|
-
} = <S extends Type.Obj.Any>(
|
|
157
|
+
export const make = <S extends Type.AnyObj>(
|
|
166
158
|
schema: S,
|
|
167
|
-
props: MakeProps<S
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
159
|
+
props: NoInfer<MakeProps<S>>,
|
|
160
|
+
): OfShape<Schema.Schema.Type<S>> => {
|
|
161
|
+
assertArgument(
|
|
162
|
+
internal.getTypeAnnotation(schema)?.kind === Entity.Kind.Object,
|
|
163
|
+
'schema',
|
|
164
|
+
'Expected an object schema',
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
let meta: internal.ObjectMeta | undefined = undefined;
|
|
171
168
|
|
|
172
169
|
// Set default fields on meta on creation.
|
|
173
|
-
if (props[MetaId] != null) {
|
|
174
|
-
meta = { ...structuredClone(defaultMeta), ...props[MetaId] };
|
|
175
|
-
delete props[MetaId];
|
|
170
|
+
if (props[internal.MetaId] != null) {
|
|
171
|
+
meta = { ...structuredClone(defaultMeta), ...props[internal.MetaId] };
|
|
172
|
+
delete props[internal.MetaId];
|
|
176
173
|
}
|
|
177
174
|
|
|
178
175
|
// Filter undefined values (Object.entries only returns string-keyed properties).
|
|
@@ -186,7 +183,7 @@ export const make: {
|
|
|
186
183
|
}
|
|
187
184
|
}
|
|
188
185
|
|
|
189
|
-
return makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
|
|
186
|
+
return internal.makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
|
|
190
187
|
...defaultMeta,
|
|
191
188
|
...meta,
|
|
192
189
|
});
|
|
@@ -196,10 +193,15 @@ export const make: {
|
|
|
196
193
|
* Determine if object is an ECHO object.
|
|
197
194
|
*/
|
|
198
195
|
export const isObject = (obj: unknown): obj is Unknown => {
|
|
199
|
-
assumeType<InternalObjectProps>(obj);
|
|
196
|
+
assumeType<internal.InternalObjectProps>(obj);
|
|
200
197
|
return typeof obj === 'object' && obj !== null && obj[Entity.KindId] === Entity.Kind.Object;
|
|
201
198
|
};
|
|
202
199
|
|
|
200
|
+
export const isSnapshot = (obj: unknown): obj is Snapshot => {
|
|
201
|
+
assumeType<internal.InternalObjectProps>(obj);
|
|
202
|
+
return typeof obj === 'object' && obj !== null && (obj as any)[Entity.SnapshotKindId] === Entity.Kind.Object;
|
|
203
|
+
};
|
|
204
|
+
|
|
203
205
|
/**
|
|
204
206
|
* Subscribe to object updates.
|
|
205
207
|
* The callback is called synchronously when the object is modified.
|
|
@@ -207,7 +209,7 @@ export const isObject = (obj: unknown): obj is Unknown => {
|
|
|
207
209
|
* @returns Unsubscribe function.
|
|
208
210
|
*/
|
|
209
211
|
export const subscribe = (obj: Unknown, callback: () => void): (() => void) => {
|
|
210
|
-
return subscribe
|
|
212
|
+
return internal.subscribe(obj, callback);
|
|
211
213
|
};
|
|
212
214
|
|
|
213
215
|
//
|
|
@@ -219,7 +221,7 @@ export const subscribe = (obj: Unknown, callback: () => void): (() => void) => {
|
|
|
219
221
|
* The snapshot is branded with SnapshotKindId instead of KindId,
|
|
220
222
|
* making it distinguishable from the reactive object at the type level.
|
|
221
223
|
*/
|
|
222
|
-
export const getSnapshot: <T extends Unknown>(obj: T) => Snapshot<T> = getSnapshot
|
|
224
|
+
export const getSnapshot: <T extends Unknown>(obj: T) => Snapshot<T> = objInternal.getSnapshot as any;
|
|
223
225
|
|
|
224
226
|
/**
|
|
225
227
|
* Returns the reactive version of an object from the database, given its snapshot.
|
|
@@ -240,7 +242,7 @@ export const getSnapshot: <T extends Unknown>(obj: T) => Snapshot<T> = getSnapsh
|
|
|
240
242
|
*/
|
|
241
243
|
export const getReactive = <T extends Unknown>(snapshot: Snapshot<T>): Effect.Effect<T, Err.GetReactiveError> =>
|
|
242
244
|
Effect.gen(function* () {
|
|
243
|
-
const db = getDatabase
|
|
245
|
+
const db = internal.getDatabase(snapshot);
|
|
244
246
|
if (!db) {
|
|
245
247
|
return yield* Effect.fail(new Err.GetReactiveError({ reason: 'no-database', snapshotId: snapshot.id }));
|
|
246
248
|
}
|
|
@@ -294,7 +296,7 @@ export type CloneOptions = {
|
|
|
294
296
|
* This does not clone referenced objects, only the properties in the object.
|
|
295
297
|
* @returns A new object with the same schema and properties.
|
|
296
298
|
*/
|
|
297
|
-
export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = clone
|
|
299
|
+
export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = objInternal.clone;
|
|
298
300
|
|
|
299
301
|
//
|
|
300
302
|
// Change
|
|
@@ -302,42 +304,42 @@ export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = clon
|
|
|
302
304
|
|
|
303
305
|
/**
|
|
304
306
|
* Makes all properties mutable recursively.
|
|
305
|
-
* Used to provide a mutable view of an object within `Obj.
|
|
307
|
+
* Used to provide a mutable view of an object within `Obj.update`.
|
|
306
308
|
*/
|
|
307
|
-
export type
|
|
309
|
+
export type Mutable<T> = internal.Mutable<T>;
|
|
308
310
|
|
|
309
311
|
/**
|
|
310
312
|
* Perform mutations on an echo object within a controlled context.
|
|
311
313
|
*
|
|
312
314
|
* All mutations within the callback are batched and trigger a single notification
|
|
313
|
-
* when the callback completes. Direct mutations outside of `Obj.
|
|
315
|
+
* when the callback completes. Direct mutations outside of `Obj.update` will throw
|
|
314
316
|
* an error for echo objects.
|
|
315
317
|
*
|
|
316
318
|
* This function also works with nested objects within echo objects (e.g., Template structs)
|
|
317
319
|
* that are reactive at runtime.
|
|
318
320
|
*
|
|
319
|
-
* @param obj - The echo object to mutate. Use `Relation.
|
|
321
|
+
* @param obj - The echo object to mutate. Use `Relation.update` for relations.
|
|
320
322
|
* @param callback - The callback that performs mutations on the object.
|
|
321
323
|
*
|
|
322
324
|
* @example
|
|
323
325
|
* ```ts
|
|
324
326
|
* const person = Obj.make(Person, { name: 'John', age: 25 });
|
|
325
327
|
*
|
|
326
|
-
* // Mutate within Obj.
|
|
327
|
-
* Obj.
|
|
328
|
-
*
|
|
329
|
-
*
|
|
328
|
+
* // Mutate within Obj.update
|
|
329
|
+
* Obj.update(person, (obj) => {
|
|
330
|
+
* obj.name = 'Jane';
|
|
331
|
+
* obj.age = 30;
|
|
330
332
|
* });
|
|
331
333
|
* // ONE notification fires here
|
|
332
334
|
*
|
|
333
335
|
* // Direct mutation throws
|
|
334
|
-
* person.name = 'Bob'; // Error: Cannot modify outside Obj.
|
|
336
|
+
* person.name = 'Bob'; // Error: Cannot modify outside Obj.update()
|
|
335
337
|
* ```
|
|
336
338
|
*
|
|
337
|
-
* Note: Only accepts objects. Use `Relation.
|
|
339
|
+
* Note: Only accepts objects. Use `Relation.update` for relations.
|
|
338
340
|
*/
|
|
339
|
-
export const
|
|
340
|
-
change
|
|
341
|
+
export const update = <T extends Unknown>(obj: T, callback: internal.ChangeCallback<T>): void => {
|
|
342
|
+
internal.change(obj, callback);
|
|
341
343
|
};
|
|
342
344
|
|
|
343
345
|
/**
|
|
@@ -363,7 +365,7 @@ export const change = <T extends Unknown>(obj: T, callback: ChangeCallback<T>):
|
|
|
363
365
|
* ```
|
|
364
366
|
*/
|
|
365
367
|
export const getValue = (obj: Unknown | Snapshot, path: readonly (string | number)[]): any => {
|
|
366
|
-
return getValue
|
|
368
|
+
return internal.getValue(obj, createJsonPath(path));
|
|
367
369
|
};
|
|
368
370
|
|
|
369
371
|
/**
|
|
@@ -371,7 +373,7 @@ export const getValue = (obj: Unknown | Snapshot, path: readonly (string | numbe
|
|
|
371
373
|
* whether to initialize nested data as an empty object or array.
|
|
372
374
|
*
|
|
373
375
|
* Similar to lodash.set and setDeep from @dxos/util, but schema-aware.
|
|
374
|
-
* Must be called within an `Obj.
|
|
376
|
+
* Must be called within an `Obj.update` callback.
|
|
375
377
|
*
|
|
376
378
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
377
379
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
@@ -385,15 +387,15 @@ export const getValue = (obj: Unknown | Snapshot, path: readonly (string | numbe
|
|
|
385
387
|
* ```ts
|
|
386
388
|
* const person = Obj.make(Person, { name: 'John' });
|
|
387
389
|
* // Person schema has: addresses: Schema.Array(Address)
|
|
388
|
-
* Obj.
|
|
389
|
-
* Obj.setValue(
|
|
390
|
+
* Obj.update(person, (obj) => {
|
|
391
|
+
* Obj.setValue(obj, ['addresses', 0, 'street'], '123 Main St');
|
|
390
392
|
* });
|
|
391
393
|
* // Creates: person.addresses = [{ street: '123 Main St' }]
|
|
392
394
|
* ```
|
|
393
395
|
*/
|
|
394
396
|
// TODO(wittjosiah): Compute possible path values + type value based on generic object type.
|
|
395
397
|
export const setValue: (obj: Mutable<Unknown>, path: readonly (string | number)[], value: any) => void =
|
|
396
|
-
setValue
|
|
398
|
+
objInternal.setValue as any;
|
|
397
399
|
|
|
398
400
|
//
|
|
399
401
|
// Type
|
|
@@ -415,14 +417,14 @@ export type ID = ObjectId;
|
|
|
415
417
|
* ```
|
|
416
418
|
*/
|
|
417
419
|
export const instanceOf: {
|
|
418
|
-
<S extends Type.
|
|
419
|
-
<S extends Type.
|
|
420
|
-
} = ((...args: [schema: Type.
|
|
420
|
+
<S extends Type.AnyEntity>(schema: S): (value: unknown) => value is Schema.Schema.Type<S>;
|
|
421
|
+
<S extends Type.AnyEntity>(schema: S, value: unknown): value is Schema.Schema.Type<S>;
|
|
422
|
+
} = ((...args: [schema: Type.AnyEntity, value: unknown] | [schema: Type.AnyEntity]) => {
|
|
421
423
|
if (args.length === 1) {
|
|
422
|
-
return (entity: unknown) => isInstanceOf(args[0], entity);
|
|
424
|
+
return (entity: unknown) => internal.isInstanceOf(args[0], entity);
|
|
423
425
|
}
|
|
424
426
|
|
|
425
|
-
return isInstanceOf(args[0], args[1]);
|
|
427
|
+
return internal.isInstanceOf(args[0], args[1]);
|
|
426
428
|
}) as any;
|
|
427
429
|
|
|
428
430
|
/**
|
|
@@ -439,11 +441,14 @@ export const instanceOf: {
|
|
|
439
441
|
* ```
|
|
440
442
|
*/
|
|
441
443
|
export const snapshotOf: {
|
|
442
|
-
<S extends Type.
|
|
443
|
-
<S extends Type.
|
|
444
|
-
} = ((...args: [schema: Type.
|
|
444
|
+
<S extends Type.AnyEntity>(schema: S): (value: unknown) => value is Snapshot<Schema.Schema.Type<S>>;
|
|
445
|
+
<S extends Type.AnyEntity>(schema: S, value: unknown): value is Snapshot<Schema.Schema.Type<S>>;
|
|
446
|
+
} = ((...args: [schema: Type.AnyEntity, value: unknown] | [schema: Type.AnyEntity]) => {
|
|
445
447
|
const check = (entity: unknown) =>
|
|
446
|
-
entity != null &&
|
|
448
|
+
entity != null &&
|
|
449
|
+
typeof entity === 'object' &&
|
|
450
|
+
Entity.SnapshotKindId in entity &&
|
|
451
|
+
internal.isInstanceOf(args[0], entity);
|
|
447
452
|
|
|
448
453
|
if (args.length === 1) {
|
|
449
454
|
return (entity: unknown) => check(entity);
|
|
@@ -459,29 +464,32 @@ export const snapshotOf: {
|
|
|
459
464
|
*/
|
|
460
465
|
export const getDXN = (entity: Unknown | Snapshot): DXN => {
|
|
461
466
|
assertArgument(!Schema.isSchema(entity), 'obj', 'Object should not be a schema.');
|
|
462
|
-
return getDXN
|
|
467
|
+
return internal.getDXN(entity);
|
|
463
468
|
};
|
|
464
469
|
|
|
465
470
|
/**
|
|
466
471
|
* @returns The DXN of the object's type.
|
|
467
|
-
* @example dxn:example.
|
|
472
|
+
* @example dxn:com.example.type.person:1.0.0
|
|
473
|
+
* @throws If the object is missing its type (corrupted object).
|
|
468
474
|
*/
|
|
469
|
-
|
|
470
|
-
|
|
475
|
+
export const getTypeDXN = (obj: Unknown | Snapshot): DXN => {
|
|
476
|
+
const type = internal.getTypeDXN(obj);
|
|
477
|
+
invariant(type != null, 'Corrupted object: missing type.');
|
|
478
|
+
return type;
|
|
479
|
+
};
|
|
471
480
|
|
|
472
481
|
/**
|
|
473
482
|
* Get the schema of the object.
|
|
474
483
|
* Returns the branded ECHO schema used to create the object.
|
|
475
484
|
*/
|
|
476
|
-
|
|
477
|
-
export const getSchema: (obj: unknown | undefined) => Type.Entity.Any | undefined = getSchema$ as any;
|
|
485
|
+
export const getSchema: (obj: Unknown | Snapshot) => Type.AnyEntity | undefined = internal.getSchema as any;
|
|
478
486
|
|
|
479
487
|
/**
|
|
480
488
|
* @returns The typename of the object's type.
|
|
481
489
|
* Accepts both reactive objects and snapshots.
|
|
482
|
-
* @example `example.
|
|
490
|
+
* @example `com.example.type.person`
|
|
483
491
|
*/
|
|
484
|
-
export const getTypename = (entity: Unknown | Snapshot): string | undefined => getTypename
|
|
492
|
+
export const getTypename = (entity: Unknown | Snapshot): string | undefined => internal.getTypename(entity);
|
|
485
493
|
|
|
486
494
|
//
|
|
487
495
|
// Database
|
|
@@ -492,30 +500,35 @@ export const getTypename = (entity: Unknown | Snapshot): string | undefined => g
|
|
|
492
500
|
* Accepts both reactive objects and snapshots.
|
|
493
501
|
*/
|
|
494
502
|
export const getDatabase = (entity: Entity.Unknown | Entity.Snapshot): Database.Database | undefined =>
|
|
495
|
-
getDatabase
|
|
503
|
+
internal.getDatabase(entity);
|
|
496
504
|
|
|
497
505
|
//
|
|
498
506
|
// Meta
|
|
499
507
|
//
|
|
500
508
|
|
|
501
|
-
|
|
509
|
+
/**
|
|
510
|
+
* Property that accesses metadata for an entity.
|
|
511
|
+
*
|
|
512
|
+
* Alias for `Entity.Meta`.
|
|
513
|
+
*/
|
|
514
|
+
export const Meta = internal.MetaId;
|
|
502
515
|
|
|
503
516
|
/**
|
|
504
517
|
* Deeply read-only version of ObjectMeta.
|
|
505
518
|
* Prevents mutation at all nesting levels (e.g., `meta.keys.push()` is a TypeScript error).
|
|
506
519
|
*/
|
|
507
|
-
export type ReadonlyMeta =
|
|
520
|
+
export type ReadonlyMeta = internal.ReadonlyMeta;
|
|
508
521
|
|
|
509
522
|
/**
|
|
510
|
-
* Mutable meta type returned by `Obj.getMeta` inside an `Obj.
|
|
523
|
+
* Mutable meta type returned by `Obj.getMeta` inside an `Obj.update` callback.
|
|
511
524
|
*/
|
|
512
|
-
export type Meta =
|
|
525
|
+
export type Meta = internal.Meta;
|
|
513
526
|
|
|
514
527
|
// TODO(burdon): Narrow type.
|
|
515
528
|
// TODO(dmaretskyi): Allow returning undefined.
|
|
516
529
|
/**
|
|
517
530
|
* Get the metadata for an object.
|
|
518
|
-
* Returns mutable meta when passed a mutable object (inside `Obj.
|
|
531
|
+
* Returns mutable meta when passed a mutable object (inside `Obj.update` callback).
|
|
519
532
|
* Returns read-only meta when passed a regular object or snapshot.
|
|
520
533
|
*
|
|
521
534
|
* @example
|
|
@@ -524,8 +537,8 @@ export type Meta = ApiMeta;
|
|
|
524
537
|
* const meta = Obj.getMeta(person); // ReadonlyMeta
|
|
525
538
|
*
|
|
526
539
|
* // Mutable access inside change callback
|
|
527
|
-
* Obj.
|
|
528
|
-
* const meta = Obj.getMeta(
|
|
540
|
+
* Obj.update(person, (obj) => {
|
|
541
|
+
* const meta = Obj.getMeta(obj); // ObjectMeta (mutable)
|
|
529
542
|
* meta.tags ??= [];
|
|
530
543
|
* meta.tags.push('important');
|
|
531
544
|
* });
|
|
@@ -535,7 +548,7 @@ export type Meta = ApiMeta;
|
|
|
535
548
|
export function getMeta(entity: Mutable<Unknown>): Meta;
|
|
536
549
|
export function getMeta(entity: Unknown | Snapshot): ReadonlyMeta;
|
|
537
550
|
export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): Meta | ReadonlyMeta {
|
|
538
|
-
return
|
|
551
|
+
return internal.getMetaChecked(entity);
|
|
539
552
|
}
|
|
540
553
|
|
|
541
554
|
/**
|
|
@@ -545,41 +558,41 @@ export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): Meta | R
|
|
|
545
558
|
export const getKeys: {
|
|
546
559
|
(entity: Unknown | Snapshot, source: string): ForeignKey[];
|
|
547
560
|
(source: string): (entity: Unknown | Snapshot) => ForeignKey[];
|
|
548
|
-
} = Function.dual(2, (entity: Unknown | Snapshot, source?: string): ForeignKey[] => getKeys
|
|
561
|
+
} = Function.dual(2, (entity: Unknown | Snapshot, source?: string): ForeignKey[] => internal.getKeys(entity, source!));
|
|
549
562
|
|
|
550
563
|
/**
|
|
551
564
|
* Delete all keys from the object for the specified source.
|
|
552
|
-
* Must be called within an `Obj.
|
|
565
|
+
* Must be called within an `Obj.update` callback.
|
|
553
566
|
*
|
|
554
567
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
555
568
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
556
569
|
*/
|
|
557
|
-
export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => deleteKeys
|
|
570
|
+
export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => internal.deleteKeys(entity, source);
|
|
558
571
|
|
|
559
572
|
/**
|
|
560
573
|
* Add a tag to the object.
|
|
561
|
-
* Must be called within an `Obj.
|
|
574
|
+
* Must be called within an `Obj.update` callback.
|
|
562
575
|
*
|
|
563
576
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
564
577
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
565
578
|
*/
|
|
566
|
-
export const addTag = (entity: Mutable<Unknown>, tag: string): void => addTag
|
|
579
|
+
export const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.addTag(entity, tag);
|
|
567
580
|
|
|
568
581
|
/**
|
|
569
582
|
* Remove a tag from the object.
|
|
570
|
-
* Must be called within an `Obj.
|
|
583
|
+
* Must be called within an `Obj.update` callback.
|
|
571
584
|
*
|
|
572
585
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
573
586
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
574
587
|
*/
|
|
575
|
-
export const removeTag = (entity: Mutable<Unknown>, tag: string): void => removeTag
|
|
588
|
+
export const removeTag = (entity: Mutable<Unknown>, tag: string): void => internal.removeTag(entity, tag);
|
|
576
589
|
|
|
577
590
|
/**
|
|
578
591
|
* Check if the object is deleted.
|
|
579
592
|
* Accepts both reactive objects and snapshots.
|
|
580
593
|
*/
|
|
581
594
|
// TODO(dmaretskyi): Default to `false`.
|
|
582
|
-
export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted
|
|
595
|
+
export const isDeleted = (entity: Unknown | Snapshot): boolean => objInternal.isDeleted(entity);
|
|
583
596
|
|
|
584
597
|
//
|
|
585
598
|
// Annotations
|
|
@@ -589,32 +602,32 @@ export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted$(ent
|
|
|
589
602
|
* Get the label of the object.
|
|
590
603
|
* Accepts both reactive objects and snapshots.
|
|
591
604
|
*/
|
|
592
|
-
export const getLabel = (entity: Unknown | Snapshot): string | undefined => getLabel
|
|
605
|
+
export const getLabel = (entity: Unknown | Snapshot): string | undefined => internal.getLabel(entity);
|
|
593
606
|
|
|
594
607
|
/**
|
|
595
608
|
* Set the label of the object.
|
|
596
|
-
* Must be called within an `Obj.
|
|
609
|
+
* Must be called within an `Obj.update` callback.
|
|
597
610
|
*
|
|
598
611
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
599
612
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
600
613
|
*/
|
|
601
|
-
export const setLabel = (entity: Mutable<Unknown>, label: string): void => setLabel
|
|
614
|
+
export const setLabel = (entity: Mutable<Unknown>, label: string): void => internal.setLabel(entity, label);
|
|
602
615
|
|
|
603
616
|
/**
|
|
604
617
|
* Get the description of the object.
|
|
605
618
|
* Accepts both reactive objects and snapshots.
|
|
606
619
|
*/
|
|
607
|
-
export const getDescription = (entity: Unknown | Snapshot): string | undefined => getDescription
|
|
620
|
+
export const getDescription = (entity: Unknown | Snapshot): string | undefined => internal.getDescription(entity);
|
|
608
621
|
|
|
609
622
|
/**
|
|
610
623
|
* Set the description of the object.
|
|
611
|
-
* Must be called within an `Obj.
|
|
624
|
+
* Must be called within an `Obj.update` callback.
|
|
612
625
|
*
|
|
613
626
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
614
627
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
615
628
|
*/
|
|
616
629
|
export const setDescription = (entity: Mutable<Unknown>, description: string): void =>
|
|
617
|
-
setDescription
|
|
630
|
+
internal.setDescription(entity, description);
|
|
618
631
|
|
|
619
632
|
/**
|
|
620
633
|
* Symbol to set parent when creating objects with `Obj.make`.
|
|
@@ -626,7 +639,7 @@ export const setDescription = (entity: Mutable<Unknown>, description: string): v
|
|
|
626
639
|
* })
|
|
627
640
|
* ```
|
|
628
641
|
*/
|
|
629
|
-
export const Parent: unique symbol = ParentId as any;
|
|
642
|
+
export const Parent: unique symbol = internal.ParentId as any;
|
|
630
643
|
|
|
631
644
|
/**
|
|
632
645
|
* Get the parent of an object.
|
|
@@ -636,8 +649,8 @@ export const Parent: unique symbol = ParentId as any;
|
|
|
636
649
|
*/
|
|
637
650
|
export const getParent = (entity: Unknown | Snapshot): Unknown | undefined => {
|
|
638
651
|
assertArgument(isObject(entity), 'Expected an object');
|
|
639
|
-
assumeType<InternalObjectProps>(entity);
|
|
640
|
-
return entity[ParentId] as Unknown | undefined;
|
|
652
|
+
assumeType<internal.InternalObjectProps>(entity);
|
|
653
|
+
return entity[internal.ParentId] as Unknown | undefined;
|
|
641
654
|
};
|
|
642
655
|
|
|
643
656
|
/**
|
|
@@ -648,9 +661,125 @@ export const getParent = (entity: Unknown | Snapshot): Unknown | undefined => {
|
|
|
648
661
|
export const setParent = (entity: Unknown, parent: Any | undefined) => {
|
|
649
662
|
assertArgument(isObject(entity), 'Expected an object');
|
|
650
663
|
assertArgument(parent === undefined || isObject(parent), 'Expected an object');
|
|
651
|
-
assumeType<InternalObjectProps>(entity);
|
|
652
|
-
assumeType<InternalObjectProps | undefined>(parent);
|
|
653
|
-
entity[ParentId] = parent;
|
|
664
|
+
assumeType<internal.InternalObjectProps>(entity);
|
|
665
|
+
assumeType<internal.InternalObjectProps | undefined>(parent);
|
|
666
|
+
entity[internal.ParentId] = parent;
|
|
667
|
+
};
|
|
668
|
+
|
|
669
|
+
interface UpdateFromOptions<T> {
|
|
670
|
+
exclude?: (keyof T)[];
|
|
671
|
+
include?: (keyof T)[];
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
const valuesEqual = (left: unknown, right: unknown): boolean => {
|
|
675
|
+
if (left === right) {
|
|
676
|
+
return true;
|
|
677
|
+
}
|
|
678
|
+
if (left === null || right === null) {
|
|
679
|
+
return left === right;
|
|
680
|
+
}
|
|
681
|
+
if (typeof left !== 'object' || typeof right !== 'object') {
|
|
682
|
+
return Utils.structuralRegion(() => Equal.equals(left, right));
|
|
683
|
+
}
|
|
684
|
+
if (Ref.isRef(left) && Ref.isRef(right)) {
|
|
685
|
+
return left.dxn.toString() === right.dxn.toString();
|
|
686
|
+
}
|
|
687
|
+
if (Ref.isRef(left) || Ref.isRef(right)) {
|
|
688
|
+
return false;
|
|
689
|
+
}
|
|
690
|
+
if (Array.isArray(left) && Array.isArray(right)) {
|
|
691
|
+
if (left.length !== right.length) {
|
|
692
|
+
return false;
|
|
693
|
+
}
|
|
694
|
+
for (let index = 0; index < left.length; index++) {
|
|
695
|
+
if (!valuesEqual(left[index], right[index])) {
|
|
696
|
+
return false;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
return true;
|
|
700
|
+
}
|
|
701
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
702
|
+
return false;
|
|
703
|
+
}
|
|
704
|
+
const leftRecord = left as Record<string, unknown>;
|
|
705
|
+
const rightRecord = right as Record<string, unknown>;
|
|
706
|
+
const keys = new Set([
|
|
707
|
+
...Object.keys(leftRecord).filter((key) => key !== 'id'),
|
|
708
|
+
...Object.keys(rightRecord).filter((key) => key !== 'id'),
|
|
709
|
+
]);
|
|
710
|
+
for (const key of keys) {
|
|
711
|
+
const leftHas = Object.hasOwn(leftRecord, key);
|
|
712
|
+
const rightHas = Object.hasOwn(rightRecord, key);
|
|
713
|
+
const leftValue = leftHas ? leftRecord[key] : undefined;
|
|
714
|
+
const rightValue = rightHas ? rightRecord[key] : undefined;
|
|
715
|
+
if (!valuesEqual(leftValue, rightValue)) {
|
|
716
|
+
return false;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
return true;
|
|
720
|
+
};
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* Breaks reactive proxies on assigned values so echo-db assignment accepts nested structs (same idea as link assignment).
|
|
724
|
+
*/
|
|
725
|
+
const prepareAssignValue = (value: unknown): unknown =>
|
|
726
|
+
deepMapValues(value, (nested, recurse) => {
|
|
727
|
+
if (nested === null || typeof nested !== 'object') {
|
|
728
|
+
return nested;
|
|
729
|
+
}
|
|
730
|
+
if (Ref.isRef(nested)) {
|
|
731
|
+
return nested;
|
|
732
|
+
}
|
|
733
|
+
if (Array.isArray(nested)) {
|
|
734
|
+
return recurse(nested);
|
|
735
|
+
}
|
|
736
|
+
if (isProxy(nested)) {
|
|
737
|
+
return recurse({ ...getProxyTarget(nested) });
|
|
738
|
+
}
|
|
739
|
+
return recurse(nested);
|
|
740
|
+
});
|
|
741
|
+
|
|
742
|
+
/**
|
|
743
|
+
* For each key present on `source` (except `id`), assigns `target[key]` when the current value differs.
|
|
744
|
+
* References are compared by target DXN; other values use Effect `Equal.equals` inside a structural region,
|
|
745
|
+
* with recursive comparison for arrays and plain object-shaped property bags (excluding `id`).
|
|
746
|
+
*
|
|
747
|
+
* Must be called within an `Obj.update` callback.
|
|
748
|
+
*
|
|
749
|
+
* @returns Whether any property was updated.
|
|
750
|
+
*/
|
|
751
|
+
export const updateFrom = <T extends Unknown>(
|
|
752
|
+
target: Mutable<T>,
|
|
753
|
+
source: T,
|
|
754
|
+
options?: UpdateFromOptions<T>,
|
|
755
|
+
): boolean => {
|
|
756
|
+
assertArgument(isObject(target), 'Expected an echo object target.');
|
|
757
|
+
assertArgument(isObject(source), 'Expected an echo object source.');
|
|
758
|
+
let keys = Object.keys(source as Record<string, unknown>).filter((key) => key !== 'id');
|
|
759
|
+
if (options?.include !== undefined) {
|
|
760
|
+
const include = new Set(options.include.map((key) => String(key)));
|
|
761
|
+
keys = keys.filter((key) => include.has(key));
|
|
762
|
+
}
|
|
763
|
+
if (options?.exclude !== undefined) {
|
|
764
|
+
const exclude = new Set(options.exclude.map((key) => String(key)));
|
|
765
|
+
keys = keys.filter((key) => !exclude.has(key));
|
|
766
|
+
}
|
|
767
|
+
let updated = false;
|
|
768
|
+
const sourceRecord = source as Record<string, unknown>;
|
|
769
|
+
const targetRecord = target as Record<string, unknown>;
|
|
770
|
+
for (const key of keys) {
|
|
771
|
+
if (!Object.hasOwn(sourceRecord, key)) {
|
|
772
|
+
continue;
|
|
773
|
+
}
|
|
774
|
+
const nextValue = sourceRecord[key];
|
|
775
|
+
const prevValue = Object.hasOwn(targetRecord, key) ? targetRecord[key] : undefined;
|
|
776
|
+
if (valuesEqual(prevValue, nextValue)) {
|
|
777
|
+
continue;
|
|
778
|
+
}
|
|
779
|
+
targetRecord[key] = prepareAssignValue(nextValue) as never;
|
|
780
|
+
updated = true;
|
|
781
|
+
}
|
|
782
|
+
return updated;
|
|
654
783
|
};
|
|
655
784
|
|
|
656
785
|
//
|
|
@@ -660,7 +789,7 @@ export const setParent = (entity: Unknown, parent: Any | undefined) => {
|
|
|
660
789
|
/**
|
|
661
790
|
* JSON representation of an object.
|
|
662
791
|
*/
|
|
663
|
-
export type JSON =
|
|
792
|
+
export type JSON = internal.ObjectJSON;
|
|
664
793
|
|
|
665
794
|
/**
|
|
666
795
|
* Converts object to its JSON representation.
|
|
@@ -668,7 +797,7 @@ export type JSON = APIJSON;
|
|
|
668
797
|
*
|
|
669
798
|
* The same algorithm is used when calling the standard `JSON.stringify(obj)` function.
|
|
670
799
|
*/
|
|
671
|
-
export const toJSON = (entity: Unknown | Snapshot): JSON =>
|
|
800
|
+
export const toJSON = (entity: Unknown | Snapshot): JSON => objInternal.objectToJSON(entity);
|
|
672
801
|
|
|
673
802
|
/**
|
|
674
803
|
* Creates an object from its json representation, performing schema validation.
|
|
@@ -678,38 +807,45 @@ export const toJSON = (entity: Unknown | Snapshot): JSON => toJSON$(entity);
|
|
|
678
807
|
*
|
|
679
808
|
* @param options.refResolver - Resolver for references. Produces hydrated references that can be resolved.
|
|
680
809
|
* @param options.dxn - Override object DXN. Changes the result of `Obj.getDXN`.
|
|
810
|
+
* @param options.database - Database to associate with the object.
|
|
681
811
|
*/
|
|
682
|
-
export const fromJSON: (
|
|
683
|
-
|
|
812
|
+
export const fromJSON: (
|
|
813
|
+
json: unknown,
|
|
814
|
+
options?: { refResolver?: Ref.Resolver; dxn?: DXN; database?: Database.Database; parent?: Unknown },
|
|
815
|
+
) => Promise<Unknown> = objInternal.objectFromJSON as any;
|
|
684
816
|
|
|
685
817
|
/**
|
|
686
818
|
* Comparator function type for sorting objects.
|
|
687
819
|
* Accepts both reactive objects and snapshots.
|
|
688
820
|
*/
|
|
689
|
-
export type Comparator =
|
|
821
|
+
export type Comparator = internal.Comparator<Unknown | Snapshot>;
|
|
690
822
|
|
|
691
|
-
export const sortByLabel: Comparator = sortByLabel
|
|
692
|
-
export const sortByTypename: Comparator = sortByTypename
|
|
693
|
-
export const sort = (...comparators: Comparator[]): Comparator => sort
|
|
823
|
+
export const sortByLabel: Comparator = internal.sortByLabel as Comparator;
|
|
824
|
+
export const sortByTypename: Comparator = internal.sortByTypename as Comparator;
|
|
825
|
+
export const sort = (...comparators: Comparator[]): Comparator => internal.sort(...comparators) as Comparator;
|
|
694
826
|
|
|
695
827
|
//
|
|
696
828
|
// Version
|
|
697
829
|
//
|
|
698
830
|
|
|
699
|
-
export
|
|
700
|
-
export type
|
|
831
|
+
export const VersionTypeId = internal.VersionTypeId;
|
|
832
|
+
export type VersionCompareResult = internal.VersionCompareResult;
|
|
701
833
|
|
|
702
834
|
/**
|
|
703
835
|
* Represent object version.
|
|
704
836
|
* May be backed by Automerge.
|
|
705
837
|
* Objects with no history are not versioned.
|
|
706
838
|
*/
|
|
707
|
-
export type Version =
|
|
839
|
+
export type Version = internal.EntityVersion;
|
|
708
840
|
|
|
709
|
-
export
|
|
841
|
+
export const isVersion = internal.isVersion;
|
|
842
|
+
export const versionValid = internal.versionValid;
|
|
843
|
+
export const compareVersions = internal.compareVersions;
|
|
844
|
+
export const encodeVersion = internal.encodeVersion;
|
|
845
|
+
export const decodeVersion = internal.decodeVersion;
|
|
710
846
|
|
|
711
847
|
/**
|
|
712
848
|
* Returns the version of the object.
|
|
713
849
|
* Accepts both reactive objects and snapshots.
|
|
714
850
|
*/
|
|
715
|
-
export const version = (entity: Unknown | Snapshot): Version => version
|
|
851
|
+
export const version = (entity: Unknown | Snapshot): Version => internal.version(entity);
|