jazz-tools 0.13.7 → 0.13.10
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/.turbo/turbo-build.log +5 -5
- package/CHANGELOG.md +13 -0
- package/dist/{chunk-VQWUJIL4.js → chunk-NFVKGXSH.js} +16 -3
- package/dist/chunk-NFVKGXSH.js.map +1 -0
- package/dist/coValues/deepLoading.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/testing.js +1 -1
- package/package.json +2 -2
- package/src/coValues/coList.ts +5 -1
- package/src/coValues/deepLoading.ts +15 -1
- package/src/tests/subscribe.test.ts +205 -0
- package/dist/chunk-VQWUJIL4.js.map +0 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"deepLoading.d.ts","sourceRoot":"","sources":["../../src/coValues/deepLoading.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAwB,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAe,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,iBAAiB,CAAC;AA4BxD,KAAK,mBAAmB,GACpB;IACE,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC;CACrC,GACD;IACE,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;CACf,CAAC;AAGN,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,GAAG,mBAAmB,
|
1
|
+
{"version":3,"file":"deepLoading.d.ts","sourceRoot":"","sources":["../../src/coValues/deepLoading.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAwB,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAe,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,iBAAiB,CAAC;AA4BxD,KAAK,mBAAmB,GACpB;IACE,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC;CACrC,GACD;IACE,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;CACf,CAAC;AAGN,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAyO7E;AAED,KAAK,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC7C,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5C,MAAM,MAAM,aAAa,CACvB,CAAC,EACD,UAAU,SAAS,MAAM,GAAG,EAAE,EAC9B,YAAY,SAAS,MAAM,EAAE,GAAG,EAAE,IAEhC,OAAO,GACP,CAAC,UAAU,SAAS,YAAY,CAAC,QAAQ,CAAC,GAEtC,GAAG,GAEH,CAAC,SAAS,KAAK,CAAC,MAAM,IAAI,CAAC,GAErB;IACE,KAAK,EAAE,aAAa,CAClB,WAAW,CAAC,IAAI,CAAC,EACjB,UAAU,EACV;QAAC,CAAC;QAAE,GAAG,YAAY;KAAC,CACrB,CAAC;CACH,GACD,OAAO,GAEX,CAAC,SAAS;IAAE,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,GAE5C;KACG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,OAAO,GAC9C,GAAG,GACH,KAAK,CAAC,CAAC,EAAE,aAAa,CACxB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EACb,UAAU,EACV;QAAC,CAAC;QAAE,GAAG,YAAY;KAAC,CACrB;CACF,GACD,CAAC,QAAQ,SAAS,MAAM,CAAC,GACrB;IACE,KAAK,EAAE,aAAa,CAClB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAClB,UAAU,EACV;QAAC,CAAC;QAAE,GAAG,YAAY;KAAC,CACrB,CAAC;CACH,GACD,KAAK,CAAC,GACV,OAAO,GACX,CAAC,SAAS;IACN,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAC3C,GAEG;IACE,KAAK,EAAE,aAAa,CAClB,WAAW,CAAC,IAAI,CAAC,EACjB,UAAU,EACV;QAAC,CAAC;QAAE,GAAG,YAAY;KAAC,CACrB,CAAC;CACH,GACD,OAAO,GACX,OAAO,CAAC,CAAC;AAEvB,MAAM,MAAM,mBAAmB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,GAC9D,aAAa,CAAC,CAAC,CAAC,GAChB,CAAC,CAAC;AAEN,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,YAAY,CAC5E,CAAC,EACD,CAAC,EACD,EAAE,EACF;CAAE,CACH,CAAC;AAEF,MAAM,MAAM,YAAY,CACtB,CAAC,EACD,KAAK,EACL,UAAU,SAAS,MAAM,GAAG,EAAE,EAC9B,YAAY,SAAS,MAAM,EAAE,GAAG,EAAE,IAChC,UAAU,SAAS,YAAY,CAAC,QAAQ,CAAC,GACzC,CAAC,GACD,KAAK,SAAS,OAAO,GAAG,SAAS,GAC/B,CAAC,GAED;IAAC,CAAC;CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,GAC7B,WAAW,CAAC,IAAI,CAAC,SAAS,OAAO,GAC/B,KAAK,SAAS;IAAE,KAAK,EAAE,MAAM,SAAS,CAAA;CAAE,GAEtC,AADA,uBAAuB;AACvB,CAAC,WAAW,CAAC,IAAI,CAAC,GAChB,YAAY,CACV,WAAW,CAAC,IAAI,CAAC,EACjB,SAAS,EACT,UAAU,EACV;IAAC,CAAC;IAAE,GAAG,YAAY;CAAC,CACrB,CAAC,EAAE,GACJ,CAAC,GACH,KAAK,GACP,CAAC,GAEH;IAAC,CAAC;CAAC,SAAS,CAAC;IAAE,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC,GACpD,QAAQ,SAAS,MAAM,CAAC,GACtB,KAAK,SAAS;IAAE,KAAK,EAAE,MAAM,SAAS,CAAA;CAAE,GAEtC,AADA,kCAAkC;AAClC;IACE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CACzB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAClB,SAAS,EACT,UAAU,EACV;QAAC,CAAC;QAAE,GAAG,YAAY;KAAC,CACrB,CAAC;CACH,GAAG,CAAC,GACL,KAAK,GACP,MAAM,KAAK,SAAS,KAAK,GACvB,CAAC,GAED,AADA,sBAAsB;AACtB;IACE,CAAC,UAAU,GAAG,IAAI,MAAM,KAAK,CAAC,CAAC,GAAG,GAAG,SAAS,MAAM,CAAC,CAAC,CAAC,GACnD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,OAAO,GAEvB,YAAY,CACV,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EACb,KAAK,CAAC,GAAG,CAAC,EACV,UAAU,EACV;QAAC,CAAC;QAAE,GAAG,YAAY;KAAC,CACrB,GACD,CAAC,SAAS,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,GAClD,KAAK,GACP,KAAK;CACV,GAAG,CAAC,GACT,CAAC,CAAC,CAAC,SAAS;IACR;QACE,KAAK,EAAE,UAAU,CAAC;QAClB,IAAI,EAAE,WAAW,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;KAC3C;CACF,GAED,AADA,yBAAyB;AACzB;IACE,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACpC,gBAAgB,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAChD,UAAU,EAAE;QACV,CAAC,GAAG,EAAE,SAAS,GAAG;YAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;SAAE,CAAC;KAChD,CAAC;CACH,GAAG;IAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;KAAE,CAAA;CAAE,GAAG,CAAC,GAC5D,CAAC,CAAC,CAAC,SAAS;IACR;QACE,KAAK,EAAE,gBAAgB,CAAC;KACzB;CACF,GACD,CAAC,GACD,CAAC,CAAC,CAAC,SAAS;IACR;QACE,KAAK,EAAE,aAAa,CAAC;KACtB;CACF,GACD,CAAC,GACD,KAAK,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/testing.js
CHANGED
package/package.json
CHANGED
@@ -17,11 +17,11 @@
|
|
17
17
|
},
|
18
18
|
"type": "module",
|
19
19
|
"license": "MIT",
|
20
|
-
"version": "0.13.
|
20
|
+
"version": "0.13.10",
|
21
21
|
"dependencies": {
|
22
22
|
"@scure/bip39": "^1.3.0",
|
23
23
|
"fast-myers-diff": "^3.2.0",
|
24
|
-
"cojson": "0.13.
|
24
|
+
"cojson": "0.13.10"
|
25
25
|
},
|
26
26
|
"devDependencies": {
|
27
27
|
"tsup": "8.3.5",
|
package/src/coValues/coList.ts
CHANGED
@@ -557,7 +557,11 @@ function toRawItems<Item>(items: Item[], itemDescriptor: Schema) {
|
|
557
557
|
: "encoded" in itemDescriptor
|
558
558
|
? items?.map((e) => itemDescriptor.encoded.encode(e))
|
559
559
|
: isRefEncoded(itemDescriptor)
|
560
|
-
? items?.map((v) =>
|
560
|
+
? items?.map((v) => {
|
561
|
+
if (!v) return null;
|
562
|
+
|
563
|
+
return (v as unknown as CoValue).id;
|
564
|
+
})
|
561
565
|
: (() => {
|
562
566
|
throw new Error("Invalid element descriptor");
|
563
567
|
})();
|
@@ -63,7 +63,7 @@ export function fulfillsDepth(depth: any, value: CoValue): FulfillsDepthResult {
|
|
63
63
|
for (const [key, item] of Object.entries(value)) {
|
64
64
|
const rawValue = map._raw.get(key);
|
65
65
|
|
66
|
-
if (rawValue !== undefined) {
|
66
|
+
if (rawValue !== undefined && rawValue !== null) {
|
67
67
|
if (!item) {
|
68
68
|
if (hasReadAccess(map, key)) {
|
69
69
|
result.status = "unfulfilled";
|
@@ -166,8 +166,22 @@ export function fulfillsDepth(depth: any, value: CoValue): FulfillsDepthResult {
|
|
166
166
|
} else if (value._type === "CoList") {
|
167
167
|
if ("$each" in depth) {
|
168
168
|
const result: FulfillsDepthResult = { status: "fulfilled" };
|
169
|
+
const list = value as CoList;
|
169
170
|
|
170
171
|
for (const [key, item] of (value as CoList).entries()) {
|
172
|
+
const rawValue = list._raw.get(key);
|
173
|
+
|
174
|
+
if (!rawValue) {
|
175
|
+
if (isOptionalField(value, ItemsSym)) {
|
176
|
+
continue;
|
177
|
+
}
|
178
|
+
|
179
|
+
// Throw an error and mark this as unavailable
|
180
|
+
throw new Error(
|
181
|
+
`The ref ${key} on ${list.constructor.name} is required but missing`,
|
182
|
+
);
|
183
|
+
}
|
184
|
+
|
171
185
|
if (hasRefValue(value, key)) {
|
172
186
|
if (!item) {
|
173
187
|
if (hasReadAccess(value, key)) {
|
@@ -417,6 +417,211 @@ describe("subscribeToCoValue", () => {
|
|
417
417
|
|
418
418
|
expect(updateFn).toHaveBeenCalledTimes(1);
|
419
419
|
});
|
420
|
+
|
421
|
+
it("should emit when all the items become available", async () => {
|
422
|
+
class TestMap extends CoMap {
|
423
|
+
value = co.string;
|
424
|
+
}
|
425
|
+
|
426
|
+
class TestList extends CoList.Of(co.ref(TestMap)) {}
|
427
|
+
|
428
|
+
const reader = await createJazzTestAccount({
|
429
|
+
isCurrentActiveAccount: true,
|
430
|
+
});
|
431
|
+
|
432
|
+
const creator = await createJazzTestAccount({
|
433
|
+
isCurrentActiveAccount: true,
|
434
|
+
});
|
435
|
+
|
436
|
+
const everyone = Group.create(creator);
|
437
|
+
everyone.addMember("everyone", "reader");
|
438
|
+
|
439
|
+
const group = Group.create(creator);
|
440
|
+
|
441
|
+
const list = TestList.create(
|
442
|
+
[
|
443
|
+
TestMap.create({ value: "1" }, group),
|
444
|
+
TestMap.create({ value: "2" }, everyone),
|
445
|
+
TestMap.create({ value: "3" }, everyone),
|
446
|
+
TestMap.create({ value: "4" }, everyone),
|
447
|
+
TestMap.create({ value: "5" }, everyone),
|
448
|
+
],
|
449
|
+
everyone,
|
450
|
+
);
|
451
|
+
|
452
|
+
let result = null as Resolved<TestList, { $each: true }> | null;
|
453
|
+
|
454
|
+
const updateFn = vi.fn().mockImplementation((value) => {
|
455
|
+
result = value;
|
456
|
+
});
|
457
|
+
const onUnauthorized = vi.fn();
|
458
|
+
|
459
|
+
const unsubscribe = subscribeToCoValue(
|
460
|
+
TestList,
|
461
|
+
list.id,
|
462
|
+
{
|
463
|
+
loadAs: reader,
|
464
|
+
resolve: {
|
465
|
+
$each: true,
|
466
|
+
},
|
467
|
+
onUnauthorized,
|
468
|
+
},
|
469
|
+
updateFn,
|
470
|
+
);
|
471
|
+
|
472
|
+
onTestFinished(unsubscribe);
|
473
|
+
|
474
|
+
await waitFor(() => {
|
475
|
+
expect(onUnauthorized).toHaveBeenCalled();
|
476
|
+
});
|
477
|
+
|
478
|
+
group.addMember("everyone", "reader");
|
479
|
+
|
480
|
+
await waitFor(() => {
|
481
|
+
expect(updateFn).toHaveBeenCalled();
|
482
|
+
});
|
483
|
+
|
484
|
+
assert(result);
|
485
|
+
|
486
|
+
expect(result[0]?.value).toBe("1");
|
487
|
+
|
488
|
+
expect(updateFn).toHaveBeenCalledTimes(1);
|
489
|
+
});
|
490
|
+
|
491
|
+
it("should handle null values in lists with required refs", async () => {
|
492
|
+
class TestMap extends CoMap {
|
493
|
+
value = co.string;
|
494
|
+
}
|
495
|
+
|
496
|
+
class TestList extends CoList.Of(co.ref(TestMap)) {}
|
497
|
+
|
498
|
+
const reader = await createJazzTestAccount({
|
499
|
+
isCurrentActiveAccount: true,
|
500
|
+
});
|
501
|
+
|
502
|
+
const creator = await createJazzTestAccount({
|
503
|
+
isCurrentActiveAccount: true,
|
504
|
+
});
|
505
|
+
|
506
|
+
const everyone = Group.create(creator);
|
507
|
+
everyone.addMember("everyone", "reader");
|
508
|
+
|
509
|
+
const list = TestList.create(
|
510
|
+
[
|
511
|
+
// TODO: This should be flagged as an error by typescript
|
512
|
+
null,
|
513
|
+
TestMap.create({ value: "2" }, everyone),
|
514
|
+
TestMap.create({ value: "3" }, everyone),
|
515
|
+
TestMap.create({ value: "4" }, everyone),
|
516
|
+
TestMap.create({ value: "5" }, everyone),
|
517
|
+
],
|
518
|
+
everyone,
|
519
|
+
);
|
520
|
+
|
521
|
+
let result = null as Resolved<TestList, { $each: true }> | null;
|
522
|
+
|
523
|
+
const updateFn = vi.fn().mockImplementation((value) => {
|
524
|
+
result = value;
|
525
|
+
});
|
526
|
+
const onUnauthorized = vi.fn();
|
527
|
+
const onUnavailable = vi.fn();
|
528
|
+
|
529
|
+
const unsubscribe = subscribeToCoValue(
|
530
|
+
TestList,
|
531
|
+
list.id,
|
532
|
+
{
|
533
|
+
loadAs: reader,
|
534
|
+
resolve: {
|
535
|
+
$each: true,
|
536
|
+
},
|
537
|
+
onUnauthorized,
|
538
|
+
onUnavailable,
|
539
|
+
},
|
540
|
+
updateFn,
|
541
|
+
);
|
542
|
+
|
543
|
+
onTestFinished(unsubscribe);
|
544
|
+
|
545
|
+
await waitFor(() => {
|
546
|
+
expect(onUnavailable).toHaveBeenCalled();
|
547
|
+
});
|
548
|
+
|
549
|
+
list[0] = TestMap.create({ value: "1" }, everyone);
|
550
|
+
|
551
|
+
await waitFor(() => {
|
552
|
+
expect(updateFn).toHaveBeenCalled();
|
553
|
+
});
|
554
|
+
|
555
|
+
assert(result);
|
556
|
+
|
557
|
+
expect(result[0]?.value).toBe("1");
|
558
|
+
|
559
|
+
expect(updateFn).toHaveBeenCalledTimes(1);
|
560
|
+
});
|
561
|
+
|
562
|
+
it("should handle null values in lists with optional refs", async () => {
|
563
|
+
class TestMap extends CoMap {
|
564
|
+
value = co.string;
|
565
|
+
}
|
566
|
+
|
567
|
+
class TestList extends CoList.Of(co.optional.ref(TestMap)) {}
|
568
|
+
|
569
|
+
const reader = await createJazzTestAccount({
|
570
|
+
isCurrentActiveAccount: true,
|
571
|
+
});
|
572
|
+
|
573
|
+
const creator = await createJazzTestAccount({
|
574
|
+
isCurrentActiveAccount: true,
|
575
|
+
});
|
576
|
+
|
577
|
+
const everyone = Group.create(creator);
|
578
|
+
everyone.addMember("everyone", "reader");
|
579
|
+
|
580
|
+
const list = TestList.create(
|
581
|
+
[
|
582
|
+
null,
|
583
|
+
TestMap.create({ value: "2" }, everyone),
|
584
|
+
TestMap.create({ value: "3" }, everyone),
|
585
|
+
TestMap.create({ value: "4" }, everyone),
|
586
|
+
TestMap.create({ value: "5" }, everyone),
|
587
|
+
],
|
588
|
+
everyone,
|
589
|
+
);
|
590
|
+
|
591
|
+
let result = null as Resolved<TestList, { $each: true }> | null;
|
592
|
+
|
593
|
+
const updateFn = vi.fn().mockImplementation((value) => {
|
594
|
+
result = value;
|
595
|
+
});
|
596
|
+
const onUnauthorized = vi.fn();
|
597
|
+
const onUnavailable = vi.fn();
|
598
|
+
|
599
|
+
const unsubscribe = subscribeToCoValue(
|
600
|
+
TestList,
|
601
|
+
list.id,
|
602
|
+
{
|
603
|
+
loadAs: reader,
|
604
|
+
resolve: {
|
605
|
+
$each: true,
|
606
|
+
},
|
607
|
+
onUnauthorized,
|
608
|
+
onUnavailable,
|
609
|
+
},
|
610
|
+
updateFn,
|
611
|
+
);
|
612
|
+
|
613
|
+
onTestFinished(unsubscribe);
|
614
|
+
|
615
|
+
await waitFor(() => {
|
616
|
+
expect(updateFn).toHaveBeenCalled();
|
617
|
+
});
|
618
|
+
|
619
|
+
assert(result);
|
620
|
+
|
621
|
+
expect(result[0]).toBeNull();
|
622
|
+
|
623
|
+
expect(updateFn).toHaveBeenCalledTimes(1);
|
624
|
+
});
|
420
625
|
});
|
421
626
|
|
422
627
|
describe("createCoValueObservable", () => {
|