@dxos/echo 0.8.4-main.dedc0f3 → 0.8.4-main.e00bdcdb52
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 +3 -4
- package/dist/lib/neutral/Annotation.mjs +37 -0
- package/dist/lib/neutral/Database.mjs +49 -0
- package/dist/lib/neutral/Entity.mjs +61 -0
- package/dist/lib/neutral/Entity.mjs.map +7 -0
- package/dist/lib/neutral/Err.mjs +12 -0
- package/dist/lib/neutral/Err.mjs.map +7 -0
- 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 +72 -0
- package/dist/lib/neutral/Filter.mjs.map +7 -0
- package/dist/lib/neutral/Format.mjs +66 -0
- package/dist/lib/neutral/Format.mjs.map +7 -0
- package/dist/lib/neutral/JsonSchema.mjs +19 -0
- package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
- package/dist/lib/neutral/Key.mjs +12 -0
- package/dist/lib/neutral/Key.mjs.map +7 -0
- package/dist/lib/neutral/Migration.mjs +17 -0
- package/dist/lib/neutral/Migration.mjs.map +7 -0
- package/dist/lib/neutral/Obj.mjs +113 -0
- package/dist/lib/neutral/Obj.mjs.map +7 -0
- package/dist/lib/neutral/Order.mjs +12 -0
- package/dist/lib/neutral/Order.mjs.map +7 -0
- package/dist/lib/neutral/Query.mjs +38 -0
- package/dist/lib/neutral/Query.mjs.map +7 -0
- package/dist/lib/neutral/QueryResult.mjs +2 -0
- package/dist/lib/neutral/QueryResult.mjs.map +7 -0
- package/dist/lib/neutral/Ref.mjs +24 -0
- package/dist/lib/neutral/Ref.mjs.map +7 -0
- package/dist/lib/neutral/Relation.mjs +94 -0
- package/dist/lib/neutral/Relation.mjs.map +7 -0
- package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
- package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
- package/dist/lib/neutral/Tag.mjs +29 -0
- package/dist/lib/neutral/Tag.mjs.map +7 -0
- package/dist/lib/neutral/Type.mjs +37 -0
- package/dist/lib/neutral/Type.mjs.map +7 -0
- package/dist/lib/neutral/chunk-2T22UGGN.mjs +206 -0
- package/dist/lib/neutral/chunk-2T22UGGN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-44HT3MEC.mjs +73 -0
- package/dist/lib/neutral/chunk-44HT3MEC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-6VC3FI5E.mjs +125 -0
- package/dist/lib/neutral/chunk-6VC3FI5E.mjs.map +7 -0
- package/dist/lib/neutral/chunk-7JFW72MX.mjs +132 -0
- package/dist/lib/neutral/chunk-7JFW72MX.mjs.map +7 -0
- package/dist/lib/neutral/chunk-7RVZT53K.mjs +21 -0
- package/dist/lib/neutral/chunk-7RVZT53K.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BICZKPQG.mjs +7 -0
- package/dist/lib/neutral/chunk-BICZKPQG.mjs.map +7 -0
- package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs +36 -0
- package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-DUNXPKAC.mjs +56 -0
- package/dist/lib/neutral/chunk-DUNXPKAC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FAW7PJRO.mjs +34 -0
- package/dist/lib/neutral/chunk-FAW7PJRO.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FAYW32CW.mjs +27 -0
- package/dist/lib/neutral/chunk-FAYW32CW.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-I2MFJ76N.mjs +354 -0
- package/dist/lib/neutral/chunk-I2MFJ76N.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-JALF2CVV.mjs +345 -0
- package/dist/lib/neutral/chunk-JALF2CVV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-KQUQZ3CB.mjs +128 -0
- package/dist/lib/neutral/chunk-KQUQZ3CB.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LOTZLYHB.mjs +420 -0
- package/dist/lib/neutral/chunk-LOTZLYHB.mjs.map +7 -0
- package/dist/lib/neutral/chunk-N4B7FHQT.mjs +67 -0
- package/dist/lib/neutral/chunk-N4B7FHQT.mjs.map +7 -0
- package/dist/lib/neutral/chunk-NKXEKBP5.mjs +81 -0
- package/dist/lib/neutral/chunk-NKXEKBP5.mjs.map +7 -0
- package/dist/lib/neutral/chunk-NSMLBSFS.mjs +270 -0
- package/dist/lib/neutral/chunk-NSMLBSFS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QBIGOSRF.mjs +45 -0
- package/dist/lib/neutral/chunk-QBIGOSRF.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QBLYZ4IV.mjs +734 -0
- package/dist/lib/neutral/chunk-QBLYZ4IV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QEVM3JUP.mjs +318 -0
- package/dist/lib/neutral/chunk-QEVM3JUP.mjs.map +7 -0
- package/dist/lib/neutral/chunk-REP7WWAQ.mjs +346 -0
- package/dist/lib/neutral/chunk-REP7WWAQ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-TRPZU2HV.mjs +402 -0
- package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-TTCSATUD.mjs +42 -0
- package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
- package/dist/lib/neutral/chunk-TW76K7H5.mjs +45 -0
- package/dist/lib/neutral/chunk-TW76K7H5.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UYJYDSD7.mjs +2436 -0
- package/dist/lib/neutral/chunk-UYJYDSD7.mjs.map +7 -0
- package/dist/lib/neutral/chunk-V72DY6LU.mjs +7 -0
- package/dist/lib/neutral/chunk-V72DY6LU.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ZISMEVKD.mjs +51 -0
- package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +107 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/internal/index.mjs +474 -0
- package/dist/lib/neutral/internal/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/testing/index.mjs +375 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/Annotation.d.ts +24 -0
- package/dist/types/src/Annotation.d.ts.map +1 -0
- 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 +201 -0
- package/dist/types/src/Database.d.ts.map +1 -0
- 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 +174 -0
- package/dist/types/src/Entity.d.ts.map +1 -0
- package/dist/types/src/Entity.test.d.ts +2 -0
- package/dist/types/src/Entity.test.d.ts.map +1 -0
- package/dist/types/src/Err.d.ts +107 -0
- package/dist/types/src/Err.d.ts.map +1 -0
- 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 +149 -0
- package/dist/types/src/Filter.d.ts.map +1 -0
- 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 +4 -0
- package/dist/types/src/Format.d.ts.map +1 -0
- package/dist/types/src/Hypergraph.d.ts +65 -0
- package/dist/types/src/Hypergraph.d.ts.map +1 -0
- 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 +16 -0
- package/dist/types/src/JsonSchema.d.ts.map +1 -0
- package/dist/types/src/Key.d.ts +1 -0
- package/dist/types/src/Key.d.ts.map +1 -1
- package/dist/types/src/Migration.d.ts +57 -0
- package/dist/types/src/Migration.d.ts.map +1 -0
- package/dist/types/src/Obj.d.ts +440 -91
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Obj.test.d.ts +2 -0
- package/dist/types/src/Obj.test.d.ts.map +1 -0
- package/dist/types/src/Order.d.ts +16 -0
- package/dist/types/src/Order.d.ts.map +1 -0
- package/dist/types/src/Query.d.ts +213 -0
- package/dist/types/src/Query.d.ts.map +1 -0
- package/dist/types/src/Query.test.d.ts +2 -0
- package/dist/types/src/Query.test.d.ts.map +1 -0
- package/dist/types/src/QueryResult.d.ts +80 -0
- package/dist/types/src/QueryResult.d.ts.map +1 -0
- package/dist/types/src/Ref.d.ts +61 -11
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +288 -21
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Relation.test.d.ts +2 -0
- package/dist/types/src/Relation.test.d.ts.map +1 -0
- package/dist/types/src/SchemaRegistry.d.ts +84 -0
- package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
- package/dist/types/src/Tag.d.ts +18 -0
- package/dist/types/src/Tag.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +123 -100
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/Type.test.d.ts +2 -0
- package/dist/types/src/Type.test.d.ts.map +1 -0
- 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 +22 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/annotations.d.ts +231 -0
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/annotations.test.d.ts +2 -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/Annotation/sorting.d.ts +24 -0
- package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/util.d.ts +39 -0
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/api.d.ts +13 -0
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/entity.d.ts +20 -0
- package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/index.d.ts +8 -0
- package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/model.d.ts +55 -0
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/object.d.ts +18 -0
- package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/relation.d.ts +35 -0
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/util.d.ts +2 -0
- package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/version.d.ts +42 -0
- package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
- package/dist/types/src/internal/Format/date.d.ts +63 -0
- package/dist/types/src/internal/Format/date.d.ts.map +1 -0
- package/dist/types/src/internal/Format/date.test.d.ts +2 -0
- package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
- package/dist/types/src/internal/Format/format.d.ts +32 -0
- package/dist/types/src/internal/Format/format.d.ts.map +1 -0
- package/dist/types/src/internal/Format/format.test.d.ts +2 -0
- package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
- package/dist/types/src/internal/Format/index.d.ts +8 -0
- package/dist/types/src/internal/Format/index.d.ts.map +1 -0
- package/dist/types/src/internal/Format/number.d.ts +31 -0
- package/dist/types/src/internal/Format/number.d.ts.map +1 -0
- package/dist/types/src/internal/Format/object.d.ts +35 -0
- package/dist/types/src/internal/Format/object.d.ts.map +1 -0
- package/dist/types/src/internal/Format/select.d.ts +13 -0
- package/dist/types/src/internal/Format/select.d.ts.map +1 -0
- package/dist/types/src/internal/Format/string.d.ts +42 -0
- package/dist/types/src/internal/Format/string.d.ts.map +1 -0
- package/dist/types/src/internal/Format/types.d.ts +72 -0
- package/dist/types/src/internal/Format/types.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/annotations.d.ts +19 -0
- package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts +2 -0
- package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/index.d.ts +5 -0
- package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts +7 -0
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +351 -0
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts +30 -0
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts +2 -0
- package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/clone.d.ts +8 -0
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/common.d.ts +18 -0
- package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/create-object.d.ts +39 -0
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/create-object.test.d.ts +2 -0
- package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/deleted.d.ts +6 -0
- package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/ids.d.ts +6 -0
- package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/index.d.ts +11 -0
- package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/inspect.d.ts +2 -0
- package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/json-serializer.d.ts +45 -0
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/json-serializer.test.d.ts +2 -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 +2 -0
- package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/set-value.d.ts +7 -0
- package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/set-value.test.d.ts +2 -0
- package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/snapshot.d.ts +6 -0
- package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/typed-object.d.ts +25 -0
- package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/typed-object.test.d.ts +2 -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 +3 -0
- package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref-array.d.ts +21 -0
- package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref.d.ts +244 -0
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref.test.d.ts +2 -0
- package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
- package/dist/types/src/internal/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 +2 -0
- package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
- package/dist/types/src/internal/Type/echo-schema.d.ts +181 -0
- package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
- package/dist/types/src/internal/Type/index.d.ts +4 -0
- package/dist/types/src/internal/Type/index.d.ts.map +1 -0
- package/dist/types/src/internal/Type/manipulation.d.ts +10 -0
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
- package/dist/types/src/internal/Type/persistent-schema.d.ts +20 -0
- package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
- package/dist/types/src/internal/common/api/index.d.ts +11 -0
- package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/api/meta.d.ts +42 -0
- 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 +55 -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 +2 -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 +5 -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 +19 -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 +10 -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 +2 -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 +14 -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 +6 -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 +14 -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 +57 -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 +18 -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 +47 -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 +8 -0
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/reactive.d.ts +39 -0
- package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -0
- 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 +15 -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 +2 -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 +3 -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 +48 -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 +2 -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 +2 -0
- package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/base.d.ts +27 -0
- package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/entity.d.ts +37 -0
- package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/index.d.ts +7 -0
- package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/meta.d.ts +33 -0
- 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 +21 -0
- package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/version.d.ts +15 -0
- package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
- package/dist/types/src/internal/index.d.ts +11 -0
- package/dist/types/src/internal/index.d.ts.map +1 -0
- package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +3 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-data.d.ts +18 -0
- package/dist/types/src/testing/test-data.d.ts.map +1 -0
- package/dist/types/src/testing/test-schema.d.ts +304 -0
- package/dist/types/src/testing/test-schema.d.ts.map +1 -0
- package/dist/types/src/testing/util.d.ts +21 -0
- package/dist/types/src/testing/util.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +119 -56
- package/src/Annotation.ts +48 -0
- package/src/Collection.ts +37 -0
- package/src/Database.ts +352 -0
- package/src/Dataset.ts +26 -0
- package/src/Entity.test.ts +22 -0
- package/src/Entity.ts +243 -0
- package/src/Err.ts +40 -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 +454 -0
- package/src/Format.ts +9 -0
- package/src/Hypergraph.ts +79 -0
- package/src/Json.test.ts +175 -0
- package/src/Json.ts +102 -0
- package/src/JsonSchema.ts +26 -0
- package/src/Key.ts +3 -0
- package/src/Migration.ts +94 -0
- package/src/Obj.test.ts +539 -0
- package/src/Obj.ts +716 -212
- package/src/Order.ts +46 -0
- package/src/Query.test.ts +822 -0
- package/src/Query.ts +567 -0
- package/src/QueryResult.ts +106 -0
- package/src/Ref.ts +78 -9
- package/src/Relation.test.ts +88 -0
- package/src/Relation.ts +452 -53
- package/src/SchemaRegistry.ts +106 -0
- package/src/Tag.ts +41 -0
- package/src/Type.test.ts +52 -0
- package/src/Type.ts +168 -155
- package/src/View.ts +107 -0
- package/src/hierarchy.test.ts +33 -0
- package/src/index.ts +25 -5
- package/src/internal/Annotation/annotations.test.ts +145 -0
- package/src/internal/Annotation/annotations.ts +577 -0
- package/src/internal/Annotation/index.ts +7 -0
- package/src/internal/Annotation/sorting.ts +51 -0
- package/src/internal/Annotation/util.ts +85 -0
- package/src/internal/Entity/api.ts +30 -0
- package/src/internal/Entity/entity.ts +128 -0
- package/src/internal/Entity/index.ts +11 -0
- package/src/internal/Entity/model.ts +109 -0
- package/src/internal/Entity/object.ts +57 -0
- package/src/internal/Entity/relation.ts +154 -0
- package/src/internal/Entity/util.ts +33 -0
- package/src/internal/Entity/version.ts +96 -0
- package/src/internal/Format/date.test.ts +55 -0
- package/src/internal/Format/date.ts +217 -0
- package/src/internal/Format/format.test.ts +76 -0
- package/src/internal/Format/format.ts +54 -0
- package/src/internal/Format/index.ts +12 -0
- package/src/internal/Format/number.ts +89 -0
- package/src/internal/Format/object.ts +80 -0
- package/src/internal/Format/select.ts +18 -0
- package/src/internal/Format/string.ts +81 -0
- package/src/internal/Format/types.ts +186 -0
- package/src/internal/JsonSchema/annotations.ts +50 -0
- package/src/internal/JsonSchema/effect-schema.test.ts +143 -0
- package/src/internal/JsonSchema/index.ts +8 -0
- package/src/internal/JsonSchema/json-schema-normalize.ts +111 -0
- package/src/internal/JsonSchema/json-schema-type.ts +403 -0
- package/src/internal/JsonSchema/json-schema.test.ts +860 -0
- package/src/internal/JsonSchema/json-schema.ts +533 -0
- package/src/internal/Obj/clone.ts +48 -0
- package/src/internal/Obj/common.ts +75 -0
- package/src/internal/Obj/create-object.test.ts +114 -0
- package/src/internal/Obj/create-object.ts +94 -0
- package/src/internal/Obj/deleted.ts +19 -0
- package/src/internal/Obj/ids.ts +12 -0
- package/src/internal/Obj/index.ts +14 -0
- package/src/internal/Obj/inspect.ts +46 -0
- package/src/internal/Obj/json-serializer.test.ts +120 -0
- package/src/internal/Obj/json-serializer.ts +222 -0
- package/src/internal/Obj/schema-validator.test.ts +182 -0
- package/src/internal/Obj/schema-validator.ts +6 -0
- package/src/internal/Obj/set-value.test.ts +281 -0
- package/src/internal/Obj/set-value.ts +165 -0
- package/src/internal/Obj/snapshot.ts +105 -0
- package/src/internal/Obj/typed-object.test.ts +34 -0
- package/src/internal/Obj/typed-object.ts +30 -0
- package/src/internal/Query.ts +137 -0
- package/src/internal/Ref/index.ts +6 -0
- package/src/internal/Ref/ref-array.ts +38 -0
- package/src/internal/Ref/ref.test.ts +100 -0
- package/src/internal/Ref/ref.ts +589 -0
- package/src/internal/Type/compose.test.ts +41 -0
- package/src/internal/Type/compose.ts +41 -0
- package/src/internal/Type/echo-schema.ts +423 -0
- package/src/internal/Type/index.ts +7 -0
- package/src/internal/Type/manipulation.ts +92 -0
- package/src/internal/Type/persistent-schema.ts +33 -0
- package/src/internal/common/README.md +102 -0
- package/src/internal/common/api/index.ts +15 -0
- package/src/internal/common/api/meta.ts +88 -0
- package/src/internal/common/index.ts +7 -0
- package/src/internal/common/proxy/change-context.ts +138 -0
- package/src/internal/common/proxy/change.test.ts +519 -0
- package/src/internal/common/proxy/define-hidden-property.ts +14 -0
- package/src/internal/common/proxy/errors.ts +42 -0
- package/src/internal/common/proxy/event-batch.ts +44 -0
- package/src/internal/common/proxy/handler.test.ts +121 -0
- package/src/internal/common/proxy/index.ts +17 -0
- package/src/internal/common/proxy/json-serializer.ts +90 -0
- package/src/internal/common/proxy/make-object.ts +105 -0
- package/src/internal/common/proxy/ownership.ts +252 -0
- package/src/internal/common/proxy/proxy-types.ts +23 -0
- package/src/internal/common/proxy/proxy-utils.ts +150 -0
- package/src/internal/common/proxy/reactive-array.ts +71 -0
- package/src/internal/common/proxy/reactive.test.ts +54 -0
- package/src/internal/common/proxy/reactive.ts +77 -0
- package/src/internal/common/proxy/schema-validator.ts +244 -0
- package/src/internal/common/proxy/schema.test.ts +145 -0
- package/src/internal/common/proxy/symbols.ts +7 -0
- package/src/internal/common/proxy/typed-handler.test.ts +313 -0
- package/src/internal/common/proxy/typed-handler.ts +447 -0
- package/src/internal/common/proxy/typed-object.test.ts +115 -0
- package/src/internal/common/types/base.ts +43 -0
- package/src/internal/common/types/entity.ts +54 -0
- package/src/internal/common/types/index.ts +10 -0
- package/src/internal/common/types/meta.ts +67 -0
- package/src/internal/common/types/model-symbols.ts +69 -0
- package/src/internal/common/types/typename.ts +55 -0
- package/src/internal/common/types/version.ts +19 -0
- package/src/internal/index.ts +17 -0
- package/src/testing/api.test.ts +125 -0
- package/src/testing/index.ts +3 -1
- package/src/testing/test-data.ts +129 -0
- package/src/testing/test-schema.ts +240 -0
- package/src/testing/util.ts +85 -0
- package/dist/lib/browser/chunk-MTR3E5S2.mjs +0 -786
- package/dist/lib/browser/chunk-MTR3E5S2.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -26
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs +0 -70
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MYZLAJSR.mjs +0 -786
- package/dist/lib/node-esm/chunk-MYZLAJSR.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -26
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -70
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/experimental/database.d.ts +0 -8
- package/dist/types/src/experimental/database.d.ts.map +0 -1
- package/dist/types/src/experimental/index.d.ts +0 -1
- package/dist/types/src/experimental/index.d.ts.map +0 -1
- package/dist/types/src/experimental/queue.d.ts +0 -8
- package/dist/types/src/experimental/queue.d.ts.map +0 -1
- package/dist/types/src/experimental/space.d.ts +0 -8
- package/dist/types/src/experimental/space.d.ts.map +0 -1
- package/dist/types/src/query/dsl.d.ts +0 -238
- package/dist/types/src/query/dsl.d.ts.map +0 -1
- package/dist/types/src/query/dsl.test.d.ts +0 -2
- package/dist/types/src/query/dsl.test.d.ts.map +0 -1
- package/dist/types/src/query/index.d.ts +0 -2
- package/dist/types/src/query/index.d.ts.map +0 -1
- package/dist/types/src/testing/types.d.ts +0 -113
- package/dist/types/src/testing/types.d.ts.map +0 -1
- package/src/experimental/database.ts +0 -11
- package/src/experimental/index.ts +0 -7
- package/src/experimental/queue.ts +0 -11
- package/src/experimental/space.ts +0 -11
- package/src/query/dsl.test.ts +0 -332
- package/src/query/dsl.ts +0 -704
- package/src/query/index.ts +0 -5
- package/src/test/api.test.ts +0 -180
- package/src/testing/types.ts +0 -91
- /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
- /package/dist/lib/{node-esm/index.mjs.map → neutral/Database.mjs.map} +0 -0
- /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { assertArgument } from '@dxos/invariant';
|
|
6
|
+
|
|
7
|
+
import { type AnyEntity, VersionTypeId } from '../common/types';
|
|
8
|
+
import { ObjectVersionId } from './model';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Represent entity version.
|
|
12
|
+
* May be backed by Automerge.
|
|
13
|
+
* Entities with no history are not versioned.
|
|
14
|
+
* Named EntityVersion to avoid conflict with types/version.ts.
|
|
15
|
+
*/
|
|
16
|
+
export interface EntityVersion {
|
|
17
|
+
[VersionTypeId]: {};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Whether the entity is versioned.
|
|
21
|
+
*/
|
|
22
|
+
versioned: boolean;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Automerge heads.
|
|
26
|
+
*/
|
|
27
|
+
automergeHeads?: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const unversioned: EntityVersion = {
|
|
31
|
+
[VersionTypeId]: {},
|
|
32
|
+
versioned: false,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Checks that `obj` is a version object.
|
|
37
|
+
*/
|
|
38
|
+
export const isVersion = (entity: unknown): entity is EntityVersion => {
|
|
39
|
+
return entity != null && typeof entity === 'object' && VersionTypeId in entity;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Returns the version of an entity.
|
|
44
|
+
* Accepts both reactive entities and snapshots.
|
|
45
|
+
*/
|
|
46
|
+
export const version = (entity: AnyEntity): EntityVersion => {
|
|
47
|
+
const ver = (entity as any)[ObjectVersionId];
|
|
48
|
+
if (ver === undefined) {
|
|
49
|
+
return unversioned;
|
|
50
|
+
}
|
|
51
|
+
return ver;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Checks that `version` is a valid version object.
|
|
56
|
+
*/
|
|
57
|
+
export const versionValid = (ver: EntityVersion): boolean => {
|
|
58
|
+
assertArgument(isVersion(ver), 'version', 'Invalid version object');
|
|
59
|
+
return !!ver.versioned;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Compares two versions.
|
|
66
|
+
* @param version1
|
|
67
|
+
* @param version2
|
|
68
|
+
* @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
|
|
69
|
+
*/
|
|
70
|
+
export const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {
|
|
71
|
+
assertArgument(isVersion(version1), 'version1', 'Invalid version object');
|
|
72
|
+
assertArgument(isVersion(version2), 'version2', 'Invalid version object');
|
|
73
|
+
|
|
74
|
+
if (!versionValid(version1) || !versionValid(version2)) {
|
|
75
|
+
return 'unversioned';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
|
|
79
|
+
return 'different';
|
|
80
|
+
}
|
|
81
|
+
if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
|
|
82
|
+
return 'different';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return 'equal';
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const encodeVersion = (ver: EntityVersion): string => {
|
|
89
|
+
return JSON.stringify(ver);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const decodeVersion = (ver: string): EntityVersion => {
|
|
93
|
+
const parsed = JSON.parse(ver);
|
|
94
|
+
parsed[VersionTypeId] = {};
|
|
95
|
+
return parsed;
|
|
96
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import { describe, expect, test } from 'vitest';
|
|
7
|
+
|
|
8
|
+
import { log } from '@dxos/log';
|
|
9
|
+
|
|
10
|
+
import { toJsonSchema } from '../JsonSchema';
|
|
11
|
+
import {
|
|
12
|
+
DateOnly,
|
|
13
|
+
DateTime,
|
|
14
|
+
type SimpleDate,
|
|
15
|
+
type SimpleDateTime,
|
|
16
|
+
type SimpleTime,
|
|
17
|
+
TimeOnly,
|
|
18
|
+
toSimpleDate,
|
|
19
|
+
toSimpleTime,
|
|
20
|
+
} from './date';
|
|
21
|
+
|
|
22
|
+
describe.skip('date', () => {
|
|
23
|
+
test('basic', () => {
|
|
24
|
+
const date = new Date('2024-12-31T23:59:59Z');
|
|
25
|
+
expect(toSimpleDate(date)).to.deep.eq({ year: 2024, month: 12, day: 31 });
|
|
26
|
+
expect(toSimpleTime(date)).to.deep.eq({ hours: 23, minutes: 59, seconds: 59 });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('Date', ({ expect }) => {
|
|
30
|
+
const jsonSchema = toJsonSchema(DateOnly);
|
|
31
|
+
log('schema', { jsonSchema });
|
|
32
|
+
const v1: SimpleDate = { year: 1999, month: 12, day: 31 };
|
|
33
|
+
const str = Schema.encodeUnknownSync(DateOnly)(v1);
|
|
34
|
+
const v2 = Schema.decodeUnknownSync(DateOnly)(str);
|
|
35
|
+
expect(v1).to.deep.eq(v2);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('Time', ({ expect }) => {
|
|
39
|
+
const jsonSchema = toJsonSchema(TimeOnly);
|
|
40
|
+
log('schema', { jsonSchema });
|
|
41
|
+
const v1: SimpleTime = { hours: 23, minutes: 59, seconds: 59 };
|
|
42
|
+
const str = Schema.encodeUnknownSync(TimeOnly)(v1);
|
|
43
|
+
const v2 = Schema.decodeUnknownSync(TimeOnly)(str);
|
|
44
|
+
expect(v1).to.deep.eq(v2);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('DateTime', ({ expect }) => {
|
|
48
|
+
const jsonSchema = toJsonSchema(DateTime);
|
|
49
|
+
log('schema', { jsonSchema });
|
|
50
|
+
const v1: SimpleDateTime = { year: 1999, month: 12, day: 31, hours: 23, minutes: 59, seconds: 59 };
|
|
51
|
+
const str = Schema.encodeUnknownSync(DateTime)(v1);
|
|
52
|
+
const v2 = Schema.decodeUnknownSync(DateTime)(str);
|
|
53
|
+
expect(v1).to.deep.eq(v2);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
|
|
8
|
+
import { FormatAnnotation, TypeFormat } from './types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Datetime values should be stored as ISO strings or unix numbers (ms) in UTC.
|
|
12
|
+
*
|
|
13
|
+
* NOTE: HyperFormula uses Excel's time format (null date 1900/01/01)
|
|
14
|
+
* It can be configured to use a different parser via `parseDateTime`.
|
|
15
|
+
* https://hyperformula.handsontable.com/guide/date-and-time-handling.html#date-and-time-handling
|
|
16
|
+
* https://github.com/handsontable/hyperformula/blob/master/src/DateTimeHelper.ts
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
// TODO(burdon): Annotations not present in JSON.
|
|
20
|
+
// TODO(burdon): Timezone.
|
|
21
|
+
// TODO(burdon): Format for timestamp (Unix UTC or ISO 8601)?
|
|
22
|
+
// TODO(burdon): Refs
|
|
23
|
+
// - https://www.npmjs.com/package/numfmt
|
|
24
|
+
// - https://date-fns.org/docs/Getting-Started
|
|
25
|
+
// - https://github.com/date-fns/tz
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Simple date compatible with HF.
|
|
29
|
+
*/
|
|
30
|
+
export const SimpleDate = Schema.Struct({
|
|
31
|
+
year: Schema.Number.pipe(Schema.between(1900, 9999)),
|
|
32
|
+
month: Schema.Number.pipe(Schema.between(1, 12)),
|
|
33
|
+
day: Schema.Number.pipe(Schema.between(1, 31)),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export type SimpleDate = Schema.Schema.Type<typeof SimpleDate>;
|
|
37
|
+
|
|
38
|
+
export const toSimpleDate = (date: Date): SimpleDate => ({
|
|
39
|
+
year: date.getUTCFullYear(),
|
|
40
|
+
month: date.getUTCMonth() + 1,
|
|
41
|
+
day: date.getUTCDate(),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Simple time compatible with HF.
|
|
46
|
+
*/
|
|
47
|
+
export const SimpleTime = Schema.Struct({
|
|
48
|
+
hours: Schema.Number.pipe(Schema.between(0, 23)),
|
|
49
|
+
minutes: Schema.Number.pipe(Schema.between(0, 59)),
|
|
50
|
+
seconds: Schema.Number.pipe(Schema.between(0, 59)),
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
export type SimpleTime = Schema.Schema.Type<typeof SimpleTime>;
|
|
54
|
+
|
|
55
|
+
export const toSimpleTime = (date: Date): SimpleTime => ({
|
|
56
|
+
hours: date.getUTCHours(),
|
|
57
|
+
minutes: date.getUTCSeconds(),
|
|
58
|
+
seconds: date.getUTCSeconds(),
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Simple date-time compatible with HF.
|
|
63
|
+
*/
|
|
64
|
+
export const SimpleDateTime = Schema.extend(SimpleDate, SimpleTime);
|
|
65
|
+
|
|
66
|
+
export type SimpleDateTime = Schema.Schema.Type<typeof SimpleDateTime>;
|
|
67
|
+
|
|
68
|
+
export const toSimpleDateTime = (date: Date): SimpleDateTime => ({
|
|
69
|
+
...toSimpleDate(date),
|
|
70
|
+
...toSimpleTime(date),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* https://effect.website/docs/guides/schema/transformations#date-transformations
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
// TODO(burdon): Consider if transformations should be supported with Automerge.
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Format: 2018-11-13
|
|
81
|
+
*/
|
|
82
|
+
export const DateOnly = /* Schema.transformOrFail(Schema.String, SimpleDate, {
|
|
83
|
+
strict: true,
|
|
84
|
+
decode: (str, _, ast) => {
|
|
85
|
+
if (!isValidDateFormat(str)) {
|
|
86
|
+
return ParseResult.fail(new ParseResult.Type(ast, str, 'Expected YYYY-MM-DD format'));
|
|
87
|
+
}
|
|
88
|
+
if (!isValidDate(str)) {
|
|
89
|
+
return ParseResult.fail(new ParseResult.Type(ast, str, 'Invalid date'));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const [year, month, day] = str.split('-').map(Number);
|
|
93
|
+
return ParseResult.succeed({ year, month, day });
|
|
94
|
+
},
|
|
95
|
+
encode: (date) => {
|
|
96
|
+
return ParseResult.succeed(
|
|
97
|
+
[
|
|
98
|
+
date.year.toString().padStart(4, '0'),
|
|
99
|
+
date.month.toString().padStart(2, '0'),
|
|
100
|
+
date.day.toString().padStart(2, '0'),
|
|
101
|
+
].join('-'),
|
|
102
|
+
);
|
|
103
|
+
},
|
|
104
|
+
}) */ Schema.String.pipe(
|
|
105
|
+
FormatAnnotation.set(TypeFormat.Date),
|
|
106
|
+
Schema.annotations({
|
|
107
|
+
title: 'Date',
|
|
108
|
+
description: 'Valid date in ISO format',
|
|
109
|
+
}),
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Format: 20:20:39+00:00
|
|
114
|
+
*/
|
|
115
|
+
export const TimeOnly = /* Schema.transformOrFail(Schema.String, SimpleTime, {
|
|
116
|
+
strict: true,
|
|
117
|
+
decode: (str, _, ast) => {
|
|
118
|
+
if (!isValidTimeFormat(str)) {
|
|
119
|
+
return ParseResult.fail(new ParseResult.Type(ast, str, 'Expected HH:mm:ss format'));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const [hours, minutes, seconds] = str.split(':').map(Number);
|
|
123
|
+
return ParseResult.succeed({ hours, minutes, seconds });
|
|
124
|
+
},
|
|
125
|
+
encode: (time) => {
|
|
126
|
+
return ParseResult.succeed(
|
|
127
|
+
[
|
|
128
|
+
time.hours.toString().padStart(2, '0'),
|
|
129
|
+
time.minutes.toString().padStart(2, '0'),
|
|
130
|
+
time.seconds.toString().padStart(2, '0'),
|
|
131
|
+
].join(':'),
|
|
132
|
+
);
|
|
133
|
+
},
|
|
134
|
+
}) */ Schema.String.pipe(
|
|
135
|
+
FormatAnnotation.set(TypeFormat.Time),
|
|
136
|
+
Schema.annotations({
|
|
137
|
+
title: 'Time',
|
|
138
|
+
description: 'Valid time in ISO format',
|
|
139
|
+
}),
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Format: 2018-11-13T20:20:39+00:00
|
|
144
|
+
*/
|
|
145
|
+
export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime, {
|
|
146
|
+
strict: false,
|
|
147
|
+
decode: (str, _, ast) => {
|
|
148
|
+
const [date, time] = str.split('T');
|
|
149
|
+
if (!isValidDateFormat(date)) {
|
|
150
|
+
return ParseResult.fail(new ParseResult.Type(ast, date, 'Expected YYYY-MM-DD format'));
|
|
151
|
+
}
|
|
152
|
+
if (!isValidDate(date)) {
|
|
153
|
+
return ParseResult.fail(new ParseResult.Type(ast, date, 'Invalid date'));
|
|
154
|
+
}
|
|
155
|
+
if (!isValidTimeFormat(time)) {
|
|
156
|
+
return ParseResult.fail(new ParseResult.Type(ast, str, 'Expected HH:mm:ss format'));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const [year, month, day] = date.split('-').map(Number);
|
|
160
|
+
const [hours, minutes, seconds] = time.split(':').map(Number);
|
|
161
|
+
return ParseResult.succeed({ year, month, day, hours, minutes, seconds });
|
|
162
|
+
},
|
|
163
|
+
encode: (datetime) => {
|
|
164
|
+
return ParseResult.succeed(
|
|
165
|
+
[
|
|
166
|
+
[
|
|
167
|
+
datetime.year.toString().padStart(4, '0'),
|
|
168
|
+
datetime.month.toString().padStart(2, '0'),
|
|
169
|
+
datetime.day.toString().padStart(2, '0'),
|
|
170
|
+
].join('-'),
|
|
171
|
+
[
|
|
172
|
+
datetime.hours.toString().padStart(2, '0'),
|
|
173
|
+
datetime.minutes.toString().padStart(2, '0'),
|
|
174
|
+
datetime.seconds.toString().padStart(2, '0'),
|
|
175
|
+
].join(':'),
|
|
176
|
+
].join('T'),
|
|
177
|
+
);
|
|
178
|
+
},
|
|
179
|
+
}) */ Schema.String.pipe(
|
|
180
|
+
FormatAnnotation.set(TypeFormat.DateTime),
|
|
181
|
+
Schema.annotations({
|
|
182
|
+
title: 'DateTime',
|
|
183
|
+
description: 'Valid date and time in ISO format',
|
|
184
|
+
}),
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* https://datatracker.ietf.org/doc/html/rfc3339#appendix-A
|
|
189
|
+
*/
|
|
190
|
+
// TODO(burdon): Define duration type.
|
|
191
|
+
export const Duration = Schema.String.pipe(
|
|
192
|
+
FormatAnnotation.set(TypeFormat.Duration),
|
|
193
|
+
Schema.annotations({
|
|
194
|
+
title: 'Duration',
|
|
195
|
+
description: 'Duration in ISO 8601 format',
|
|
196
|
+
[SchemaAST.ExamplesAnnotationId]: ['1h', '3D'],
|
|
197
|
+
}),
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
//
|
|
201
|
+
// Utils
|
|
202
|
+
//
|
|
203
|
+
|
|
204
|
+
// YYYY-MM-DD
|
|
205
|
+
const DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
|
|
206
|
+
|
|
207
|
+
const _isValidDateFormat = (str: string) => DATE_REGEX.test(str);
|
|
208
|
+
|
|
209
|
+
const _isValidDate = (str: string) => {
|
|
210
|
+
const date = new Date(str);
|
|
211
|
+
return !isNaN(date.getTime()) && date.toISOString().startsWith(str);
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
// HH:mm:ss
|
|
215
|
+
const TIME_REGEX = /^([01]\d|2[0-3]):([0-5]\d):([0-5]\d)$/;
|
|
216
|
+
|
|
217
|
+
const _isValidTimeFormat = (str: string) => TIME_REGEX.test(str);
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import { describe, test } from 'vitest';
|
|
7
|
+
|
|
8
|
+
import { toJsonSchema } from '../JsonSchema';
|
|
9
|
+
import { Format } from './format';
|
|
10
|
+
import { TypeEnum, TypeFormat, getTypeEnum } from './types';
|
|
11
|
+
|
|
12
|
+
describe('formats', () => {
|
|
13
|
+
test('annotations', ({ expect }) => {
|
|
14
|
+
const TestSchema = Schema.Struct({
|
|
15
|
+
name: Schema.String,
|
|
16
|
+
email: Schema.optional(Format.Email),
|
|
17
|
+
salary: Schema.optional(Format.Currency({ decimals: 2, code: 'usd' })),
|
|
18
|
+
website: Schema.optional(Format.URL),
|
|
19
|
+
birthday: Schema.optional(Format.Date),
|
|
20
|
+
started: Schema.optional(Format.DateTime),
|
|
21
|
+
active: Schema.optional(Schema.Boolean),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
type TestType = Schema.Schema.Type<typeof TestSchema>;
|
|
25
|
+
|
|
26
|
+
const jsonSchema = toJsonSchema(TestSchema);
|
|
27
|
+
|
|
28
|
+
const data: TestType = {
|
|
29
|
+
name: 'Alice',
|
|
30
|
+
email: 'alice@example.com',
|
|
31
|
+
birthday: '1999-06-11',
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const validate = Schema.validateSync(TestSchema);
|
|
35
|
+
validate(data);
|
|
36
|
+
|
|
37
|
+
{
|
|
38
|
+
const prop = jsonSchema.properties!['active' as const];
|
|
39
|
+
expect(getTypeEnum(prop)).to.eq(TypeEnum.Boolean);
|
|
40
|
+
expect(prop).includes({
|
|
41
|
+
type: TypeEnum.Boolean,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
{
|
|
46
|
+
const prop = jsonSchema.properties!['email' as const];
|
|
47
|
+
expect(getTypeEnum(prop)).to.eq(TypeEnum.String);
|
|
48
|
+
expect(prop).includes({
|
|
49
|
+
type: TypeEnum.String,
|
|
50
|
+
format: TypeFormat.Email,
|
|
51
|
+
title: 'Email',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
{
|
|
56
|
+
const prop = jsonSchema.properties!['salary' as const];
|
|
57
|
+
expect(getTypeEnum(prop)).to.eq(TypeEnum.Number);
|
|
58
|
+
expect(prop).includes({
|
|
59
|
+
type: TypeEnum.Number,
|
|
60
|
+
format: TypeFormat.Currency,
|
|
61
|
+
title: 'Currency',
|
|
62
|
+
multipleOf: 0.01,
|
|
63
|
+
currency: 'USD',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
{
|
|
68
|
+
const prop = jsonSchema.properties!['birthday' as const];
|
|
69
|
+
expect(getTypeEnum(prop)).to.eq(TypeEnum.String);
|
|
70
|
+
expect(prop).includes({
|
|
71
|
+
type: TypeEnum.String,
|
|
72
|
+
format: TypeFormat.Date,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import * as Keys from '@dxos/keys';
|
|
8
|
+
|
|
9
|
+
import * as DateUtil from './date';
|
|
10
|
+
import * as NumberUtil from './number';
|
|
11
|
+
import * as ObjectUtil from './object';
|
|
12
|
+
import * as StringUtil from './string';
|
|
13
|
+
import { TypeFormat as TypeFormat$ } from './types';
|
|
14
|
+
|
|
15
|
+
// TODO(burdon): Media encoding.
|
|
16
|
+
// - https://json-schema.org/understanding-json-schema/reference/non_json_data
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Formats.
|
|
20
|
+
* https://json-schema.org/understanding-json-schema/reference/string#built-in-formats
|
|
21
|
+
* NOTE: A JSON Schema validator will ignore any format type that it does not understand.
|
|
22
|
+
*/
|
|
23
|
+
// TODO(burdon): Add fields for `examples`, `message`, etc.
|
|
24
|
+
export namespace Format {
|
|
25
|
+
export import TypeFormat = TypeFormat$;
|
|
26
|
+
|
|
27
|
+
// String
|
|
28
|
+
export const DXN = Keys.DXN.Schema;
|
|
29
|
+
export const Email = StringUtil.Email;
|
|
30
|
+
export const Formula = StringUtil.Formula;
|
|
31
|
+
export const Hostname = StringUtil.Hostname;
|
|
32
|
+
export const JSON = StringUtil.JSON;
|
|
33
|
+
export const Markdown = StringUtil.Markdown;
|
|
34
|
+
export const Regex = StringUtil.Regex;
|
|
35
|
+
export const URL = StringUtil.URL;
|
|
36
|
+
export const UUID = Schema.UUID;
|
|
37
|
+
|
|
38
|
+
// Numbers
|
|
39
|
+
// TODO(burdon): BigInt.
|
|
40
|
+
export const Currency = NumberUtil.Currency;
|
|
41
|
+
export const Integer = NumberUtil.Integer;
|
|
42
|
+
export const Percent = NumberUtil.Percent;
|
|
43
|
+
export const Timestamp = NumberUtil.Timestamp;
|
|
44
|
+
|
|
45
|
+
// Dates and times
|
|
46
|
+
export const Date = DateUtil.DateOnly;
|
|
47
|
+
export const DateTime = DateUtil.DateTime;
|
|
48
|
+
export const Duration = DateUtil.Duration;
|
|
49
|
+
export const Time = DateUtil.TimeOnly;
|
|
50
|
+
|
|
51
|
+
// Objects
|
|
52
|
+
export const GeoPoint = ObjectUtil.GeoPoint;
|
|
53
|
+
export type GeoPoint = ObjectUtil.GeoPoint; // TODO(burdon): Export types.
|
|
54
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export type { SimpleDate, SimpleDateTime, SimpleTime } from './date';
|
|
6
|
+
export { CurrencyAnnotationId, DecimalPrecision, Currency } from './number';
|
|
7
|
+
export { GeoPoint, GeoLocation } from './object';
|
|
8
|
+
|
|
9
|
+
export * from './format';
|
|
10
|
+
export * from './select';
|
|
11
|
+
export * from './string';
|
|
12
|
+
export * from './types';
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { FormatAnnotation, TypeFormat } from './types';
|
|
8
|
+
|
|
9
|
+
const encodeMultipleOf = (divisor: number) => 1 / Math.pow(10, divisor);
|
|
10
|
+
|
|
11
|
+
const encodeMultiple =
|
|
12
|
+
<A extends number>(divisor?: number) =>
|
|
13
|
+
<I, R>(self: Schema.Schema<A, I, R>) =>
|
|
14
|
+
divisor === undefined || divisor === 0 ? self : self.pipe(Schema.multipleOf(encodeMultipleOf(divisor)));
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Convert number of digits to multipleOf annotation.
|
|
18
|
+
*/
|
|
19
|
+
export const DecimalPrecision = Schema.transform(Schema.Number, Schema.Number, {
|
|
20
|
+
strict: true,
|
|
21
|
+
encode: (value) => encodeMultipleOf(value),
|
|
22
|
+
decode: (value) => Math.log10(1 / value),
|
|
23
|
+
}).annotations({
|
|
24
|
+
title: 'Number of digits',
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
export const CurrencyAnnotationId = Symbol.for('@dxos/schema/annotation/Currency');
|
|
28
|
+
|
|
29
|
+
export type CurrencyAnnotation = {
|
|
30
|
+
decimals?: number;
|
|
31
|
+
code?: string;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* ISO 4217 currency code.
|
|
36
|
+
*/
|
|
37
|
+
export const Currency = ({ decimals, code }: CurrencyAnnotation = { decimals: 2 }) =>
|
|
38
|
+
Schema.Number.pipe(
|
|
39
|
+
encodeMultiple(decimals),
|
|
40
|
+
FormatAnnotation.set(TypeFormat.Currency),
|
|
41
|
+
Schema.annotations({
|
|
42
|
+
title: 'Currency',
|
|
43
|
+
description: 'Currency value',
|
|
44
|
+
...(code ? { [CurrencyAnnotationId]: code.toUpperCase() } : {}),
|
|
45
|
+
}),
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
export type PercentAnnotation = {
|
|
49
|
+
decimals?: number;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Integer.
|
|
54
|
+
*/
|
|
55
|
+
export const Integer = () =>
|
|
56
|
+
Schema.Number.pipe(
|
|
57
|
+
Schema.int(),
|
|
58
|
+
FormatAnnotation.set(TypeFormat.Integer),
|
|
59
|
+
Schema.annotations({
|
|
60
|
+
title: 'Integer',
|
|
61
|
+
description: 'Integer value',
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Percent.
|
|
67
|
+
*/
|
|
68
|
+
// TODO(burdon): Define min/max (e.g., 0, 1).
|
|
69
|
+
export const Percent = ({ decimals }: PercentAnnotation = { decimals: 2 }) =>
|
|
70
|
+
Schema.Number.pipe(
|
|
71
|
+
encodeMultiple(decimals),
|
|
72
|
+
FormatAnnotation.set(TypeFormat.Percent),
|
|
73
|
+
Schema.annotations({
|
|
74
|
+
title: 'Percent',
|
|
75
|
+
description: 'Percentage value',
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Unix timestamp.
|
|
81
|
+
* https://en.wikipedia.org/wiki/Unix_time
|
|
82
|
+
*/
|
|
83
|
+
export const Timestamp = Schema.Number.pipe(
|
|
84
|
+
FormatAnnotation.set(TypeFormat.Timestamp),
|
|
85
|
+
Schema.annotations({
|
|
86
|
+
title: 'Timestamp',
|
|
87
|
+
description: 'Unix timestamp',
|
|
88
|
+
}),
|
|
89
|
+
);
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { clamp } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
import { FormatAnnotation, TypeFormat } from './types';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* GeoJSON Format
|
|
13
|
+
* https://datatracker.ietf.org/doc/html/rfc7946
|
|
14
|
+
* https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.1
|
|
15
|
+
* https://en.wikipedia.org/wiki/Geographic_coordinate_system
|
|
16
|
+
* https://geojson.org
|
|
17
|
+
* {
|
|
18
|
+
* "type": "Point",
|
|
19
|
+
* "coordinates": [0, 51.47] // [longitude, latitude]
|
|
20
|
+
* }
|
|
21
|
+
* Note: optional third element for altitude.
|
|
22
|
+
*/
|
|
23
|
+
export const GeoPoint = Schema.Tuple(
|
|
24
|
+
Schema.Number.pipe(Schema.annotations({ title: 'Longitude' }), Schema.clamp(-180, 180), Schema.multipleOf(0.000001)),
|
|
25
|
+
Schema.Number.pipe(Schema.annotations({ title: 'Latitude' }), Schema.clamp(-90, 90), Schema.multipleOf(0.000001)),
|
|
26
|
+
Schema.optionalElement(Schema.Number).annotations({
|
|
27
|
+
title: 'Height ASL (m)',
|
|
28
|
+
}),
|
|
29
|
+
).pipe(
|
|
30
|
+
FormatAnnotation.set(TypeFormat.GeoPoint),
|
|
31
|
+
Schema.annotations({
|
|
32
|
+
title: 'GeoPoint',
|
|
33
|
+
description: 'GeoJSON Position',
|
|
34
|
+
}),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
export type GeoPoint = Schema.Schema.Type<typeof GeoPoint>;
|
|
38
|
+
|
|
39
|
+
export type GeoLocation = {
|
|
40
|
+
longitude: number;
|
|
41
|
+
latitude: number;
|
|
42
|
+
height?: number;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Geolocation utilities for working with GeoPoint format.
|
|
47
|
+
*/
|
|
48
|
+
export namespace GeoLocation {
|
|
49
|
+
/**
|
|
50
|
+
* Convert latitude and longitude to GeoPoint (GeoJSON format [longitude, latitude, height?]).
|
|
51
|
+
* Clamps values to valid ranges: latitude [-90, 90], longitude [-180, 180].
|
|
52
|
+
*/
|
|
53
|
+
export const toGeoPoint = ({ longitude, latitude, height }: GeoLocation): GeoPoint => {
|
|
54
|
+
// TODO(ZaymonFC): Use schema validation instead of doing this manually.
|
|
55
|
+
const clampedLongitude = clamp(longitude, -180, 180);
|
|
56
|
+
const clampedLatitude = clamp(latitude, -90, 90);
|
|
57
|
+
return height !== undefined ? [clampedLongitude, clampedLatitude, height] : [clampedLongitude, clampedLatitude];
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Extract latitude and longitude from GeoPoint (GeoJSON format [longitude, latitude, height?]).
|
|
62
|
+
*/
|
|
63
|
+
export const fromGeoPoint = (geoPoint: GeoPoint | undefined): GeoLocation => {
|
|
64
|
+
if (!geoPoint) {
|
|
65
|
+
return { longitude: 0, latitude: 0 };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const result: GeoLocation = {
|
|
69
|
+
longitude: geoPoint[0],
|
|
70
|
+
latitude: geoPoint[1],
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Add height if defined.
|
|
74
|
+
if (geoPoint[2] !== undefined) {
|
|
75
|
+
result.height = geoPoint[2];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return result;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Schema for a single select option. Used to define choices in a {single|multi}-select field.
|
|
9
|
+
*/
|
|
10
|
+
export const SelectOption = Schema.Struct({
|
|
11
|
+
/** Stable identifier for the option. */
|
|
12
|
+
id: Schema.NonEmptyString,
|
|
13
|
+
title: Schema.String,
|
|
14
|
+
/** Color palette used for visual styling. */
|
|
15
|
+
color: Schema.String,
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export type SelectOption = Schema.Schema.Type<typeof SelectOption>;
|