@osdk/client 2.5.0-beta.5 → 2.5.0-beta.7
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 +31 -0
- package/build/browser/MinimalClientContext.js.map +1 -1
- package/build/browser/actions/applyAction.js +4 -0
- package/build/browser/actions/applyAction.js.map +1 -1
- package/build/browser/createClient.js +2 -1
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createMinimalClient.js +2 -1
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/object/aggregate.js +2 -0
- package/build/browser/object/aggregate.js.map +1 -1
- package/build/browser/object/fetchPage.js +5 -2
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/observable/internal/AbstractHelper.js +8 -4
- package/build/browser/observable/internal/AbstractHelper.js.map +1 -1
- package/build/browser/observable/internal/BatchContext.js +2 -0
- package/build/browser/observable/internal/BatchContext.js.map +1 -0
- package/build/browser/observable/internal/CacheKeys.js +61 -36
- package/build/browser/observable/internal/CacheKeys.js.map +1 -1
- package/build/browser/observable/internal/Layer.js +0 -8
- package/build/browser/observable/internal/Layer.js.map +1 -1
- package/build/browser/observable/internal/Layers.js +151 -0
- package/build/browser/observable/internal/Layers.js.map +1 -0
- package/build/browser/observable/internal/ObservableClientImpl.js +3 -1
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/Queries.js +40 -0
- package/build/browser/observable/internal/Queries.js.map +1 -0
- package/build/browser/observable/internal/Query.js +30 -3
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/QuerySubscription.js +7 -0
- package/build/browser/observable/internal/QuerySubscription.js.map +1 -1
- package/build/browser/observable/internal/Store.js +36 -225
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +11 -9
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/SubjectPayload.js +2 -0
- package/build/browser/observable/internal/SubjectPayload.js.map +1 -0
- package/build/browser/observable/internal/Subjects.js +55 -0
- package/build/browser/observable/internal/Subjects.js.map +1 -0
- package/build/browser/observable/internal/actions/ActionApplication.js +2 -2
- package/build/browser/observable/internal/actions/ActionApplication.js.map +1 -1
- package/build/browser/observable/internal/actions/OptimisticJob.js +1 -1
- package/build/browser/observable/internal/actions/OptimisticJob.js.map +1 -1
- package/build/browser/observable/internal/base-list/BaseListQuery.js +6 -9
- package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/browser/observable/internal/base-list/createCollectionConnectable.js +2 -2
- package/build/browser/observable/internal/base-list/createCollectionConnectable.js.map +1 -1
- package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js +23 -25
- package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -1
- package/build/browser/observable/internal/base-list/removeDuplicates.js.map +1 -1
- package/build/browser/observable/internal/createInitEntry.js +25 -0
- package/build/browser/observable/internal/createInitEntry.js.map +1 -0
- package/build/browser/observable/internal/links/LinksHelper.js +5 -5
- package/build/browser/observable/internal/links/LinksHelper.js.map +1 -1
- package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -1
- package/build/browser/observable/internal/list/ListQuery.js +5 -5
- package/build/browser/observable/internal/list/ListQuery.js.map +1 -1
- package/build/browser/observable/internal/list/ListsHelper.js +5 -5
- package/build/browser/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectsHelper.js +2 -2
- package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/browser/observable/internal/sorting/SortingStrategy.js.map +1 -1
- package/build/browser/observable/internal/testUtils/invalidateList.js +2 -2
- package/build/browser/observable/internal/testUtils/invalidateList.js.map +1 -1
- package/build/browser/observable/internal/testUtils.js +1 -1
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/ontology/loadActionMetadata.js +3 -1
- package/build/browser/ontology/loadActionMetadata.js.map +1 -1
- package/build/browser/ontology/loadFullObjectMetadata.js +2 -1
- package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/browser/ontology/loadInterfaceMetadata.js +2 -1
- package/build/browser/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/browser/queries/applyQuery.js +2 -2
- package/build/browser/queries/applyQuery.js.map +1 -1
- package/build/browser/util/UserAgent.js +2 -2
- package/build/cjs/{chunk-ELAA4C2C.cjs → chunk-5KDG5ZET.cjs} +9 -4
- package/build/cjs/chunk-5KDG5ZET.cjs.map +1 -0
- package/build/cjs/{chunk-KCMGIMVC.cjs → chunk-BY2PQEYA.cjs} +70 -60
- package/build/cjs/chunk-BY2PQEYA.cjs.map +1 -0
- package/build/cjs/{createClient-BJo8T7Js.d.cts → createClient-mOlFts15.d.cts} +1 -0
- package/build/cjs/index.cjs +7 -7
- package/build/cjs/index.d.cts +1 -1
- package/build/cjs/public/internal.cjs +8 -8
- package/build/cjs/public/unstable-do-not-use.cjs +396 -302
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +1 -1
- package/build/esm/MinimalClientContext.js.map +1 -1
- package/build/esm/actions/applyAction.js +4 -0
- package/build/esm/actions/applyAction.js.map +1 -1
- package/build/esm/createClient.js +2 -1
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createMinimalClient.js +2 -1
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/object/aggregate.js +2 -0
- package/build/esm/object/aggregate.js.map +1 -1
- package/build/esm/object/fetchPage.js +5 -2
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/observable/internal/AbstractHelper.js +8 -4
- package/build/esm/observable/internal/AbstractHelper.js.map +1 -1
- package/build/esm/observable/internal/BatchContext.js +2 -0
- package/build/esm/observable/internal/BatchContext.js.map +1 -0
- package/build/esm/observable/internal/CacheKeys.js +61 -36
- package/build/esm/observable/internal/CacheKeys.js.map +1 -1
- package/build/esm/observable/internal/Layer.js +0 -8
- package/build/esm/observable/internal/Layer.js.map +1 -1
- package/build/esm/observable/internal/Layers.js +151 -0
- package/build/esm/observable/internal/Layers.js.map +1 -0
- package/build/esm/observable/internal/ObservableClientImpl.js +3 -1
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/Queries.js +40 -0
- package/build/esm/observable/internal/Queries.js.map +1 -0
- package/build/esm/observable/internal/Query.js +30 -3
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/QuerySubscription.js +7 -0
- package/build/esm/observable/internal/QuerySubscription.js.map +1 -1
- package/build/esm/observable/internal/Store.js +36 -225
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +11 -9
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/SubjectPayload.js +2 -0
- package/build/esm/observable/internal/SubjectPayload.js.map +1 -0
- package/build/esm/observable/internal/Subjects.js +55 -0
- package/build/esm/observable/internal/Subjects.js.map +1 -0
- package/build/esm/observable/internal/actions/ActionApplication.js +2 -2
- package/build/esm/observable/internal/actions/ActionApplication.js.map +1 -1
- package/build/esm/observable/internal/actions/OptimisticJob.js +1 -1
- package/build/esm/observable/internal/actions/OptimisticJob.js.map +1 -1
- package/build/esm/observable/internal/base-list/BaseListQuery.js +6 -9
- package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/esm/observable/internal/base-list/createCollectionConnectable.js +2 -2
- package/build/esm/observable/internal/base-list/createCollectionConnectable.js.map +1 -1
- package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js +23 -25
- package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -1
- package/build/esm/observable/internal/base-list/removeDuplicates.js.map +1 -1
- package/build/esm/observable/internal/createInitEntry.js +25 -0
- package/build/esm/observable/internal/createInitEntry.js.map +1 -0
- package/build/esm/observable/internal/links/LinksHelper.js +5 -5
- package/build/esm/observable/internal/links/LinksHelper.js.map +1 -1
- package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -1
- package/build/esm/observable/internal/list/ListQuery.js +5 -5
- package/build/esm/observable/internal/list/ListQuery.js.map +1 -1
- package/build/esm/observable/internal/list/ListsHelper.js +5 -5
- package/build/esm/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectsHelper.js +2 -2
- package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/esm/observable/internal/sorting/SortingStrategy.js.map +1 -1
- package/build/esm/observable/internal/testUtils/invalidateList.js +2 -2
- package/build/esm/observable/internal/testUtils/invalidateList.js.map +1 -1
- package/build/esm/observable/internal/testUtils.js +1 -1
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/ontology/loadActionMetadata.js +3 -1
- package/build/esm/ontology/loadActionMetadata.js.map +1 -1
- package/build/esm/ontology/loadFullObjectMetadata.js +2 -1
- package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/esm/ontology/loadInterfaceMetadata.js +2 -1
- package/build/esm/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/esm/queries/applyQuery.js +2 -2
- package/build/esm/queries/applyQuery.js.map +1 -1
- package/build/esm/util/UserAgent.js +2 -2
- package/build/types/MinimalClientContext.d.ts +1 -0
- 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 +1 -0
- package/build/types/createClient.d.ts.map +1 -1
- package/build/types/observable/internal/AbstractHelper.d.ts +3 -1
- package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -1
- package/build/types/observable/internal/BatchContext.d.ts +11 -0
- package/build/types/observable/internal/BatchContext.d.ts.map +1 -0
- package/build/types/observable/internal/CacheKeys.d.ts +9 -9
- package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
- package/build/types/observable/internal/Layer.d.ts +1 -2
- package/build/types/observable/internal/Layer.d.ts.map +1 -1
- package/build/types/observable/internal/Layers.d.ts +26 -0
- package/build/types/observable/internal/Layers.d.ts.map +1 -0
- package/build/types/observable/internal/Queries.d.ts +9 -0
- package/build/types/observable/internal/Queries.d.ts.map +1 -0
- package/build/types/observable/internal/Query.d.ts +17 -1
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- package/build/types/observable/internal/Store.d.ts +19 -34
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/Store.test.d.ts.map +1 -1
- package/build/types/observable/internal/SubjectPayload.d.ts +5 -0
- package/build/types/observable/internal/SubjectPayload.d.ts.map +1 -0
- package/build/types/observable/internal/Subjects.d.ts +16 -0
- package/build/types/observable/internal/Subjects.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts +2 -1
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts +3 -2
- package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts.map +1 -1
- package/build/types/observable/internal/base-list/removeDuplicates.d.ts +1 -1
- package/build/types/observable/internal/base-list/removeDuplicates.d.ts.map +1 -1
- package/build/types/observable/internal/createInitEntry.d.ts +3 -0
- package/build/types/observable/internal/createInitEntry.d.ts.map +1 -0
- package/build/types/observable/internal/links/LinksHelper.d.ts +3 -1
- package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -1
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +3 -1
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListQuery.d.ts +3 -1
- package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListsHelper.d.ts +3 -1
- package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectQuery.d.ts +3 -1
- package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/sorting/SortingStrategy.d.ts +1 -1
- package/build/types/observable/internal/sorting/SortingStrategy.d.ts.map +1 -1
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/package.json +9 -9
- package/build/cjs/chunk-ELAA4C2C.cjs.map +0 -1
- package/build/cjs/chunk-KCMGIMVC.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createCollectionConnectable.test.js","names":["BehaviorSubject","beforeEach","describe","expect","it","vi","createClientMockHelper","mockObserver","waitForCall","createCollectionConnectable","actualCreateCollectionConnectable","mockEmployee1","$apiName","$primaryKey","$objectType","$title","employeeId","fullName","mockEmployee2","mockEmployee3","mockStore","createPayload","mockListCacheKey","client","getSubject","fn","type","otherKeys","params","data","resolvedData","status","isOptimistic","lastUpdated","count","length","objectKey1","objectKey2","subjectPayload","cacheKey","value","Date","now","subject","mocked","mockImplementation","undefined","connectable","subscription","connect","observer","subscribe","next","toHaveBeenCalledWith","objectContaining","unsubscribe","mockReturnValue","basePayload","mockClear","objectKey3","initialPayload","observer1","observer2","toHaveBeenCalledTimes","not","toHaveBeenCalled","errorThrowingCreatePayload","Error","error","message"],"sources":["createCollectionConnectable.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 type { Osdk } from \"@osdk/api\";\nimport type { Employee } from \"@osdk/client.test.ontology\";\nimport { BehaviorSubject } from \"rxjs\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { ObjectCacheKey } from \"../object/ObjectCacheKey.js\";\nimport type { Store, SubjectPayload } from \"../Store.js\";\nimport {\n createClientMockHelper,\n mockObserver,\n waitForCall,\n} from \"../testUtils.js\";\nimport { createCollectionConnectable as actualCreateCollectionConnectable } from \"./createCollectionConnectable.js\";\n\n// Test payload type for our collection\ninterface TestPayload {\n data: any[];\n status: Status;\n isOptimistic: boolean;\n lastUpdated: number;\n count: number;\n}\n\n// Mock object instances for testing\nconst mockEmployee1: Osdk.Instance<Employee> & ObjectHolder = {\n $apiName: \"Employee\",\n $primaryKey: 1,\n $objectType: \"Employee\",\n $title: \"Employee 1\",\n employeeId: 1,\n fullName: \"John Doe\",\n} as any;\n\nconst mockEmployee2: Osdk.Instance<Employee> & ObjectHolder = {\n $apiName: \"Employee\",\n $primaryKey: 2,\n $objectType: \"Employee\",\n $title: \"Employee 2\",\n employeeId: 2,\n fullName: \"Jane Smith\",\n} as any;\n\nconst mockEmployee3: Osdk.Instance<Employee> & ObjectHolder = {\n $apiName: \"Employee\",\n $primaryKey: 3,\n $objectType: \"Employee\",\n $title: \"Employee 3\",\n employeeId: 3,\n fullName: \"Bob Johnson\",\n} as any;\n\ndescribe(\"createCollectionConnectable\", () => {\n let mockStore: Store;\n let createPayload: ReturnType<typeof vi.fn>;\n let mockListCacheKey: CacheKey<any, any, any, any>;\n\n beforeEach(() => {\n const { client } = createClientMockHelper();\n\n // Mock the store with minimal required methods\n mockStore = {\n getSubject: vi.fn(),\n } as any;\n\n // Mock cache key for list\n mockListCacheKey = {\n type: \"list\",\n otherKeys: [\"Employee\", {}, {}],\n } as CacheKey<any, any, any, any>;\n\n // Create payload function that mimics real usage\n createPayload = vi.fn((params) => ({\n data: params.resolvedData,\n status: params.status,\n isOptimistic: params.isOptimistic,\n lastUpdated: params.lastUpdated,\n count: params.resolvedData.length,\n }));\n });\n\n describe(\"basic functionality\", () => {\n it(\"should create a connectable observable with resolved data\", async () => {\n // Mock object cache keys\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const objectKey2: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 2],\n } as ObjectCacheKey;\n\n // Create subject payload with mock data\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1, objectKey2],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n // Mock store.getSubject to return object observables\n vi.mocked(mockStore.getSubject).mockImplementation((cacheKey: any) => {\n if (cacheKey === objectKey1) {\n return new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n if (cacheKey === objectKey2) {\n return new BehaviorSubject({\n cacheKey: objectKey2,\n value: mockEmployee2,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n return new BehaviorSubject(undefined as any);\n }) as any;\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n // Connect and subscribe\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n // Wait for the observable to emit\n await waitForCall(observer);\n\n // Verify the result\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1, mockEmployee2],\n status: \"loaded\",\n isOptimistic: false,\n count: 2,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should handle empty data correctly\", async () => {\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [],\n status: \"loaded\",\n isOptimistic: false,\n count: 0,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should handle null/undefined data\", async () => {\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: null as any,\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [],\n status: \"loaded\",\n isOptimistic: false,\n count: 0,\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"optimistic updates\", () => {\n it(\"should propagate optimistic flag correctly\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loading\",\n lastUpdated: Date.now(),\n isOptimistic: true, // This is an optimistic update\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n vi.mocked(mockStore.getSubject).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n status: \"loading\",\n isOptimistic: true, // Should preserve optimistic flag\n count: 1,\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"status transitions\", () => {\n it(\"should handle different status values\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const basePayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"init\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(basePayload);\n\n vi.mocked(mockStore.getSubject).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n // Wait for initial emission\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n status: \"init\",\n isOptimistic: false,\n count: 1,\n }),\n );\n\n observer.next.mockClear();\n\n // Test transition to loading\n subject.next({\n ...basePayload,\n status: \"loading\",\n lastUpdated: Date.now(),\n });\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n status: \"loading\",\n isOptimistic: false,\n count: 1,\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"multiple objects\", () => {\n it(\"should handle multiple objects in collection\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const objectKey2: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 2],\n } as ObjectCacheKey;\n\n const objectKey3: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 3],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1, objectKey2, objectKey3],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n // Mock store.getSubject for all three objects\n vi.mocked(mockStore.getSubject).mockImplementation((cacheKey: any) => {\n if (cacheKey === objectKey1) {\n return new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n if (cacheKey === objectKey2) {\n return new BehaviorSubject({\n cacheKey: objectKey2,\n value: mockEmployee2,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n if (cacheKey === objectKey3) {\n return new BehaviorSubject({\n cacheKey: objectKey3,\n value: mockEmployee3,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n return new BehaviorSubject(undefined as any);\n }) as any;\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1, mockEmployee2, mockEmployee3],\n status: \"loaded\",\n isOptimistic: false,\n count: 3,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should handle objects being added/removed from collection\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const objectKey2: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 2],\n } as ObjectCacheKey;\n\n // Start with one object\n const initialPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(initialPayload);\n\n vi.mocked(mockStore.getSubject).mockImplementation((cacheKey: any) => {\n if (cacheKey === objectKey1) {\n return new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n if (cacheKey === objectKey2) {\n return new BehaviorSubject({\n cacheKey: objectKey2,\n value: mockEmployee2,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n return new BehaviorSubject(undefined as any);\n }) as any;\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n // First check - single object\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n count: 1,\n }),\n );\n\n observer.next.mockClear();\n\n // Add second object\n subject.next({\n ...initialPayload,\n value: {\n data: [objectKey1, objectKey2],\n },\n lastUpdated: Date.now(),\n });\n\n // Second check - two objects\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1, mockEmployee2],\n count: 2,\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"subscription behavior\", () => {\n it(\"should support multiple subscribers\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n vi.mocked(mockStore.getSubject).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer1 = mockObserver<TestPayload>();\n const observer2 = mockObserver<TestPayload>();\n\n connectable.subscribe(observer1);\n connectable.subscribe(observer2);\n\n await waitForCall(observer1);\n await waitForCall(observer2);\n\n // Both observers should receive the data\n expect(observer1.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n count: 1,\n }),\n );\n\n expect(observer2.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n count: 1,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should use ReplaySubject behavior (last value replayed)\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n vi.mocked(mockStore.getSubject).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer1 = mockObserver<TestPayload>();\n\n // Subscribe first observer\n connectable.subscribe(observer1);\n\n await waitForCall(observer1);\n expect(observer1.next).toHaveBeenCalledTimes(1);\n observer1.next.mockClear();\n\n // Subscribe second observer after first has already received data\n const observer2 = mockObserver<TestPayload>();\n connectable.subscribe(observer2);\n\n await waitForCall(observer2);\n\n // Second observer should immediately receive the last value (ReplaySubject behavior)\n expect(observer2.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n count: 1,\n }),\n );\n\n // First observer should not receive additional calls\n expect(observer1.next).not.toHaveBeenCalled();\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should handle store.getSubject returning undefined object entry\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n // Mock store.getSubject to return undefined entry - this creates an object with undefined value\n vi.mocked(mockStore.getSubject).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: undefined, // This is the key - undefined value\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n // Should handle undefined object entry gracefully by filtering it out\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [undefined], // The function maps the undefined value from the store\n status: \"loaded\",\n count: 1,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should handle createPayload function throwing errors\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n vi.mocked(mockStore.getSubject).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n // Mock createPayload to throw an error\n const errorThrowingCreatePayload = vi.fn(() => {\n throw new Error(\"Test error in createPayload\");\n });\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockStore,\n errorThrowingCreatePayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer.error);\n\n // Should call the error handler\n expect(observer.error).toHaveBeenCalledWith(\n expect.objectContaining({\n message: \"Test error in createPayload\",\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"createCollectionConnectable.test.js","names":["BehaviorSubject","beforeEach","describe","expect","it","vi","createClientMockHelper","mockObserver","waitForCall","createCollectionConnectable","actualCreateCollectionConnectable","mockEmployee1","$apiName","$primaryKey","$objectType","$title","employeeId","fullName","mockEmployee2","mockEmployee3","mockSubjects","createPayload","mockListCacheKey","client","get","fn","type","otherKeys","params","data","resolvedData","status","isOptimistic","lastUpdated","count","length","objectKey1","objectKey2","subjectPayload","cacheKey","value","Date","now","subject","mocked","mockImplementation","undefined","connectable","subscription","connect","observer","subscribe","next","toHaveBeenCalledWith","objectContaining","unsubscribe","mockReturnValue","basePayload","mockClear","objectKey3","initialPayload","observer1","observer2","toHaveBeenCalledTimes","not","toHaveBeenCalled","errorThrowingCreatePayload","Error","error","message"],"sources":["createCollectionConnectable.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 type { Osdk } from \"@osdk/api\";\nimport type { Employee } from \"@osdk/client.test.ontology\";\nimport { BehaviorSubject } from \"rxjs\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { ObjectCacheKey } from \"../object/ObjectCacheKey.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport type { Subjects } from \"../Subjects.js\";\nimport {\n createClientMockHelper,\n mockObserver,\n waitForCall,\n} from \"../testUtils.js\";\nimport { createCollectionConnectable as actualCreateCollectionConnectable } from \"./createCollectionConnectable.js\";\n\n// Test payload type for our collection\ninterface TestPayload {\n data: any[];\n status: Status;\n isOptimistic: boolean;\n lastUpdated: number;\n count: number;\n}\n\n// Mock object instances for testing\nconst mockEmployee1: Osdk.Instance<Employee> & ObjectHolder = {\n $apiName: \"Employee\",\n $primaryKey: 1,\n $objectType: \"Employee\",\n $title: \"Employee 1\",\n employeeId: 1,\n fullName: \"John Doe\",\n} as any;\n\nconst mockEmployee2: Osdk.Instance<Employee> & ObjectHolder = {\n $apiName: \"Employee\",\n $primaryKey: 2,\n $objectType: \"Employee\",\n $title: \"Employee 2\",\n employeeId: 2,\n fullName: \"Jane Smith\",\n} as any;\n\nconst mockEmployee3: Osdk.Instance<Employee> & ObjectHolder = {\n $apiName: \"Employee\",\n $primaryKey: 3,\n $objectType: \"Employee\",\n $title: \"Employee 3\",\n employeeId: 3,\n fullName: \"Bob Johnson\",\n} as any;\n\ndescribe(\"createCollectionConnectable\", () => {\n let mockSubjects: Subjects;\n let createPayload: ReturnType<typeof vi.fn>;\n let mockListCacheKey: CacheKey<any, any, any, any>;\n\n beforeEach(() => {\n const { client } = createClientMockHelper();\n\n mockSubjects = {\n get: vi.fn(),\n } as any;\n\n // Mock cache key for list\n mockListCacheKey = {\n type: \"list\",\n otherKeys: [\"Employee\", {}, {}],\n } as CacheKey<any, any, any, any>;\n\n // Create payload function that mimics real usage\n createPayload = vi.fn((params) => ({\n data: params.resolvedData,\n status: params.status,\n isOptimistic: params.isOptimistic,\n lastUpdated: params.lastUpdated,\n count: params.resolvedData.length,\n }));\n });\n\n describe(\"basic functionality\", () => {\n it(\"should create a connectable observable with resolved data\", async () => {\n // Mock object cache keys\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const objectKey2: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 2],\n } as ObjectCacheKey;\n\n // Create subject payload with mock data\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1, objectKey2],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n // Mock store.getSubject to return object observables\n vi.mocked(mockSubjects.get).mockImplementation((cacheKey: any) => {\n if (cacheKey === objectKey1) {\n return new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n if (cacheKey === objectKey2) {\n return new BehaviorSubject({\n cacheKey: objectKey2,\n value: mockEmployee2,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n return new BehaviorSubject(undefined as any);\n }) as any;\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n // Connect and subscribe\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n // Wait for the observable to emit\n await waitForCall(observer);\n\n // Verify the result\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1, mockEmployee2],\n status: \"loaded\",\n isOptimistic: false,\n count: 2,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should handle empty data correctly\", async () => {\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [],\n status: \"loaded\",\n isOptimistic: false,\n count: 0,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should handle null/undefined data\", async () => {\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: null as any,\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [],\n status: \"loaded\",\n isOptimistic: false,\n count: 0,\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"optimistic updates\", () => {\n it(\"should propagate optimistic flag correctly\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loading\",\n lastUpdated: Date.now(),\n isOptimistic: true, // This is an optimistic update\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n vi.mocked(mockSubjects.get).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n status: \"loading\",\n isOptimistic: true, // Should preserve optimistic flag\n count: 1,\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"status transitions\", () => {\n it(\"should handle different status values\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const basePayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"init\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(basePayload);\n\n vi.mocked(mockSubjects.get).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n // Wait for initial emission\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n status: \"init\",\n isOptimistic: false,\n count: 1,\n }),\n );\n\n observer.next.mockClear();\n\n // Test transition to loading\n subject.next({\n ...basePayload,\n status: \"loading\",\n lastUpdated: Date.now(),\n });\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n status: \"loading\",\n isOptimistic: false,\n count: 1,\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"multiple objects\", () => {\n it(\"should handle multiple objects in collection\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const objectKey2: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 2],\n } as ObjectCacheKey;\n\n const objectKey3: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 3],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1, objectKey2, objectKey3],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n // Mock store.getSubject for all three objects\n vi.mocked(mockSubjects.get).mockImplementation((cacheKey: any) => {\n if (cacheKey === objectKey1) {\n return new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n if (cacheKey === objectKey2) {\n return new BehaviorSubject({\n cacheKey: objectKey2,\n value: mockEmployee2,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n if (cacheKey === objectKey3) {\n return new BehaviorSubject({\n cacheKey: objectKey3,\n value: mockEmployee3,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n return new BehaviorSubject(undefined as any);\n }) as any;\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1, mockEmployee2, mockEmployee3],\n status: \"loaded\",\n isOptimistic: false,\n count: 3,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should handle objects being added/removed from collection\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const objectKey2: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 2],\n } as ObjectCacheKey;\n\n // Start with one object\n const initialPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(initialPayload);\n\n vi.mocked(mockSubjects.get).mockImplementation((cacheKey: any) => {\n if (cacheKey === objectKey1) {\n return new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n if (cacheKey === objectKey2) {\n return new BehaviorSubject({\n cacheKey: objectKey2,\n value: mockEmployee2,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any);\n }\n return new BehaviorSubject(undefined as any);\n }) as any;\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n // First check - single object\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n count: 1,\n }),\n );\n\n observer.next.mockClear();\n\n // Add second object\n subject.next({\n ...initialPayload,\n value: {\n data: [objectKey1, objectKey2],\n },\n lastUpdated: Date.now(),\n });\n\n // Second check - two objects\n await waitForCall(observer);\n\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1, mockEmployee2],\n count: 2,\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"subscription behavior\", () => {\n it(\"should support multiple subscribers\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n vi.mocked(mockSubjects.get).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer1 = mockObserver<TestPayload>();\n const observer2 = mockObserver<TestPayload>();\n\n connectable.subscribe(observer1);\n connectable.subscribe(observer2);\n\n await waitForCall(observer1);\n await waitForCall(observer2);\n\n // Both observers should receive the data\n expect(observer1.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n count: 1,\n }),\n );\n\n expect(observer2.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n count: 1,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should use ReplaySubject behavior (last value replayed)\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n vi.mocked(mockSubjects.get).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer1 = mockObserver<TestPayload>();\n\n // Subscribe first observer\n connectable.subscribe(observer1);\n\n await waitForCall(observer1);\n expect(observer1.next).toHaveBeenCalledTimes(1);\n observer1.next.mockClear();\n\n // Subscribe second observer after first has already received data\n const observer2 = mockObserver<TestPayload>();\n connectable.subscribe(observer2);\n\n await waitForCall(observer2);\n\n // Second observer should immediately receive the last value (ReplaySubject behavior)\n expect(observer2.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [mockEmployee1],\n count: 1,\n }),\n );\n\n // First observer should not receive additional calls\n expect(observer1.next).not.toHaveBeenCalled();\n\n subscription.unsubscribe();\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should handle store.getSubject returning undefined object entry\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n // Mock store.getSubject to return undefined entry - this creates an object with undefined value\n vi.mocked(mockSubjects.get).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: undefined, // This is the key - undefined value\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n createPayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer);\n\n // Should handle undefined object entry gracefully by filtering it out\n expect(observer.next).toHaveBeenCalledWith(\n expect.objectContaining({\n data: [undefined], // The function maps the undefined value from the store\n status: \"loaded\",\n count: 1,\n }),\n );\n\n subscription.unsubscribe();\n });\n\n it(\"should handle createPayload function throwing errors\", async () => {\n const objectKey1: ObjectCacheKey = {\n type: \"object\",\n otherKeys: [\"Employee\", 1],\n } as ObjectCacheKey;\n\n const subjectPayload: SubjectPayload<typeof mockListCacheKey> = {\n cacheKey: mockListCacheKey,\n value: {\n data: [objectKey1],\n },\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n };\n\n const subject = new BehaviorSubject(subjectPayload);\n\n vi.mocked(mockSubjects.get).mockReturnValue(\n new BehaviorSubject({\n cacheKey: objectKey1,\n value: mockEmployee1,\n status: \"loaded\",\n lastUpdated: Date.now(),\n isOptimistic: false,\n } as any),\n );\n\n // Mock createPayload to throw an error\n const errorThrowingCreatePayload = vi.fn(() => {\n throw new Error(\"Test error in createPayload\");\n });\n\n const connectable = actualCreateCollectionConnectable(\n subject,\n mockSubjects,\n errorThrowingCreatePayload,\n );\n\n const subscription = connectable.connect();\n const observer = mockObserver<TestPayload>();\n\n connectable.subscribe(observer);\n\n await waitForCall(observer.error);\n\n // Should call the error handler\n expect(observer.error).toHaveBeenCalledWith(\n expect.objectContaining({\n message: \"Test error in createPayload\",\n }),\n );\n\n subscription.unsubscribe();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeDuplicates.js","names":["removeDuplicates","objectCacheKeys","batch","visited","Set","filter","key","read","has","add"],"sources":["removeDuplicates.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 {
|
|
1
|
+
{"version":3,"file":"removeDuplicates.js","names":["removeDuplicates","objectCacheKeys","batch","visited","Set","filter","key","read","has","add"],"sources":["removeDuplicates.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 { BatchContext } from \"../BatchContext.js\";\nimport type { ObjectCacheKey } from \"../object/ObjectCacheKey.js\";\n\n/**\n * Removes duplicate object cache keys from an array while maintaining order.\n * Also reads each key from the batch context (for side effects).\n *\n * @param objectCacheKeys Array of object cache keys that may contain duplicates\n * @param batch The batch context used to read cache entries\n * @returns Array with duplicates removed, maintaining the original order\n */\nexport function removeDuplicates(\n objectCacheKeys: ObjectCacheKey[],\n batch: BatchContext,\n): ObjectCacheKey[] {\n const visited = new Set<ObjectCacheKey>();\n return objectCacheKeys.filter((key) => {\n batch.read(key);\n if (visited.has(key)) {\n return false;\n }\n visited.add(key);\n return true;\n });\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,gBAAgBA,CAC9BC,eAAiC,EACjCC,KAAmB,EACD;EAClB,MAAMC,OAAO,GAAG,IAAIC,GAAG,CAAiB,CAAC;EACzC,OAAOH,eAAe,CAACI,MAAM,CAAEC,GAAG,IAAK;IACrCJ,KAAK,CAACK,IAAI,CAACD,GAAG,CAAC;IACf,IAAIH,OAAO,CAACK,GAAG,CAACF,GAAG,CAAC,EAAE;MACpB,OAAO,KAAK;IACd;IACAH,OAAO,CAACM,GAAG,CAACH,GAAG,CAAC;IAChB,OAAO,IAAI;EACb,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
export function createInitEntry(cacheKey) {
|
|
18
|
+
return {
|
|
19
|
+
cacheKey,
|
|
20
|
+
status: "init",
|
|
21
|
+
value: undefined,
|
|
22
|
+
lastUpdated: 0
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=createInitEntry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createInitEntry.js","names":["createInitEntry","cacheKey","status","value","undefined","lastUpdated"],"sources":["createInitEntry.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 { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\n\nexport function createInitEntry(cacheKey: KnownCacheKey): Entry<any> {\n return {\n cacheKey,\n status: \"init\",\n value: undefined,\n lastUpdated: 0,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,OAAO,SAASA,eAAeA,CAACC,QAAuB,EAAc;EACnE,OAAO;IACLA,QAAQ;IACRC,MAAM,EAAE,MAAM;IACdC,KAAK,EAAEC,SAAS;IAChBC,WAAW,EAAE;EACf,CAAC;AACH","ignoreList":[]}
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
import { AbstractHelper } from "../AbstractHelper.js";
|
|
18
18
|
import { SpecificLinkQuery } from "./SpecificLinkQuery.js";
|
|
19
19
|
export class LinksHelper extends AbstractHelper {
|
|
20
|
-
constructor(store, whereCanonicalizer, orderByCanonicalizer) {
|
|
21
|
-
super(store);
|
|
20
|
+
constructor(store, cacheKeys, whereCanonicalizer, orderByCanonicalizer) {
|
|
21
|
+
super(store, cacheKeys);
|
|
22
22
|
this.whereCanonicalizer = whereCanonicalizer;
|
|
23
23
|
this.orderByCanonicalizer = orderByCanonicalizer;
|
|
24
24
|
}
|
|
@@ -28,9 +28,9 @@ export class LinksHelper extends AbstractHelper {
|
|
|
28
28
|
} = options.srcType;
|
|
29
29
|
const canonWhere = this.whereCanonicalizer.canonicalize(options.where ?? {});
|
|
30
30
|
const canonOrderBy = this.orderByCanonicalizer.canonicalize(options.orderBy ?? {});
|
|
31
|
-
const linkCacheKey = this.
|
|
32
|
-
return this.store.
|
|
33
|
-
return new SpecificLinkQuery(this.store, this.store.
|
|
31
|
+
const linkCacheKey = this.cacheKeys.get("specificLink", apiName, options.pk, options.linkName, canonWhere, canonOrderBy);
|
|
32
|
+
return this.store.queries.get(linkCacheKey, () => {
|
|
33
|
+
return new SpecificLinkQuery(this.store, this.store.subjects.get(linkCacheKey), linkCacheKey, options);
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinksHelper.js","names":["AbstractHelper","SpecificLinkQuery","LinksHelper","constructor","store","whereCanonicalizer","orderByCanonicalizer","getQuery","options","apiName","srcType","canonWhere","canonicalize","where","canonOrderBy","orderBy","linkCacheKey","
|
|
1
|
+
{"version":3,"file":"LinksHelper.js","names":["AbstractHelper","SpecificLinkQuery","LinksHelper","constructor","store","cacheKeys","whereCanonicalizer","orderByCanonicalizer","getQuery","options","apiName","srcType","canonWhere","canonicalize","where","canonOrderBy","orderBy","linkCacheKey","get","pk","linkName","queries","subjects"],"sources":["LinksHelper.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 { CompileTimeMetadata, ObjectTypeDefinition } from \"@osdk/api\";\nimport type { SpecificLinkPayload } from \"../../LinkPayload.js\";\n\nimport type { Observer } from \"../../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../../ObservableClient/ObserveLink.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { CacheKeys } from \"../CacheKeys.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 { SpecificLinkCacheKey } from \"./SpecificLinkCacheKey.js\";\nimport { SpecificLinkQuery } from \"./SpecificLinkQuery.js\";\n\nexport interface LinksHelper {\n observe<\n T extends ObjectTypeDefinition,\n L extends keyof CompileTimeMetadata<T>[\"links\"] & string,\n >(\n options: ObserveLinks.Options<T, L>,\n subFn: Observer<SpecificLinkPayload>,\n ): QuerySubscription<SpecificLinkQuery>;\n\n getQuery<\n T extends ObjectTypeDefinition,\n L extends keyof CompileTimeMetadata<T>[\"links\"] & string,\n >(options: ObserveLinks.Options<T, L>): SpecificLinkQuery;\n}\n\nexport class LinksHelper extends AbstractHelper<\n SpecificLinkQuery,\n ObserveLinks.Options<ObjectTypeDefinition, string>\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 getQuery<\n T extends ObjectTypeDefinition,\n L extends keyof CompileTimeMetadata<T>[\"links\"] & string,\n >(options: ObserveLinks.Options<T, L>): SpecificLinkQuery {\n const { apiName } = options.srcType;\n\n const canonWhere = this.whereCanonicalizer.canonicalize(\n options.where ?? {},\n );\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(\n options.orderBy ?? {},\n );\n const linkCacheKey = this.cacheKeys.get<SpecificLinkCacheKey>(\n \"specificLink\",\n apiName,\n options.pk,\n options.linkName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.store.queries.get(linkCacheKey, () => {\n return new SpecificLinkQuery(\n this.store,\n this.store.subjects.get(linkCacheKey),\n linkCacheKey,\n options,\n );\n });\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA,SAASA,cAAc,QAAQ,sBAAsB;AAQrD,SAASC,iBAAiB,QAAQ,wBAAwB;AAiB1D,OAAO,MAAMC,WAAW,SAASF,cAAc,CAG7C;EAIAG,WAAWA,CACTC,KAAY,EACZC,SAAmC,EACnCC,kBAA4C,EAC5CC,oBAA0C,EAC1C;IACA,KAAK,CAACH,KAAK,EAAEC,SAAS,CAAC;IAEvB,IAAI,CAACC,kBAAkB,GAAGA,kBAAkB;IAC5C,IAAI,CAACC,oBAAoB,GAAGA,oBAAoB;EAClD;EAEAC,QAAQA,CAGNC,OAAmC,EAAqB;IACxD,MAAM;MAAEC;IAAQ,CAAC,GAAGD,OAAO,CAACE,OAAO;IAEnC,MAAMC,UAAU,GAAG,IAAI,CAACN,kBAAkB,CAACO,YAAY,CACrDJ,OAAO,CAACK,KAAK,IAAI,CAAC,CACpB,CAAC;IACD,MAAMC,YAAY,GAAG,IAAI,CAACR,oBAAoB,CAACM,YAAY,CACzDJ,OAAO,CAACO,OAAO,IAAI,CAAC,CACtB,CAAC;IACD,MAAMC,YAAY,GAAG,IAAI,CAACZ,SAAS,CAACa,GAAG,CACrC,cAAc,EACdR,OAAO,EACPD,OAAO,CAACU,EAAE,EACVV,OAAO,CAACW,QAAQ,EAChBR,UAAU,EACVG,YACF,CAAC;IAED,OAAO,IAAI,CAACX,KAAK,CAACiB,OAAO,CAACH,GAAG,CAACD,YAAY,EAAE,MAAM;MAChD,OAAO,IAAIhB,iBAAiB,CAC1B,IAAI,CAACG,KAAK,EACV,IAAI,CAACA,KAAK,CAACkB,QAAQ,CAACJ,GAAG,CAACD,YAAY,CAAC,EACrCA,YAAY,EACZR,OACF,CAAC;IACH,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpecificLinkQuery.js","names":["deepEqual","additionalContext","BaseListQuery","OrderBySortingStrategy","tombstone","SpecificLinkQuery","sourceApiName","sourcePk","linkName","whereClause","orderBy","registerCacheChanges","batch","changes","modified","add","cacheKey","constructor","store","subject","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","map","x","JSON","stringify","join","undefined","sortingStrategy","fetchPageData","signal","sourceObjectDef","type","apiName","sourceMetadata","ontologyProvider","getObjectDefinition","sourceQuery","where","primaryKeyApiName","linkQuery","pivotTo","aborted","Error","queryParams","$pageSize","options","pageSize","$nextPageToken","nextPageToken","Object","keys","length","$orderBy","$where","response","fetchPage","deleteFromStore","status","entry","read","value","methodName","debug","write","ret","delete","deleted","maybeUpdateAndRevalidate","has","revalidate","Promise","resolve","invalidateObjectType","objectType","linkDef","links","targetType","promise","isSpecificLinkCacheKey","key"],"sources":["SpecificLinkQuery.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 ObjectTypeDefinition,\n Osdk,\n PageResult,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport { type Subject } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport type { SpecificLinkPayload } from \"../../LinkPayload.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../../ObservableClient/ObserveLink.js\";\nimport { BaseListQuery } from \"../base-list/BaseListQuery.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Entry } from \"../Layer.js\";\nimport type { OptimisticId } from \"../OptimisticId.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport { OrderBySortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { BatchContext, Store, SubjectPayload } from \"../Store.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport type { SpecificLinkCacheKey } from \"./SpecificLinkCacheKey.js\";\n\n/**\n * Query implementation for retrieving linked objects from a specific object.\n * - Stores links as ObjectCacheKey[] references\n * - Creates indirect dependencies on linked objects\n * - Supports filtering and sorting of linked collections\n * - Handles proper invalidation of related objects\n */\nexport class SpecificLinkQuery extends BaseListQuery<\n SpecificLinkCacheKey,\n SpecificLinkPayload,\n ObserveLinks.Options<ObjectTypeDefinition, string>\n> {\n #sourceApiName: string;\n #sourcePk: PrimaryKeyType<ObjectTypeDefinition>;\n #linkName: string;\n #whereClause: Canonical<SimpleWhereClause>;\n #orderBy: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>;\n\n /**\n * Register changes to the cache specific to SpecificLinkQuery\n */\n protected registerCacheChanges(batch: BatchContext): void {\n batch.changes.modified.add(this.cacheKey);\n }\n\n constructor(\n store: Store,\n subject: Subject<SubjectPayload<SpecificLinkCacheKey>>,\n cacheKey: SpecificLinkCacheKey,\n opts: ObserveLinks.Options<\n ObjectTypeDefinition,\n string\n >,\n ) {\n super(\n store,\n subject,\n opts,\n cacheKey,\n process.env.NODE_ENV !== \"production\"\n ? (\n store.client[additionalContext].logger?.child({}, {\n msgPrefix: `SpecificLinkQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n\n // Extract the necessary parameters from the cache key\n [\n this.#sourceApiName,\n this.#sourcePk,\n this.#linkName,\n this.#whereClause,\n this.#orderBy,\n ] = cacheKey.otherKeys;\n\n this.sortingStrategy = new OrderBySortingStrategy(\n this.#linkName,\n this.#orderBy,\n );\n }\n\n // _fetchAndStore is now implemented in BaseCollectionQuery\n\n /**\n * Implements fetchPageData from the BaseCollectionQuery template method pattern\n * Fetches a page of linked objects\n */\n protected async fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>> {\n // Use the client API to create a query that pivots to linked objects\n const client = this.store.client;\n\n // First, get metadata for the source object to know the primary key field name\n const sourceObjectDef = {\n type: \"object\",\n apiName: this.#sourceApiName,\n } as ObjectTypeDefinition;\n\n // Use the client's ontologyProvider to get metadata, which has built-in caching\n const sourceMetadata = await client[additionalContext].ontologyProvider\n .getObjectDefinition(this.#sourceApiName);\n\n // Query for the specific source object\n const sourceQuery = client(sourceObjectDef).where({\n [sourceMetadata.primaryKeyApiName]: this.#sourcePk,\n } as WhereClause<any>);\n\n // Pivot to the linked objects\n const linkQuery = sourceQuery.pivotTo(this.#linkName);\n\n // Check for abort signal again before fetching\n if (signal?.aborted) {\n throw new Error(\"Aborted\");\n }\n\n // Fetch the linked objects with pagination\n // Add orderBy to the query parameters if specified\n const queryParams: any = {\n $pageSize: this.options.pageSize || 100,\n $nextPageToken: this.nextPageToken,\n };\n\n // Include orderBy if it has entries\n if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {\n queryParams.$orderBy = this.#orderBy;\n }\n\n // Include whereClause if it has entries\n if (this.#whereClause && Object.keys(this.#whereClause).length > 0) {\n queryParams.$where = this.#whereClause;\n }\n\n const response = await linkQuery.fetchPage(queryParams);\n\n // Store the next page token for pagination\n this.nextPageToken = response.nextPageToken;\n\n return response;\n }\n\n /**\n * Removes a link query from the store\n */\n deleteFromStore(\n status: Status,\n batch: BatchContext,\n ): Entry<SpecificLinkCacheKey> | undefined {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(tombstone, entry.value)) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n `Links were already deleted, just setting status`,\n );\n }\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n JSON.stringify({ status }),\n );\n }\n\n // If there is no entry then there is nothing to do\n if (!entry || !entry.value) {\n return;\n }\n\n const ret = batch.delete(this.cacheKey, status);\n batch.changes.deleted.add(this.cacheKey);\n\n return ret;\n }\n\n /**\n * Implements Query.maybeUpdateAndRevalidate to handle cache invalidation\n */\n maybeUpdateAndRevalidate = async (\n changes: Changes,\n _optimisticId: OptimisticId | undefined,\n ): Promise<void> => {\n // TODO: Implement proper invalidation logic for linked objects\n // This would check if any of the linked objects have changed,\n // or if the source object's links might have changed\n\n // For now, simply check if this specific link cache key was modified\n if (changes.modified.has(this.cacheKey)) {\n return this.revalidate(true);\n }\n\n // No relevant changes were detected\n return Promise.resolve();\n };\n\n invalidateObjectType = (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n // We need to invalidate links in two cases:\n // 1. When the source object type matches the apiName (direct invalidation)\n // 2. When the target object type might be the invalidated type (affected by target changes)\n\n // For case 1 - direct source object type match\n if (this.#sourceApiName === objectType) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n } else {\n // For case 2 - check if the link's target type matches the invalidated type\n // We need to use the ontology provider to get the link metadata\n // Since this is async, we'll collect all the metadata check promises\n return (async () => {\n // Get the source object metadata to determine link target type\n const sourceMetadata = await this.store.client[additionalContext]\n .ontologyProvider\n .getObjectDefinition(this.#sourceApiName);\n\n const linkDef = sourceMetadata.links?.[this.#linkName];\n if (!linkDef || linkDef.targetType !== objectType) return;\n\n const promise = this.revalidate(true);\n changes?.modified.add(this.cacheKey);\n return promise;\n })();\n }\n };\n}\n\n/**\n * Type guard to check if a cache key is a SpecificLinkCacheKey\n */\nexport function isSpecificLinkCacheKey(\n key: CacheKey,\n): key is SpecificLinkCacheKey {\n return key.type === \"specificLink\";\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SpecificLinkQuery.js","names":["deepEqual","additionalContext","BaseListQuery","OrderBySortingStrategy","tombstone","SpecificLinkQuery","sourceApiName","sourcePk","linkName","whereClause","orderBy","registerCacheChanges","batch","changes","modified","add","cacheKey","constructor","store","subject","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","map","x","JSON","stringify","join","undefined","sortingStrategy","fetchPageData","signal","sourceObjectDef","type","apiName","sourceMetadata","ontologyProvider","getObjectDefinition","sourceQuery","where","primaryKeyApiName","linkQuery","pivotTo","aborted","Error","queryParams","$pageSize","options","pageSize","$nextPageToken","nextPageToken","Object","keys","length","$orderBy","$where","response","fetchPage","deleteFromStore","status","entry","read","value","methodName","debug","write","ret","delete","deleted","maybeUpdateAndRevalidate","has","revalidate","Promise","resolve","invalidateObjectType","objectType","linkDef","links","targetType","promise","isSpecificLinkCacheKey","key"],"sources":["SpecificLinkQuery.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 ObjectTypeDefinition,\n Osdk,\n PageResult,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport { type Subject } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport type { SpecificLinkPayload } from \"../../LinkPayload.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../../ObservableClient/ObserveLink.js\";\nimport { BaseListQuery } from \"../base-list/BaseListQuery.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Entry } from \"../Layer.js\";\nimport type { OptimisticId } from \"../OptimisticId.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport { OrderBySortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport type { SpecificLinkCacheKey } from \"./SpecificLinkCacheKey.js\";\n\n/**\n * Query implementation for retrieving linked objects from a specific object.\n * - Stores links as ObjectCacheKey[] references\n * - Creates indirect dependencies on linked objects\n * - Supports filtering and sorting of linked collections\n * - Handles proper invalidation of related objects\n */\nexport class SpecificLinkQuery extends BaseListQuery<\n SpecificLinkCacheKey,\n SpecificLinkPayload,\n ObserveLinks.Options<ObjectTypeDefinition, string>\n> {\n #sourceApiName: string;\n #sourcePk: PrimaryKeyType<ObjectTypeDefinition>;\n #linkName: string;\n #whereClause: Canonical<SimpleWhereClause>;\n #orderBy: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>;\n\n /**\n * Register changes to the cache specific to SpecificLinkQuery\n */\n protected registerCacheChanges(batch: BatchContext): void {\n batch.changes.modified.add(this.cacheKey);\n }\n\n constructor(\n store: Store,\n subject: Subject<SubjectPayload<SpecificLinkCacheKey>>,\n cacheKey: SpecificLinkCacheKey,\n opts: ObserveLinks.Options<\n ObjectTypeDefinition,\n string\n >,\n ) {\n super(\n store,\n subject,\n opts,\n cacheKey,\n process.env.NODE_ENV !== \"production\"\n ? (\n store.client[additionalContext].logger?.child({}, {\n msgPrefix: `SpecificLinkQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n\n // Extract the necessary parameters from the cache key\n [\n this.#sourceApiName,\n this.#sourcePk,\n this.#linkName,\n this.#whereClause,\n this.#orderBy,\n ] = cacheKey.otherKeys;\n\n this.sortingStrategy = new OrderBySortingStrategy(\n this.#linkName,\n this.#orderBy,\n );\n }\n\n // _fetchAndStore is now implemented in BaseCollectionQuery\n\n /**\n * Implements fetchPageData from the BaseCollectionQuery template method pattern\n * Fetches a page of linked objects\n */\n protected async fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>> {\n // Use the client API to create a query that pivots to linked objects\n const client = this.store.client;\n\n // First, get metadata for the source object to know the primary key field name\n const sourceObjectDef = {\n type: \"object\",\n apiName: this.#sourceApiName,\n } as ObjectTypeDefinition;\n\n // Use the client's ontologyProvider to get metadata, which has built-in caching\n const sourceMetadata = await client[additionalContext].ontologyProvider\n .getObjectDefinition(this.#sourceApiName);\n\n // Query for the specific source object\n const sourceQuery = client(sourceObjectDef).where({\n [sourceMetadata.primaryKeyApiName]: this.#sourcePk,\n } as WhereClause<any>);\n\n // Pivot to the linked objects\n const linkQuery = sourceQuery.pivotTo(this.#linkName);\n\n // Check for abort signal again before fetching\n if (signal?.aborted) {\n throw new Error(\"Aborted\");\n }\n\n // Fetch the linked objects with pagination\n // Add orderBy to the query parameters if specified\n const queryParams: any = {\n $pageSize: this.options.pageSize || 100,\n $nextPageToken: this.nextPageToken,\n };\n\n // Include orderBy if it has entries\n if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {\n queryParams.$orderBy = this.#orderBy;\n }\n\n // Include whereClause if it has entries\n if (this.#whereClause && Object.keys(this.#whereClause).length > 0) {\n queryParams.$where = this.#whereClause;\n }\n\n const response = await linkQuery.fetchPage(queryParams);\n\n // Store the next page token for pagination\n this.nextPageToken = response.nextPageToken;\n\n return response;\n }\n\n /**\n * Removes a link query from the store\n */\n deleteFromStore(\n status: Status,\n batch: BatchContext,\n ): Entry<SpecificLinkCacheKey> | undefined {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(tombstone, entry.value)) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n `Links were already deleted, just setting status`,\n );\n }\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n JSON.stringify({ status }),\n );\n }\n\n // If there is no entry then there is nothing to do\n if (!entry || !entry.value) {\n return;\n }\n\n const ret = batch.delete(this.cacheKey, status);\n batch.changes.deleted.add(this.cacheKey);\n\n return ret;\n }\n\n /**\n * Implements Query.maybeUpdateAndRevalidate to handle cache invalidation\n */\n maybeUpdateAndRevalidate = async (\n changes: Changes,\n _optimisticId: OptimisticId | undefined,\n ): Promise<void> => {\n // TODO: Implement proper invalidation logic for linked objects\n // This would check if any of the linked objects have changed,\n // or if the source object's links might have changed\n\n // For now, simply check if this specific link cache key was modified\n if (changes.modified.has(this.cacheKey)) {\n return this.revalidate(true);\n }\n\n // No relevant changes were detected\n return Promise.resolve();\n };\n\n invalidateObjectType = (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n // We need to invalidate links in two cases:\n // 1. When the source object type matches the apiName (direct invalidation)\n // 2. When the target object type might be the invalidated type (affected by target changes)\n\n // For case 1 - direct source object type match\n if (this.#sourceApiName === objectType) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n } else {\n // For case 2 - check if the link's target type matches the invalidated type\n // We need to use the ontology provider to get the link metadata\n // Since this is async, we'll collect all the metadata check promises\n return (async () => {\n // Get the source object metadata to determine link target type\n const sourceMetadata = await this.store.client[additionalContext]\n .ontologyProvider\n .getObjectDefinition(this.#sourceApiName);\n\n const linkDef = sourceMetadata.links?.[this.#linkName];\n if (!linkDef || linkDef.targetType !== objectType) return;\n\n const promise = this.revalidate(true);\n changes?.modified.add(this.cacheKey);\n return promise;\n })();\n }\n };\n}\n\n/**\n * Type guard to check if a cache key is a SpecificLinkCacheKey\n */\nexport function isSpecificLinkCacheKey(\n key: CacheKey,\n): key is SpecificLinkCacheKey {\n return key.type === \"specificLink\";\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -108,7 +108,7 @@ export class ListQuery extends BaseListQuery {
|
|
|
108
108
|
*/
|
|
109
109
|
handleFetchError(error, _status, batch) {
|
|
110
110
|
this.logger?.error("error", error);
|
|
111
|
-
this.store.
|
|
111
|
+
this.store.subjects.get(this.cacheKey).error(error);
|
|
112
112
|
|
|
113
113
|
// We don't call super.handleFetchError because ListQuery has special error handling
|
|
114
114
|
// but we still use writeToStore to create a properly structured Entry
|
|
@@ -200,7 +200,7 @@ export class ListQuery extends BaseListQuery {
|
|
|
200
200
|
// deal with the modified objects
|
|
201
201
|
for (const obj of relevantObjects.modified.all) {
|
|
202
202
|
if (relevantObjects.modified.strictMatches.has(obj)) {
|
|
203
|
-
const objectCacheKey = this.
|
|
203
|
+
const objectCacheKey = this.cacheKeys.get("object", obj.$objectType, obj.$primaryKey);
|
|
204
204
|
if (!existingList.has(objectCacheKey)) {
|
|
205
205
|
// object is new to the list
|
|
206
206
|
toAdd.add(obj);
|
|
@@ -213,7 +213,7 @@ export class ListQuery extends BaseListQuery {
|
|
|
213
213
|
continue;
|
|
214
214
|
} else {
|
|
215
215
|
// object is no longer a strict match
|
|
216
|
-
const existingObjectCacheKey = this.
|
|
216
|
+
const existingObjectCacheKey = this.cacheKeys.get("object", obj.$objectType, obj.$primaryKey);
|
|
217
217
|
toRemove.add(existingObjectCacheKey);
|
|
218
218
|
if (relevantObjects.modified.sortaMatches.has(obj)) {
|
|
219
219
|
// since it might still be in the list we need to revalidate
|
|
@@ -226,7 +226,7 @@ export class ListQuery extends BaseListQuery {
|
|
|
226
226
|
newList.push(key);
|
|
227
227
|
}
|
|
228
228
|
for (const obj of toAdd) {
|
|
229
|
-
newList.push(this.
|
|
229
|
+
newList.push(this.cacheKeys.get("object", obj.$objectType, obj.$primaryKey));
|
|
230
230
|
}
|
|
231
231
|
this._updateList(newList, status, batch, /* append */false);
|
|
232
232
|
});
|
|
@@ -377,7 +377,7 @@ export class ListQuery extends BaseListQuery {
|
|
|
377
377
|
const existing = batch.read(this.cacheKey);
|
|
378
378
|
!existing ? process.env.NODE_ENV !== "production" ? invariant(false, "the truth value for our list should exist as we already subscribed") : invariant(false) : void 0;
|
|
379
379
|
if (existing.status === "loaded") {
|
|
380
|
-
const objectCacheKey = this.
|
|
380
|
+
const objectCacheKey = this.cacheKeys.get("object", objOrIface.$objectType, objOrIface.$primaryKey);
|
|
381
381
|
// remove the object from the list
|
|
382
382
|
const newObjects = existing.value?.data.filter(o => o !== objectCacheKey);
|
|
383
383
|
|