@osdk/client 2.5.0-beta.9 → 2.5.0
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/CHANGELOG.md +132 -0
- package/build/browser/MinimalClientContext.js.map +1 -1
- package/build/browser/actions/applyAction.js +0 -4
- package/build/browser/actions/applyAction.js.map +1 -1
- package/build/browser/createClient.js +1 -2
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createMinimalClient.js +1 -2
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/definitions/LinkDefinitions.test.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +0 -17
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/browser/fetchMetadata.test.js +4 -0
- package/build/browser/fetchMetadata.test.js.map +1 -1
- package/build/browser/index.js +1 -1
- package/build/browser/index.js.map +1 -1
- package/build/browser/object/aggregate.js +0 -2
- package/build/browser/object/aggregate.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +5 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/object/fetchPage.js +5 -7
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/object/mediaUpload.js +0 -3
- package/build/browser/object/mediaUpload.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +31 -9
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/observable/ObjectSetPayload.js +2 -0
- package/build/browser/observable/ObjectSetPayload.js.map +1 -0
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/computeObjectSetCacheKey.js +64 -0
- package/build/browser/observable/computeObjectSetCacheKey.js.map +1 -0
- package/build/browser/observable/internal/Changes.js +3 -0
- package/build/browser/observable/internal/Changes.js.map +1 -1
- package/build/browser/observable/internal/KnownCacheKey.js.map +1 -1
- package/build/browser/observable/internal/ObservableClientImpl.js +17 -0
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/Query.js +18 -1
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/Store.invalidation.test.js +165 -0
- package/build/browser/observable/internal/Store.invalidation.test.js.map +1 -1
- package/build/browser/observable/internal/Store.js +23 -0
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetCacheKey.js +2 -0
- package/build/browser/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js +69 -0
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js +151 -0
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetQueryOptions.js +2 -0
- package/build/browser/observable/internal/objectset/ObjectSetQueryOptions.js.map +1 -0
- package/build/browser/ontology/loadActionMetadata.js +1 -3
- package/build/browser/ontology/loadActionMetadata.js.map +1 -1
- package/build/browser/ontology/loadFullObjectMetadata.js +1 -2
- package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/browser/ontology/loadInterfaceMetadata.js +1 -2
- package/build/browser/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/browser/public/unstable-do-not-use.js +1 -0
- package/build/browser/public/unstable-do-not-use.js.map +1 -1
- package/build/browser/util/UserAgent.js +2 -2
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/browser/util/exponentialBackoff.js +51 -0
- package/build/browser/util/exponentialBackoff.js.map +1 -0
- package/build/browser/util/exponentialBackoff.test.js +81 -0
- package/build/browser/util/exponentialBackoff.test.js.map +1 -0
- package/build/browser/util/toDataValue.js +1 -15
- package/build/browser/util/toDataValue.js.map +1 -1
- package/build/browser/util/toDataValue.test.js +2 -42
- package/build/browser/util/toDataValue.test.js.map +1 -1
- package/build/cjs/{chunk-MKL3HEQ5.cjs → chunk-KODTFRP3.cjs} +105 -71
- package/build/cjs/chunk-KODTFRP3.cjs.map +1 -0
- package/build/cjs/{chunk-HCCGD2AP.cjs → chunk-UMET26AF.cjs} +68 -91
- package/build/cjs/chunk-UMET26AF.cjs.map +1 -0
- package/build/cjs/{createClient-mOlFts15.d.cts → createClient-BJo8T7Js.d.cts} +0 -1
- package/build/cjs/index.cjs +7 -11
- package/build/cjs/index.d.cts +2 -2
- package/build/cjs/public/internal.cjs +8 -8
- package/build/cjs/public/unstable-do-not-use.cjs +429 -156
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +79 -7
- package/build/esm/MinimalClientContext.js.map +1 -1
- package/build/esm/actions/applyAction.js +0 -4
- package/build/esm/actions/applyAction.js.map +1 -1
- package/build/esm/createClient.js +1 -2
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createMinimalClient.js +1 -2
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/definitions/LinkDefinitions.test.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +0 -17
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/esm/fetchMetadata.test.js +4 -0
- package/build/esm/fetchMetadata.test.js.map +1 -1
- package/build/esm/index.js +1 -1
- package/build/esm/index.js.map +1 -1
- package/build/esm/object/aggregate.js +0 -2
- package/build/esm/object/aggregate.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +5 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/object/fetchPage.js +5 -7
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/object/mediaUpload.js +0 -3
- package/build/esm/object/mediaUpload.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +31 -9
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/observable/ObjectSetPayload.js +2 -0
- package/build/esm/observable/ObjectSetPayload.js.map +1 -0
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/computeObjectSetCacheKey.js +64 -0
- package/build/esm/observable/computeObjectSetCacheKey.js.map +1 -0
- package/build/esm/observable/internal/Changes.js +3 -0
- package/build/esm/observable/internal/Changes.js.map +1 -1
- package/build/esm/observable/internal/KnownCacheKey.js.map +1 -1
- package/build/esm/observable/internal/ObservableClientImpl.js +17 -0
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/Query.js +18 -1
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/Store.invalidation.test.js +165 -0
- package/build/esm/observable/internal/Store.invalidation.test.js.map +1 -1
- package/build/esm/observable/internal/Store.js +23 -0
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetCacheKey.js +2 -0
- package/build/esm/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js +69 -0
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js +151 -0
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetQueryOptions.js +2 -0
- package/build/esm/observable/internal/objectset/ObjectSetQueryOptions.js.map +1 -0
- package/build/esm/ontology/loadActionMetadata.js +1 -3
- package/build/esm/ontology/loadActionMetadata.js.map +1 -1
- package/build/esm/ontology/loadFullObjectMetadata.js +1 -2
- package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/esm/ontology/loadInterfaceMetadata.js +1 -2
- package/build/esm/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/esm/public/unstable-do-not-use.js +1 -0
- package/build/esm/public/unstable-do-not-use.js.map +1 -1
- package/build/esm/util/UserAgent.js +2 -2
- package/build/esm/util/UserAgent.js.map +1 -1
- package/build/esm/util/exponentialBackoff.js +51 -0
- package/build/esm/util/exponentialBackoff.js.map +1 -0
- package/build/esm/util/exponentialBackoff.test.js +81 -0
- package/build/esm/util/exponentialBackoff.test.js.map +1 -0
- package/build/esm/util/toDataValue.js +1 -15
- package/build/esm/util/toDataValue.js.map +1 -1
- package/build/esm/util/toDataValue.test.js +2 -42
- package/build/esm/util/toDataValue.test.js.map +1 -1
- package/build/types/MinimalClientContext.d.ts +0 -1
- package/build/types/MinimalClientContext.d.ts.map +1 -1
- package/build/types/actions/applyAction.d.ts.map +1 -1
- package/build/types/createClient.d.ts +0 -1
- package/build/types/createClient.d.ts.map +1 -1
- package/build/types/index.d.ts +1 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/object/fetchPage.d.ts.map +1 -1
- package/build/types/object/mediaUpload.d.ts +1 -2
- package/build/types/object/mediaUpload.d.ts.map +1 -1
- package/build/types/observable/ObjectSetPayload.d.ts +5 -0
- package/build/types/observable/ObjectSetPayload.d.ts.map +1 -0
- package/build/types/observable/ObservableClient.d.ts +54 -1
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/computeObjectSetCacheKey.d.ts +16 -0
- package/build/types/observable/computeObjectSetCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/Changes.d.ts +5 -3
- package/build/types/observable/internal/Changes.d.ts.map +1 -1
- package/build/types/observable/internal/KnownCacheKey.d.ts +2 -1
- package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- package/build/types/observable/internal/Store.d.ts +5 -1
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts +16 -0
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts +19 -0
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts +34 -0
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetQueryOptions.d.ts +18 -0
- package/build/types/observable/internal/objectset/ObjectSetQueryOptions.d.ts.map +1 -0
- package/build/types/public/unstable-do-not-use.d.ts +2 -1
- package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
- package/build/types/util/exponentialBackoff.d.ts +14 -0
- package/build/types/util/exponentialBackoff.d.ts.map +1 -0
- package/build/types/util/exponentialBackoff.test.d.ts +1 -0
- package/build/types/util/exponentialBackoff.test.d.ts.map +1 -0
- package/package.json +11 -11
- package/build/cjs/chunk-HCCGD2AP.cjs.map +0 -1
- package/build/cjs/chunk-MKL3HEQ5.cjs.map +0 -1
|
@@ -477,5 +477,170 @@ describe("Store Invalidation Type Isolation", () => {
|
|
|
477
477
|
expect(officeOccupantsLinkSubFn.next).not.toHaveBeenCalled();
|
|
478
478
|
});
|
|
479
479
|
});
|
|
480
|
+
describe("invalidateAll", () => {
|
|
481
|
+
it("should invalidate all cached queries", async () => {
|
|
482
|
+
const {
|
|
483
|
+
subFn: empSubFn
|
|
484
|
+
} = await expectStandardObserveObject({
|
|
485
|
+
cache,
|
|
486
|
+
type: Employee,
|
|
487
|
+
primaryKey: EMPLOYEE_1_ID
|
|
488
|
+
});
|
|
489
|
+
const {
|
|
490
|
+
subFn: officeSubFn
|
|
491
|
+
} = await expectStandardObserveObject({
|
|
492
|
+
cache,
|
|
493
|
+
type: Office,
|
|
494
|
+
primaryKey: OFFICE_1_ID
|
|
495
|
+
});
|
|
496
|
+
const {
|
|
497
|
+
subFn: todoSubFn
|
|
498
|
+
} = await expectStandardObserveObject({
|
|
499
|
+
cache,
|
|
500
|
+
type: Todo,
|
|
501
|
+
primaryKey: TODO_1_ID
|
|
502
|
+
});
|
|
503
|
+
empSubFn.next.mockClear();
|
|
504
|
+
officeSubFn.next.mockClear();
|
|
505
|
+
todoSubFn.next.mockClear();
|
|
506
|
+
await cache.invalidateAll();
|
|
507
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
508
|
+
expect(empSubFn.next).toHaveBeenCalled();
|
|
509
|
+
expect(officeSubFn.next).toHaveBeenCalled();
|
|
510
|
+
expect(todoSubFn.next).toHaveBeenCalled();
|
|
511
|
+
});
|
|
512
|
+
it("should invalidate all list queries", async () => {
|
|
513
|
+
const empListSubFn = mockListSubCallback();
|
|
514
|
+
defer(cache.lists.observe({
|
|
515
|
+
type: Employee,
|
|
516
|
+
where: {},
|
|
517
|
+
orderBy: {},
|
|
518
|
+
pageSize: 10
|
|
519
|
+
}, empListSubFn));
|
|
520
|
+
const officeListSubFn = mockListSubCallback();
|
|
521
|
+
defer(cache.lists.observe({
|
|
522
|
+
type: Office,
|
|
523
|
+
where: {},
|
|
524
|
+
orderBy: {},
|
|
525
|
+
pageSize: 10
|
|
526
|
+
}, officeListSubFn));
|
|
527
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
528
|
+
empListSubFn.next.mockClear();
|
|
529
|
+
officeListSubFn.next.mockClear();
|
|
530
|
+
await cache.invalidateAll();
|
|
531
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
532
|
+
expect(empListSubFn.next).toHaveBeenCalled();
|
|
533
|
+
expect(officeListSubFn.next).toHaveBeenCalled();
|
|
534
|
+
});
|
|
535
|
+
});
|
|
536
|
+
describe("invalidateObjects", () => {
|
|
537
|
+
it("should invalidate a single object", async () => {
|
|
538
|
+
const {
|
|
539
|
+
subFn: empSubFn
|
|
540
|
+
} = await expectStandardObserveObject({
|
|
541
|
+
cache,
|
|
542
|
+
type: Employee,
|
|
543
|
+
primaryKey: EMPLOYEE_1_ID
|
|
544
|
+
});
|
|
545
|
+
const {
|
|
546
|
+
subFn: emp2SubFn
|
|
547
|
+
} = await expectStandardObserveObject({
|
|
548
|
+
cache,
|
|
549
|
+
type: Employee,
|
|
550
|
+
primaryKey: EMPLOYEE_2_ID
|
|
551
|
+
});
|
|
552
|
+
empSubFn.next.mockClear();
|
|
553
|
+
emp2SubFn.next.mockClear();
|
|
554
|
+
const emp1 = await client(Employee).fetchOne(EMPLOYEE_1_ID);
|
|
555
|
+
!emp1 ? process.env.NODE_ENV !== "production" ? invariant(false) : invariant(false) : void 0;
|
|
556
|
+
await cache.invalidateObjects(emp1);
|
|
557
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
558
|
+
expect(empSubFn.next).toHaveBeenCalled();
|
|
559
|
+
expect(emp2SubFn.next).not.toHaveBeenCalled();
|
|
560
|
+
});
|
|
561
|
+
it("should invalidate multiple objects", async () => {
|
|
562
|
+
const {
|
|
563
|
+
subFn: empSubFn
|
|
564
|
+
} = await expectStandardObserveObject({
|
|
565
|
+
cache,
|
|
566
|
+
type: Employee,
|
|
567
|
+
primaryKey: EMPLOYEE_1_ID
|
|
568
|
+
});
|
|
569
|
+
const {
|
|
570
|
+
subFn: emp2SubFn
|
|
571
|
+
} = await expectStandardObserveObject({
|
|
572
|
+
cache,
|
|
573
|
+
type: Employee,
|
|
574
|
+
primaryKey: EMPLOYEE_2_ID
|
|
575
|
+
});
|
|
576
|
+
const {
|
|
577
|
+
subFn: officeSubFn
|
|
578
|
+
} = await expectStandardObserveObject({
|
|
579
|
+
cache,
|
|
580
|
+
type: Office,
|
|
581
|
+
primaryKey: OFFICE_1_ID
|
|
582
|
+
});
|
|
583
|
+
empSubFn.next.mockClear();
|
|
584
|
+
emp2SubFn.next.mockClear();
|
|
585
|
+
officeSubFn.next.mockClear();
|
|
586
|
+
const emp1 = await client(Employee).fetchOne(EMPLOYEE_1_ID);
|
|
587
|
+
const emp2 = await client(Employee).fetchOne(EMPLOYEE_2_ID);
|
|
588
|
+
!emp1 ? process.env.NODE_ENV !== "production" ? invariant(false) : invariant(false) : void 0;
|
|
589
|
+
!emp2 ? process.env.NODE_ENV !== "production" ? invariant(false) : invariant(false) : void 0;
|
|
590
|
+
await cache.invalidateObjects([emp1, emp2]);
|
|
591
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
592
|
+
expect(empSubFn.next).toHaveBeenCalled();
|
|
593
|
+
expect(emp2SubFn.next).toHaveBeenCalled();
|
|
594
|
+
expect(officeSubFn.next).not.toHaveBeenCalled();
|
|
595
|
+
});
|
|
596
|
+
it("should invalidate mixed object types", async () => {
|
|
597
|
+
const {
|
|
598
|
+
subFn: empSubFn
|
|
599
|
+
} = await expectStandardObserveObject({
|
|
600
|
+
cache,
|
|
601
|
+
type: Employee,
|
|
602
|
+
primaryKey: EMPLOYEE_1_ID
|
|
603
|
+
});
|
|
604
|
+
const {
|
|
605
|
+
subFn: officeSubFn
|
|
606
|
+
} = await expectStandardObserveObject({
|
|
607
|
+
cache,
|
|
608
|
+
type: Office,
|
|
609
|
+
primaryKey: OFFICE_1_ID
|
|
610
|
+
});
|
|
611
|
+
const {
|
|
612
|
+
subFn: todoSubFn
|
|
613
|
+
} = await expectStandardObserveObject({
|
|
614
|
+
cache,
|
|
615
|
+
type: Todo,
|
|
616
|
+
primaryKey: TODO_1_ID
|
|
617
|
+
});
|
|
618
|
+
empSubFn.next.mockClear();
|
|
619
|
+
officeSubFn.next.mockClear();
|
|
620
|
+
todoSubFn.next.mockClear();
|
|
621
|
+
const emp1 = await client(Employee).fetchOne(EMPLOYEE_1_ID);
|
|
622
|
+
const office1 = await client(Office).fetchOne(OFFICE_1_ID);
|
|
623
|
+
!emp1 ? process.env.NODE_ENV !== "production" ? invariant(false) : invariant(false) : void 0;
|
|
624
|
+
!office1 ? process.env.NODE_ENV !== "production" ? invariant(false) : invariant(false) : void 0;
|
|
625
|
+
await cache.invalidateObjects([emp1, office1]);
|
|
626
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
627
|
+
expect(empSubFn.next).toHaveBeenCalled();
|
|
628
|
+
expect(officeSubFn.next).toHaveBeenCalled();
|
|
629
|
+
expect(todoSubFn.next).not.toHaveBeenCalled();
|
|
630
|
+
});
|
|
631
|
+
it("should handle empty array", async () => {
|
|
632
|
+
const {
|
|
633
|
+
subFn: empSubFn
|
|
634
|
+
} = await expectStandardObserveObject({
|
|
635
|
+
cache,
|
|
636
|
+
type: Employee,
|
|
637
|
+
primaryKey: EMPLOYEE_1_ID
|
|
638
|
+
});
|
|
639
|
+
empSubFn.next.mockClear();
|
|
640
|
+
await cache.invalidateObjects([]);
|
|
641
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
642
|
+
expect(empSubFn.next).not.toHaveBeenCalled();
|
|
643
|
+
});
|
|
644
|
+
});
|
|
480
645
|
});
|
|
481
646
|
//# sourceMappingURL=Store.invalidation.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.invalidation.test.js","names":["Employee","Office","Todo","FauxFoundry","ontologies","startNodeApiServer","stubData","invariant","beforeAll","beforeEach","describe","expect","it","vi","createClient","TestLogger","Store","createDefer","mockListSubCallback","updateList","expectStandardObserveLink","expectStandardObserveObject","defer","logger","EMPLOYEE_1_ID","EMPLOYEE_2_ID","OFFICE_1_ID","OFFICE_2_ID","TODO_1_ID","TODO_2_ID","client","cache","fauxFoundry","setupOntology","fauxOntology","getDefaultOntology","addEmployeeOntology","registerObjectType","todoWithLinkTypes","registerActionType","editTodo","actionTypeV2","b","payload","id","other","parameters","modifyObject","apiName","setupTestObjects","dataStore","getDefaultDataStore","emp1","registerObject","employeeId","fullName","emp2","office1","officeId","name","office2","todo1","$apiName","text","todo2","registerLink","testSetup","apiServer","close","resetAllMocks","undefined","emp1Payload","subFn","empSubFn","type","primaryKey","object","process","env","NODE_ENV","office1Payload","officeSubFn","next","mockClear","invalidateObjectType","Promise","resolve","setTimeout","toHaveBeenCalled","not","todo1Payload","todoSubFn","fetchOne","where","orderBy","empListSubFn","lists","observe","mode","officeListSubFn","linkSubFn","officeLinkSubFn","store","srcObject","srcLinkName","targetType","expected","objectContaining","$primaryKey","todoListSubFn","employeeOfficeLinkSubFn","officeOccupantsLinkSubFn"],"sources":["Store.invalidation.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Employee, Office, Todo } from \"@osdk/client.test.ontology\";\nimport {\n FauxFoundry,\n ontologies,\n startNodeApiServer,\n stubData,\n} from \"@osdk/shared.test\";\nimport invariant from \"tiny-invariant\";\nimport { beforeAll, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { createClient } from \"../../createClient.js\";\nimport { TestLogger } from \"../../logger/TestLogger.js\";\nimport { Store } from \"./Store.js\";\nimport { createDefer, mockListSubCallback, updateList } from \"./testUtils.js\";\nimport { expectStandardObserveLink } from \"./testUtils/observeLink/expectStandardObserveLink.js\";\nimport { expectStandardObserveObject } from \"./testUtils/observeObject/expectStandardObserveObject.js\";\n\n// Defer utility to track subscriptions for cleanup\nconst defer = createDefer();\n\n// Logger setup\nconst logger = new TestLogger({}, {\n // level: \"debug\",\n});\n\n// Constants for test objects\nconst EMPLOYEE_1_ID = 1;\nconst EMPLOYEE_2_ID = 2;\nconst OFFICE_1_ID = \"101\";\nconst OFFICE_2_ID = \"102\";\nconst TODO_1_ID = 201;\nconst TODO_2_ID = 202;\n\ndescribe(\"Store Invalidation Type Isolation\", () => {\n let client: ReturnType<typeof createClient>;\n let cache: Store;\n let fauxFoundry: FauxFoundry;\n\n function setupOntology(fauxFoundry: FauxFoundry) {\n const fauxOntology = fauxFoundry.getDefaultOntology();\n ontologies.addEmployeeOntology(fauxOntology);\n\n fauxFoundry.getDefaultOntology().registerObjectType(\n stubData.todoWithLinkTypes,\n );\n\n fauxFoundry.getDefaultOntology().registerActionType(\n stubData.editTodo.actionTypeV2,\n (b, payload) => {\n const { id, ...other } = payload.parameters;\n b.modifyObject<Todo>(Todo.apiName, id, { ...other });\n },\n );\n }\n\n function setupTestObjects(fauxFoundry: FauxFoundry) {\n const dataStore = fauxFoundry.getDefaultDataStore();\n\n // Create Employees\n const emp1 = dataStore.registerObject(Employee, {\n employeeId: EMPLOYEE_1_ID,\n fullName: \"Employee One\",\n });\n\n const emp2 = dataStore.registerObject(Employee, {\n employeeId: EMPLOYEE_2_ID,\n fullName: \"Employee Two\",\n });\n\n // Create Offices\n const office1 = dataStore.registerObject(Office, {\n officeId: OFFICE_1_ID,\n name: \"Office One\",\n });\n\n const office2 = dataStore.registerObject(Office, {\n officeId: OFFICE_2_ID,\n name: \"Office Two\",\n });\n\n // Create Todos\n const todo1 = dataStore.registerObject(Todo, {\n $apiName: \"Todo\",\n id: TODO_1_ID,\n text: \"Todo One\",\n });\n\n const todo2 = dataStore.registerObject(Todo, {\n $apiName: \"Todo\",\n id: TODO_2_ID,\n text: \"Todo Two\",\n });\n\n // Link employees to offices\n dataStore.registerLink(emp1, \"officeLink\", office1, \"occupants\");\n dataStore.registerLink(emp2, \"officeLink\", office2, \"occupants\");\n\n // Link employees to todos (we're not using these links in this test, but showing different link patterns)\n // Note: There are no direct Todo-Employee links in the test ontology\n }\n\n beforeAll(async () => {\n // Set up the mock environment and client\n const testSetup = startNodeApiServer(\n new FauxFoundry(\"https://stack.palantir.com/\"),\n createClient,\n { logger },\n );\n ({ client, fauxFoundry } = testSetup);\n\n // Set up the test ontology and data\n setupOntology(fauxFoundry);\n setupTestObjects(fauxFoundry);\n\n return () => {\n testSetup.apiServer.close();\n };\n });\n\n beforeEach(() => {\n vi.resetAllMocks();\n cache = new Store(client);\n return () => {\n cache = undefined!;\n };\n });\n\n describe(\"Object Type Isolation\", () => {\n it(\"invalidating Employee type should not affect Office objects\", async () => {\n // Set up observations for an Employee and Office object\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n // Clear the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n\n // Invalidate only the Employee type\n await cache.invalidateObjectType(Employee, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Employee should be updated\n expect(empSubFn.next).toHaveBeenCalled();\n\n // Office object should NOT receive any updates\n expect(officeSubFn.next).not.toHaveBeenCalled();\n });\n\n it(\"invalidating Office type should not affect Employee objects\", async () => {\n // Set up observations for an Employee and Office object\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n // Clear the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n\n // Invalidate only the Office type\n await cache.invalidateObjectType(Office, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Office should be updated\n expect(officeSubFn.next).toHaveBeenCalled();\n\n // Employee object should NOT receive any updates\n expect(empSubFn.next).not.toHaveBeenCalled();\n });\n\n it(\"invalidating Todo type should not affect Employee or Office objects\", async () => {\n // Set up observations for Employee, Office, and Todo objects\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n const { payload: todo1Payload, subFn: todoSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Todo,\n primaryKey: TODO_1_ID,\n });\n const todo1 = todo1Payload?.object;\n invariant(todo1);\n\n // Clear the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n todoSubFn.next.mockClear();\n\n // Invalidate only the Todo type\n await cache.invalidateObjectType(Todo, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Todo should be updated\n expect(todoSubFn.next).toHaveBeenCalled();\n\n // Employee and Office objects should NOT receive any updates\n expect(empSubFn.next).not.toHaveBeenCalled();\n expect(officeSubFn.next).not.toHaveBeenCalled();\n });\n });\n\n describe(\"List Query Isolation\", () => {\n it(\"invalidating Employee type should only affect Employee lists\", async () => {\n // Pre-seed the cache with lists - need to fetch the objects first to get proper instances\n const emp1 = await client(Employee).fetchOne(EMPLOYEE_1_ID);\n const emp2 = await client(Employee).fetchOne(EMPLOYEE_2_ID);\n const office1 = await client(Office).fetchOne(OFFICE_1_ID);\n const office2 = await client(Office).fetchOne(OFFICE_2_ID);\n\n updateList(cache, { type: Employee, where: {}, orderBy: {} }, [\n emp1,\n emp2,\n ]);\n updateList(cache, { type: Office, where: {}, orderBy: {} }, [\n office1,\n office2,\n ]);\n\n // Set up list observations\n const empListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, empListSubFn));\n\n const officeListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Office,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, officeListSubFn));\n\n // Wait for the initial calls and clear them\n await new Promise(resolve => setTimeout(resolve, 100));\n empListSubFn.next.mockClear();\n officeListSubFn.next.mockClear();\n\n // Invalidate only the Employee type\n await cache.invalidateObjectType(Employee, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Employee list should be updated\n expect(empListSubFn.next).toHaveBeenCalled();\n\n // Office list should NOT be invalidated\n expect(officeListSubFn.next).not.toHaveBeenCalled();\n });\n });\n\n describe(\"Link Query Isolation\", () => {\n it(\"basic source object filtering works for direct invalidation\", async () => {\n // Get an Office object that has Employee occupants\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n // Get an Employee object\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n // Set up observation of Employee -> Office link\n const { linkSubFn: officeLinkSubFn } = await expectStandardObserveLink({\n store: cache,\n srcObject: emp1,\n srcLinkName: \"officeLink\",\n targetType: Office,\n expected: [expect.objectContaining({ $primaryKey: OFFICE_1_ID })],\n });\n\n // Clear initial calls\n officeSubFn.next.mockClear();\n empSubFn.next.mockClear();\n officeLinkSubFn.next.mockClear();\n\n // Invalidate the Employee type\n await cache.invalidateObjectType(Employee, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Employee object should be invalidated\n expect(empSubFn.next).toHaveBeenCalled();\n\n // Employee -> Office link (with Employee source) should be invalidated\n // because its source is an Employee object\n expect(officeLinkSubFn.next).toHaveBeenCalled();\n });\n });\n\n describe(\"Complex Multi-Type Scenario\", () => {\n it(\"should correctly isolate invalidation across multiple related objects\", async () => {\n // Set up observations for all three object types\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n const { payload: todo1Payload, subFn: todoSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Todo,\n primaryKey: TODO_1_ID,\n });\n const todo1 = todo1Payload?.object;\n invariant(todo1);\n\n // Set up list observations\n const empListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, empListSubFn));\n\n const officeListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Office,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, officeListSubFn));\n\n const todoListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Todo,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, todoListSubFn));\n\n // Set up link observations\n const { linkSubFn: employeeOfficeLinkSubFn } =\n await expectStandardObserveLink({\n store: cache,\n srcObject: emp1,\n srcLinkName: \"officeLink\",\n targetType: Office,\n expected: [expect.objectContaining({ $primaryKey: OFFICE_1_ID })],\n });\n\n // Setup another link observation for the test\n const { linkSubFn: officeOccupantsLinkSubFn } =\n await expectStandardObserveLink({\n store: cache,\n srcObject: office1,\n srcLinkName: \"occupants\",\n targetType: Employee,\n expected: [expect.objectContaining({ $primaryKey: EMPLOYEE_1_ID })],\n });\n\n // Clear all the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n todoSubFn.next.mockClear();\n empListSubFn.next.mockClear();\n officeListSubFn.next.mockClear();\n todoListSubFn.next.mockClear();\n employeeOfficeLinkSubFn.next.mockClear();\n officeOccupantsLinkSubFn.next.mockClear();\n\n // Invalidate only the Todo type\n await cache.invalidateObjectType(Todo, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Todo object and list should be invalidated\n expect(todoSubFn.next).toHaveBeenCalled();\n expect(todoListSubFn.next).toHaveBeenCalled();\n\n // All Employee and Office related items should NOT be invalidated\n expect(empSubFn.next).not.toHaveBeenCalled();\n expect(officeSubFn.next).not.toHaveBeenCalled();\n expect(empListSubFn.next).not.toHaveBeenCalled();\n expect(officeListSubFn.next).not.toHaveBeenCalled();\n expect(employeeOfficeLinkSubFn.next).not.toHaveBeenCalled();\n expect(officeOccupantsLinkSubFn.next).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Store.invalidation.test.js","names":["Employee","Office","Todo","FauxFoundry","ontologies","startNodeApiServer","stubData","invariant","beforeAll","beforeEach","describe","expect","it","vi","createClient","TestLogger","Store","createDefer","mockListSubCallback","updateList","expectStandardObserveLink","expectStandardObserveObject","defer","logger","EMPLOYEE_1_ID","EMPLOYEE_2_ID","OFFICE_1_ID","OFFICE_2_ID","TODO_1_ID","TODO_2_ID","client","cache","fauxFoundry","setupOntology","fauxOntology","getDefaultOntology","addEmployeeOntology","registerObjectType","todoWithLinkTypes","registerActionType","editTodo","actionTypeV2","b","payload","id","other","parameters","modifyObject","apiName","setupTestObjects","dataStore","getDefaultDataStore","emp1","registerObject","employeeId","fullName","emp2","office1","officeId","name","office2","todo1","$apiName","text","todo2","registerLink","testSetup","apiServer","close","resetAllMocks","undefined","emp1Payload","subFn","empSubFn","type","primaryKey","object","process","env","NODE_ENV","office1Payload","officeSubFn","next","mockClear","invalidateObjectType","Promise","resolve","setTimeout","toHaveBeenCalled","not","todo1Payload","todoSubFn","fetchOne","where","orderBy","empListSubFn","lists","observe","mode","officeListSubFn","linkSubFn","officeLinkSubFn","store","srcObject","srcLinkName","targetType","expected","objectContaining","$primaryKey","todoListSubFn","employeeOfficeLinkSubFn","officeOccupantsLinkSubFn","invalidateAll","pageSize","emp2SubFn","invalidateObjects"],"sources":["Store.invalidation.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Employee, Office, Todo } from \"@osdk/client.test.ontology\";\nimport {\n FauxFoundry,\n ontologies,\n startNodeApiServer,\n stubData,\n} from \"@osdk/shared.test\";\nimport invariant from \"tiny-invariant\";\nimport { beforeAll, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { createClient } from \"../../createClient.js\";\nimport { TestLogger } from \"../../logger/TestLogger.js\";\nimport { Store } from \"./Store.js\";\nimport { createDefer, mockListSubCallback, updateList } from \"./testUtils.js\";\nimport { expectStandardObserveLink } from \"./testUtils/observeLink/expectStandardObserveLink.js\";\nimport { expectStandardObserveObject } from \"./testUtils/observeObject/expectStandardObserveObject.js\";\n\n// Defer utility to track subscriptions for cleanup\nconst defer = createDefer();\n\n// Logger setup\nconst logger = new TestLogger({}, {\n // level: \"debug\",\n});\n\n// Constants for test objects\nconst EMPLOYEE_1_ID = 1;\nconst EMPLOYEE_2_ID = 2;\nconst OFFICE_1_ID = \"101\";\nconst OFFICE_2_ID = \"102\";\nconst TODO_1_ID = 201;\nconst TODO_2_ID = 202;\n\ndescribe(\"Store Invalidation Type Isolation\", () => {\n let client: ReturnType<typeof createClient>;\n let cache: Store;\n let fauxFoundry: FauxFoundry;\n\n function setupOntology(fauxFoundry: FauxFoundry) {\n const fauxOntology = fauxFoundry.getDefaultOntology();\n ontologies.addEmployeeOntology(fauxOntology);\n\n fauxFoundry.getDefaultOntology().registerObjectType(\n stubData.todoWithLinkTypes,\n );\n\n fauxFoundry.getDefaultOntology().registerActionType(\n stubData.editTodo.actionTypeV2,\n (b, payload) => {\n const { id, ...other } = payload.parameters;\n b.modifyObject<Todo>(Todo.apiName, id, { ...other });\n },\n );\n }\n\n function setupTestObjects(fauxFoundry: FauxFoundry) {\n const dataStore = fauxFoundry.getDefaultDataStore();\n\n // Create Employees\n const emp1 = dataStore.registerObject(Employee, {\n employeeId: EMPLOYEE_1_ID,\n fullName: \"Employee One\",\n });\n\n const emp2 = dataStore.registerObject(Employee, {\n employeeId: EMPLOYEE_2_ID,\n fullName: \"Employee Two\",\n });\n\n // Create Offices\n const office1 = dataStore.registerObject(Office, {\n officeId: OFFICE_1_ID,\n name: \"Office One\",\n });\n\n const office2 = dataStore.registerObject(Office, {\n officeId: OFFICE_2_ID,\n name: \"Office Two\",\n });\n\n // Create Todos\n const todo1 = dataStore.registerObject(Todo, {\n $apiName: \"Todo\",\n id: TODO_1_ID,\n text: \"Todo One\",\n });\n\n const todo2 = dataStore.registerObject(Todo, {\n $apiName: \"Todo\",\n id: TODO_2_ID,\n text: \"Todo Two\",\n });\n\n // Link employees to offices\n dataStore.registerLink(emp1, \"officeLink\", office1, \"occupants\");\n dataStore.registerLink(emp2, \"officeLink\", office2, \"occupants\");\n\n // Link employees to todos (we're not using these links in this test, but showing different link patterns)\n // Note: There are no direct Todo-Employee links in the test ontology\n }\n\n beforeAll(async () => {\n // Set up the mock environment and client\n const testSetup = startNodeApiServer(\n new FauxFoundry(\"https://stack.palantir.com/\"),\n createClient,\n { logger },\n );\n ({ client, fauxFoundry } = testSetup);\n\n // Set up the test ontology and data\n setupOntology(fauxFoundry);\n setupTestObjects(fauxFoundry);\n\n return () => {\n testSetup.apiServer.close();\n };\n });\n\n beforeEach(() => {\n vi.resetAllMocks();\n cache = new Store(client);\n return () => {\n cache = undefined!;\n };\n });\n\n describe(\"Object Type Isolation\", () => {\n it(\"invalidating Employee type should not affect Office objects\", async () => {\n // Set up observations for an Employee and Office object\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n // Clear the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n\n // Invalidate only the Employee type\n await cache.invalidateObjectType(Employee, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Employee should be updated\n expect(empSubFn.next).toHaveBeenCalled();\n\n // Office object should NOT receive any updates\n expect(officeSubFn.next).not.toHaveBeenCalled();\n });\n\n it(\"invalidating Office type should not affect Employee objects\", async () => {\n // Set up observations for an Employee and Office object\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n // Clear the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n\n // Invalidate only the Office type\n await cache.invalidateObjectType(Office, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Office should be updated\n expect(officeSubFn.next).toHaveBeenCalled();\n\n // Employee object should NOT receive any updates\n expect(empSubFn.next).not.toHaveBeenCalled();\n });\n\n it(\"invalidating Todo type should not affect Employee or Office objects\", async () => {\n // Set up observations for Employee, Office, and Todo objects\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n const { payload: todo1Payload, subFn: todoSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Todo,\n primaryKey: TODO_1_ID,\n });\n const todo1 = todo1Payload?.object;\n invariant(todo1);\n\n // Clear the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n todoSubFn.next.mockClear();\n\n // Invalidate only the Todo type\n await cache.invalidateObjectType(Todo, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Todo should be updated\n expect(todoSubFn.next).toHaveBeenCalled();\n\n // Employee and Office objects should NOT receive any updates\n expect(empSubFn.next).not.toHaveBeenCalled();\n expect(officeSubFn.next).not.toHaveBeenCalled();\n });\n });\n\n describe(\"List Query Isolation\", () => {\n it(\"invalidating Employee type should only affect Employee lists\", async () => {\n // Pre-seed the cache with lists - need to fetch the objects first to get proper instances\n const emp1 = await client(Employee).fetchOne(EMPLOYEE_1_ID);\n const emp2 = await client(Employee).fetchOne(EMPLOYEE_2_ID);\n const office1 = await client(Office).fetchOne(OFFICE_1_ID);\n const office2 = await client(Office).fetchOne(OFFICE_2_ID);\n\n updateList(cache, { type: Employee, where: {}, orderBy: {} }, [\n emp1,\n emp2,\n ]);\n updateList(cache, { type: Office, where: {}, orderBy: {} }, [\n office1,\n office2,\n ]);\n\n // Set up list observations\n const empListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, empListSubFn));\n\n const officeListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Office,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, officeListSubFn));\n\n // Wait for the initial calls and clear them\n await new Promise(resolve => setTimeout(resolve, 100));\n empListSubFn.next.mockClear();\n officeListSubFn.next.mockClear();\n\n // Invalidate only the Employee type\n await cache.invalidateObjectType(Employee, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Employee list should be updated\n expect(empListSubFn.next).toHaveBeenCalled();\n\n // Office list should NOT be invalidated\n expect(officeListSubFn.next).not.toHaveBeenCalled();\n });\n });\n\n describe(\"Link Query Isolation\", () => {\n it(\"basic source object filtering works for direct invalidation\", async () => {\n // Get an Office object that has Employee occupants\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n // Get an Employee object\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n // Set up observation of Employee -> Office link\n const { linkSubFn: officeLinkSubFn } = await expectStandardObserveLink({\n store: cache,\n srcObject: emp1,\n srcLinkName: \"officeLink\",\n targetType: Office,\n expected: [expect.objectContaining({ $primaryKey: OFFICE_1_ID })],\n });\n\n // Clear initial calls\n officeSubFn.next.mockClear();\n empSubFn.next.mockClear();\n officeLinkSubFn.next.mockClear();\n\n // Invalidate the Employee type\n await cache.invalidateObjectType(Employee, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Employee object should be invalidated\n expect(empSubFn.next).toHaveBeenCalled();\n\n // Employee -> Office link (with Employee source) should be invalidated\n // because its source is an Employee object\n expect(officeLinkSubFn.next).toHaveBeenCalled();\n });\n });\n\n describe(\"Complex Multi-Type Scenario\", () => {\n it(\"should correctly isolate invalidation across multiple related objects\", async () => {\n // Set up observations for all three object types\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n const { payload: todo1Payload, subFn: todoSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Todo,\n primaryKey: TODO_1_ID,\n });\n const todo1 = todo1Payload?.object;\n invariant(todo1);\n\n // Set up list observations\n const empListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, empListSubFn));\n\n const officeListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Office,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, officeListSubFn));\n\n const todoListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Todo,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, todoListSubFn));\n\n // Set up link observations\n const { linkSubFn: employeeOfficeLinkSubFn } =\n await expectStandardObserveLink({\n store: cache,\n srcObject: emp1,\n srcLinkName: \"officeLink\",\n targetType: Office,\n expected: [expect.objectContaining({ $primaryKey: OFFICE_1_ID })],\n });\n\n // Setup another link observation for the test\n const { linkSubFn: officeOccupantsLinkSubFn } =\n await expectStandardObserveLink({\n store: cache,\n srcObject: office1,\n srcLinkName: \"occupants\",\n targetType: Employee,\n expected: [expect.objectContaining({ $primaryKey: EMPLOYEE_1_ID })],\n });\n\n // Clear all the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n todoSubFn.next.mockClear();\n empListSubFn.next.mockClear();\n officeListSubFn.next.mockClear();\n todoListSubFn.next.mockClear();\n employeeOfficeLinkSubFn.next.mockClear();\n officeOccupantsLinkSubFn.next.mockClear();\n\n // Invalidate only the Todo type\n await cache.invalidateObjectType(Todo, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Todo object and list should be invalidated\n expect(todoSubFn.next).toHaveBeenCalled();\n expect(todoListSubFn.next).toHaveBeenCalled();\n\n // All Employee and Office related items should NOT be invalidated\n expect(empSubFn.next).not.toHaveBeenCalled();\n expect(officeSubFn.next).not.toHaveBeenCalled();\n expect(empListSubFn.next).not.toHaveBeenCalled();\n expect(officeListSubFn.next).not.toHaveBeenCalled();\n expect(employeeOfficeLinkSubFn.next).not.toHaveBeenCalled();\n expect(officeOccupantsLinkSubFn.next).not.toHaveBeenCalled();\n });\n });\n\n describe(\"invalidateAll\", () => {\n it(\"should invalidate all cached queries\", async () => {\n const { subFn: empSubFn } = await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const { subFn: officeSubFn } = await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const { subFn: todoSubFn } = await expectStandardObserveObject({\n cache,\n type: Todo,\n primaryKey: TODO_1_ID,\n });\n\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n todoSubFn.next.mockClear();\n\n await cache.invalidateAll();\n\n await new Promise(resolve => setTimeout(resolve, 500));\n\n expect(empSubFn.next).toHaveBeenCalled();\n expect(officeSubFn.next).toHaveBeenCalled();\n expect(todoSubFn.next).toHaveBeenCalled();\n });\n\n it(\"should invalidate all list queries\", async () => {\n const empListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Employee,\n where: {},\n orderBy: {},\n pageSize: 10,\n }, empListSubFn));\n\n const officeListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Office,\n where: {},\n orderBy: {},\n pageSize: 10,\n }, officeListSubFn));\n\n await new Promise(resolve => setTimeout(resolve, 100));\n empListSubFn.next.mockClear();\n officeListSubFn.next.mockClear();\n\n await cache.invalidateAll();\n\n await new Promise(resolve => setTimeout(resolve, 500));\n\n expect(empListSubFn.next).toHaveBeenCalled();\n expect(officeListSubFn.next).toHaveBeenCalled();\n });\n });\n\n describe(\"invalidateObjects\", () => {\n it(\"should invalidate a single object\", async () => {\n const { subFn: empSubFn } = await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const { subFn: emp2SubFn } = await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_2_ID,\n });\n\n empSubFn.next.mockClear();\n emp2SubFn.next.mockClear();\n\n const emp1 = await client(Employee).fetchOne(EMPLOYEE_1_ID);\n invariant(emp1);\n\n await cache.invalidateObjects(emp1);\n\n await new Promise(resolve => setTimeout(resolve, 500));\n\n expect(empSubFn.next).toHaveBeenCalled();\n expect(emp2SubFn.next).not.toHaveBeenCalled();\n });\n\n it(\"should invalidate multiple objects\", async () => {\n const { subFn: empSubFn } = await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const { subFn: emp2SubFn } = await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_2_ID,\n });\n const { subFn: officeSubFn } = await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n\n empSubFn.next.mockClear();\n emp2SubFn.next.mockClear();\n officeSubFn.next.mockClear();\n\n const emp1 = await client(Employee).fetchOne(EMPLOYEE_1_ID);\n const emp2 = await client(Employee).fetchOne(EMPLOYEE_2_ID);\n invariant(emp1);\n invariant(emp2);\n\n await cache.invalidateObjects([emp1, emp2]);\n\n await new Promise(resolve => setTimeout(resolve, 500));\n\n expect(empSubFn.next).toHaveBeenCalled();\n expect(emp2SubFn.next).toHaveBeenCalled();\n expect(officeSubFn.next).not.toHaveBeenCalled();\n });\n\n it(\"should invalidate mixed object types\", async () => {\n const { subFn: empSubFn } = await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const { subFn: officeSubFn } = await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const { subFn: todoSubFn } = await expectStandardObserveObject({\n cache,\n type: Todo,\n primaryKey: TODO_1_ID,\n });\n\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n todoSubFn.next.mockClear();\n\n const emp1 = await client(Employee).fetchOne(EMPLOYEE_1_ID);\n const office1 = await client(Office).fetchOne(OFFICE_1_ID);\n invariant(emp1);\n invariant(office1);\n\n await cache.invalidateObjects([emp1, office1]);\n\n await new Promise(resolve => setTimeout(resolve, 500));\n\n expect(empSubFn.next).toHaveBeenCalled();\n expect(officeSubFn.next).toHaveBeenCalled();\n expect(todoSubFn.next).not.toHaveBeenCalled();\n });\n\n it(\"should handle empty array\", async () => {\n const { subFn: empSubFn } = await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n\n empSubFn.next.mockClear();\n\n await cache.invalidateObjects([]);\n\n await new Promise(resolve => setTimeout(resolve, 500));\n\n expect(empSubFn.next).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -24,6 +24,7 @@ import { Layers } from "./Layers.js";
|
|
|
24
24
|
import { LinksHelper } from "./links/LinksHelper.js";
|
|
25
25
|
import { ListsHelper } from "./list/ListsHelper.js";
|
|
26
26
|
import { ObjectsHelper } from "./object/ObjectsHelper.js";
|
|
27
|
+
import { ObjectSetHelper } from "./objectset/ObjectSetHelper.js";
|
|
27
28
|
import { OrderByCanonicalizer } from "./OrderByCanonicalizer.js";
|
|
28
29
|
import { Queries } from "./Queries.js";
|
|
29
30
|
import { WhereClauseCanonicalizer } from "./WhereClauseCanonicalizer.js";
|
|
@@ -65,6 +66,7 @@ export class Store {
|
|
|
65
66
|
this.lists = new ListsHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer);
|
|
66
67
|
this.objects = new ObjectsHelper(this, this.cacheKeys);
|
|
67
68
|
this.links = new LinksHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer);
|
|
69
|
+
this.objectSets = new ObjectSetHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer);
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
/**
|
|
@@ -176,6 +178,27 @@ export class Store {
|
|
|
176
178
|
promises.push(query.invalidateObjectType(apiName, changes));
|
|
177
179
|
}
|
|
178
180
|
|
|
181
|
+
// we use allSettled here because we don't care if it succeeds or fails, just that they all complete.
|
|
182
|
+
return Promise.allSettled(promises).then(() => void 0);
|
|
183
|
+
}
|
|
184
|
+
async invalidateAll() {
|
|
185
|
+
const promises = [];
|
|
186
|
+
for (const cacheKey of this.queries.keys()) {
|
|
187
|
+
const query = this.queries.peek(cacheKey);
|
|
188
|
+
if (query) {
|
|
189
|
+
promises.push(query.revalidate(true));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// we use allSettled here because we don't care if it succeeds or fails, just that they all complete.
|
|
193
|
+
return Promise.allSettled(promises).then(() => void 0);
|
|
194
|
+
}
|
|
195
|
+
async invalidateObjects(objects) {
|
|
196
|
+
const objectsArray = Array.isArray(objects) ? objects : [objects];
|
|
197
|
+
const promises = [];
|
|
198
|
+
for (const obj of objectsArray) {
|
|
199
|
+
promises.push(this.invalidateObject(obj.$objectType, obj.$primaryKey));
|
|
200
|
+
}
|
|
201
|
+
|
|
179
202
|
// we use allSettled here because we don't care if it succeeds or fails, just that they all complete.
|
|
180
203
|
return Promise.allSettled(promises).then(() => void 0);
|
|
181
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.js","names":["invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","Layers","LinksHelper","ListsHelper","ObjectsHelper","OrderByCanonicalizer","Queries","WhereClauseCanonicalizer","Store","whereCanonicalizer","orderByCanonicalizer","queries","layers","logger","onRevalidate","maybeRevalidateQueries","bind","subjects","constructor","client","child","msgPrefix","cacheKeys","onDestroy","cleanupCacheKey","lists","objects","links","key","subject","peek","console","log","JSON","stringify","closed","observed","type","otherKeys","process","env","NODE_ENV","delete","applyAction","action","args","opts","validateAction","result","$validateOnly","$returnEdits","getValue","cacheKey","top","get","batch","optimisticId","changes","batchFn","invalidateObject","apiName","pk","getQuery","revalidate","#maybeRevalidateQueries","methodName","undefined","isEmpty","debug","promises","keys","promise","maybeUpdateAndRevalidate","push","Promise","all","invalidateObjectType","info","truth","modified","has","query","allSettled","then"],"sources":["Store.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n ActionValidationResponse,\n Logger,\n ObjectTypeDefinition,\n PrimaryKeyType,\n} from \"@osdk/api\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport { ActionApplication } from \"./actions/ActionApplication.js\";\nimport type { BatchContext } from \"./BatchContext.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport {\n type Changes,\n createChangedObjects,\n DEBUG_ONLY__changesToString,\n} from \"./Changes.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\nimport { Layers } from \"./Layers.js\";\nimport { LinksHelper } from \"./links/LinksHelper.js\";\nimport { ListsHelper } from \"./list/ListsHelper.js\";\nimport { ObjectsHelper } from \"./object/ObjectsHelper.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport { Queries } from \"./Queries.js\";\nimport type { Subjects } from \"./Subjects.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\n/**\n * Central data store with layered cache architecture.\n * - Truth layer: server state | Optimistic layers: pending changes\n * - Reference counting prevents memory leaks\n * - Batch operations ensure consistency\n */\nexport class Store {\n readonly whereCanonicalizer: WhereClauseCanonicalizer =\n new WhereClauseCanonicalizer();\n readonly orderByCanonicalizer: OrderByCanonicalizer =\n new OrderByCanonicalizer();\n\n readonly client: Client;\n\n /** @internal */\n readonly logger?: Logger;\n\n readonly cacheKeys: CacheKeys<KnownCacheKey>;\n readonly queries: Queries = new Queries();\n\n readonly layers: Layers = new Layers({\n logger: this.logger,\n onRevalidate: this.#maybeRevalidateQueries.bind(this),\n });\n readonly subjects: Subjects = this.layers.subjects;\n\n // these are hopefully temporary\n readonly lists: ListsHelper;\n readonly objects: ObjectsHelper;\n readonly links: LinksHelper;\n\n constructor(client: Client) {\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n this.client = client;\n\n this.cacheKeys = new CacheKeys<KnownCacheKey>({\n onDestroy: this.#cleanupCacheKey,\n });\n\n this.lists = new ListsHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n );\n this.objects = new ObjectsHelper(this, this.cacheKeys);\n this.links = new LinksHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: KnownCacheKey) => {\n const subject = this.subjects.peek(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n this.subjects.delete(key);\n this.queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (action, args, opts) => {\n return await new ActionApplication(this).applyAction(action, args, opts);\n };\n\n validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse> = async (action, args) => {\n const result = await this.client(action).applyAction(args as any, {\n $validateOnly: true,\n $returnEdits: false,\n });\n return result as ActionValidationResponse;\n };\n\n public getValue<K extends KnownCacheKey>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.layers.top.get(cacheKey);\n }\n\n batch<X>(\n { optimisticId, changes = createChangedObjects() }: {\n optimisticId?: OptimisticId;\n changes?: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n changes: Changes;\n } {\n return this.layers.batch({ optimisticId, changes }, batchFn);\n }\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n return this.objects.getQuery({\n apiName,\n pk,\n }).revalidate(/* force */ true);\n }\n\n async #maybeRevalidateQueries(\n changes: Changes,\n optimisticId?: OptimisticId | undefined,\n ): Promise<void> {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"maybeRevalidateQueries\" })\n : undefined;\n\n if (changes.isEmpty()) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"No changes, aborting\");\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(DEBUG_ONLY__changesToString(changes), { optimisticId });\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.queries.keys()) {\n const promise = this.queries.peek(cacheKey)?.maybeUpdateAndRevalidate?.(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"in finally\", DEBUG_ONLY__changesToString(changes));\n }\n }\n }\n\n /**\n * Invalidates all cache entries for a specific object type.\n * This will revalidate:\n * 1. All objects of the specified type\n * 2. All lists of the specified type\n * 3. All links where the source object is of the specified type\n *\n * @param apiName - The API name of the object type to invalidate\n * @param changes - Optional changes object to track what has been modified\n * @returns Promise that resolves when all invalidations are complete\n */\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n changes: Changes | undefined,\n ): Promise<void> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"invalidateObjectType\" }).info(\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<void>> = [];\n\n for (const cacheKey of this.layers.truth.keys()) {\n if (changes && changes.modified.has(cacheKey)) {\n continue;\n }\n const query = this.queries.peek(cacheKey);\n if (!query) continue;\n\n promises.push(query.invalidateObjectType(apiName, changes));\n }\n\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Store.js","names":["invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","Layers","LinksHelper","ListsHelper","ObjectsHelper","ObjectSetHelper","OrderByCanonicalizer","Queries","WhereClauseCanonicalizer","Store","whereCanonicalizer","orderByCanonicalizer","queries","layers","logger","onRevalidate","maybeRevalidateQueries","bind","subjects","constructor","client","child","msgPrefix","cacheKeys","onDestroy","cleanupCacheKey","lists","objects","links","objectSets","key","subject","peek","console","log","JSON","stringify","closed","observed","type","otherKeys","process","env","NODE_ENV","delete","applyAction","action","args","opts","validateAction","result","$validateOnly","$returnEdits","getValue","cacheKey","top","get","batch","optimisticId","changes","batchFn","invalidateObject","apiName","pk","getQuery","revalidate","#maybeRevalidateQueries","methodName","undefined","isEmpty","debug","promises","keys","promise","maybeUpdateAndRevalidate","push","Promise","all","invalidateObjectType","info","truth","modified","has","query","allSettled","then","invalidateAll","invalidateObjects","objectsArray","Array","isArray","obj","$objectType","$primaryKey"],"sources":["Store.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n ActionValidationResponse,\n Logger,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n} from \"@osdk/api\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport { ActionApplication } from \"./actions/ActionApplication.js\";\nimport type { BatchContext } from \"./BatchContext.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport {\n type Changes,\n createChangedObjects,\n DEBUG_ONLY__changesToString,\n} from \"./Changes.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\nimport { Layers } from \"./Layers.js\";\nimport { LinksHelper } from \"./links/LinksHelper.js\";\nimport { ListsHelper } from \"./list/ListsHelper.js\";\nimport { ObjectsHelper } from \"./object/ObjectsHelper.js\";\nimport { ObjectSetHelper } from \"./objectset/ObjectSetHelper.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport { Queries } from \"./Queries.js\";\nimport type { Subjects } from \"./Subjects.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\n/**\n * Central data store with layered cache architecture.\n * - Truth layer: server state | Optimistic layers: pending changes\n * - Reference counting prevents memory leaks\n * - Batch operations ensure consistency\n */\nexport class Store {\n readonly whereCanonicalizer: WhereClauseCanonicalizer =\n new WhereClauseCanonicalizer();\n readonly orderByCanonicalizer: OrderByCanonicalizer =\n new OrderByCanonicalizer();\n\n readonly client: Client;\n\n /** @internal */\n readonly logger?: Logger;\n\n readonly cacheKeys: CacheKeys<KnownCacheKey>;\n readonly queries: Queries = new Queries();\n\n readonly layers: Layers = new Layers({\n logger: this.logger,\n onRevalidate: this.#maybeRevalidateQueries.bind(this),\n });\n readonly subjects: Subjects = this.layers.subjects;\n\n // these are hopefully temporary\n readonly lists: ListsHelper;\n readonly objects: ObjectsHelper;\n readonly links: LinksHelper;\n readonly objectSets: ObjectSetHelper;\n\n constructor(client: Client) {\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n this.client = client;\n\n this.cacheKeys = new CacheKeys<KnownCacheKey>({\n onDestroy: this.#cleanupCacheKey,\n });\n\n this.lists = new ListsHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n );\n this.objects = new ObjectsHelper(this, this.cacheKeys);\n this.links = new LinksHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n );\n this.objectSets = new ObjectSetHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: KnownCacheKey) => {\n const subject = this.subjects.peek(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n this.subjects.delete(key);\n this.queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (action, args, opts) => {\n return await new ActionApplication(this).applyAction(action, args, opts);\n };\n\n validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse> = async (action, args) => {\n const result = await this.client(action).applyAction(args as any, {\n $validateOnly: true,\n $returnEdits: false,\n });\n return result as ActionValidationResponse;\n };\n\n public getValue<K extends KnownCacheKey>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.layers.top.get(cacheKey);\n }\n\n batch<X>(\n { optimisticId, changes = createChangedObjects() }: {\n optimisticId?: OptimisticId;\n changes?: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n changes: Changes;\n } {\n return this.layers.batch({ optimisticId, changes }, batchFn);\n }\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n return this.objects.getQuery({\n apiName,\n pk,\n }).revalidate(/* force */ true);\n }\n\n async #maybeRevalidateQueries(\n changes: Changes,\n optimisticId?: OptimisticId | undefined,\n ): Promise<void> {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"maybeRevalidateQueries\" })\n : undefined;\n\n if (changes.isEmpty()) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"No changes, aborting\");\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(DEBUG_ONLY__changesToString(changes), { optimisticId });\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.queries.keys()) {\n const promise = this.queries.peek(cacheKey)?.maybeUpdateAndRevalidate?.(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"in finally\", DEBUG_ONLY__changesToString(changes));\n }\n }\n }\n\n /**\n * Invalidates all cache entries for a specific object type.\n * This will revalidate:\n * 1. All objects of the specified type\n * 2. All lists of the specified type\n * 3. All links where the source object is of the specified type\n *\n * @param apiName - The API name of the object type to invalidate\n * @param changes - Optional changes object to track what has been modified\n * @returns Promise that resolves when all invalidations are complete\n */\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n changes: Changes | undefined,\n ): Promise<void> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"invalidateObjectType\" }).info(\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<void>> = [];\n\n for (const cacheKey of this.layers.truth.keys()) {\n if (changes && changes.modified.has(cacheKey)) {\n continue;\n }\n const query = this.queries.peek(cacheKey);\n if (!query) continue;\n\n promises.push(query.invalidateObjectType(apiName, changes));\n }\n\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n\n public async invalidateAll(): Promise<void> {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.queries.keys()) {\n const query = this.queries.peek(cacheKey);\n if (query) {\n promises.push(query.revalidate(true));\n }\n }\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n\n public async invalidateObjects(\n objects:\n | Osdk.Instance<ObjectTypeDefinition>\n | ReadonlyArray<Osdk.Instance<ObjectTypeDefinition>>,\n ): Promise<void> {\n const objectsArray = Array.isArray(objects) ? objects : [objects];\n const promises: Array<Promise<unknown>> = [];\n\n for (const obj of objectsArray) {\n promises.push(this.invalidateObject(obj.$objectType, obj.$primaryKey));\n }\n\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectSetCacheKey.js","names":[],"sources":["ObjectSetCacheKey.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { CollectionStorageData } from \"../base-list/BaseCollectionQuery.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { ObjectSetQuery } from \"./ObjectSetQuery.js\";\n\nexport interface ObjectSetStorageData extends CollectionStorageData {}\n\nexport interface ObjectSetOperations {\n where?: Canonical<any>;\n withProperties?: string[];\n union?: string[];\n intersect?: string[];\n subtract?: string[];\n pivotTo?: string;\n orderBy?: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>;\n pageSize?: number;\n}\n\nexport interface ObjectSetCacheKey extends\n CacheKey<\n \"objectSet\",\n ObjectSetStorageData,\n ObjectSetQuery,\n [\n baseObjectSetWire: string,\n operations: Canonical<ObjectSetOperations>,\n ]\n >\n{\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { getWireObjectSet } from "../../../objectSet/createObjectSet.js";
|
|
18
|
+
import { AbstractHelper } from "../AbstractHelper.js";
|
|
19
|
+
import { ObjectSetQuery } from "./ObjectSetQuery.js";
|
|
20
|
+
export class ObjectSetHelper extends AbstractHelper {
|
|
21
|
+
constructor(store, cacheKeys, whereCanonicalizer, orderByCanonicalizer) {
|
|
22
|
+
super(store, cacheKeys);
|
|
23
|
+
this.whereCanonicalizer = whereCanonicalizer;
|
|
24
|
+
this.orderByCanonicalizer = orderByCanonicalizer;
|
|
25
|
+
}
|
|
26
|
+
observe(options, subFn) {
|
|
27
|
+
return super.observe(options, subFn);
|
|
28
|
+
}
|
|
29
|
+
getQuery(options) {
|
|
30
|
+
const {
|
|
31
|
+
baseObjectSet
|
|
32
|
+
} = options;
|
|
33
|
+
const baseObjectSetWire = JSON.stringify(getWireObjectSet(baseObjectSet));
|
|
34
|
+
const operations = this.buildCanonicalizedOperations(options);
|
|
35
|
+
const objectSetCacheKey = this.cacheKeys.get("objectSet", baseObjectSetWire, operations);
|
|
36
|
+
return this.store.queries.get(objectSetCacheKey, () => {
|
|
37
|
+
return new ObjectSetQuery(this.store, this.store.subjects.get(objectSetCacheKey), baseObjectSetWire, operations, objectSetCacheKey, options);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
buildCanonicalizedOperations(options) {
|
|
41
|
+
const operations = {};
|
|
42
|
+
if (options.where) {
|
|
43
|
+
operations.where = this.whereCanonicalizer.canonicalize(options.where);
|
|
44
|
+
}
|
|
45
|
+
if (options.withProperties) {
|
|
46
|
+
operations.withProperties = Object.keys(options.withProperties).sort();
|
|
47
|
+
}
|
|
48
|
+
if (options.union && options.union.length > 0) {
|
|
49
|
+
operations.union = options.union.map(os => JSON.stringify(getWireObjectSet(os)));
|
|
50
|
+
}
|
|
51
|
+
if (options.intersect && options.intersect.length > 0) {
|
|
52
|
+
operations.intersect = options.intersect.map(os => JSON.stringify(getWireObjectSet(os)));
|
|
53
|
+
}
|
|
54
|
+
if (options.subtract && options.subtract.length > 0) {
|
|
55
|
+
operations.subtract = options.subtract.map(os => JSON.stringify(getWireObjectSet(os)));
|
|
56
|
+
}
|
|
57
|
+
if (options.pivotTo) {
|
|
58
|
+
operations.pivotTo = options.pivotTo;
|
|
59
|
+
}
|
|
60
|
+
if (options.orderBy) {
|
|
61
|
+
operations.orderBy = this.orderByCanonicalizer.canonicalize(options.orderBy);
|
|
62
|
+
}
|
|
63
|
+
if (options.pageSize) {
|
|
64
|
+
operations.pageSize = options.pageSize;
|
|
65
|
+
}
|
|
66
|
+
return operations;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=ObjectSetHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectSetHelper.js","names":["getWireObjectSet","AbstractHelper","ObjectSetQuery","ObjectSetHelper","constructor","store","cacheKeys","whereCanonicalizer","orderByCanonicalizer","observe","options","subFn","getQuery","baseObjectSet","baseObjectSetWire","JSON","stringify","operations","buildCanonicalizedOperations","objectSetCacheKey","get","queries","subjects","where","canonicalize","withProperties","Object","keys","sort","union","length","map","os","intersect","subtract","pivotTo","orderBy","pageSize"],"sources":["ObjectSetHelper.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getWireObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport type { ObjectSetPayload } from \"../../ObjectSetPayload.js\";\nimport type { Observer } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { CacheKeys } from \"../CacheKeys.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { KnownCacheKey } from \"../KnownCacheKey.js\";\nimport type { OrderByCanonicalizer } from \"../OrderByCanonicalizer.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { Store } from \"../Store.js\";\nimport type { WhereClauseCanonicalizer } from \"../WhereClauseCanonicalizer.js\";\nimport type {\n ObjectSetCacheKey,\n ObjectSetOperations,\n} from \"./ObjectSetCacheKey.js\";\nimport { ObjectSetQuery } from \"./ObjectSetQuery.js\";\nimport type { ObjectSetQueryOptions } from \"./ObjectSetQueryOptions.js\";\n\nexport class ObjectSetHelper extends AbstractHelper<\n ObjectSetQuery,\n ObjectSetQueryOptions\n> {\n whereCanonicalizer: WhereClauseCanonicalizer;\n orderByCanonicalizer: OrderByCanonicalizer;\n\n constructor(\n store: Store,\n cacheKeys: CacheKeys<KnownCacheKey>,\n whereCanonicalizer: WhereClauseCanonicalizer,\n orderByCanonicalizer: OrderByCanonicalizer,\n ) {\n super(store, cacheKeys);\n\n this.whereCanonicalizer = whereCanonicalizer;\n this.orderByCanonicalizer = orderByCanonicalizer;\n }\n\n observe(\n options: ObjectSetQueryOptions,\n subFn: Observer<ObjectSetPayload>,\n ): QuerySubscription<ObjectSetQuery> {\n return super.observe(options, subFn);\n }\n\n getQuery(options: ObjectSetQueryOptions): ObjectSetQuery {\n const { baseObjectSet } = options;\n const baseObjectSetWire = JSON.stringify(getWireObjectSet(baseObjectSet));\n const operations = this.buildCanonicalizedOperations(options);\n\n const objectSetCacheKey = this.cacheKeys.get<ObjectSetCacheKey>(\n \"objectSet\",\n baseObjectSetWire,\n operations,\n );\n\n return this.store.queries.get(objectSetCacheKey, () => {\n return new ObjectSetQuery(\n this.store,\n this.store.subjects.get(objectSetCacheKey),\n baseObjectSetWire,\n operations,\n objectSetCacheKey,\n options,\n );\n });\n }\n\n private buildCanonicalizedOperations(\n options: ObjectSetQueryOptions,\n ): Canonical<ObjectSetOperations> {\n const operations: ObjectSetOperations = {};\n\n if (options.where) {\n operations.where = this.whereCanonicalizer.canonicalize(options.where);\n }\n\n if (options.withProperties) {\n operations.withProperties = Object.keys(options.withProperties).sort();\n }\n\n if (options.union && options.union.length > 0) {\n operations.union = options.union.map(os =>\n JSON.stringify(getWireObjectSet(os))\n );\n }\n\n if (options.intersect && options.intersect.length > 0) {\n operations.intersect = options.intersect.map(os =>\n JSON.stringify(getWireObjectSet(os))\n );\n }\n\n if (options.subtract && options.subtract.length > 0) {\n operations.subtract = options.subtract.map(os =>\n JSON.stringify(getWireObjectSet(os))\n );\n }\n\n if (options.pivotTo) {\n operations.pivotTo = options.pivotTo as string;\n }\n\n if (options.orderBy) {\n operations.orderBy = this.orderByCanonicalizer.canonicalize(\n options.orderBy,\n );\n }\n\n if (options.pageSize) {\n operations.pageSize = options.pageSize;\n }\n\n return operations as Canonical<ObjectSetOperations>;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|