@dxos/echo 0.8.4-main.9be5663bfe → 0.8.4-main.abd8ff62ef
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/neutral/Annotation.mjs +3 -3
- package/dist/lib/neutral/Database.mjs +6 -4
- package/dist/lib/neutral/Entity.mjs +16 -14
- package/dist/lib/neutral/Err.mjs +1 -1
- package/dist/lib/neutral/Extension.mjs +1 -1
- package/dist/lib/neutral/Feed.mjs +19 -17
- package/dist/lib/neutral/Filter.mjs +11 -11
- package/dist/lib/neutral/Format.mjs +3 -3
- package/dist/lib/neutral/JsonSchema.mjs +8 -8
- package/dist/lib/neutral/Key.mjs +1 -1
- package/dist/lib/neutral/Migration.mjs +17 -0
- package/dist/lib/neutral/Migration.mjs.map +7 -0
- package/dist/lib/neutral/Obj.mjs +14 -14
- package/dist/lib/neutral/Order.mjs +1 -1
- package/dist/lib/neutral/Query.mjs +17 -17
- package/dist/lib/neutral/QueryResult.mjs +1 -1
- package/dist/lib/neutral/Ref.mjs +7 -7
- package/dist/lib/neutral/Relation.mjs +15 -15
- package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
- package/dist/lib/neutral/Tag.mjs +14 -14
- package/dist/lib/neutral/Type.mjs +10 -10
- package/dist/lib/neutral/{chunk-7SQD3FRZ.mjs → chunk-2T22UGGN.mjs} +59 -12
- package/dist/lib/neutral/chunk-2T22UGGN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-GZQTCRJB.mjs → chunk-44HT3MEC.mjs} +2 -2
- package/dist/lib/neutral/{chunk-WVLOCXB5.mjs → chunk-6VC3FI5E.mjs} +12 -8
- package/dist/lib/neutral/chunk-6VC3FI5E.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-HBJ7JT5A.mjs → chunk-7JFW72MX.mjs} +17 -5
- package/dist/lib/neutral/chunk-7JFW72MX.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7RVZT53K.mjs} +1 -1
- package/dist/lib/neutral/{chunk-BNCCGLJN.mjs → chunk-BICZKPQG.mjs} +1 -1
- package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs +36 -0
- package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-OLFCVPOO.mjs → chunk-DUNXPKAC.mjs} +4 -4
- package/dist/lib/neutral/{chunk-R72KFH2X.mjs → chunk-FAW7PJRO.mjs} +2 -2
- package/dist/lib/neutral/{chunk-E5PBQJWV.mjs → chunk-FAYW32CW.mjs} +2 -2
- package/dist/lib/neutral/{chunk-YS6Q3XAD.mjs → chunk-GWFFC34K.mjs} +1 -1
- package/dist/lib/neutral/{chunk-YS6Q3XAD.mjs.map → chunk-GWFFC34K.mjs.map} +1 -1
- package/dist/lib/neutral/{chunk-T2JOLN37.mjs → chunk-I2MFJ76N.mjs} +6 -6
- package/dist/lib/neutral/chunk-I2MFJ76N.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-6URFBQJH.mjs → chunk-JALF2CVV.mjs} +5 -21
- package/dist/lib/neutral/chunk-JALF2CVV.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-EBVB5NOH.mjs → chunk-KQUQZ3CB.mjs} +15 -20
- package/dist/lib/neutral/chunk-KQUQZ3CB.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ZGVZNBBJ.mjs → chunk-LOTZLYHB.mjs} +17 -12
- package/dist/lib/neutral/chunk-LOTZLYHB.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TBKX6JQO.mjs → chunk-N4B7FHQT.mjs} +1 -1
- package/dist/lib/neutral/{chunk-UPWIIW2V.mjs → chunk-NKXEKBP5.mjs} +6 -22
- package/dist/lib/neutral/{chunk-UPWIIW2V.mjs.map → chunk-NKXEKBP5.mjs.map} +2 -2
- package/dist/lib/neutral/{chunk-YSLSJ7QS.mjs → chunk-NSMLBSFS.mjs} +17 -45
- package/dist/lib/neutral/chunk-NSMLBSFS.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ZIXGDU6F.mjs → chunk-QBIGOSRF.mjs} +2 -2
- package/dist/lib/neutral/{chunk-FNEFSO2C.mjs → chunk-QBLYZ4IV.mjs} +12 -65
- package/dist/lib/neutral/{chunk-FNEFSO2C.mjs.map → chunk-QBLYZ4IV.mjs.map} +2 -2
- package/dist/lib/neutral/{chunk-5VKHCUDA.mjs → chunk-QEVM3JUP.mjs} +26 -7
- package/dist/lib/neutral/chunk-QEVM3JUP.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-QWAOTFCY.mjs → chunk-REP7WWAQ.mjs} +16 -66
- package/dist/lib/neutral/chunk-REP7WWAQ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-DQYLD2RB.mjs → chunk-TRPZU2HV.mjs} +2 -2
- package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-TTCSATUD.mjs} +1 -1
- package/dist/lib/neutral/{chunk-46QNGNTY.mjs → chunk-TW76K7H5.mjs} +3 -3
- package/dist/lib/neutral/{chunk-FW7UJX25.mjs → chunk-UYJYDSD7.mjs} +67 -465
- package/dist/lib/neutral/chunk-UYJYDSD7.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-V72DY6LU.mjs} +1 -1
- package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-ZISMEVKD.mjs} +1 -1
- package/dist/lib/neutral/{chunk-UBEZSGXY.mjs.map → chunk-ZISMEVKD.mjs.map} +2 -2
- package/dist/lib/neutral/index.mjs +33 -27
- package/dist/lib/neutral/internal/index.mjs +9 -9
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/testing/index.mjs +28 -27
- package/dist/lib/neutral/testing/index.mjs.map +1 -1
- package/dist/types/src/Collection.d.ts.map +1 -1
- package/dist/types/src/Database.d.ts +5 -0
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Dataset.d.ts +1 -1
- package/dist/types/src/Entity.d.ts +15 -9
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +18 -18
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Extension.d.ts +4 -4
- package/dist/types/src/Extension.d.ts.map +1 -1
- package/dist/types/src/Feed.d.ts +12 -1
- package/dist/types/src/Feed.d.ts.map +1 -1
- package/dist/types/src/Filter.d.ts +5 -3
- package/dist/types/src/Filter.d.ts.map +1 -1
- package/dist/types/src/Json.d.ts +33 -0
- package/dist/types/src/Json.d.ts.map +1 -0
- package/dist/types/src/Json.test.d.ts +2 -0
- package/dist/types/src/Json.test.d.ts.map +1 -0
- package/dist/types/src/JsonSchema.d.ts +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 +22 -21
- 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 +5 -1
- package/dist/types/src/Query.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +15 -15
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Tag.d.ts +2 -2
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/View.d.ts +1 -1
- package/dist/types/src/View.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/annotations.d.ts +2 -2
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/util.d.ts +1 -1
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
- package/dist/types/src/internal/Format/date.d.ts.map +1 -1
- package/dist/types/src/internal/Format/format.d.ts.map +1 -1
- package/dist/types/src/internal/Format/number.d.ts.map +1 -1
- package/dist/types/src/internal/Format/object.d.ts.map +1 -1
- package/dist/types/src/internal/Format/types.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +28 -28
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/ids.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
- package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
- package/dist/types/src/internal/Query.d.ts.map +1 -1
- package/dist/types/src/internal/Ref/ref.d.ts +13 -0
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
- package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
- package/dist/types/src/internal/Type/echo-schema.d.ts +1 -1
- package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -1
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
- package/dist/types/src/internal/common/api/meta.d.ts +3 -3
- package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/entity.d.ts +3 -3
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/version.d.ts +1 -1
- package/dist/types/src/testing/test-data.d.ts.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +53 -53
- package/dist/types/src/testing/test-schema.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -13
- package/src/Collection.ts +1 -1
- package/src/Database.ts +35 -13
- package/src/Entity.ts +16 -9
- package/src/Extension.ts +3 -3
- package/src/Feed.ts +22 -1
- package/src/Filter.ts +9 -5
- package/src/Json.test.ts +175 -0
- package/src/Json.ts +102 -0
- package/src/Migration.ts +94 -0
- package/src/Obj.test.ts +12 -12
- package/src/Obj.ts +27 -24
- package/src/Query.test.ts +44 -11
- package/src/Query.ts +20 -0
- package/src/Relation.ts +21 -17
- package/src/index.ts +3 -0
- package/src/internal/Annotation/annotations.ts +5 -6
- package/src/internal/Obj/json-serializer.test.ts +1 -1
- package/src/internal/Obj/set-value.test.ts +15 -15
- package/src/internal/Obj/set-value.ts +1 -1
- package/src/internal/Query.ts +3 -0
- package/src/internal/Ref/ref.ts +17 -0
- package/src/internal/Type/echo-schema.ts +1 -1
- package/src/internal/common/README.md +1 -1
- package/src/internal/common/api/meta.ts +3 -3
- package/src/internal/common/proxy/change-context.ts +1 -1
- package/src/internal/common/proxy/change.test.ts +59 -59
- package/src/internal/common/proxy/errors.ts +2 -2
- package/src/internal/common/proxy/reactive-array.ts +1 -1
- package/src/internal/common/proxy/reactive.test.ts +54 -0
- package/src/internal/common/proxy/reactive.ts +11 -2
- package/src/internal/common/proxy/typed-handler.ts +7 -7
- package/src/internal/common/proxy/typed-object.test.ts +1 -1
- package/dist/lib/neutral/chunk-5VKHCUDA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-6URFBQJH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-7SQD3FRZ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-EBVB5NOH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-FW7UJX25.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HBJ7JT5A.mjs.map +0 -7
- package/dist/lib/neutral/chunk-QWAOTFCY.mjs.map +0 -7
- package/dist/lib/neutral/chunk-T2JOLN37.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WVLOCXB5.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YSLSJ7QS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ZGVZNBBJ.mjs.map +0 -7
- /package/dist/lib/neutral/{chunk-GZQTCRJB.mjs.map → chunk-44HT3MEC.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-ANHVGJI4.mjs.map → chunk-7RVZT53K.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-BNCCGLJN.mjs.map → chunk-BICZKPQG.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-OLFCVPOO.mjs.map → chunk-DUNXPKAC.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-R72KFH2X.mjs.map → chunk-FAW7PJRO.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-E5PBQJWV.mjs.map → chunk-FAYW32CW.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-TBKX6JQO.mjs.map → chunk-N4B7FHQT.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-ZIXGDU6F.mjs.map → chunk-QBIGOSRF.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-DQYLD2RB.mjs.map → chunk-TRPZU2HV.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-UI6MWK5W.mjs.map → chunk-TTCSATUD.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-46QNGNTY.mjs.map → chunk-TW76K7H5.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-OMUPQMLR.mjs.map → chunk-V72DY6LU.mjs.map} +0 -0
|
@@ -90,10 +90,10 @@ export const getTypeDXNFromSpecifier = (input: Schema.Schema.All | string): DXN
|
|
|
90
90
|
* Example: `org.dxos.type.message`
|
|
91
91
|
*/
|
|
92
92
|
// TODO(wittjosiah): Factor out to DXN spec.
|
|
93
|
-
// TODO(wittjosiah): Switch to atproto NSID regex once legacy typenames are fully migrated:
|
|
94
|
-
// /^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z]([a-zA-Z0-9]{0,62})?)$/
|
|
95
93
|
export const TypenameSchema = Schema.String.pipe(
|
|
96
|
-
Schema.pattern(
|
|
94
|
+
Schema.pattern(
|
|
95
|
+
/^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z]([a-zA-Z0-9]{0,62})?)$/,
|
|
96
|
+
),
|
|
97
97
|
).annotations({
|
|
98
98
|
description: 'Fully qualified globally unique typename in reverse-DNS form.',
|
|
99
99
|
example: 'org.dxos.type.message',
|
|
@@ -443,7 +443,6 @@ export const setDescriptionWithSchema = <S extends Schema.Schema.Any>(
|
|
|
443
443
|
* Identifies if a property should be included in a form or not.
|
|
444
444
|
* By default, all properties are included in forms, so this is opt-out.
|
|
445
445
|
*/
|
|
446
|
-
// TODO(burdon): UI concern.
|
|
447
446
|
export const FormInputAnnotationId = Symbol.for('@dxos/schema/annotation/FormInput');
|
|
448
447
|
export const FormInputAnnotation = createAnnotationHelper<boolean>(FormInputAnnotationId);
|
|
449
448
|
|
|
@@ -546,7 +545,7 @@ export const getLabel = (entity: AnyProperties): string | undefined => {
|
|
|
546
545
|
|
|
547
546
|
/**
|
|
548
547
|
* Set the label of an entity.
|
|
549
|
-
* Must be called within an Obj.
|
|
548
|
+
* Must be called within an Obj.update or Relation.update callback.
|
|
550
549
|
*/
|
|
551
550
|
export const setLabel = (entity: Mutable<AnyProperties>, label: string) => {
|
|
552
551
|
const schema = getSchema(entity);
|
|
@@ -568,7 +567,7 @@ export const getDescription = (entity: AnyProperties): string | undefined => {
|
|
|
568
567
|
|
|
569
568
|
/**
|
|
570
569
|
* Set the description of an entity.
|
|
571
|
-
* Must be called within an Obj.
|
|
570
|
+
* Must be called within an Obj.update or Relation.update callback.
|
|
572
571
|
*/
|
|
573
572
|
export const setDescription = (entity: Mutable<AnyProperties>, description: string) => {
|
|
574
573
|
const schema = getSchema(entity);
|
|
@@ -20,7 +20,7 @@ import { objectFromJSON, objectToJSON } from './json-serializer';
|
|
|
20
20
|
describe('Object JSON serializer', () => {
|
|
21
21
|
test('should serialize and deserialize object', async () => {
|
|
22
22
|
const contact = makeObject(TestSchema.Person, { name: 'Alice' });
|
|
23
|
-
Obj.
|
|
23
|
+
Obj.update(contact, (contact) => {
|
|
24
24
|
getMetaChecked(contact).keys.push({ id: '12345', source: 'example.com' });
|
|
25
25
|
});
|
|
26
26
|
|
|
@@ -17,7 +17,7 @@ describe('Obj.setValue', () => {
|
|
|
17
17
|
email: 'john@example.com',
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
-
Obj.
|
|
20
|
+
Obj.update(person, (person) => Obj.setValue(person, ['address', 'city'], 'NYC'));
|
|
21
21
|
|
|
22
22
|
expect(person.address).toBeDefined();
|
|
23
23
|
expect(person.address?.city).toBe('NYC');
|
|
@@ -30,7 +30,7 @@ describe('Obj.setValue', () => {
|
|
|
30
30
|
email: 'john@example.com',
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
-
Obj.
|
|
33
|
+
Obj.update(person, (person) => Obj.setValue(person, ['fields', 0, 'label'], 'Phone'));
|
|
34
34
|
|
|
35
35
|
expect(Array.isArray(person.fields)).toBe(true);
|
|
36
36
|
expect(person.fields?.[0].label).toBe('Phone');
|
|
@@ -45,7 +45,7 @@ describe('Obj.setValue', () => {
|
|
|
45
45
|
email: 'john@example.com',
|
|
46
46
|
});
|
|
47
47
|
|
|
48
|
-
Obj.
|
|
48
|
+
Obj.update(person, (person) => Obj.setValue(person, ['address', 'coordinates', 'lat'], 40.7128));
|
|
49
49
|
|
|
50
50
|
expect(person.address).toBeDefined();
|
|
51
51
|
expect(person.address?.coordinates).toBeDefined();
|
|
@@ -69,7 +69,7 @@ describe('Obj.setValue', () => {
|
|
|
69
69
|
|
|
70
70
|
const container = Obj.make(Container, { name: 'box' });
|
|
71
71
|
|
|
72
|
-
Obj.
|
|
72
|
+
Obj.update(container, (container) => {
|
|
73
73
|
Obj.setValue(container, ['items', 0, 'value'], 10);
|
|
74
74
|
Obj.setValue(container, ['items', 1, 'value'], 20);
|
|
75
75
|
Obj.setValue(container, ['items', 2, 'value'], 30);
|
|
@@ -88,7 +88,7 @@ describe('Obj.setValue', () => {
|
|
|
88
88
|
email: 'john@example.com',
|
|
89
89
|
});
|
|
90
90
|
|
|
91
|
-
Obj.
|
|
91
|
+
Obj.update(person, (person) => Obj.setValue(person, ['age'], 25));
|
|
92
92
|
|
|
93
93
|
expect(person.age).toBe(25);
|
|
94
94
|
});
|
|
@@ -100,7 +100,7 @@ describe('Obj.setValue', () => {
|
|
|
100
100
|
email: 'john@example.com',
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
-
Obj.
|
|
103
|
+
Obj.update(person, (person) => Obj.setValue(person, ['address', 'city'], 'NYC'));
|
|
104
104
|
|
|
105
105
|
expect(person.address).toBeDefined();
|
|
106
106
|
expect(person.address?.city).toBe('NYC');
|
|
@@ -114,7 +114,7 @@ describe('Obj.setValue', () => {
|
|
|
114
114
|
});
|
|
115
115
|
|
|
116
116
|
let result: any;
|
|
117
|
-
Obj.
|
|
117
|
+
Obj.update(person, (person) => {
|
|
118
118
|
result = Obj.setValue(person, ['age'], 30);
|
|
119
119
|
});
|
|
120
120
|
|
|
@@ -129,7 +129,7 @@ describe('Obj.setValue', () => {
|
|
|
129
129
|
age: 25,
|
|
130
130
|
});
|
|
131
131
|
|
|
132
|
-
Obj.
|
|
132
|
+
Obj.update(person, (person) => Obj.setValue(person, ['age'], 30));
|
|
133
133
|
|
|
134
134
|
expect(person.age).toBe(30);
|
|
135
135
|
});
|
|
@@ -142,7 +142,7 @@ describe('Obj.setValue', () => {
|
|
|
142
142
|
address: { city: 'Boston', state: 'MA', coordinates: {} },
|
|
143
143
|
});
|
|
144
144
|
|
|
145
|
-
Obj.
|
|
145
|
+
Obj.update(person, (person) => Obj.setValue(person, ['address', 'city'], 'NYC'));
|
|
146
146
|
|
|
147
147
|
expect(person.address?.city).toBe('NYC');
|
|
148
148
|
expect(person.address?.state).toBe('MA');
|
|
@@ -160,7 +160,7 @@ describe('Obj.setValue', () => {
|
|
|
160
160
|
|
|
161
161
|
const matrix = Obj.make(Matrix, {});
|
|
162
162
|
|
|
163
|
-
Obj.
|
|
163
|
+
Obj.update(matrix, (matrix) => {
|
|
164
164
|
Obj.setValue(matrix, ['values', 0, 0], 1);
|
|
165
165
|
Obj.setValue(matrix, ['values', 0, 1], 2);
|
|
166
166
|
Obj.setValue(matrix, ['values', 1, 0], 3);
|
|
@@ -180,7 +180,7 @@ describe('Obj.setValue', () => {
|
|
|
180
180
|
email: 'john@example.com',
|
|
181
181
|
});
|
|
182
182
|
|
|
183
|
-
Obj.
|
|
183
|
+
Obj.update(person, (person) => {
|
|
184
184
|
expect(() => Obj.setValue(person, [], 'value')).toThrow('Path must not be empty');
|
|
185
185
|
});
|
|
186
186
|
});
|
|
@@ -192,7 +192,7 @@ describe('Obj.setValue', () => {
|
|
|
192
192
|
email: 'john@example.com',
|
|
193
193
|
});
|
|
194
194
|
|
|
195
|
-
Obj.
|
|
195
|
+
Obj.update(person, (person) => Obj.setValue(person, ['age'], 30));
|
|
196
196
|
|
|
197
197
|
expect(person.age).toBe(30);
|
|
198
198
|
});
|
|
@@ -215,7 +215,7 @@ describe('Obj.setValue', () => {
|
|
|
215
215
|
const container = Obj.make(Container, { name: 'box' });
|
|
216
216
|
|
|
217
217
|
// Using string '0' for array index.
|
|
218
|
-
Obj.
|
|
218
|
+
Obj.update(container, (container) => Obj.setValue(container, ['items', '0', 'value'], 42));
|
|
219
219
|
|
|
220
220
|
expect(container.items?.[0].value).toBe(42);
|
|
221
221
|
});
|
|
@@ -243,7 +243,7 @@ describe('Obj.setValue', () => {
|
|
|
243
243
|
|
|
244
244
|
// This should work: setting a nested property on an array element.
|
|
245
245
|
// The required 'id' field should be initialized with a default value.
|
|
246
|
-
Obj.
|
|
246
|
+
Obj.update(todoList, (todoList) => Obj.setValue(todoList, ['tasks', 0, 'title'], 'Buy groceries'));
|
|
247
247
|
|
|
248
248
|
expect(todoList.tasks?.[0].id).toBe(''); // Default value for required String
|
|
249
249
|
expect(todoList.tasks?.[0].title).toBe('Buy groceries');
|
|
@@ -270,7 +270,7 @@ describe('Obj.setValue', () => {
|
|
|
270
270
|
|
|
271
271
|
const container = Obj.make(Container, { name: 'box' });
|
|
272
272
|
|
|
273
|
-
Obj.
|
|
273
|
+
Obj.update(container, (container) => Obj.setValue(container, ['items', 0, 'label'], 'First Item'));
|
|
274
274
|
|
|
275
275
|
// All required primitive fields should have default values.
|
|
276
276
|
expect(container.items?.[0].id).toBe('');
|
|
@@ -21,7 +21,7 @@ import { getSchema } from '../common/types';
|
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Set a deeply nested property on an object.
|
|
24
|
-
* Must be called within an Obj.
|
|
24
|
+
* Must be called within an Obj.update or Relation.update callback.
|
|
25
25
|
*/
|
|
26
26
|
export const setValue = (obj: Mutable<any>, path: readonly (string | number)[], value: any): void => {
|
|
27
27
|
invariant(path.length > 0, 'Path must not be empty');
|
package/src/internal/Query.ts
CHANGED
|
@@ -109,6 +109,9 @@ export const prettyQuery = (query: QueryAST.Query): string => {
|
|
|
109
109
|
if (opts.deleted !== undefined) {
|
|
110
110
|
parts.push(`deleted: ${JSON.stringify(opts.deleted)}`);
|
|
111
111
|
}
|
|
112
|
+
if (opts.debugLabel !== undefined) {
|
|
113
|
+
parts.push(`debugLabel: ${JSON.stringify(opts.debugLabel)}`);
|
|
114
|
+
}
|
|
112
115
|
return `${prettyQuery(query.query)}.options({ ${parts.join(', ')} })`;
|
|
113
116
|
}
|
|
114
117
|
case 'from': {
|
package/src/internal/Ref/ref.ts
CHANGED
|
@@ -164,6 +164,16 @@ export interface Ref<T> extends Pipeable.Pipeable {
|
|
|
164
164
|
|
|
165
165
|
tryLoad(): Promise<T | undefined>;
|
|
166
166
|
|
|
167
|
+
/**
|
|
168
|
+
* Subscribe to the ref's resolution event.
|
|
169
|
+
* The callback fires when the target object becomes available in the working set
|
|
170
|
+
* (e.g. when its document is loaded after sibling-client mutation).
|
|
171
|
+
* Note: the resolver only schedules a notification when the target is requested
|
|
172
|
+
* via {@link target} while it is not yet loaded.
|
|
173
|
+
* @returns Function that unsubscribes the callback.
|
|
174
|
+
*/
|
|
175
|
+
onResolved(callback: () => void): () => void;
|
|
176
|
+
|
|
167
177
|
/**
|
|
168
178
|
* Do not inline the target object in the reference.
|
|
169
179
|
* Makes .target unavailable unless the reference is connected to a database context.
|
|
@@ -420,6 +430,13 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
420
430
|
return (await this.#resolver.resolve(this.#dxn)) as T | undefined;
|
|
421
431
|
}
|
|
422
432
|
|
|
433
|
+
/**
|
|
434
|
+
* @inheritdoc
|
|
435
|
+
*/
|
|
436
|
+
onResolved(callback: () => void): () => void {
|
|
437
|
+
return this.#resolved.on(callback);
|
|
438
|
+
}
|
|
439
|
+
|
|
423
440
|
/**
|
|
424
441
|
* Do not inline the target object in the reference.
|
|
425
442
|
* Makes .target unavailable unless the reference is connected to a database context.
|
|
@@ -372,7 +372,7 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
|
|
|
372
372
|
}
|
|
373
373
|
|
|
374
374
|
/**
|
|
375
|
-
* Wrapper for Obj.
|
|
375
|
+
* Wrapper for Obj.update that handles the change context for the persistent schema.
|
|
376
376
|
*/
|
|
377
377
|
private _change(callback: (schema: PersistentSchema) => void): void {
|
|
378
378
|
const changeFn = (this._persistentSchema as any)[ChangeId];
|
|
@@ -99,4 +99,4 @@
|
|
|
99
99
|
- [ ] ReactiveObject should specify id property? Reconcile AnyProperties, ReactiveObject, HasId, WithId, etc.
|
|
100
100
|
- [ ] Can we us S.is(MyType) to detect objects with our types system? (Branding?)
|
|
101
101
|
- [ ] Type.Expando doesn't work with AtomQuery result type (have to use Obj.Any instead).
|
|
102
|
-
- [ ] Obj.Any doesn't work with Obj.
|
|
102
|
+
- [ ] Obj.Any doesn't work with Obj.update callback types (have to use `any` for the mutable parameter).
|
|
@@ -48,7 +48,7 @@ export const getKeys = (entity: AnyProperties, source: string): ForeignKey[] =>
|
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
50
|
* Delete all keys from the entity for the specified source.
|
|
51
|
-
* Must be called within an Obj.
|
|
51
|
+
* Must be called within an Obj.update or Relation.update callback.
|
|
52
52
|
*/
|
|
53
53
|
export const deleteKeys = (entity: Mutable<AnyProperties>, source: string) => {
|
|
54
54
|
const meta = getMetaChecked(entity);
|
|
@@ -62,7 +62,7 @@ export const deleteKeys = (entity: Mutable<AnyProperties>, source: string) => {
|
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
64
|
* Add a tag to the entity.
|
|
65
|
-
* Must be called within an Obj.
|
|
65
|
+
* Must be called within an Obj.update or Relation.update callback.
|
|
66
66
|
*/
|
|
67
67
|
export const addTag = (entity: Mutable<AnyProperties>, tag: string) => {
|
|
68
68
|
const meta = getMetaChecked(entity);
|
|
@@ -72,7 +72,7 @@ export const addTag = (entity: Mutable<AnyProperties>, tag: string) => {
|
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
74
|
* Remove a tag from the entity.
|
|
75
|
-
* Must be called within an Obj.
|
|
75
|
+
* Must be called within an Obj.update or Relation.update callback.
|
|
76
76
|
*/
|
|
77
77
|
export const removeTag = (entity: Mutable<AnyProperties>, tag: string) => {
|
|
78
78
|
const meta = getMetaChecked(entity);
|
|
@@ -35,7 +35,7 @@ const pendingOwnerNotifications = new Set<object>();
|
|
|
35
35
|
/**
|
|
36
36
|
* Enter a change context for the given key.
|
|
37
37
|
* While in a change context, mutations are allowed on the associated object.
|
|
38
|
-
* Nested Obj.
|
|
38
|
+
* Nested Obj.update calls are not supported.
|
|
39
39
|
*
|
|
40
40
|
* @param key - The key to enter the change context for (target object or ObjectCore).
|
|
41
41
|
* @returns A cleanup function that exits the change context.
|