@dxos/echo 0.8.4-main.937b3ca → 0.8.4-main.9be5663bfe
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 +2 -2
- package/dist/lib/{browser → neutral}/Annotation.mjs +9 -5
- package/dist/lib/neutral/Database.mjs +47 -0
- package/dist/lib/{browser → neutral}/Entity.mjs +19 -12
- package/dist/lib/{browser → neutral}/Err.mjs +4 -3
- package/dist/lib/neutral/Extension.mjs +18 -0
- package/dist/lib/neutral/Feed.mjs +48 -0
- package/dist/lib/neutral/Filter.mjs +72 -0
- package/dist/lib/{browser → neutral}/Format.mjs +4 -5
- package/dist/lib/neutral/JsonSchema.mjs +19 -0
- package/dist/lib/{browser → neutral}/Key.mjs +2 -3
- package/dist/lib/{node-esm → neutral}/Obj.mjs +39 -17
- package/dist/lib/{browser → neutral}/Order.mjs +2 -3
- package/dist/lib/neutral/Query.mjs +38 -0
- package/dist/lib/neutral/QueryResult.mjs +2 -0
- package/dist/lib/neutral/Ref.mjs +24 -0
- package/dist/lib/{browser → neutral}/Relation.mjs +22 -13
- package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
- package/dist/lib/neutral/Tag.mjs +29 -0
- package/dist/lib/neutral/Type.mjs +37 -0
- package/dist/lib/{browser/chunk-XDIUHAAX.mjs → neutral/chunk-46QNGNTY.mjs} +9 -5
- package/dist/lib/neutral/chunk-46QNGNTY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-5VKHCUDA.mjs +299 -0
- package/dist/lib/neutral/chunk-5VKHCUDA.mjs.map +7 -0
- package/dist/lib/{node-esm/chunk-YOLH5KS4.mjs → neutral/chunk-6URFBQJH.mjs} +104 -26
- package/dist/lib/neutral/chunk-6URFBQJH.mjs.map +7 -0
- package/dist/lib/neutral/chunk-7SQD3FRZ.mjs +159 -0
- package/dist/lib/neutral/chunk-7SQD3FRZ.mjs.map +7 -0
- package/dist/lib/{browser/chunk-INHXFXY5.mjs → neutral/chunk-ANHVGJI4.mjs} +2 -3
- package/dist/lib/{node-esm/chunk-AJEMYSIR.mjs.map → neutral/chunk-ANHVGJI4.mjs.map} +1 -1
- package/dist/lib/{browser/chunk-ZHXZGIXD.mjs → neutral/chunk-BNCCGLJN.mjs} +1 -3
- package/dist/lib/{node-esm/chunk-MOLNWFNL.mjs.map → neutral/chunk-BNCCGLJN.mjs.map} +2 -2
- package/dist/lib/{browser/chunk-FRDT7RA4.mjs → neutral/chunk-DQYLD2RB.mjs} +15 -16
- package/dist/lib/neutral/chunk-DQYLD2RB.mjs.map +7 -0
- package/dist/lib/{node-esm/chunk-ZBB67AKD.mjs → neutral/chunk-E5PBQJWV.mjs} +9 -6
- package/dist/lib/neutral/chunk-E5PBQJWV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-EBVB5NOH.mjs +133 -0
- package/dist/lib/neutral/chunk-EBVB5NOH.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FNEFSO2C.mjs +787 -0
- package/dist/lib/neutral/chunk-FNEFSO2C.mjs.map +7 -0
- package/dist/lib/{browser/chunk-BJPE6CIC.mjs → neutral/chunk-FW7UJX25.mjs} +1708 -2721
- package/dist/lib/neutral/chunk-FW7UJX25.mjs.map +7 -0
- package/dist/lib/{browser/chunk-PQZW3S6L.mjs → neutral/chunk-GZQTCRJB.mjs} +3 -4
- package/dist/lib/neutral/chunk-GZQTCRJB.mjs.map +7 -0
- package/dist/lib/neutral/chunk-HBJ7JT5A.mjs +120 -0
- package/dist/lib/neutral/chunk-HBJ7JT5A.mjs.map +7 -0
- package/dist/lib/{browser/chunk-CGS2ULMK.mjs → neutral/chunk-J5LGTIGS.mjs} +1 -2
- package/dist/lib/{browser/chunk-U2J7TA7K.mjs → neutral/chunk-OLFCVPOO.mjs} +6 -7
- package/dist/lib/neutral/chunk-OLFCVPOO.mjs.map +7 -0
- package/dist/lib/{browser/chunk-IXVWLTG7.mjs → neutral/chunk-OMUPQMLR.mjs} +1 -3
- package/dist/lib/{browser/chunk-IXVWLTG7.mjs.map → neutral/chunk-OMUPQMLR.mjs.map} +1 -1
- package/dist/lib/neutral/chunk-QWAOTFCY.mjs +396 -0
- package/dist/lib/neutral/chunk-QWAOTFCY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-R72KFH2X.mjs +34 -0
- package/dist/lib/neutral/chunk-R72KFH2X.mjs.map +7 -0
- package/dist/lib/{browser/chunk-ZAGAOZVY.mjs → neutral/chunk-T2JOLN37.mjs} +73 -7
- package/dist/lib/neutral/chunk-T2JOLN37.mjs.map +7 -0
- package/dist/lib/{browser/chunk-YKTSSMDS.mjs → neutral/chunk-TBKX6JQO.mjs} +4 -6
- package/dist/lib/neutral/chunk-TBKX6JQO.mjs.map +7 -0
- package/dist/lib/{browser/chunk-CJ5YELTO.mjs → neutral/chunk-UBEZSGXY.mjs} +15 -3
- package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +7 -0
- package/dist/lib/{browser/chunk-JMKVF2YQ.mjs → neutral/chunk-UI6MWK5W.mjs} +3 -4
- package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +7 -0
- package/dist/lib/{browser/chunk-KQQGVHFN.mjs → neutral/chunk-UPWIIW2V.mjs} +12 -58
- package/dist/lib/neutral/chunk-UPWIIW2V.mjs.map +7 -0
- package/dist/lib/{node-esm/chunk-ANLVLWME.mjs → neutral/chunk-WVLOCXB5.mjs} +33 -10
- package/dist/lib/neutral/chunk-WVLOCXB5.mjs.map +7 -0
- package/dist/lib/neutral/chunk-YS6Q3XAD.mjs +50 -0
- package/dist/lib/neutral/chunk-YS6Q3XAD.mjs.map +7 -0
- package/dist/lib/{browser/chunk-2SBB7OWV.mjs → neutral/chunk-YSLSJ7QS.mjs} +73 -25
- package/dist/lib/neutral/chunk-YSLSJ7QS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ZGVZNBBJ.mjs +415 -0
- package/dist/lib/neutral/chunk-ZGVZNBBJ.mjs.map +7 -0
- package/dist/lib/{node-esm/chunk-NBWL7UCZ.mjs → neutral/chunk-ZIXGDU6F.mjs} +9 -4
- package/dist/lib/neutral/chunk-ZIXGDU6F.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +101 -0
- package/dist/lib/{browser → neutral}/internal/index.mjs +57 -40
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/{node-esm → neutral}/testing/index.mjs +44 -37
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/Annotation.d.ts +23 -1
- 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 +86 -84
- 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 +41 -15
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +43 -0
- 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 +171 -0
- package/dist/types/src/Feed.d.ts.map +1 -0
- package/dist/types/src/Filter.d.ts +32 -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/JsonSchema.d.ts +11 -4
- package/dist/types/src/JsonSchema.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +174 -46
- 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 +109 -15
- 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 +75 -29
- 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 +4 -3
- 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/hierarchy.test.d.ts +2 -0
- package/dist/types/src/hierarchy.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +5 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +69 -8
- 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 +13 -1
- 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 +4 -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/{formats → Format}/select.d.ts +2 -2
- 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 +131 -30
- 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 +2 -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 +1 -1
- 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 +18 -4
- 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/Type/compose.d.ts +7 -0
- 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 +8 -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 +2 -2
- 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/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/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/common/proxy/reactive-array.d.ts.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive.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/{proxy → common/proxy}/typed-handler.d.ts +2 -1
- 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 +2 -2
- 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 +7 -6
- 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/{types → common/types}/typename.d.ts +8 -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.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +19 -18
- package/dist/types/src/testing/test-schema.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +44 -113
- package/src/Annotation.ts +31 -1
- package/src/Collection.ts +37 -0
- package/src/Database.ts +167 -173
- package/src/Dataset.ts +26 -0
- package/src/Entity.ts +73 -54
- package/src/Err.ts +22 -0
- package/src/Extension.test.ts +235 -0
- package/src/Extension.ts +122 -0
- package/src/Feed.ts +283 -0
- package/src/Filter.test.ts +90 -0
- package/src/Filter.ts +81 -7
- package/src/Format.ts +3 -3
- package/src/Hypergraph.ts +9 -4
- package/src/JsonSchema.ts +14 -4
- package/src/Obj.test.ts +166 -13
- package/src/Obj.ts +407 -145
- package/src/Order.ts +3 -1
- package/src/Query.test.ts +339 -15
- package/src/Query.ts +275 -24
- package/src/Ref.ts +64 -11
- package/src/Relation.test.ts +8 -2
- package/src/Relation.ts +167 -133
- 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/hierarchy.test.ts +33 -0
- package/src/index.ts +5 -0
- package/src/internal/{annotations → Annotation}/annotations.test.ts +56 -7
- package/src/internal/{annotations → Annotation}/annotations.ts +134 -16
- 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 +14 -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 +17 -42
- package/src/internal/{entities → Entity}/object.ts +3 -6
- package/src/internal/{entities → Entity}/relation.ts +20 -39
- 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 +2 -3
- package/src/internal/{formats → Format}/select.ts +1 -1
- package/src/internal/{formats → Format}/types.ts +3 -3
- package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
- package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +4 -2
- package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +33 -34
- package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +48 -49
- package/src/internal/{json-schema → JsonSchema}/json-schema.ts +16 -11
- 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 -8
- package/src/internal/{object → Obj}/json-serializer.ts +58 -24
- package/src/internal/{object → Obj}/schema-validator.test.ts +3 -7
- package/src/internal/{object → Obj}/schema-validator.ts +1 -1
- package/src/internal/{object → Obj}/set-value.test.ts +33 -33
- package/src/internal/{object → Obj}/set-value.ts +2 -2
- package/src/internal/Obj/snapshot.ts +105 -0
- 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 +134 -0
- package/src/internal/{ref → Ref}/ref-array.ts +1 -2
- package/src/internal/{ref → Ref}/ref.test.ts +5 -6
- package/src/internal/{ref → Ref}/ref.ts +29 -5
- package/src/internal/{schema → Type}/compose.test.ts +5 -6
- package/src/internal/{schema → Type}/compose.ts +14 -9
- package/src/internal/{schema → Type}/echo-schema.ts +11 -11
- package/src/internal/{schema → Type}/manipulation.ts +1 -1
- package/src/internal/{schema → Type}/persistent-schema.ts +10 -4
- package/src/internal/{README.md → common/README.md} +1 -1
- 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.test.ts +65 -65
- 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 +13 -4
- package/src/internal/{proxy → common/proxy}/ownership.ts +0 -1
- package/src/internal/{proxy → common/proxy}/reactive.ts +1 -2
- package/src/internal/{proxy → common/proxy}/schema.test.ts +10 -10
- package/src/internal/{proxy → common/proxy}/typed-handler.test.ts +14 -19
- package/src/internal/{proxy → common/proxy}/typed-handler.ts +11 -6
- package/src/internal/{proxy → common/proxy}/typed-object.test.ts +15 -16
- 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 +15 -14
- package/src/internal/common/types/model-symbols.ts +69 -0
- package/src/internal/{types → common/types}/typename.ts +10 -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 +0 -1
- package/src/testing/test-schema.ts +20 -18
- package/dist/lib/browser/Database.mjs +0 -18
- package/dist/lib/browser/Filter.mjs +0 -62
- package/dist/lib/browser/JsonSchema.mjs +0 -20
- package/dist/lib/browser/Obj.mjs +0 -91
- package/dist/lib/browser/Query.mjs +0 -27
- package/dist/lib/browser/QueryResult.mjs +0 -3
- package/dist/lib/browser/Ref.mjs +0 -23
- package/dist/lib/browser/SchemaRegistry.mjs +0 -3
- package/dist/lib/browser/Tag.mjs +0 -26
- package/dist/lib/browser/Type.mjs +0 -48
- package/dist/lib/browser/chunk-22JMFST2.mjs +0 -24
- package/dist/lib/browser/chunk-22JMFST2.mjs.map +0 -7
- package/dist/lib/browser/chunk-2SBB7OWV.mjs.map +0 -7
- package/dist/lib/browser/chunk-6L5HHUVU.mjs +0 -158
- package/dist/lib/browser/chunk-6L5HHUVU.mjs.map +0 -7
- package/dist/lib/browser/chunk-7STIBCP7.mjs +0 -133
- package/dist/lib/browser/chunk-7STIBCP7.mjs.map +0 -7
- package/dist/lib/browser/chunk-BJPE6CIC.mjs.map +0 -7
- package/dist/lib/browser/chunk-CJ5YELTO.mjs.map +0 -7
- package/dist/lib/browser/chunk-FPOISFQK.mjs +0 -40
- package/dist/lib/browser/chunk-FPOISFQK.mjs.map +0 -7
- package/dist/lib/browser/chunk-FRDT7RA4.mjs.map +0 -7
- package/dist/lib/browser/chunk-INHXFXY5.mjs.map +0 -7
- package/dist/lib/browser/chunk-JMKVF2YQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-KQQGVHFN.mjs.map +0 -7
- package/dist/lib/browser/chunk-MYCCGG2T.mjs +0 -15
- package/dist/lib/browser/chunk-MYCCGG2T.mjs.map +0 -7
- package/dist/lib/browser/chunk-NOPVNWPT.mjs +0 -204
- package/dist/lib/browser/chunk-NOPVNWPT.mjs.map +0 -7
- package/dist/lib/browser/chunk-PQZW3S6L.mjs.map +0 -7
- package/dist/lib/browser/chunk-RK4Z4JUZ.mjs +0 -283
- package/dist/lib/browser/chunk-RK4Z4JUZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-U2J7TA7K.mjs.map +0 -7
- package/dist/lib/browser/chunk-W5D2GWAW.mjs +0 -98
- package/dist/lib/browser/chunk-W5D2GWAW.mjs.map +0 -7
- package/dist/lib/browser/chunk-XDIUHAAX.mjs.map +0 -7
- package/dist/lib/browser/chunk-YKTSSMDS.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZAGAOZVY.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZHXZGIXD.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -85
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs +0 -367
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/Annotation.mjs +0 -33
- package/dist/lib/node-esm/Annotation.mjs.map +0 -7
- package/dist/lib/node-esm/Database.mjs +0 -18
- package/dist/lib/node-esm/Database.mjs.map +0 -7
- package/dist/lib/node-esm/Entity.mjs +0 -52
- package/dist/lib/node-esm/Entity.mjs.map +0 -7
- package/dist/lib/node-esm/Err.mjs +0 -11
- package/dist/lib/node-esm/Err.mjs.map +0 -7
- package/dist/lib/node-esm/Filter.mjs +0 -62
- package/dist/lib/node-esm/Format.mjs +0 -67
- package/dist/lib/node-esm/JsonSchema.mjs +0 -20
- package/dist/lib/node-esm/JsonSchema.mjs.map +0 -7
- package/dist/lib/node-esm/Key.mjs +0 -13
- package/dist/lib/node-esm/Key.mjs.map +0 -7
- package/dist/lib/node-esm/Obj.mjs.map +0 -7
- package/dist/lib/node-esm/Order.mjs +0 -13
- package/dist/lib/node-esm/Order.mjs.map +0 -7
- package/dist/lib/node-esm/Query.mjs +0 -27
- package/dist/lib/node-esm/Query.mjs.map +0 -7
- package/dist/lib/node-esm/QueryResult.mjs +0 -3
- package/dist/lib/node-esm/QueryResult.mjs.map +0 -7
- package/dist/lib/node-esm/Ref.mjs +0 -23
- package/dist/lib/node-esm/Ref.mjs.map +0 -7
- package/dist/lib/node-esm/Relation.mjs +0 -85
- package/dist/lib/node-esm/Relation.mjs.map +0 -7
- package/dist/lib/node-esm/SchemaRegistry.mjs +0 -3
- package/dist/lib/node-esm/SchemaRegistry.mjs.map +0 -7
- package/dist/lib/node-esm/Tag.mjs +0 -26
- package/dist/lib/node-esm/Tag.mjs.map +0 -7
- package/dist/lib/node-esm/Type.mjs +0 -48
- package/dist/lib/node-esm/Type.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4PNXQA64.mjs +0 -250
- package/dist/lib/node-esm/chunk-4PNXQA64.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5OBN7GZW.mjs +0 -158
- package/dist/lib/node-esm/chunk-5OBN7GZW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AJEMYSIR.mjs +0 -22
- package/dist/lib/node-esm/chunk-ANLVLWME.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-DMR7OAFK.mjs +0 -57
- package/dist/lib/node-esm/chunk-DMR7OAFK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FWTSPIFF.mjs +0 -133
- package/dist/lib/node-esm/chunk-FWTSPIFF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ILMLLM4R.mjs +0 -204
- package/dist/lib/node-esm/chunk-ILMLLM4R.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-K37NA7PO.mjs +0 -43
- package/dist/lib/node-esm/chunk-K37NA7PO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LT3H4JOX.mjs +0 -3847
- package/dist/lib/node-esm/chunk-LT3H4JOX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MOLNWFNL.mjs +0 -9
- package/dist/lib/node-esm/chunk-MOWUEW5P.mjs +0 -15
- package/dist/lib/node-esm/chunk-MOWUEW5P.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NBWL7UCZ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NRN3ZW2T.mjs +0 -143
- package/dist/lib/node-esm/chunk-NRN3ZW2T.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QLI2EIJ2.mjs +0 -41
- package/dist/lib/node-esm/chunk-QLI2EIJ2.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QYR67VBV.mjs +0 -288
- package/dist/lib/node-esm/chunk-QYR67VBV.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UKGVOINP.mjs +0 -9
- package/dist/lib/node-esm/chunk-UKGVOINP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-W6QIEBTQ.mjs +0 -403
- package/dist/lib/node-esm/chunk-W6QIEBTQ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XHJRMQZD.mjs +0 -69
- package/dist/lib/node-esm/chunk-XHJRMQZD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-Y75VU7LB.mjs +0 -74
- package/dist/lib/node-esm/chunk-Y75VU7LB.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YOLH5KS4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs +0 -39
- package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ZBB67AKD.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -85
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/internal/index.mjs +0 -457
- package/dist/lib/node-esm/internal/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.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/reactive.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 +0 -6
- 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/src/internal/object/snapshot.ts +0 -70
- /package/dist/lib/{browser → neutral}/Annotation.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Database.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Entity.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Err.mjs.map +0 -0
- /package/dist/lib/{browser/Filter.mjs.map → neutral/Extension.mjs.map} +0 -0
- /package/dist/lib/{browser/Format.mjs.map → neutral/Feed.mjs.map} +0 -0
- /package/dist/lib/{node-esm → neutral}/Filter.mjs.map +0 -0
- /package/dist/lib/{node-esm → neutral}/Format.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/JsonSchema.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Key.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Obj.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Order.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Query.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/QueryResult.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Ref.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Relation.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/SchemaRegistry.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Tag.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/Type.mjs.map +0 -0
- /package/dist/lib/{browser/chunk-CGS2ULMK.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{browser → neutral}/index.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/internal/index.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}/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-context.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}/errors.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}/reactive-array.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.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.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}/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/{object → Obj}/ids.ts +0 -0
- /package/src/internal/{object → Obj}/index.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}/change-context.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/define-hidden-property.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/errors.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}/reactive-array.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/Obj.ts
CHANGED
|
@@ -2,81 +2,39 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
// @import-as-namespace
|
|
6
|
+
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as Equal from 'effect/Equal';
|
|
5
9
|
import * as Function from 'effect/Function';
|
|
10
|
+
import * as Option from 'effect/Option';
|
|
6
11
|
import * as Schema from 'effect/Schema';
|
|
12
|
+
import * as Utils from 'effect/Utils';
|
|
7
13
|
|
|
8
14
|
import type { ForeignKey } from '@dxos/echo-protocol';
|
|
9
|
-
import { createJsonPath
|
|
15
|
+
import { createJsonPath } from '@dxos/effect';
|
|
10
16
|
import { assertArgument } from '@dxos/invariant';
|
|
11
17
|
import { type DXN, ObjectId } from '@dxos/keys';
|
|
12
|
-
import { assumeType } from '@dxos/util';
|
|
18
|
+
import { assumeType, deepMapValues } from '@dxos/util';
|
|
13
19
|
|
|
14
20
|
import type * as Database from './Database';
|
|
15
21
|
import * as Entity from './Entity';
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
type Meta as ApiMeta,
|
|
22
|
-
type ReadonlyMeta as ApiReadonlyMeta,
|
|
23
|
-
type EntityVersion as ApiVersion,
|
|
24
|
-
type ChangeCallback,
|
|
25
|
-
type InternalObjectProps,
|
|
26
|
-
type KindId,
|
|
27
|
-
MetaId,
|
|
28
|
-
type Mutable,
|
|
29
|
-
type ObjectMeta,
|
|
30
|
-
type SnapshotKindId,
|
|
31
|
-
type VersionCompareResult,
|
|
32
|
-
VersionTypeId,
|
|
33
|
-
addTag as addTag$,
|
|
34
|
-
change as change$,
|
|
35
|
-
clone as clone$,
|
|
36
|
-
compareVersions,
|
|
37
|
-
decodeVersion,
|
|
38
|
-
deleteKeys as deleteKeys$,
|
|
39
|
-
encodeVersion,
|
|
40
|
-
getDXN as getDXN$,
|
|
41
|
-
getDatabase as getDatabase$,
|
|
42
|
-
getDescription as getDescription$,
|
|
43
|
-
getKeys as getKeys$,
|
|
44
|
-
getLabel as getLabel$,
|
|
45
|
-
getMetaChecked as getMeta$,
|
|
46
|
-
getSchema as getSchema$,
|
|
47
|
-
getSnapshot as getSnapshot$,
|
|
48
|
-
getTypeAnnotation,
|
|
49
|
-
getTypeDXN as getTypeDXN$,
|
|
50
|
-
getTypename as getTypename$,
|
|
51
|
-
isDeleted as isDeleted$,
|
|
52
|
-
isInstanceOf,
|
|
53
|
-
isVersion,
|
|
54
|
-
makeObject,
|
|
55
|
-
objectFromJSON,
|
|
56
|
-
removeTag as removeTag$,
|
|
57
|
-
setDescription as setDescription$,
|
|
58
|
-
setLabel as setLabel$,
|
|
59
|
-
setValue as setValue$,
|
|
60
|
-
sort as sort$,
|
|
61
|
-
sortByLabel as sortByLabel$,
|
|
62
|
-
sortByTypename as sortByTypename$,
|
|
63
|
-
subscribe as subscribe$,
|
|
64
|
-
objectToJSON as toJSON$,
|
|
65
|
-
version as version$,
|
|
66
|
-
versionValid,
|
|
67
|
-
} from './internal';
|
|
68
|
-
import type * as Ref from './Ref';
|
|
22
|
+
import * as Err from './Err';
|
|
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';
|
|
69
27
|
import type * as Type from './Type';
|
|
70
28
|
|
|
71
29
|
/**
|
|
72
30
|
* Base type for all ECHO objects.
|
|
73
31
|
*/
|
|
74
|
-
interface BaseObj extends AnyEntity, Entity.OfKind<typeof Entity.Kind.Object> {}
|
|
32
|
+
interface BaseObj extends internal.AnyEntity, Entity.OfKind<typeof Entity.Kind.Object> {}
|
|
75
33
|
|
|
76
34
|
/**
|
|
77
35
|
* Object type with specific properties.
|
|
78
36
|
*/
|
|
79
|
-
export type
|
|
37
|
+
export type OfShape<Props> = BaseObj & Props;
|
|
80
38
|
|
|
81
39
|
/**
|
|
82
40
|
* Object with no known properties beyond id and kind.
|
|
@@ -88,6 +46,44 @@ export type Obj<Props> = BaseObj & Props;
|
|
|
88
46
|
*/
|
|
89
47
|
export interface Unknown extends BaseObj {}
|
|
90
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
|
+
|
|
91
87
|
/**
|
|
92
88
|
* Object with arbitrary properties.
|
|
93
89
|
*
|
|
@@ -96,13 +92,13 @@ export interface Unknown extends BaseObj {}
|
|
|
96
92
|
*
|
|
97
93
|
* Prefer using `Obj.Unknown` when you don't need to access arbitrary properties.
|
|
98
94
|
*/
|
|
99
|
-
export interface Any extends BaseObj, AnyProperties {}
|
|
95
|
+
export interface Any extends BaseObj, internal.AnyProperties {}
|
|
100
96
|
|
|
101
97
|
/**
|
|
102
98
|
* Base type for snapshot objects (has SnapshotKindId instead of KindId).
|
|
103
99
|
*/
|
|
104
|
-
interface BaseSnapshot extends AnyEntity {
|
|
105
|
-
readonly [SnapshotKindId]: typeof Entity.Kind.Object;
|
|
100
|
+
interface BaseSnapshot extends internal.AnyEntity {
|
|
101
|
+
readonly [Entity.SnapshotKindId]: typeof Entity.Kind.Object;
|
|
106
102
|
readonly id: ObjectId;
|
|
107
103
|
}
|
|
108
104
|
|
|
@@ -115,16 +111,23 @@ interface BaseSnapshot extends AnyEntity {
|
|
|
115
111
|
* Snapshots are structurally identical to reactive objects but have a different brand,
|
|
116
112
|
* making them distinguishable at the TypeScript level. Neither is assignable to the other.
|
|
117
113
|
*/
|
|
118
|
-
export type Snapshot<T extends Unknown = Unknown> = Omit<T, KindId> & BaseSnapshot;
|
|
114
|
+
export type Snapshot<T extends Unknown = Unknown> = Omit<T, Entity.KindId> & BaseSnapshot;
|
|
119
115
|
|
|
120
|
-
|
|
116
|
+
/**
|
|
117
|
+
* JSON-encoded properties for objects.
|
|
118
|
+
*/
|
|
119
|
+
export interface BaseObjJson {
|
|
120
|
+
id: string;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const defaultMeta: internal.ObjectMeta = {
|
|
121
124
|
keys: [],
|
|
122
125
|
};
|
|
123
126
|
|
|
124
|
-
type
|
|
127
|
+
type MakePropsInternal<T extends Unknown> = {
|
|
125
128
|
id?: ObjectId;
|
|
126
|
-
[Meta]?: Partial<ObjectMeta>;
|
|
127
|
-
} &
|
|
129
|
+
[Meta]?: Partial<internal.ObjectMeta>;
|
|
130
|
+
} & Entity.Properties<T>;
|
|
128
131
|
|
|
129
132
|
// TODO(burdon): Should we allow the caller to set the id?
|
|
130
133
|
/**
|
|
@@ -132,8 +135,9 @@ type Props<T = any> = {
|
|
|
132
135
|
*/
|
|
133
136
|
export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
|
|
134
137
|
id?: ObjectId;
|
|
135
|
-
[Meta]?: Partial<ObjectMeta>;
|
|
136
|
-
|
|
138
|
+
[Meta]?: Partial<internal.ObjectMeta>;
|
|
139
|
+
[Parent]?: Unknown;
|
|
140
|
+
} & MakePropsInternal<Schema.Schema.Type<S>>;
|
|
137
141
|
|
|
138
142
|
/**
|
|
139
143
|
* Creates a new echo object of the given schema.
|
|
@@ -150,29 +154,36 @@ export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
|
|
|
150
154
|
*
|
|
151
155
|
* Note: Only accepts object schemas, not relation schemas. Use `Relation.make` for relations.
|
|
152
156
|
*/
|
|
153
|
-
export const make
|
|
154
|
-
<S extends Type.Obj.Any>(schema: S, props: MakeProps<S>): Obj<Schema.Schema.Type<S>>;
|
|
155
|
-
/**
|
|
156
|
-
* @deprecated Pass meta as in the example: `Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' })`.
|
|
157
|
-
*/
|
|
158
|
-
<S extends Type.Obj.Any>(schema: S, props: MakeProps<S>, meta: Partial<ObjectMeta>): Obj<Schema.Schema.Type<S>>;
|
|
159
|
-
} = <S extends Type.Obj.Any>(
|
|
157
|
+
export const make = <S extends Type.AnyObj>(
|
|
160
158
|
schema: S,
|
|
161
|
-
props: MakeProps<S
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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;
|
|
165
168
|
|
|
166
169
|
// Set default fields on meta on creation.
|
|
167
|
-
if (props[MetaId] != null) {
|
|
168
|
-
meta = { ...structuredClone(defaultMeta), ...props[MetaId] };
|
|
169
|
-
delete props[MetaId];
|
|
170
|
+
if (props[internal.MetaId] != null) {
|
|
171
|
+
meta = { ...structuredClone(defaultMeta), ...props[internal.MetaId] };
|
|
172
|
+
delete props[internal.MetaId];
|
|
170
173
|
}
|
|
171
174
|
|
|
172
|
-
// Filter undefined values.
|
|
173
|
-
const filterUndefined = Object.fromEntries(Object.entries(props).filter(([_, v]) => v !== undefined));
|
|
175
|
+
// Filter undefined values (Object.entries only returns string-keyed properties).
|
|
176
|
+
const filterUndefined: any = Object.fromEntries(Object.entries(props).filter(([_, v]) => v !== undefined));
|
|
177
|
+
|
|
178
|
+
// Copy symbol properties (like ParentId) that Object.entries doesn't include.
|
|
179
|
+
for (const sym of Object.getOwnPropertySymbols(props)) {
|
|
180
|
+
const value = (props as any)[sym];
|
|
181
|
+
if (value !== undefined) {
|
|
182
|
+
filterUndefined[sym] = value;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
174
185
|
|
|
175
|
-
return makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
|
|
186
|
+
return internal.makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
|
|
176
187
|
...defaultMeta,
|
|
177
188
|
...meta,
|
|
178
189
|
});
|
|
@@ -182,10 +193,15 @@ export const make: {
|
|
|
182
193
|
* Determine if object is an ECHO object.
|
|
183
194
|
*/
|
|
184
195
|
export const isObject = (obj: unknown): obj is Unknown => {
|
|
185
|
-
assumeType<InternalObjectProps>(obj);
|
|
196
|
+
assumeType<internal.InternalObjectProps>(obj);
|
|
186
197
|
return typeof obj === 'object' && obj !== null && obj[Entity.KindId] === Entity.Kind.Object;
|
|
187
198
|
};
|
|
188
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
|
+
|
|
189
205
|
/**
|
|
190
206
|
* Subscribe to object updates.
|
|
191
207
|
* The callback is called synchronously when the object is modified.
|
|
@@ -193,7 +209,7 @@ export const isObject = (obj: unknown): obj is Unknown => {
|
|
|
193
209
|
* @returns Unsubscribe function.
|
|
194
210
|
*/
|
|
195
211
|
export const subscribe = (obj: Unknown, callback: () => void): (() => void) => {
|
|
196
|
-
return subscribe
|
|
212
|
+
return internal.subscribe(obj, callback);
|
|
197
213
|
};
|
|
198
214
|
|
|
199
215
|
//
|
|
@@ -205,7 +221,61 @@ export const subscribe = (obj: Unknown, callback: () => void): (() => void) => {
|
|
|
205
221
|
* The snapshot is branded with SnapshotKindId instead of KindId,
|
|
206
222
|
* making it distinguishable from the reactive object at the type level.
|
|
207
223
|
*/
|
|
208
|
-
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;
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Returns the reactive version of an object from the database, given its snapshot.
|
|
228
|
+
* Inverse of `Obj.getSnapshot`.
|
|
229
|
+
*
|
|
230
|
+
* Uses `Obj.getDatabase` internally to get the database from the snapshot,
|
|
231
|
+
* then resolves the reactive object by ID.
|
|
232
|
+
*
|
|
233
|
+
* @param snapshot - A snapshot of the object (from `Obj.getSnapshot`).
|
|
234
|
+
* @returns Effect that succeeds with the reactive object, or fails with `GetReactiveError`.
|
|
235
|
+
* @example
|
|
236
|
+
* ```ts
|
|
237
|
+
* const snapshot = Obj.getSnapshot(obj);
|
|
238
|
+
* const reactive = Obj.getReactive(snapshot).pipe(
|
|
239
|
+
* Effect.runSync
|
|
240
|
+
* );
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
export const getReactive = <T extends Unknown>(snapshot: Snapshot<T>): Effect.Effect<T, Err.GetReactiveError> =>
|
|
244
|
+
Effect.gen(function* () {
|
|
245
|
+
const db = internal.getDatabase(snapshot);
|
|
246
|
+
if (!db) {
|
|
247
|
+
return yield* Effect.fail(new Err.GetReactiveError({ reason: 'no-database', snapshotId: snapshot.id }));
|
|
248
|
+
}
|
|
249
|
+
const obj = db.getObjectById(snapshot.id);
|
|
250
|
+
if (!obj) {
|
|
251
|
+
return yield* Effect.fail(new Err.GetReactiveError({ reason: 'object-not-found', snapshotId: snapshot.id }));
|
|
252
|
+
}
|
|
253
|
+
return obj as T;
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Like `Obj.getReactive` but returns `Option.none()` instead of failing when the object
|
|
258
|
+
* cannot be resolved (no database, object not found).
|
|
259
|
+
*
|
|
260
|
+
* @param snapshot - A snapshot of the object (from `Obj.getSnapshot`).
|
|
261
|
+
* @returns Effect that succeeds with `Option.some(reactive)` or `Option.none()`.
|
|
262
|
+
*/
|
|
263
|
+
export const getReactiveOption = <T extends Unknown>(snapshot: Snapshot<T>): Effect.Effect<Option.Option<T>, never> =>
|
|
264
|
+
getReactive(snapshot).pipe(
|
|
265
|
+
Effect.map(Option.some),
|
|
266
|
+
Effect.catchAll(() => Effect.succeed(Option.none())),
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Synchronous version of `Obj.getReactive`. Returns the reactive object or throws
|
|
271
|
+
* `GetReactiveError` when the object cannot be resolved (no database, object not found).
|
|
272
|
+
*
|
|
273
|
+
* @param snapshot - A snapshot of the object (from `Obj.getSnapshot`).
|
|
274
|
+
* @returns The reactive object.
|
|
275
|
+
* @throws {Err.GetReactiveError} When the object cannot be resolved.
|
|
276
|
+
*/
|
|
277
|
+
export const getReactiveOrThrow = <T extends Unknown>(snapshot: Snapshot<T>): T =>
|
|
278
|
+
Effect.runSync(getReactive(snapshot));
|
|
209
279
|
|
|
210
280
|
export type CloneOptions = {
|
|
211
281
|
/**
|
|
@@ -226,7 +296,7 @@ export type CloneOptions = {
|
|
|
226
296
|
* This does not clone referenced objects, only the properties in the object.
|
|
227
297
|
* @returns A new object with the same schema and properties.
|
|
228
298
|
*/
|
|
229
|
-
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;
|
|
230
300
|
|
|
231
301
|
//
|
|
232
302
|
// Change
|
|
@@ -236,7 +306,7 @@ export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = clon
|
|
|
236
306
|
* Makes all properties mutable recursively.
|
|
237
307
|
* Used to provide a mutable view of an object within `Obj.change`.
|
|
238
308
|
*/
|
|
239
|
-
export type
|
|
309
|
+
export type Mutable<T> = internal.Mutable<T>;
|
|
240
310
|
|
|
241
311
|
/**
|
|
242
312
|
* Perform mutations on an echo object within a controlled context.
|
|
@@ -256,9 +326,9 @@ export type { Mutable };
|
|
|
256
326
|
* const person = Obj.make(Person, { name: 'John', age: 25 });
|
|
257
327
|
*
|
|
258
328
|
* // Mutate within Obj.change
|
|
259
|
-
* Obj.change(person, (
|
|
260
|
-
*
|
|
261
|
-
*
|
|
329
|
+
* Obj.change(person, (obj) => {
|
|
330
|
+
* obj.name = 'Jane';
|
|
331
|
+
* obj.age = 30;
|
|
262
332
|
* });
|
|
263
333
|
* // ONE notification fires here
|
|
264
334
|
*
|
|
@@ -268,8 +338,8 @@ export type { Mutable };
|
|
|
268
338
|
*
|
|
269
339
|
* Note: Only accepts objects. Use `Relation.change` for relations.
|
|
270
340
|
*/
|
|
271
|
-
export const change = <T extends Unknown>(obj: T, callback: ChangeCallback<T>): void => {
|
|
272
|
-
change
|
|
341
|
+
export const change = <T extends Unknown>(obj: T, callback: internal.ChangeCallback<T>): void => {
|
|
342
|
+
internal.change(obj, callback);
|
|
273
343
|
};
|
|
274
344
|
|
|
275
345
|
/**
|
|
@@ -295,7 +365,7 @@ export const change = <T extends Unknown>(obj: T, callback: ChangeCallback<T>):
|
|
|
295
365
|
* ```
|
|
296
366
|
*/
|
|
297
367
|
export const getValue = (obj: Unknown | Snapshot, path: readonly (string | number)[]): any => {
|
|
298
|
-
return getValue
|
|
368
|
+
return internal.getValue(obj, createJsonPath(path));
|
|
299
369
|
};
|
|
300
370
|
|
|
301
371
|
/**
|
|
@@ -316,16 +386,16 @@ export const getValue = (obj: Unknown | Snapshot, path: readonly (string | numbe
|
|
|
316
386
|
* @example
|
|
317
387
|
* ```ts
|
|
318
388
|
* const person = Obj.make(Person, { name: 'John' });
|
|
319
|
-
* // Person schema has: addresses: Schema.
|
|
320
|
-
* Obj.change(person, (
|
|
321
|
-
* Obj.setValue(
|
|
389
|
+
* // Person schema has: addresses: Schema.Array(Address)
|
|
390
|
+
* Obj.change(person, (obj) => {
|
|
391
|
+
* Obj.setValue(obj, ['addresses', 0, 'street'], '123 Main St');
|
|
322
392
|
* });
|
|
323
393
|
* // Creates: person.addresses = [{ street: '123 Main St' }]
|
|
324
394
|
* ```
|
|
325
395
|
*/
|
|
326
396
|
// TODO(wittjosiah): Compute possible path values + type value based on generic object type.
|
|
327
397
|
export const setValue: (obj: Mutable<Unknown>, path: readonly (string | number)[], value: any) => void =
|
|
328
|
-
setValue
|
|
398
|
+
objInternal.setValue as any;
|
|
329
399
|
|
|
330
400
|
//
|
|
331
401
|
// Type
|
|
@@ -347,14 +417,44 @@ export type ID = ObjectId;
|
|
|
347
417
|
* ```
|
|
348
418
|
*/
|
|
349
419
|
export const instanceOf: {
|
|
350
|
-
<S extends Type.
|
|
351
|
-
<S extends Type.
|
|
352
|
-
} = ((...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]) => {
|
|
353
423
|
if (args.length === 1) {
|
|
354
|
-
return (entity: unknown) => isInstanceOf(args[0], entity);
|
|
424
|
+
return (entity: unknown) => internal.isInstanceOf(args[0], entity);
|
|
355
425
|
}
|
|
356
426
|
|
|
357
|
-
return isInstanceOf(args[0], args[1]);
|
|
427
|
+
return internal.isInstanceOf(args[0], args[1]);
|
|
428
|
+
}) as any;
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Test if a snapshot is an instance of a schema.
|
|
432
|
+
* Mirrors `instanceOf` but only accepts values branded with SnapshotKindId.
|
|
433
|
+
* Use when the value is known to be a snapshot (e.g. from `getSnapshot` or `useObject`).
|
|
434
|
+
*
|
|
435
|
+
* @example
|
|
436
|
+
* ```ts
|
|
437
|
+
* const snapshot = Obj.getSnapshot(person);
|
|
438
|
+
* if (Obj.snapshotOf(Person, snapshot)) {
|
|
439
|
+
* // snapshot is Obj.Snapshot<Person>
|
|
440
|
+
* }
|
|
441
|
+
* ```
|
|
442
|
+
*/
|
|
443
|
+
export const snapshotOf: {
|
|
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]) => {
|
|
447
|
+
const check = (entity: unknown) =>
|
|
448
|
+
entity != null &&
|
|
449
|
+
typeof entity === 'object' &&
|
|
450
|
+
Entity.SnapshotKindId in entity &&
|
|
451
|
+
internal.isInstanceOf(args[0], entity);
|
|
452
|
+
|
|
453
|
+
if (args.length === 1) {
|
|
454
|
+
return (entity: unknown) => check(entity);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
return check(args[1]);
|
|
358
458
|
}) as any;
|
|
359
459
|
|
|
360
460
|
// TODO(dmaretskyi): Allow returning undefined.
|
|
@@ -364,29 +464,29 @@ export const instanceOf: {
|
|
|
364
464
|
*/
|
|
365
465
|
export const getDXN = (entity: Unknown | Snapshot): DXN => {
|
|
366
466
|
assertArgument(!Schema.isSchema(entity), 'obj', 'Object should not be a schema.');
|
|
367
|
-
return getDXN
|
|
467
|
+
return internal.getDXN(entity);
|
|
368
468
|
};
|
|
369
469
|
|
|
370
470
|
/**
|
|
371
471
|
* @returns The DXN of the object's type.
|
|
372
|
-
* @example dxn:example.
|
|
472
|
+
* @example dxn:com.example.type.person:1.0.0
|
|
373
473
|
*/
|
|
374
474
|
// TODO(wittjosiah): Narrow types.
|
|
375
|
-
export const getTypeDXN: (obj: unknown | undefined) => DXN | undefined = getTypeDXN
|
|
475
|
+
export const getTypeDXN: (obj: unknown | undefined) => DXN | undefined = internal.getTypeDXN as any;
|
|
376
476
|
|
|
377
477
|
/**
|
|
378
478
|
* Get the schema of the object.
|
|
379
479
|
* Returns the branded ECHO schema used to create the object.
|
|
380
480
|
*/
|
|
381
481
|
// TODO(wittjosiah): Narrow types.
|
|
382
|
-
export const getSchema: (obj: unknown | undefined) => Type.
|
|
482
|
+
export const getSchema: (obj: unknown | undefined) => Type.AnyEntity | undefined = internal.getSchema as any;
|
|
383
483
|
|
|
384
484
|
/**
|
|
385
485
|
* @returns The typename of the object's type.
|
|
386
486
|
* Accepts both reactive objects and snapshots.
|
|
387
|
-
* @example `example.
|
|
487
|
+
* @example `com.example.type.person`
|
|
388
488
|
*/
|
|
389
|
-
export const getTypename = (entity: Unknown | Snapshot): string | undefined => getTypename
|
|
489
|
+
export const getTypename = (entity: Unknown | Snapshot): string | undefined => internal.getTypename(entity);
|
|
390
490
|
|
|
391
491
|
//
|
|
392
492
|
// Database
|
|
@@ -396,24 +496,30 @@ export const getTypename = (entity: Unknown | Snapshot): string | undefined => g
|
|
|
396
496
|
* Get the database the object belongs to.
|
|
397
497
|
* Accepts both reactive objects and snapshots.
|
|
398
498
|
*/
|
|
399
|
-
export const getDatabase = (entity: Unknown | Snapshot): Database.Database | undefined =>
|
|
499
|
+
export const getDatabase = (entity: Entity.Unknown | Entity.Snapshot): Database.Database | undefined =>
|
|
500
|
+
internal.getDatabase(entity);
|
|
400
501
|
|
|
401
502
|
//
|
|
402
503
|
// Meta
|
|
403
504
|
//
|
|
404
505
|
|
|
405
|
-
|
|
506
|
+
/**
|
|
507
|
+
* Property that accesses metadata for an entity.
|
|
508
|
+
*
|
|
509
|
+
* Alias for `Entity.Meta`.
|
|
510
|
+
*/
|
|
511
|
+
export const Meta = internal.MetaId;
|
|
406
512
|
|
|
407
513
|
/**
|
|
408
514
|
* Deeply read-only version of ObjectMeta.
|
|
409
515
|
* Prevents mutation at all nesting levels (e.g., `meta.keys.push()` is a TypeScript error).
|
|
410
516
|
*/
|
|
411
|
-
export type ReadonlyMeta =
|
|
517
|
+
export type ReadonlyMeta = internal.ReadonlyMeta;
|
|
412
518
|
|
|
413
519
|
/**
|
|
414
520
|
* Mutable meta type returned by `Obj.getMeta` inside an `Obj.change` callback.
|
|
415
521
|
*/
|
|
416
|
-
export type Meta =
|
|
522
|
+
export type Meta = internal.Meta;
|
|
417
523
|
|
|
418
524
|
// TODO(burdon): Narrow type.
|
|
419
525
|
// TODO(dmaretskyi): Allow returning undefined.
|
|
@@ -428,18 +534,18 @@ export type Meta = ApiMeta;
|
|
|
428
534
|
* const meta = Obj.getMeta(person); // ReadonlyMeta
|
|
429
535
|
*
|
|
430
536
|
* // Mutable access inside change callback
|
|
431
|
-
* Obj.change(person, (
|
|
432
|
-
* const meta = Obj.getMeta(
|
|
537
|
+
* Obj.change(person, (obj) => {
|
|
538
|
+
* const meta = Obj.getMeta(obj); // ObjectMeta (mutable)
|
|
433
539
|
* meta.tags ??= [];
|
|
434
540
|
* meta.tags.push('important');
|
|
435
541
|
* });
|
|
436
542
|
* ```
|
|
437
543
|
*/
|
|
438
544
|
// TODO(wittjosiah): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
|
|
439
|
-
export function getMeta(entity: Mutable<Unknown>):
|
|
545
|
+
export function getMeta(entity: Mutable<Unknown>): Meta;
|
|
440
546
|
export function getMeta(entity: Unknown | Snapshot): ReadonlyMeta;
|
|
441
|
-
export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>):
|
|
442
|
-
return
|
|
547
|
+
export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): Meta | ReadonlyMeta {
|
|
548
|
+
return internal.getMetaChecked(entity);
|
|
443
549
|
}
|
|
444
550
|
|
|
445
551
|
/**
|
|
@@ -449,7 +555,7 @@ export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): ObjectMe
|
|
|
449
555
|
export const getKeys: {
|
|
450
556
|
(entity: Unknown | Snapshot, source: string): ForeignKey[];
|
|
451
557
|
(source: string): (entity: Unknown | Snapshot) => ForeignKey[];
|
|
452
|
-
} = Function.dual(2, (entity: Unknown | Snapshot, source?: string): ForeignKey[] => getKeys
|
|
558
|
+
} = Function.dual(2, (entity: Unknown | Snapshot, source?: string): ForeignKey[] => internal.getKeys(entity, source!));
|
|
453
559
|
|
|
454
560
|
/**
|
|
455
561
|
* Delete all keys from the object for the specified source.
|
|
@@ -458,7 +564,7 @@ export const getKeys: {
|
|
|
458
564
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
459
565
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
460
566
|
*/
|
|
461
|
-
export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => deleteKeys
|
|
567
|
+
export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => internal.deleteKeys(entity, source);
|
|
462
568
|
|
|
463
569
|
/**
|
|
464
570
|
* Add a tag to the object.
|
|
@@ -467,7 +573,7 @@ export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => de
|
|
|
467
573
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
468
574
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
469
575
|
*/
|
|
470
|
-
export const addTag = (entity: Mutable<Unknown>, tag: string): void => addTag
|
|
576
|
+
export const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.addTag(entity, tag);
|
|
471
577
|
|
|
472
578
|
/**
|
|
473
579
|
* Remove a tag from the object.
|
|
@@ -476,14 +582,14 @@ export const addTag = (entity: Mutable<Unknown>, tag: string): void => addTag$(e
|
|
|
476
582
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
477
583
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
478
584
|
*/
|
|
479
|
-
export const removeTag = (entity: Mutable<Unknown>, tag: string): void => removeTag
|
|
585
|
+
export const removeTag = (entity: Mutable<Unknown>, tag: string): void => internal.removeTag(entity, tag);
|
|
480
586
|
|
|
481
587
|
/**
|
|
482
588
|
* Check if the object is deleted.
|
|
483
589
|
* Accepts both reactive objects and snapshots.
|
|
484
590
|
*/
|
|
485
591
|
// TODO(dmaretskyi): Default to `false`.
|
|
486
|
-
export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted
|
|
592
|
+
export const isDeleted = (entity: Unknown | Snapshot): boolean => objInternal.isDeleted(entity);
|
|
487
593
|
|
|
488
594
|
//
|
|
489
595
|
// Annotations
|
|
@@ -493,7 +599,7 @@ export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted$(ent
|
|
|
493
599
|
* Get the label of the object.
|
|
494
600
|
* Accepts both reactive objects and snapshots.
|
|
495
601
|
*/
|
|
496
|
-
export const getLabel = (entity: Unknown | Snapshot): string | undefined => getLabel
|
|
602
|
+
export const getLabel = (entity: Unknown | Snapshot): string | undefined => internal.getLabel(entity);
|
|
497
603
|
|
|
498
604
|
/**
|
|
499
605
|
* Set the label of the object.
|
|
@@ -502,13 +608,13 @@ export const getLabel = (entity: Unknown | Snapshot): string | undefined => getL
|
|
|
502
608
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
503
609
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
504
610
|
*/
|
|
505
|
-
export const setLabel = (entity: Mutable<Unknown>, label: string): void => setLabel
|
|
611
|
+
export const setLabel = (entity: Mutable<Unknown>, label: string): void => internal.setLabel(entity, label);
|
|
506
612
|
|
|
507
613
|
/**
|
|
508
614
|
* Get the description of the object.
|
|
509
615
|
* Accepts both reactive objects and snapshots.
|
|
510
616
|
*/
|
|
511
|
-
export const getDescription = (entity: Unknown | Snapshot): string | undefined => getDescription
|
|
617
|
+
export const getDescription = (entity: Unknown | Snapshot): string | undefined => internal.getDescription(entity);
|
|
512
618
|
|
|
513
619
|
/**
|
|
514
620
|
* Set the description of the object.
|
|
@@ -518,7 +624,160 @@ export const getDescription = (entity: Unknown | Snapshot): string | undefined =
|
|
|
518
624
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
519
625
|
*/
|
|
520
626
|
export const setDescription = (entity: Mutable<Unknown>, description: string): void =>
|
|
521
|
-
setDescription
|
|
627
|
+
internal.setDescription(entity, description);
|
|
628
|
+
|
|
629
|
+
/**
|
|
630
|
+
* Symbol to set parent when creating objects with `Obj.make`.
|
|
631
|
+
* @example
|
|
632
|
+
* ```ts
|
|
633
|
+
* Obj.make(TestSchema.Person, {
|
|
634
|
+
* [Obj.Parent]: parentObject,
|
|
635
|
+
* name: 'John',
|
|
636
|
+
* })
|
|
637
|
+
* ```
|
|
638
|
+
*/
|
|
639
|
+
export const Parent: unique symbol = internal.ParentId as any;
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* Get the parent of an object.
|
|
643
|
+
* The parent is always loaded together with the object.
|
|
644
|
+
* Only objects are allowed to have a parent
|
|
645
|
+
* @returns The parent object, or undefined if the object has no parent.
|
|
646
|
+
*/
|
|
647
|
+
export const getParent = (entity: Unknown | Snapshot): Unknown | undefined => {
|
|
648
|
+
assertArgument(isObject(entity), 'Expected an object');
|
|
649
|
+
assumeType<internal.InternalObjectProps>(entity);
|
|
650
|
+
return entity[internal.ParentId] as Unknown | undefined;
|
|
651
|
+
};
|
|
652
|
+
|
|
653
|
+
/**
|
|
654
|
+
* Sets the parent of an object.
|
|
655
|
+
* If a parent (or any transitive parent) is deleted, the object will be deleted.
|
|
656
|
+
* Only objects are allowed to have a parent.
|
|
657
|
+
*/
|
|
658
|
+
export const setParent = (entity: Unknown, parent: Any | undefined) => {
|
|
659
|
+
assertArgument(isObject(entity), 'Expected an object');
|
|
660
|
+
assertArgument(parent === undefined || isObject(parent), 'Expected an object');
|
|
661
|
+
assumeType<internal.InternalObjectProps>(entity);
|
|
662
|
+
assumeType<internal.InternalObjectProps | undefined>(parent);
|
|
663
|
+
entity[internal.ParentId] = parent;
|
|
664
|
+
};
|
|
665
|
+
|
|
666
|
+
interface UpdateFromOptions<T> {
|
|
667
|
+
exclude?: (keyof T)[];
|
|
668
|
+
include?: (keyof T)[];
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
const valuesEqual = (left: unknown, right: unknown): boolean => {
|
|
672
|
+
if (left === right) {
|
|
673
|
+
return true;
|
|
674
|
+
}
|
|
675
|
+
if (left === null || right === null) {
|
|
676
|
+
return left === right;
|
|
677
|
+
}
|
|
678
|
+
if (typeof left !== 'object' || typeof right !== 'object') {
|
|
679
|
+
return Utils.structuralRegion(() => Equal.equals(left, right));
|
|
680
|
+
}
|
|
681
|
+
if (Ref.isRef(left) && Ref.isRef(right)) {
|
|
682
|
+
return left.dxn.toString() === right.dxn.toString();
|
|
683
|
+
}
|
|
684
|
+
if (Ref.isRef(left) || Ref.isRef(right)) {
|
|
685
|
+
return false;
|
|
686
|
+
}
|
|
687
|
+
if (Array.isArray(left) && Array.isArray(right)) {
|
|
688
|
+
if (left.length !== right.length) {
|
|
689
|
+
return false;
|
|
690
|
+
}
|
|
691
|
+
for (let index = 0; index < left.length; index++) {
|
|
692
|
+
if (!valuesEqual(left[index], right[index])) {
|
|
693
|
+
return false;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
return true;
|
|
697
|
+
}
|
|
698
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
699
|
+
return false;
|
|
700
|
+
}
|
|
701
|
+
const leftRecord = left as Record<string, unknown>;
|
|
702
|
+
const rightRecord = right as Record<string, unknown>;
|
|
703
|
+
const keys = new Set([
|
|
704
|
+
...Object.keys(leftRecord).filter((key) => key !== 'id'),
|
|
705
|
+
...Object.keys(rightRecord).filter((key) => key !== 'id'),
|
|
706
|
+
]);
|
|
707
|
+
for (const key of keys) {
|
|
708
|
+
const leftHas = Object.hasOwn(leftRecord, key);
|
|
709
|
+
const rightHas = Object.hasOwn(rightRecord, key);
|
|
710
|
+
const leftValue = leftHas ? leftRecord[key] : undefined;
|
|
711
|
+
const rightValue = rightHas ? rightRecord[key] : undefined;
|
|
712
|
+
if (!valuesEqual(leftValue, rightValue)) {
|
|
713
|
+
return false;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
return true;
|
|
717
|
+
};
|
|
718
|
+
|
|
719
|
+
/**
|
|
720
|
+
* Breaks reactive proxies on assigned values so echo-db assignment accepts nested structs (same idea as link assignment).
|
|
721
|
+
*/
|
|
722
|
+
const prepareAssignValue = (value: unknown): unknown =>
|
|
723
|
+
deepMapValues(value, (nested, recurse) => {
|
|
724
|
+
if (nested === null || typeof nested !== 'object') {
|
|
725
|
+
return nested;
|
|
726
|
+
}
|
|
727
|
+
if (Ref.isRef(nested)) {
|
|
728
|
+
return nested;
|
|
729
|
+
}
|
|
730
|
+
if (Array.isArray(nested)) {
|
|
731
|
+
return recurse(nested);
|
|
732
|
+
}
|
|
733
|
+
if (isProxy(nested)) {
|
|
734
|
+
return recurse({ ...getProxyTarget(nested) });
|
|
735
|
+
}
|
|
736
|
+
return recurse(nested);
|
|
737
|
+
});
|
|
738
|
+
|
|
739
|
+
/**
|
|
740
|
+
* For each key present on `source` (except `id`), assigns `target[key]` when the current value differs.
|
|
741
|
+
* References are compared by target DXN; other values use Effect `Equal.equals` inside a structural region,
|
|
742
|
+
* with recursive comparison for arrays and plain object-shaped property bags (excluding `id`).
|
|
743
|
+
*
|
|
744
|
+
* Must be called within an `Obj.change` callback.
|
|
745
|
+
*
|
|
746
|
+
* @returns Whether any property was updated.
|
|
747
|
+
*/
|
|
748
|
+
export const updateFrom = <T extends Unknown>(
|
|
749
|
+
target: Mutable<T>,
|
|
750
|
+
source: T,
|
|
751
|
+
options?: UpdateFromOptions<T>,
|
|
752
|
+
): boolean => {
|
|
753
|
+
assertArgument(isObject(target), 'Expected an echo object target.');
|
|
754
|
+
assertArgument(isObject(source), 'Expected an echo object source.');
|
|
755
|
+
let keys = Object.keys(source as Record<string, unknown>).filter((key) => key !== 'id');
|
|
756
|
+
if (options?.include !== undefined) {
|
|
757
|
+
const include = new Set(options.include.map((key) => String(key)));
|
|
758
|
+
keys = keys.filter((key) => include.has(key));
|
|
759
|
+
}
|
|
760
|
+
if (options?.exclude !== undefined) {
|
|
761
|
+
const exclude = new Set(options.exclude.map((key) => String(key)));
|
|
762
|
+
keys = keys.filter((key) => !exclude.has(key));
|
|
763
|
+
}
|
|
764
|
+
let updated = false;
|
|
765
|
+
const sourceRecord = source as Record<string, unknown>;
|
|
766
|
+
const targetRecord = target as Record<string, unknown>;
|
|
767
|
+
for (const key of keys) {
|
|
768
|
+
if (!Object.hasOwn(sourceRecord, key)) {
|
|
769
|
+
continue;
|
|
770
|
+
}
|
|
771
|
+
const nextValue = sourceRecord[key];
|
|
772
|
+
const prevValue = Object.hasOwn(targetRecord, key) ? targetRecord[key] : undefined;
|
|
773
|
+
if (valuesEqual(prevValue, nextValue)) {
|
|
774
|
+
continue;
|
|
775
|
+
}
|
|
776
|
+
targetRecord[key] = prepareAssignValue(nextValue) as never;
|
|
777
|
+
updated = true;
|
|
778
|
+
}
|
|
779
|
+
return updated;
|
|
780
|
+
};
|
|
522
781
|
|
|
523
782
|
//
|
|
524
783
|
// JSON
|
|
@@ -527,7 +786,7 @@ export const setDescription = (entity: Mutable<Unknown>, description: string): v
|
|
|
527
786
|
/**
|
|
528
787
|
* JSON representation of an object.
|
|
529
788
|
*/
|
|
530
|
-
export type JSON =
|
|
789
|
+
export type JSON = internal.ObjectJSON;
|
|
531
790
|
|
|
532
791
|
/**
|
|
533
792
|
* Converts object to its JSON representation.
|
|
@@ -535,7 +794,7 @@ export type JSON = APIJSON;
|
|
|
535
794
|
*
|
|
536
795
|
* The same algorithm is used when calling the standard `JSON.stringify(obj)` function.
|
|
537
796
|
*/
|
|
538
|
-
export const toJSON = (entity: Unknown | Snapshot): JSON =>
|
|
797
|
+
export const toJSON = (entity: Unknown | Snapshot): JSON => objInternal.objectToJSON(entity);
|
|
539
798
|
|
|
540
799
|
/**
|
|
541
800
|
* Creates an object from its json representation, performing schema validation.
|
|
@@ -545,42 +804,45 @@ export const toJSON = (entity: Unknown | Snapshot): JSON => toJSON$(entity);
|
|
|
545
804
|
*
|
|
546
805
|
* @param options.refResolver - Resolver for references. Produces hydrated references that can be resolved.
|
|
547
806
|
* @param options.dxn - Override object DXN. Changes the result of `Obj.getDXN`.
|
|
807
|
+
* @param options.database - Database to associate with the object.
|
|
548
808
|
*/
|
|
549
|
-
export const fromJSON: (
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
// Sorting
|
|
554
|
-
//
|
|
809
|
+
export const fromJSON: (
|
|
810
|
+
json: unknown,
|
|
811
|
+
options?: { refResolver?: Ref.Resolver; dxn?: DXN; database?: Database.Database; parent?: Unknown },
|
|
812
|
+
) => Promise<Unknown> = objInternal.objectFromJSON as any;
|
|
555
813
|
|
|
556
814
|
/**
|
|
557
815
|
* Comparator function type for sorting objects.
|
|
558
816
|
* Accepts both reactive objects and snapshots.
|
|
559
817
|
*/
|
|
560
|
-
export type Comparator =
|
|
818
|
+
export type Comparator = internal.Comparator<Unknown | Snapshot>;
|
|
561
819
|
|
|
562
|
-
export const sortByLabel: Comparator = sortByLabel
|
|
563
|
-
export const sortByTypename: Comparator = sortByTypename
|
|
564
|
-
export const sort = (...comparators: Comparator[]): Comparator => sort
|
|
820
|
+
export const sortByLabel: Comparator = internal.sortByLabel as Comparator;
|
|
821
|
+
export const sortByTypename: Comparator = internal.sortByTypename as Comparator;
|
|
822
|
+
export const sort = (...comparators: Comparator[]): Comparator => internal.sort(...comparators) as Comparator;
|
|
565
823
|
|
|
566
824
|
//
|
|
567
825
|
// Version
|
|
568
826
|
//
|
|
569
827
|
|
|
570
|
-
export
|
|
571
|
-
export type
|
|
828
|
+
export const VersionTypeId = internal.VersionTypeId;
|
|
829
|
+
export type VersionCompareResult = internal.VersionCompareResult;
|
|
572
830
|
|
|
573
831
|
/**
|
|
574
832
|
* Represent object version.
|
|
575
833
|
* May be backed by Automerge.
|
|
576
834
|
* Objects with no history are not versioned.
|
|
577
835
|
*/
|
|
578
|
-
export type Version =
|
|
836
|
+
export type Version = internal.EntityVersion;
|
|
579
837
|
|
|
580
|
-
export
|
|
838
|
+
export const isVersion = internal.isVersion;
|
|
839
|
+
export const versionValid = internal.versionValid;
|
|
840
|
+
export const compareVersions = internal.compareVersions;
|
|
841
|
+
export const encodeVersion = internal.encodeVersion;
|
|
842
|
+
export const decodeVersion = internal.decodeVersion;
|
|
581
843
|
|
|
582
844
|
/**
|
|
583
845
|
* Returns the version of the object.
|
|
584
846
|
* Accepts both reactive objects and snapshots.
|
|
585
847
|
*/
|
|
586
|
-
export const version = (entity: Unknown | Snapshot): Version => version
|
|
848
|
+
export const version = (entity: Unknown | Snapshot): Version => internal.version(entity);
|