@osdk/client 2.7.1 → 2.8.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -157
- package/build/browser/Client.js +1 -1
- package/build/browser/Client.js.map +1 -1
- package/build/browser/MinimalClientContext.js.map +1 -1
- package/build/browser/actions/applyAction.js +5 -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 +1 -0
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +17 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js +101 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
- package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js +1 -1
- package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -1
- package/build/browser/fetchMetadata.test.js +9 -0
- package/build/browser/fetchMetadata.test.js.map +1 -1
- package/build/browser/intellisense.test.js +1 -1
- package/build/browser/intellisense.test.js.map +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/browser/object/aggregate.js +1 -0
- package/build/browser/object/aggregate.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.js +3 -0
- package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +4 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +85 -3
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.js +4 -4
- package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +48 -27
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/object/fetchPage.js +18 -5
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/object/object.test.js +123 -0
- package/build/browser/object/object.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSet.test.js +6 -6
- package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +4 -4
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +3 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +0 -4
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/objectSet/fetchLinksPage.js +1 -0
- package/build/browser/objectSet/fetchLinksPage.js.map +1 -1
- package/build/browser/observable/ObservableClient/ObserveLink.js.map +1 -1
- package/build/browser/observable/ObservableClient.js +11 -0
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/internal/AbstractHelper.js +56 -3
- package/build/browser/observable/internal/AbstractHelper.js.map +1 -1
- package/build/browser/observable/internal/AbstractHelper.test.js +114 -0
- package/build/browser/observable/internal/AbstractHelper.test.js.map +1 -0
- package/build/browser/observable/internal/BulkObjectLoader.js +71 -9
- package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/browser/observable/internal/BulkObjectLoader.test.js +79 -0
- package/build/browser/observable/internal/BulkObjectLoader.test.js.map +1 -1
- package/build/browser/observable/internal/CacheKeys.js +19 -8
- package/build/browser/observable/internal/CacheKeys.js.map +1 -1
- package/build/browser/observable/internal/ListQueryView.js +120 -0
- package/build/browser/observable/internal/ListQueryView.js.map +1 -0
- package/build/browser/observable/internal/ObservableClientImpl.js +136 -24
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/PivotCanonicalizer.js +4 -4
- package/build/browser/observable/internal/PivotCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/Query.js +7 -5
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/RdpCanonicalizer.test.js +23 -7
- package/build/browser/observable/internal/RdpCanonicalizer.test.js.map +1 -1
- package/build/browser/observable/internal/Store.js +19 -2
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +328 -1
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/actions/ActionApplication.js +7 -4
- 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/aggregation/AggregationCacheKey.js +5 -3
- package/build/browser/observable/internal/aggregation/AggregationCacheKey.js.map +1 -1
- package/build/browser/observable/internal/aggregation/AggregationQuery.js +28 -2
- package/build/browser/observable/internal/aggregation/AggregationQuery.js.map +1 -1
- package/build/browser/observable/internal/aggregation/AggregationsHelper.js +18 -2
- package/build/browser/observable/internal/aggregation/AggregationsHelper.js.map +1 -1
- package/build/browser/observable/internal/aggregation/AggregationsHelper.test.js +103 -0
- package/build/browser/observable/internal/aggregation/AggregationsHelper.test.js.map +1 -0
- package/build/browser/observable/internal/aggregation/ObjectAggregationQuery.js +22 -3
- package/build/browser/observable/internal/aggregation/ObjectAggregationQuery.js.map +1 -1
- package/build/browser/observable/internal/base-list/BaseListQuery.js +73 -6
- package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/browser/observable/internal/function/FunctionQuery.js +27 -1
- package/build/browser/observable/internal/function/FunctionQuery.js.map +1 -1
- package/build/browser/observable/internal/function/FunctionsHelper.js +2 -1
- package/build/browser/observable/internal/function/FunctionsHelper.js.map +1 -1
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.js +2 -2
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.js.map +1 -1
- package/build/browser/observable/internal/links/LinksHelper.js +3 -2
- package/build/browser/observable/internal/links/LinksHelper.js.map +1 -1
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js +7 -5
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
- package/build/browser/observable/internal/links/SpecificLinkQuery.js +97 -62
- package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -1
- package/build/browser/observable/internal/list/InterfaceListQuery.js +19 -1
- package/build/browser/observable/internal/list/InterfaceListQuery.js.map +1 -1
- package/build/browser/observable/internal/list/ListQuery.js +30 -10
- package/build/browser/observable/internal/list/ListQuery.js.map +1 -1
- package/build/browser/observable/internal/list/ListQuery.test.js +262 -1
- package/build/browser/observable/internal/list/ListQuery.test.js.map +1 -1
- package/build/browser/observable/internal/list/ListsHelper.js +1 -1
- package/build/browser/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/browser/observable/internal/list/ObjectListQuery.js +22 -21
- package/build/browser/observable/internal/list/ObjectListQuery.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectQuery.js +23 -6
- package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectsHelper.js +12 -3
- package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectsHelper.test.js +200 -0
- package/build/browser/observable/internal/object/ObjectsHelper.test.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js +3 -2
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetHelper.test.js +94 -0
- package/build/browser/observable/internal/objectset/ObjectSetHelper.test.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js +4 -1
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
- package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +1 -0
- package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -1
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/observable/internal/utils/rdpFieldOperations.js +7 -2
- package/build/browser/observable/internal/utils/rdpFieldOperations.js.map +1 -1
- package/build/browser/observable/internal/utils/rdpFieldOperations.test.js +55 -0
- package/build/browser/observable/internal/utils/rdpFieldOperations.test.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/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/interfaceUtils.js +7 -0
- package/build/browser/util/interfaceUtils.js.map +1 -1
- package/build/cjs/{chunk-OVZCGOMG.cjs → chunk-6VOFZIIJ.cjs} +196 -92
- package/build/cjs/chunk-6VOFZIIJ.cjs.map +1 -0
- package/build/cjs/{chunk-OZNDU7AU.cjs → chunk-YVZM2JPW.cjs} +237 -196
- package/build/cjs/chunk-YVZM2JPW.cjs.map +1 -0
- package/build/cjs/{createClient-BDmrDOzZ.d.cts → createClient-BPK4om7e.d.cts} +1 -0
- package/build/cjs/index.cjs +8 -8
- 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 +928 -360
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +65 -27
- package/build/esm/Client.js +1 -1
- package/build/esm/Client.js.map +1 -1
- package/build/esm/MinimalClientContext.js.map +1 -1
- package/build/esm/actions/applyAction.js +5 -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 +1 -0
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +17 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js +101 -0
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
- package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js +1 -1
- package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -1
- package/build/esm/fetchMetadata.test.js +9 -0
- package/build/esm/fetchMetadata.test.js.map +1 -1
- package/build/esm/intellisense.test.js +1 -1
- package/build/esm/intellisense.test.js.map +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/esm/object/aggregate.js +1 -0
- package/build/esm/object/aggregate.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.js +3 -0
- package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +4 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +85 -3
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.js +4 -4
- package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +48 -27
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/object/fetchPage.js +18 -5
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/object/object.test.js +123 -0
- package/build/esm/object/object.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSet.test.js +6 -6
- package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +4 -4
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +3 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +0 -4
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/objectSet/fetchLinksPage.js +1 -0
- package/build/esm/objectSet/fetchLinksPage.js.map +1 -1
- package/build/esm/observable/ObservableClient/ObserveLink.js.map +1 -1
- package/build/esm/observable/ObservableClient.js +11 -0
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/internal/AbstractHelper.js +56 -3
- package/build/esm/observable/internal/AbstractHelper.js.map +1 -1
- package/build/esm/observable/internal/AbstractHelper.test.js +114 -0
- package/build/esm/observable/internal/AbstractHelper.test.js.map +1 -0
- package/build/esm/observable/internal/BulkObjectLoader.js +71 -9
- package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/esm/observable/internal/BulkObjectLoader.test.js +79 -0
- package/build/esm/observable/internal/BulkObjectLoader.test.js.map +1 -1
- package/build/esm/observable/internal/CacheKeys.js +19 -8
- package/build/esm/observable/internal/CacheKeys.js.map +1 -1
- package/build/esm/observable/internal/ListQueryView.js +120 -0
- package/build/esm/observable/internal/ListQueryView.js.map +1 -0
- package/build/esm/observable/internal/ObservableClientImpl.js +136 -24
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/PivotCanonicalizer.js +4 -4
- package/build/esm/observable/internal/PivotCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/Query.js +7 -5
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/RdpCanonicalizer.test.js +23 -7
- package/build/esm/observable/internal/RdpCanonicalizer.test.js.map +1 -1
- package/build/esm/observable/internal/Store.js +19 -2
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +328 -1
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/actions/ActionApplication.js +7 -4
- 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/aggregation/AggregationCacheKey.js +5 -3
- package/build/esm/observable/internal/aggregation/AggregationCacheKey.js.map +1 -1
- package/build/esm/observable/internal/aggregation/AggregationQuery.js +28 -2
- package/build/esm/observable/internal/aggregation/AggregationQuery.js.map +1 -1
- package/build/esm/observable/internal/aggregation/AggregationsHelper.js +18 -2
- package/build/esm/observable/internal/aggregation/AggregationsHelper.js.map +1 -1
- package/build/esm/observable/internal/aggregation/AggregationsHelper.test.js +103 -0
- package/build/esm/observable/internal/aggregation/AggregationsHelper.test.js.map +1 -0
- package/build/esm/observable/internal/aggregation/ObjectAggregationQuery.js +22 -3
- package/build/esm/observable/internal/aggregation/ObjectAggregationQuery.js.map +1 -1
- package/build/esm/observable/internal/base-list/BaseListQuery.js +73 -6
- package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/esm/observable/internal/function/FunctionQuery.js +27 -1
- package/build/esm/observable/internal/function/FunctionQuery.js.map +1 -1
- package/build/esm/observable/internal/function/FunctionsHelper.js +2 -1
- package/build/esm/observable/internal/function/FunctionsHelper.js.map +1 -1
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.js +2 -2
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.js.map +1 -1
- package/build/esm/observable/internal/links/LinksHelper.js +3 -2
- package/build/esm/observable/internal/links/LinksHelper.js.map +1 -1
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js +7 -5
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
- package/build/esm/observable/internal/links/SpecificLinkQuery.js +97 -62
- package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -1
- package/build/esm/observable/internal/list/InterfaceListQuery.js +19 -1
- package/build/esm/observable/internal/list/InterfaceListQuery.js.map +1 -1
- package/build/esm/observable/internal/list/ListQuery.js +30 -10
- package/build/esm/observable/internal/list/ListQuery.js.map +1 -1
- package/build/esm/observable/internal/list/ListQuery.test.js +262 -1
- package/build/esm/observable/internal/list/ListQuery.test.js.map +1 -1
- package/build/esm/observable/internal/list/ListsHelper.js +1 -1
- package/build/esm/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/esm/observable/internal/list/ObjectListQuery.js +22 -21
- package/build/esm/observable/internal/list/ObjectListQuery.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectQuery.js +23 -6
- package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectsHelper.js +12 -3
- package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectsHelper.test.js +200 -0
- package/build/esm/observable/internal/object/ObjectsHelper.test.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js +3 -2
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetHelper.test.js +94 -0
- package/build/esm/observable/internal/objectset/ObjectSetHelper.test.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js +4 -1
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
- package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +1 -0
- package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -1
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/observable/internal/utils/rdpFieldOperations.js +7 -2
- package/build/esm/observable/internal/utils/rdpFieldOperations.js.map +1 -1
- package/build/esm/observable/internal/utils/rdpFieldOperations.test.js +55 -0
- package/build/esm/observable/internal/utils/rdpFieldOperations.test.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/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/interfaceUtils.js +7 -0
- package/build/esm/util/interfaceUtils.js.map +1 -1
- package/build/types/Client.d.ts +1 -1
- package/build/types/MinimalClientContext.d.ts +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/object/convertWireToOsdkObjects/InternalSymbols.d.ts +2 -0
- package/build/types/object/convertWireToOsdkObjects/InternalSymbols.d.ts.map +1 -1
- package/build/types/object/convertWireToOsdkObjects.d.ts +4 -4
- package/build/types/object/convertWireToOsdkObjects.d.ts.map +1 -1
- package/build/types/object/fetchPage.d.ts.map +1 -1
- package/build/types/object/object.test.d.ts.map +1 -1
- package/build/types/objectSet/createObjectSet.d.ts +5 -14
- package/build/types/objectSet/createObjectSet.d.ts.map +1 -1
- package/build/types/objectSet/fetchLinksPage.d.ts +1 -9
- package/build/types/objectSet/fetchLinksPage.d.ts.map +1 -1
- package/build/types/observable/ObservableClient/ObserveLink.d.ts +2 -1
- package/build/types/observable/ObservableClient/ObserveLink.d.ts.map +1 -1
- package/build/types/observable/ObservableClient.d.ts +71 -25
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/internal/AbstractHelper.d.ts +1 -1
- package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -1
- package/build/types/observable/internal/AbstractHelper.test.d.ts +1 -0
- package/build/types/observable/internal/AbstractHelper.test.d.ts.map +1 -0
- package/build/types/observable/internal/BulkObjectLoader.d.ts +2 -1
- package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -1
- package/build/types/observable/internal/CacheKeys.d.ts +5 -0
- package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
- package/build/types/observable/internal/ListQueryView.d.ts +21 -0
- package/build/types/observable/internal/ListQueryView.d.ts.map +1 -0
- package/build/types/observable/internal/PivotCanonicalizer.d.ts +2 -2
- package/build/types/observable/internal/PivotCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- 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/actions/ActionApplication.d.ts.map +1 -1
- package/build/types/observable/internal/actions/OptimisticJob.d.ts.map +1 -1
- package/build/types/observable/internal/aggregation/AggregationCacheKey.d.ts +6 -4
- package/build/types/observable/internal/aggregation/AggregationCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/aggregation/AggregationQuery.d.ts +8 -3
- package/build/types/observable/internal/aggregation/AggregationQuery.d.ts.map +1 -1
- package/build/types/observable/internal/aggregation/AggregationsHelper.d.ts +19 -14
- package/build/types/observable/internal/aggregation/AggregationsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/aggregation/AggregationsHelper.test.d.ts +1 -0
- package/build/types/observable/internal/aggregation/AggregationsHelper.test.d.ts.map +1 -0
- package/build/types/observable/internal/aggregation/ObjectAggregationQuery.d.ts.map +1 -1
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts +47 -2
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/function/FunctionQuery.d.ts +1 -1
- package/build/types/observable/internal/function/FunctionQuery.d.ts.map +1 -1
- package/build/types/observable/internal/function/FunctionsHelper.d.ts +1 -0
- package/build/types/observable/internal/function/FunctionsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/links/LinksHelper.d.ts +5 -5
- package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -1
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +8 -6
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +3 -4
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/InterfaceListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListQuery.d.ts +0 -3
- package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListsHelper.d.ts +4 -4
- package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/list/ObjectListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectQuery.d.ts +2 -1
- package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectsHelper.d.ts +8 -4
- package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectsHelper.test.d.ts +1 -0
- package/build/types/observable/internal/object/ObjectsHelper.test.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts +2 -1
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts +3 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.test.d.ts +1 -0
- package/build/types/observable/internal/objectset/ObjectSetHelper.test.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts +2 -0
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts.map +1 -1
- package/build/types/observable/internal/testUtils.d.ts +2 -2
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/build/types/public/unstable-do-not-use.d.ts +1 -0
- package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
- package/build/types/util/interfaceUtils.d.ts +2 -1
- package/build/types/util/interfaceUtils.d.ts.map +1 -1
- package/package.json +15 -14
- package/build/cjs/chunk-OVZCGOMG.cjs.map +0 -1
- package/build/cjs/chunk-OZNDU7AU.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectsHelper.js","names":["deepEqual","AbstractHelper","tombstone","mergeObjectFields","ObjectQuery","ObjectsHelper","observe","options","subFn","getQuery","rdpConfig","apiName","pk","objectCacheKey","cacheKeys","get","undefined","store","queries","subjects","dedupeInterval","storeOsdkInstances","values","batch","map","v","$objectType","$apiName","$primaryKey","writeToStore","cacheKey","propagateWrite","sourceCacheKey","value","status","existing","read","dataChanged","statusChanged","valueToWrite","write","changes","registerObject","metadata","objectCacheKeyRegistry","getMetadata","relatedKeys","getVariants","primaryKey","Set","targetKey","isKeyActive","targetCurrentValue","merged","mergeForTarget","isObjectHolder","key","subject","peek","observed","sourceValue","targetCacheKey","sourceRdpFields","getRdpFieldSet","targetRdpFields"],"sources":["ObjectsHelper.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 InterfaceDefinition,\n ObjectTypeDefinition,\n Osdk,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type { ObserveObjectOptions } from \"../../ObservableClient.js\";\nimport type { Observer, Status } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport { mergeObjectFields } from \"../utils/rdpFieldOperations.js\";\nimport { type ObjectCacheKey } from \"./ObjectCacheKey.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\n\nexport class ObjectsHelper extends AbstractHelper<\n ObjectQuery,\n ObserveObjectOptions<any>\n> {\n observe<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): QuerySubscription<ObjectQuery> {\n return super.observe(options, subFn);\n }\n\n getQuery<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n rdpConfig?: Canonical<Rdp> | null,\n ): ObjectQuery {\n const apiName = typeof options.apiName === \"string\"\n ? options.apiName\n : options.apiName.apiName;\n const { pk } = options;\n\n const objectCacheKey = this.cacheKeys.get<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n rdpConfig ?? undefined,\n );\n\n return this.store.queries.get(objectCacheKey, () =>\n new ObjectQuery(\n this.store,\n this.store.subjects.get(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n /**\n * Internal helper method for writing objects to the store and returning their\n * object keys. For list queries with RDPs, the rdpConfig is included in the\n * cache key to ensure proper data isolation.\n * @internal\n */\n public storeOsdkInstances(\n values: Array<ObjectHolder> | Array<Osdk.Instance<any, any, any>>,\n batch: BatchContext,\n rdpConfig?: Canonical<Rdp> | null,\n ): ObjectCacheKey[] {\n return values.map(v =>\n this.getQuery({\n apiName: v.$objectType ?? v.$apiName,\n pk: v.$primaryKey as string | number,\n }, rdpConfig).writeToStore(\n v as ObjectHolder,\n \"loaded\",\n batch,\n ).cacheKey\n );\n }\n\n /**\n * Write an object to cache and propagate to all related cache keys\n * @internal\n */\n public propagateWrite(\n sourceCacheKey: ObjectCacheKey,\n value: ObjectHolder | typeof tombstone,\n status: Status,\n batch: BatchContext,\n ): void {\n const existing = batch.read(sourceCacheKey);\n const dataChanged = !existing\n || existing.value === undefined\n || value === tombstone\n || !deepEqual(existing.value, value);\n const statusChanged = !existing || existing.status !== status;\n\n if (!dataChanged && !statusChanged) {\n return;\n }\n\n const valueToWrite = !dataChanged && existing ? existing.value : value;\n batch.write(sourceCacheKey, valueToWrite, status);\n\n if (value !== tombstone) {\n batch.changes.registerObject(sourceCacheKey, value, !existing);\n }\n\n const metadata = this.store.objectCacheKeyRegistry.getMetadata(\n sourceCacheKey,\n );\n\n const relatedKeys = metadata\n ? this.store.objectCacheKeyRegistry.getVariants(\n metadata.apiName,\n metadata.primaryKey,\n )\n : new Set([sourceCacheKey]);\n\n for (const targetKey of relatedKeys) {\n if (targetKey === sourceCacheKey || !this.isKeyActive(targetKey)) {\n continue;\n }\n\n if (value === tombstone) {\n batch.write(targetKey, tombstone, status);\n continue;\n }\n\n const targetCurrentValue = batch.read(targetKey)?.value;\n const merged = this.mergeForTarget(\n value,\n targetCurrentValue && this.isObjectHolder(targetCurrentValue)\n ? targetCurrentValue\n : undefined,\n sourceCacheKey,\n targetKey,\n );\n\n batch.write(targetKey, merged, status);\n }\n }\n\n /**\n * Check if a cache key is actively observed\n */\n private isKeyActive(key: ObjectCacheKey): boolean {\n const subject = this.store.subjects.peek(key);\n return subject?.observed === true;\n }\n\n /**\n * Type guard to check if a value is an ObjectHolder\n */\n private isObjectHolder(\n value: ObjectHolder | undefined,\n ): value is ObjectHolder {\n return value != null\n && typeof value === \"object\"\n && \"$apiName\" in value\n && \"$primaryKey\" in value;\n }\n\n /**\n * Merge object data for a specific target cache key, preserving RDP fields\n */\n private mergeForTarget(\n sourceValue: ObjectHolder,\n targetCurrentValue: ObjectHolder | undefined,\n sourceCacheKey: ObjectCacheKey,\n targetCacheKey: ObjectCacheKey,\n ): ObjectHolder {\n const sourceRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n sourceCacheKey,\n );\n const targetRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n targetCacheKey,\n );\n\n return mergeObjectFields(\n sourceValue,\n sourceRdpFields,\n targetRdpFields,\n targetCurrentValue,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectsHelper.js","names":["deepEqual","getDefType","AbstractHelper","tombstone","mergeObjectFields","ObjectQuery","ObjectsHelper","observe","options","subFn","getQuery","rdpConfig","apiName","pk","defType","objectCacheKey","cacheKeys","get","undefined","store","queries","subjects","dedupeInterval","storeOsdkInstances","values","batch","map","v","$objectType","$apiName","$primaryKey","writeToStore","cacheKey","propagateWrite","sourceCacheKey","value","status","existing","read","dataChanged","statusChanged","valueToWrite","write","changes","registerObject","metadata","objectCacheKeyRegistry","getMetadata","relatedKeys","getVariants","primaryKey","Set","targetKey","isKeyActive","targetCurrentValue","merged","mergeForTarget","isObjectHolder","key","subject","peek","observed","pendingCleanup","sourceValue","targetCacheKey","sourceRdpFields","getRdpFieldSet","targetRdpFields"],"sources":["ObjectsHelper.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 { ObjectOrInterfaceDefinition, Osdk } from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport { getDefType } from \"../../../util/interfaceUtils.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type { ObserveObjectOptions } from \"../../ObservableClient.js\";\nimport type { Observer, Status } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport { mergeObjectFields } from \"../utils/rdpFieldOperations.js\";\nimport { type ObjectCacheKey } from \"./ObjectCacheKey.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\n\nexport class ObjectsHelper extends AbstractHelper<\n ObjectQuery,\n ObserveObjectOptions<any>\n> {\n observe<T extends ObjectOrInterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): QuerySubscription<ObjectQuery> {\n return super.observe(options, subFn);\n }\n\n getQuery<T extends ObjectOrInterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n rdpConfig?: Canonical<Rdp> | null,\n ): ObjectQuery {\n const apiName = typeof options.apiName === \"string\"\n ? options.apiName\n : options.apiName.apiName;\n const { pk } = options;\n\n const defType = getDefType(options.apiName);\n\n const objectCacheKey = this.cacheKeys.get<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n rdpConfig ?? undefined,\n );\n\n return this.store.queries.get(objectCacheKey, () =>\n new ObjectQuery(\n this.store,\n this.store.subjects.get(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n defType,\n ));\n }\n\n /**\n * Internal helper method for writing objects to the store and returning their\n * object keys. For list queries with RDPs, the rdpConfig is included in the\n * cache key to ensure proper data isolation.\n * @internal\n */\n public storeOsdkInstances(\n values: Array<ObjectHolder> | Array<Osdk.Instance<any, any, any>>,\n batch: BatchContext,\n rdpConfig?: Canonical<Rdp> | null,\n ): ObjectCacheKey[] {\n return values.map(v =>\n this.getQuery({\n apiName: v.$objectType ?? v.$apiName,\n pk: v.$primaryKey as string | number,\n }, rdpConfig).writeToStore(\n v as ObjectHolder,\n \"loaded\",\n batch,\n ).cacheKey\n );\n }\n\n /**\n * Write an object to cache and propagate to all related cache keys\n * @internal\n */\n public propagateWrite(\n sourceCacheKey: ObjectCacheKey,\n value: ObjectHolder | typeof tombstone,\n status: Status,\n batch: BatchContext,\n ): void {\n const existing = batch.read(sourceCacheKey);\n const dataChanged = !existing\n || existing.value === undefined\n || value === tombstone\n || !deepEqual(existing.value, value);\n const statusChanged = !existing || existing.status !== status;\n\n if (!dataChanged && !statusChanged) {\n return;\n }\n\n const valueToWrite = !dataChanged && existing ? existing.value : value;\n batch.write(sourceCacheKey, valueToWrite, status);\n\n if (value !== tombstone) {\n batch.changes.registerObject(sourceCacheKey, value, !existing);\n }\n\n const metadata = this.store.objectCacheKeyRegistry.getMetadata(\n sourceCacheKey,\n );\n\n const relatedKeys = metadata\n ? this.store.objectCacheKeyRegistry.getVariants(\n metadata.apiName,\n metadata.primaryKey,\n )\n : new Set([sourceCacheKey]);\n\n for (const targetKey of relatedKeys) {\n if (targetKey === sourceCacheKey || !this.isKeyActive(targetKey)) {\n continue;\n }\n\n if (value === tombstone) {\n batch.write(targetKey, tombstone, status);\n continue;\n }\n\n const targetCurrentValue = batch.read(targetKey)?.value;\n const merged = this.mergeForTarget(\n value,\n targetCurrentValue && this.isObjectHolder(targetCurrentValue)\n ? targetCurrentValue\n : undefined,\n sourceCacheKey,\n targetKey,\n );\n\n batch.write(targetKey, merged, status);\n }\n }\n\n /**\n * Check if a cache key is actively observed or pending cleanup.\n * During React unmount-remount cycles, a key may be momentarily\n * unobserved while its cleanup is deferred to a microtask.\n * We still propagate to such keys to prevent stale data when\n * the subscription is re-established.\n */\n private isKeyActive(key: ObjectCacheKey): boolean {\n const subject = this.store.subjects.peek(key);\n if (subject?.observed === true) {\n return true;\n }\n return (this.store.pendingCleanup.get(key) ?? 0) > 0;\n }\n\n /**\n * Type guard to check if a value is an ObjectHolder\n */\n private isObjectHolder(\n value: ObjectHolder | undefined,\n ): value is ObjectHolder {\n return value != null\n && typeof value === \"object\"\n && \"$apiName\" in value\n && \"$primaryKey\" in value;\n }\n\n /**\n * Merge object data for a specific target cache key, preserving RDP fields\n */\n private mergeForTarget(\n sourceValue: ObjectHolder,\n targetCurrentValue: ObjectHolder | undefined,\n sourceCacheKey: ObjectCacheKey,\n targetCacheKey: ObjectCacheKey,\n ): ObjectHolder {\n const sourceRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n sourceCacheKey,\n );\n const targetRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n targetCacheKey,\n );\n\n return mergeObjectFields(\n sourceValue,\n sourceRdpFields,\n targetRdpFields,\n targetCurrentValue,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 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 { Employee } from "@osdk/client.test.ontology";
|
|
18
|
+
import { FauxFoundry, ontologies, startNodeApiServer } from "@osdk/shared.test";
|
|
19
|
+
import { beforeAll, beforeEach, describe, expect, it } from "vitest";
|
|
20
|
+
import { createClient } from "../../../createClient.js";
|
|
21
|
+
import { Store } from "../Store.js";
|
|
22
|
+
import { mockSingleSubCallback, updateObject, waitForCall } from "../testUtils.js";
|
|
23
|
+
function createFakeRdpConfig(...fields) {
|
|
24
|
+
const rdp = {};
|
|
25
|
+
for (const field of fields) {
|
|
26
|
+
rdp[field] = () => ({});
|
|
27
|
+
}
|
|
28
|
+
return rdp;
|
|
29
|
+
}
|
|
30
|
+
describe("ObjectsHelper.isKeyActive", () => {
|
|
31
|
+
let client;
|
|
32
|
+
let store;
|
|
33
|
+
let emp;
|
|
34
|
+
beforeAll(async () => {
|
|
35
|
+
const testSetup = startNodeApiServer(new FauxFoundry("https://stack.palantir.com/"), createClient);
|
|
36
|
+
client = testSetup.client;
|
|
37
|
+
const fauxOntology = testSetup.fauxFoundry.getDefaultOntology();
|
|
38
|
+
ontologies.addEmployeeOntology(fauxOntology);
|
|
39
|
+
testSetup.fauxFoundry.getDefaultDataStore().registerObject(Employee, {
|
|
40
|
+
employeeId: 1,
|
|
41
|
+
fullName: "Alice"
|
|
42
|
+
});
|
|
43
|
+
emp = await client(Employee).fetchOne(1, {
|
|
44
|
+
$includeRid: true
|
|
45
|
+
});
|
|
46
|
+
return () => {
|
|
47
|
+
testSetup.apiServer.close();
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
store = new Store(client);
|
|
52
|
+
return () => {
|
|
53
|
+
store = undefined;
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
it("propagateWrite propagates to a variant key with pending cleanup", () => {
|
|
57
|
+
const rdpConfig = createFakeRdpConfig("derivedAddress");
|
|
58
|
+
|
|
59
|
+
// Seed key A (no RDP)
|
|
60
|
+
updateObject(store, emp);
|
|
61
|
+
|
|
62
|
+
// Create key B (with RDP) and seed it
|
|
63
|
+
const queryB = store.objects.getQuery({
|
|
64
|
+
apiName: Employee,
|
|
65
|
+
pk: 1
|
|
66
|
+
}, rdpConfig);
|
|
67
|
+
store.batch({}, batch => {
|
|
68
|
+
queryB.writeToStore(emp, "loaded", batch);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Subscribe then unsubscribe to make key B unobserved
|
|
72
|
+
const subjectB = store.subjects.get(queryB.cacheKey);
|
|
73
|
+
const subB = subjectB.subscribe(() => {});
|
|
74
|
+
subB.unsubscribe();
|
|
75
|
+
|
|
76
|
+
// Simulate pending cleanup (React unmount-remount cycle)
|
|
77
|
+
store.pendingCleanup.set(queryB.cacheKey, 1);
|
|
78
|
+
|
|
79
|
+
// Write through key A — should propagate to B due to pending cleanup
|
|
80
|
+
const updated = emp.$clone({
|
|
81
|
+
fullName: "Bob"
|
|
82
|
+
});
|
|
83
|
+
updateObject(store, updated);
|
|
84
|
+
|
|
85
|
+
// Key B should have the propagated write
|
|
86
|
+
const valueB = store.getValue(queryB.cacheKey);
|
|
87
|
+
expect(valueB).toBeDefined();
|
|
88
|
+
expect(valueB?.value).toEqual(expect.objectContaining({
|
|
89
|
+
$primaryKey: 1,
|
|
90
|
+
fullName: "Bob"
|
|
91
|
+
}));
|
|
92
|
+
});
|
|
93
|
+
it("propagateWrite skips variant key that is neither observed nor pending cleanup", () => {
|
|
94
|
+
const rdpConfig = createFakeRdpConfig("derivedAddress");
|
|
95
|
+
|
|
96
|
+
// Seed key A (no RDP)
|
|
97
|
+
updateObject(store, emp);
|
|
98
|
+
|
|
99
|
+
// Create key B (with RDP) and seed it
|
|
100
|
+
const queryB = store.objects.getQuery({
|
|
101
|
+
apiName: Employee,
|
|
102
|
+
pk: 1
|
|
103
|
+
}, rdpConfig);
|
|
104
|
+
store.batch({}, batch => {
|
|
105
|
+
queryB.writeToStore(emp, "loaded", batch);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Subscribe then unsubscribe, no pending cleanup (cleanup already ran)
|
|
109
|
+
const subjectB = store.subjects.get(queryB.cacheKey);
|
|
110
|
+
const subB = subjectB.subscribe(() => {});
|
|
111
|
+
subB.unsubscribe();
|
|
112
|
+
|
|
113
|
+
// Write through key A
|
|
114
|
+
const updated = emp.$clone({
|
|
115
|
+
fullName: "Charlie"
|
|
116
|
+
});
|
|
117
|
+
updateObject(store, updated);
|
|
118
|
+
|
|
119
|
+
// Key B should NOT propagate (no subscribers, no pending cleanup)
|
|
120
|
+
const valueB = store.getValue(queryB.cacheKey);
|
|
121
|
+
expect(valueB?.value).toEqual(expect.objectContaining({
|
|
122
|
+
fullName: "Alice" // still the original seeded value
|
|
123
|
+
}));
|
|
124
|
+
});
|
|
125
|
+
it("pending cleanup protects propagation then stops after cleanup runs", () => {
|
|
126
|
+
const rdpConfig = createFakeRdpConfig("derivedPhone");
|
|
127
|
+
|
|
128
|
+
// Seed both keys
|
|
129
|
+
updateObject(store, emp);
|
|
130
|
+
const queryB = store.objects.getQuery({
|
|
131
|
+
apiName: Employee,
|
|
132
|
+
pk: 1
|
|
133
|
+
}, rdpConfig);
|
|
134
|
+
store.batch({}, batch => {
|
|
135
|
+
queryB.writeToStore(emp, "loaded", batch);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// Subscribe, unsubscribe, mark pending cleanup
|
|
139
|
+
const subjectB = store.subjects.get(queryB.cacheKey);
|
|
140
|
+
const subB = subjectB.subscribe(() => {});
|
|
141
|
+
subB.unsubscribe();
|
|
142
|
+
store.pendingCleanup.set(queryB.cacheKey, 1);
|
|
143
|
+
|
|
144
|
+
// Should propagate while pending cleanup is active
|
|
145
|
+
updateObject(store, emp.$clone({
|
|
146
|
+
fullName: "Bob"
|
|
147
|
+
}));
|
|
148
|
+
expect(store.getValue(queryB.cacheKey)?.value).toEqual(expect.objectContaining({
|
|
149
|
+
fullName: "Bob"
|
|
150
|
+
}));
|
|
151
|
+
|
|
152
|
+
// Simulate cleanup microtask completing
|
|
153
|
+
store.pendingCleanup.delete(queryB.cacheKey);
|
|
154
|
+
|
|
155
|
+
// Should NOT propagate after cleanup ran
|
|
156
|
+
updateObject(store, emp.$clone({
|
|
157
|
+
fullName: "Charlie"
|
|
158
|
+
}));
|
|
159
|
+
expect(store.getValue(queryB.cacheKey)?.value).toEqual(expect.objectContaining({
|
|
160
|
+
fullName: "Bob"
|
|
161
|
+
}));
|
|
162
|
+
});
|
|
163
|
+
it("re-subscribing before microtask flush receives latest data", async () => {
|
|
164
|
+
const rdpConfig = createFakeRdpConfig("derivedAddress");
|
|
165
|
+
|
|
166
|
+
// Seed both keys
|
|
167
|
+
updateObject(store, emp);
|
|
168
|
+
const queryB = store.objects.getQuery({
|
|
169
|
+
apiName: Employee,
|
|
170
|
+
pk: 1
|
|
171
|
+
}, rdpConfig);
|
|
172
|
+
store.batch({}, batch => {
|
|
173
|
+
queryB.writeToStore(emp, "loaded", batch);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Subscribe, unsubscribe (unmount), mark pending cleanup
|
|
177
|
+
const subjectB = store.subjects.get(queryB.cacheKey);
|
|
178
|
+
const sub1 = subjectB.subscribe(() => {});
|
|
179
|
+
sub1.unsubscribe();
|
|
180
|
+
store.pendingCleanup.set(queryB.cacheKey, 1);
|
|
181
|
+
|
|
182
|
+
// Write new data while pending cleanup is active
|
|
183
|
+
updateObject(store, emp.$clone({
|
|
184
|
+
fullName: "Updated"
|
|
185
|
+
}));
|
|
186
|
+
|
|
187
|
+
// Re-subscribe (remount) — should see updated data
|
|
188
|
+
const subFn = mockSingleSubCallback();
|
|
189
|
+
store.cacheKeys.retain(queryB.cacheKey);
|
|
190
|
+
const sub2 = subjectB.subscribe(value => subFn.next(value));
|
|
191
|
+
await waitForCall(subFn);
|
|
192
|
+
expect(subFn.next).toHaveBeenCalledWith(expect.objectContaining({
|
|
193
|
+
value: expect.objectContaining({
|
|
194
|
+
fullName: "Updated"
|
|
195
|
+
})
|
|
196
|
+
}));
|
|
197
|
+
sub2.unsubscribe();
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=ObjectsHelper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectsHelper.test.js","names":["Employee","FauxFoundry","ontologies","startNodeApiServer","beforeAll","beforeEach","describe","expect","it","createClient","Store","mockSingleSubCallback","updateObject","waitForCall","createFakeRdpConfig","fields","rdp","field","client","store","emp","testSetup","fauxOntology","fauxFoundry","getDefaultOntology","addEmployeeOntology","getDefaultDataStore","registerObject","employeeId","fullName","fetchOne","$includeRid","apiServer","close","undefined","rdpConfig","queryB","objects","getQuery","apiName","pk","batch","writeToStore","subjectB","subjects","get","cacheKey","subB","subscribe","unsubscribe","pendingCleanup","set","updated","$clone","valueB","getValue","toBeDefined","value","toEqual","objectContaining","$primaryKey","delete","sub1","subFn","cacheKeys","retain","sub2","next","toHaveBeenCalledWith"],"sources":["ObjectsHelper.test.ts"],"sourcesContent":["/*\n * Copyright 2026 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 { Employee } from \"@osdk/client.test.ontology\";\nimport { FauxFoundry, ontologies, startNodeApiServer } from \"@osdk/shared.test\";\nimport { beforeAll, beforeEach, describe, expect, it } from \"vitest\";\nimport type { Client } from \"../../../Client.js\";\nimport { createClient } from \"../../../createClient.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { Store } from \"../Store.js\";\nimport {\n mockSingleSubCallback,\n updateObject,\n waitForCall,\n} from \"../testUtils.js\";\n\nfunction createFakeRdpConfig(...fields: string[]): Canonical<Rdp> {\n const rdp: Rdp = {};\n for (const field of fields) {\n rdp[field] = () => ({}) as any;\n }\n return rdp as Canonical<Rdp>;\n}\n\ndescribe(\"ObjectsHelper.isKeyActive\", () => {\n let client: Client;\n let store: Store;\n let emp: Osdk.Instance<Employee>;\n\n beforeAll(async () => {\n const testSetup = startNodeApiServer(\n new FauxFoundry(\"https://stack.palantir.com/\"),\n createClient,\n );\n client = testSetup.client;\n\n const fauxOntology = testSetup.fauxFoundry.getDefaultOntology();\n ontologies.addEmployeeOntology(fauxOntology);\n\n testSetup.fauxFoundry.getDefaultDataStore().registerObject(Employee, {\n employeeId: 1,\n fullName: \"Alice\",\n });\n\n emp = await client(Employee).fetchOne(1, { $includeRid: true });\n\n return () => {\n testSetup.apiServer.close();\n };\n });\n\n beforeEach(() => {\n store = new Store(client);\n return () => {\n store = undefined!;\n };\n });\n\n it(\"propagateWrite propagates to a variant key with pending cleanup\", () => {\n const rdpConfig = createFakeRdpConfig(\"derivedAddress\");\n\n // Seed key A (no RDP)\n updateObject(store, emp);\n\n // Create key B (with RDP) and seed it\n const queryB = store.objects.getQuery({\n apiName: Employee,\n pk: 1,\n }, rdpConfig);\n store.batch({}, (batch) => {\n queryB.writeToStore(\n emp as any,\n \"loaded\",\n batch,\n );\n });\n\n // Subscribe then unsubscribe to make key B unobserved\n const subjectB = store.subjects.get(queryB.cacheKey);\n const subB = subjectB.subscribe(() => {});\n subB.unsubscribe();\n\n // Simulate pending cleanup (React unmount-remount cycle)\n store.pendingCleanup.set(queryB.cacheKey, 1);\n\n // Write through key A — should propagate to B due to pending cleanup\n const updated = emp.$clone({ fullName: \"Bob\" });\n updateObject(store, updated);\n\n // Key B should have the propagated write\n const valueB = store.getValue(queryB.cacheKey);\n expect(valueB).toBeDefined();\n expect(valueB?.value).toEqual(\n expect.objectContaining({\n $primaryKey: 1,\n fullName: \"Bob\",\n }),\n );\n });\n\n it(\"propagateWrite skips variant key that is neither observed nor pending cleanup\", () => {\n const rdpConfig = createFakeRdpConfig(\"derivedAddress\");\n\n // Seed key A (no RDP)\n updateObject(store, emp);\n\n // Create key B (with RDP) and seed it\n const queryB = store.objects.getQuery({\n apiName: Employee,\n pk: 1,\n }, rdpConfig);\n store.batch({}, (batch) => {\n queryB.writeToStore(\n emp as any,\n \"loaded\",\n batch,\n );\n });\n\n // Subscribe then unsubscribe, no pending cleanup (cleanup already ran)\n const subjectB = store.subjects.get(queryB.cacheKey);\n const subB = subjectB.subscribe(() => {});\n subB.unsubscribe();\n\n // Write through key A\n const updated = emp.$clone({ fullName: \"Charlie\" });\n updateObject(store, updated);\n\n // Key B should NOT propagate (no subscribers, no pending cleanup)\n const valueB = store.getValue(queryB.cacheKey);\n expect(valueB?.value).toEqual(\n expect.objectContaining({\n fullName: \"Alice\", // still the original seeded value\n }),\n );\n });\n\n it(\"pending cleanup protects propagation then stops after cleanup runs\", () => {\n const rdpConfig = createFakeRdpConfig(\"derivedPhone\");\n\n // Seed both keys\n updateObject(store, emp);\n const queryB = store.objects.getQuery({\n apiName: Employee,\n pk: 1,\n }, rdpConfig);\n store.batch({}, (batch) => {\n queryB.writeToStore(emp as any, \"loaded\", batch);\n });\n\n // Subscribe, unsubscribe, mark pending cleanup\n const subjectB = store.subjects.get(queryB.cacheKey);\n const subB = subjectB.subscribe(() => {});\n subB.unsubscribe();\n store.pendingCleanup.set(queryB.cacheKey, 1);\n\n // Should propagate while pending cleanup is active\n updateObject(store, emp.$clone({ fullName: \"Bob\" }));\n expect(store.getValue(queryB.cacheKey)?.value).toEqual(\n expect.objectContaining({ fullName: \"Bob\" }),\n );\n\n // Simulate cleanup microtask completing\n store.pendingCleanup.delete(queryB.cacheKey);\n\n // Should NOT propagate after cleanup ran\n updateObject(store, emp.$clone({ fullName: \"Charlie\" }));\n expect(store.getValue(queryB.cacheKey)?.value).toEqual(\n expect.objectContaining({ fullName: \"Bob\" }),\n );\n });\n\n it(\"re-subscribing before microtask flush receives latest data\", async () => {\n const rdpConfig = createFakeRdpConfig(\"derivedAddress\");\n\n // Seed both keys\n updateObject(store, emp);\n const queryB = store.objects.getQuery({\n apiName: Employee,\n pk: 1,\n }, rdpConfig);\n store.batch({}, (batch) => {\n queryB.writeToStore(emp as any, \"loaded\", batch);\n });\n\n // Subscribe, unsubscribe (unmount), mark pending cleanup\n const subjectB = store.subjects.get(queryB.cacheKey);\n const sub1 = subjectB.subscribe(() => {});\n sub1.unsubscribe();\n store.pendingCleanup.set(queryB.cacheKey, 1);\n\n // Write new data while pending cleanup is active\n updateObject(store, emp.$clone({ fullName: \"Updated\" }));\n\n // Re-subscribe (remount) — should see updated data\n const subFn = mockSingleSubCallback();\n store.cacheKeys.retain(queryB.cacheKey);\n const sub2 = subjectB.subscribe(\n (value) => subFn.next(value as any),\n );\n\n await waitForCall(subFn);\n expect(subFn.next).toHaveBeenCalledWith(\n expect.objectContaining({\n value: expect.objectContaining({\n fullName: \"Updated\",\n }),\n }),\n );\n\n sub2.unsubscribe();\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +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?:
|
|
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 { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { ObjectSetQuery } from \"./ObjectSetQuery.js\";\n\nexport interface ObjectSetStorageData extends CollectionStorageData {}\n\nexport interface ObjectSetOperations {\n where?: Canonical<any>;\n withProperties?: Canonical<Rdp>;\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":[]}
|
|
@@ -18,10 +18,11 @@ import { getWireObjectSet } from "../../../objectSet/createObjectSet.js";
|
|
|
18
18
|
import { AbstractHelper } from "../AbstractHelper.js";
|
|
19
19
|
import { ObjectSetQuery } from "./ObjectSetQuery.js";
|
|
20
20
|
export class ObjectSetHelper extends AbstractHelper {
|
|
21
|
-
constructor(store, cacheKeys, whereCanonicalizer, orderByCanonicalizer) {
|
|
21
|
+
constructor(store, cacheKeys, whereCanonicalizer, orderByCanonicalizer, rdpCanonicalizer) {
|
|
22
22
|
super(store, cacheKeys);
|
|
23
23
|
this.whereCanonicalizer = whereCanonicalizer;
|
|
24
24
|
this.orderByCanonicalizer = orderByCanonicalizer;
|
|
25
|
+
this.rdpCanonicalizer = rdpCanonicalizer;
|
|
25
26
|
}
|
|
26
27
|
observe(options, subFn) {
|
|
27
28
|
const ret = super.observe(options, subFn);
|
|
@@ -47,7 +48,7 @@ export class ObjectSetHelper extends AbstractHelper {
|
|
|
47
48
|
operations.where = this.whereCanonicalizer.canonicalize(options.where);
|
|
48
49
|
}
|
|
49
50
|
if (options.withProperties) {
|
|
50
|
-
operations.withProperties =
|
|
51
|
+
operations.withProperties = this.rdpCanonicalizer.canonicalize(options.withProperties);
|
|
51
52
|
}
|
|
52
53
|
if (options.union && options.union.length > 0) {
|
|
53
54
|
operations.union = options.union.map(os => JSON.stringify(getWireObjectSet(os)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectSetHelper.js","names":["getWireObjectSet","AbstractHelper","ObjectSetQuery","ObjectSetHelper","constructor","store","cacheKeys","whereCanonicalizer","orderByCanonicalizer","observe","options","subFn","ret","streamUpdates","query","registerStreamUpdates","subscription","getQuery","baseObjectSet","baseObjectSetWire","JSON","stringify","operations","buildCanonicalizedOperations","objectSetCacheKey","get","queries","subjects","where","canonicalize","withProperties","
|
|
1
|
+
{"version":3,"file":"ObjectSetHelper.js","names":["getWireObjectSet","AbstractHelper","ObjectSetQuery","ObjectSetHelper","constructor","store","cacheKeys","whereCanonicalizer","orderByCanonicalizer","rdpCanonicalizer","observe","options","subFn","ret","streamUpdates","query","registerStreamUpdates","subscription","getQuery","baseObjectSet","baseObjectSetWire","JSON","stringify","operations","buildCanonicalizedOperations","objectSetCacheKey","get","queries","subjects","where","canonicalize","withProperties","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 { RdpCanonicalizer } from \"../RdpCanonicalizer.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 rdpCanonicalizer: RdpCanonicalizer;\n\n constructor(\n store: Store,\n cacheKeys: CacheKeys<KnownCacheKey>,\n whereCanonicalizer: WhereClauseCanonicalizer,\n orderByCanonicalizer: OrderByCanonicalizer,\n rdpCanonicalizer: RdpCanonicalizer,\n ) {\n super(store, cacheKeys);\n\n this.whereCanonicalizer = whereCanonicalizer;\n this.orderByCanonicalizer = orderByCanonicalizer;\n this.rdpCanonicalizer = rdpCanonicalizer;\n }\n\n observe(\n options: ObjectSetQueryOptions,\n subFn: Observer<ObjectSetPayload>,\n ): QuerySubscription<ObjectSetQuery> {\n const ret = super.observe(options, subFn);\n\n if (options.streamUpdates) {\n ret.query.registerStreamUpdates(ret.subscription);\n }\n return ret;\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 = this.rdpCanonicalizer.canonicalize(\n options.withProperties,\n );\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":[]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 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 { Employee } from "@osdk/client.test.ontology";
|
|
18
|
+
import { FauxFoundry, ontologies, startNodeApiServer } from "@osdk/shared.test";
|
|
19
|
+
import { beforeAll, beforeEach, describe, expect, it } from "vitest";
|
|
20
|
+
import { createClient } from "../../../createClient.js";
|
|
21
|
+
import { Store } from "../Store.js";
|
|
22
|
+
describe("ObjectSetHelper RDP canonicalization", () => {
|
|
23
|
+
let client;
|
|
24
|
+
let store;
|
|
25
|
+
beforeAll(() => {
|
|
26
|
+
const testSetup = startNodeApiServer(new FauxFoundry("https://stack.palantir.com/"), createClient);
|
|
27
|
+
client = testSetup.client;
|
|
28
|
+
const fauxOntology = testSetup.fauxFoundry.getDefaultOntology();
|
|
29
|
+
ontologies.addEmployeeOntology(fauxOntology);
|
|
30
|
+
return () => {
|
|
31
|
+
testSetup.apiServer.close();
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
store = new Store(client);
|
|
36
|
+
return () => {
|
|
37
|
+
store = undefined;
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
it("getQuery returns same rdpConfig reference for structurally identical withProperties", () => {
|
|
41
|
+
const withProperties1 = {
|
|
42
|
+
derivedAddress: base => base.pivotTo("lead").selectProperty("employeeId"),
|
|
43
|
+
derivedName: base => base.pivotTo("lead").selectProperty("fullName")
|
|
44
|
+
};
|
|
45
|
+
const withProperties2 = {
|
|
46
|
+
derivedAddress: base => base.pivotTo("lead").selectProperty("employeeId"),
|
|
47
|
+
derivedName: base => base.pivotTo("lead").selectProperty("fullName")
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Precondition: the two configs are distinct objects
|
|
51
|
+
expect(withProperties1).not.toBe(withProperties2);
|
|
52
|
+
const query1 = store.objectSets.getQuery({
|
|
53
|
+
baseObjectSet: client(Employee),
|
|
54
|
+
withProperties: withProperties1,
|
|
55
|
+
mode: "offline"
|
|
56
|
+
});
|
|
57
|
+
const query2 = store.objectSets.getQuery({
|
|
58
|
+
baseObjectSet: client(Employee),
|
|
59
|
+
withProperties: withProperties2,
|
|
60
|
+
mode: "offline"
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// The canonical RDP reference should be identical
|
|
64
|
+
expect(query1.rdpConfig).toBe(query2.rdpConfig);
|
|
65
|
+
expect(query1.rdpConfig).not.toBeNull();
|
|
66
|
+
});
|
|
67
|
+
it("getQuery returns distinct rdpConfig references for different withProperties", () => {
|
|
68
|
+
const queryA = store.objectSets.getQuery({
|
|
69
|
+
baseObjectSet: client(Employee),
|
|
70
|
+
withProperties: {
|
|
71
|
+
derivedAddress: base => base.pivotTo("lead").selectProperty("employeeId")
|
|
72
|
+
},
|
|
73
|
+
mode: "offline"
|
|
74
|
+
});
|
|
75
|
+
const queryB = store.objectSets.getQuery({
|
|
76
|
+
baseObjectSet: client(Employee),
|
|
77
|
+
withProperties: {
|
|
78
|
+
derivedName: base => base.pivotTo("lead").selectProperty("fullName")
|
|
79
|
+
},
|
|
80
|
+
mode: "offline"
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Different RDP structures should produce different canonical references
|
|
84
|
+
expect(queryA.rdpConfig).not.toBe(queryB.rdpConfig);
|
|
85
|
+
});
|
|
86
|
+
it("getQuery returns null rdpConfig when withProperties is not specified", () => {
|
|
87
|
+
const query = store.objectSets.getQuery({
|
|
88
|
+
baseObjectSet: client(Employee),
|
|
89
|
+
mode: "offline"
|
|
90
|
+
});
|
|
91
|
+
expect(query.rdpConfig).toBeNull();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=ObjectSetHelper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectSetHelper.test.js","names":["Employee","FauxFoundry","ontologies","startNodeApiServer","beforeAll","beforeEach","describe","expect","it","createClient","Store","client","store","testSetup","fauxOntology","fauxFoundry","getDefaultOntology","addEmployeeOntology","apiServer","close","undefined","withProperties1","derivedAddress","base","pivotTo","selectProperty","derivedName","withProperties2","not","toBe","query1","objectSets","getQuery","baseObjectSet","withProperties","mode","query2","rdpConfig","toBeNull","queryA","queryB","query"],"sources":["ObjectSetHelper.test.ts"],"sourcesContent":["/*\n * Copyright 2026 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 { DerivedProperty, ObjectSet } from \"@osdk/api\";\nimport { Employee } from \"@osdk/client.test.ontology\";\nimport { FauxFoundry, ontologies, startNodeApiServer } from \"@osdk/shared.test\";\nimport { beforeAll, beforeEach, describe, expect, it } from \"vitest\";\nimport type { Client } from \"../../../Client.js\";\nimport { createClient } from \"../../../createClient.js\";\nimport { Store } from \"../Store.js\";\n\ndescribe(\"ObjectSetHelper RDP canonicalization\", () => {\n let client: Client;\n let store: Store;\n\n beforeAll(() => {\n const testSetup = startNodeApiServer(\n new FauxFoundry(\"https://stack.palantir.com/\"),\n createClient,\n );\n client = testSetup.client;\n\n const fauxOntology = testSetup.fauxFoundry.getDefaultOntology();\n ontologies.addEmployeeOntology(fauxOntology);\n\n return () => {\n testSetup.apiServer.close();\n };\n });\n\n beforeEach(() => {\n store = new Store(client);\n return () => {\n store = undefined!;\n };\n });\n\n it(\"getQuery returns same rdpConfig reference for structurally identical withProperties\", () => {\n const withProperties1: DerivedProperty.Clause<typeof Employee> = {\n derivedAddress: (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n derivedName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n const withProperties2: DerivedProperty.Clause<typeof Employee> = {\n derivedAddress: (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n derivedName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n // Precondition: the two configs are distinct objects\n expect(withProperties1).not.toBe(withProperties2);\n\n const query1 = store.objectSets.getQuery({\n baseObjectSet: client(Employee) as ObjectSet<any>,\n withProperties: withProperties1,\n mode: \"offline\",\n });\n const query2 = store.objectSets.getQuery({\n baseObjectSet: client(Employee) as ObjectSet<any>,\n withProperties: withProperties2,\n mode: \"offline\",\n });\n\n // The canonical RDP reference should be identical\n expect(query1.rdpConfig).toBe(query2.rdpConfig);\n expect(query1.rdpConfig).not.toBeNull();\n });\n\n it(\"getQuery returns distinct rdpConfig references for different withProperties\", () => {\n const withPropertiesA: DerivedProperty.Clause<typeof Employee> = {\n derivedAddress: (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n };\n const withPropertiesB: DerivedProperty.Clause<typeof Employee> = {\n derivedName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n const queryA = store.objectSets.getQuery({\n baseObjectSet: client(Employee) as ObjectSet<any>,\n withProperties: withPropertiesA,\n mode: \"offline\",\n });\n const queryB = store.objectSets.getQuery({\n baseObjectSet: client(Employee) as ObjectSet<any>,\n withProperties: withPropertiesB,\n mode: \"offline\",\n });\n\n // Different RDP structures should produce different canonical references\n expect(queryA.rdpConfig).not.toBe(queryB.rdpConfig);\n });\n\n it(\"getQuery returns null rdpConfig when withProperties is not specified\", () => {\n const query = store.objectSets.getQuery({\n baseObjectSet: client(Employee) as ObjectSet<any>,\n mode: \"offline\",\n });\n\n expect(query.rdpConfig).toBeNull();\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -40,6 +40,9 @@ export class ObjectSetQuery extends BaseListQuery {
|
|
|
40
40
|
this.minResultsToLoad = opts.pageSize || 0;
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
+
get rdpConfig() {
|
|
44
|
+
return this.#operations.withProperties ?? null;
|
|
45
|
+
}
|
|
43
46
|
#composeObjectSet(opts) {
|
|
44
47
|
let result = opts.baseObjectSet;
|
|
45
48
|
if (opts.withProperties) {
|
|
@@ -118,7 +121,7 @@ export class ObjectSetQuery extends BaseListQuery {
|
|
|
118
121
|
// Fetch the data with pagination
|
|
119
122
|
const resp = await this.#composedObjectSet.fetchPage({
|
|
120
123
|
$nextPageToken: this.nextPageToken,
|
|
121
|
-
$pageSize: this.
|
|
124
|
+
$pageSize: this.getEffectiveFetchPageSize(),
|
|
122
125
|
$includeRid: true,
|
|
123
126
|
// OrderBy is already applied in the composed ObjectSet
|
|
124
127
|
...(this.#operations.orderBy && Object.keys(this.#operations.orderBy).length > 0 ? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectSetQuery.js","names":["additionalContext","getWireObjectSet","BaseListQuery","getObjectTypesThatInvalidate","OrderBySortingStrategy","ObjectSetQuery","baseObjectSetWire","operations","composedObjectSet","objectTypes","constructor","store","subject","cacheKey","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","map","x","JSON","stringify","join","undefined","composeObjectSet","extractObjectTypes","autoFetchMore","minResultsToLoad","Number","MAX_SAFE_INTEGER","Math","max","pageSize","#composeObjectSet","result","baseObjectSet","withProperties","where","union","length","intersect","subtract","pivotTo","#extractObjectTypes","types","Set","baseWire","parse","type","add","os","wire","registerCacheChanges","batch","changes","registerObjectSet","fetchPageData","signal","orderBy","Object","keys","sortingStrategy","wireObjectSet","resultType","apiName","resp","fetchPage","$nextPageToken","nextPageToken","$pageSize","options","$includeRid","$orderBy","aborted","Error","handleFetchError","error","_status","subjects","get","existingTotalCount","read","value","totalCount","writeToStore","data","registerStreamUpdates","sub","createWebsocketSubscription","invalidateObjectType","objectType","has","modified","revalidate","Promise","resolve","createPayload","params","resolvedList","resolvedData","isOptimistic","fetchMore","hasMore","status","lastUpdated","objectSet"],"sources":["ObjectSetQuery.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 { ObjectSet, Osdk, PageResult } from \"@osdk/api\";\nimport type { Observable, Subscription } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport { getWireObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport type { ObjectSetPayload } from \"../../ObjectSetPayload.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport { BaseListQuery } from \"../base-list/BaseListQuery.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Changes } from \"../Changes.js\";\nimport { getObjectTypesThatInvalidate } from \"../getObjectTypesThatInvalidate.js\";\nimport type { Entry } from \"../Layer.js\";\nimport { OrderBySortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport type {\n ObjectSetCacheKey,\n ObjectSetOperations,\n} from \"./ObjectSetCacheKey.js\";\nimport type { ObjectSetQueryOptions } from \"./ObjectSetQueryOptions.js\";\n\nexport class ObjectSetQuery extends BaseListQuery<\n ObjectSetCacheKey,\n ObjectSetPayload,\n ObjectSetQueryOptions\n> {\n #baseObjectSetWire: string;\n #operations: Canonical<ObjectSetOperations>;\n #composedObjectSet: ObjectSet<any, any>;\n #objectTypes: Set<string>;\n\n constructor(\n store: Store,\n subject: Observable<SubjectPayload<ObjectSetCacheKey>>,\n baseObjectSetWire: string,\n operations: Canonical<ObjectSetOperations>,\n cacheKey: ObjectSetCacheKey,\n opts: ObjectSetQueryOptions,\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: `ObjectSetQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n\n this.#baseObjectSetWire = baseObjectSetWire;\n this.#operations = operations;\n this.#composedObjectSet = this.#composeObjectSet(opts);\n this.#objectTypes = this.#extractObjectTypes(opts);\n\n if (opts.autoFetchMore === true) {\n this.minResultsToLoad = Number.MAX_SAFE_INTEGER;\n } else if (typeof opts.autoFetchMore === \"number\") {\n this.minResultsToLoad = Math.max(0, opts.autoFetchMore);\n } else {\n this.minResultsToLoad = opts.pageSize || 0;\n }\n }\n\n #composeObjectSet(opts: ObjectSetQueryOptions): ObjectSet<any, any> {\n let result = opts.baseObjectSet;\n\n if (opts.withProperties) {\n result = result.withProperties(opts.withProperties);\n }\n if (opts.where) {\n result = result.where(opts.where);\n }\n if (opts.union && opts.union.length > 0) {\n result = result.union(...opts.union);\n }\n if (opts.intersect && opts.intersect.length > 0) {\n result = result.intersect(...opts.intersect);\n }\n if (opts.subtract && opts.subtract.length > 0) {\n result = result.subtract(...opts.subtract);\n }\n if (opts.pivotTo) {\n result = result.pivotTo(opts.pivotTo);\n }\n\n return result;\n }\n\n #extractObjectTypes(opts: ObjectSetQueryOptions): Set<string> {\n const types = new Set<string>();\n const baseWire = JSON.parse(this.#baseObjectSetWire);\n if (baseWire.type) {\n types.add(baseWire.type);\n }\n\n if (opts.union) {\n for (const os of opts.union) {\n const wire = getWireObjectSet(os);\n if (wire.type) {\n types.add(wire.type);\n }\n }\n }\n\n if (opts.intersect) {\n for (const os of opts.intersect) {\n const wire = getWireObjectSet(os);\n if (wire.type) {\n types.add(wire.type);\n }\n }\n }\n\n if (opts.subtract) {\n for (const os of opts.subtract) {\n const wire = getWireObjectSet(os);\n if (wire.type) {\n types.add(wire.type);\n }\n }\n }\n\n return types;\n }\n\n /**\n * Register changes to the cache specific to ObjectSetQuery\n */\n protected registerCacheChanges(batch: BatchContext): void {\n batch.changes.registerObjectSet(this.cacheKey);\n }\n\n /**\n * Implements fetchPageData from BaseListQuery template method\n * Fetches a page of data from the composed ObjectSet\n */\n protected async fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>> {\n if (\n this.#operations.orderBy\n && Object.keys(this.#operations.orderBy).length > 0\n && !(this.sortingStrategy instanceof OrderBySortingStrategy)\n ) {\n const wireObjectSet = getWireObjectSet(this.#composedObjectSet);\n const { resultType } = await getObjectTypesThatInvalidate(\n this.store.client[additionalContext],\n wireObjectSet,\n );\n this.sortingStrategy = new OrderBySortingStrategy(\n resultType.apiName,\n this.#operations.orderBy,\n );\n }\n\n // Fetch the data with pagination\n const resp = await this.#composedObjectSet.fetchPage({\n $nextPageToken: this.nextPageToken,\n $pageSize: this.options.pageSize,\n $includeRid: true,\n // OrderBy is already applied in the composed ObjectSet\n ...(this.#operations.orderBy\n && Object.keys(this.#operations.orderBy).length > 0\n ? { $orderBy: this.#operations.orderBy }\n : {}),\n });\n\n if (signal?.aborted) {\n throw new Error(\"Aborted\");\n }\n\n this.nextPageToken = resp.nextPageToken;\n\n return resp;\n }\n\n protected handleFetchError(\n error: unknown,\n _status: Status,\n batch: BatchContext,\n ): Entry<ObjectSetCacheKey> {\n this.logger?.error(\"error\", error);\n this.store.subjects.get(this.cacheKey).error(error);\n\n const existingTotalCount = batch.read(this.cacheKey)?.value?.totalCount;\n return this.writeToStore(\n { data: [], totalCount: existingTotalCount },\n \"error\",\n batch,\n );\n }\n\n registerStreamUpdates(sub: Subscription): void {\n this.createWebsocketSubscription(\n this.#composedObjectSet,\n sub,\n \"observeObjectSet\",\n );\n }\n\n invalidateObjectType = async (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n if (this.#objectTypes.has(objectType)) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n }\n return Promise.resolve();\n };\n\n protected createPayload(\n params: {\n resolvedData: any[];\n isOptimistic: boolean;\n status: Status;\n lastUpdated: number;\n totalCount?: string;\n },\n ): ObjectSetPayload {\n return {\n resolvedList: params.resolvedData,\n isOptimistic: params.isOptimistic,\n fetchMore: this.fetchMore,\n hasMore: this.nextPageToken != null,\n status: params.status,\n lastUpdated: params.lastUpdated,\n objectSet: this.#composedObjectSet,\n totalCount: params.totalCount,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectSetQuery.js","names":["additionalContext","getWireObjectSet","BaseListQuery","getObjectTypesThatInvalidate","OrderBySortingStrategy","ObjectSetQuery","baseObjectSetWire","operations","composedObjectSet","objectTypes","constructor","store","subject","cacheKey","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","map","x","JSON","stringify","join","undefined","composeObjectSet","extractObjectTypes","autoFetchMore","minResultsToLoad","Number","MAX_SAFE_INTEGER","Math","max","pageSize","rdpConfig","withProperties","#composeObjectSet","result","baseObjectSet","where","union","length","intersect","subtract","pivotTo","#extractObjectTypes","types","Set","baseWire","parse","type","add","os","wire","registerCacheChanges","batch","changes","registerObjectSet","fetchPageData","signal","orderBy","Object","keys","sortingStrategy","wireObjectSet","resultType","apiName","resp","fetchPage","$nextPageToken","nextPageToken","$pageSize","getEffectiveFetchPageSize","$includeRid","$orderBy","aborted","Error","handleFetchError","error","_status","subjects","get","existingTotalCount","read","value","totalCount","writeToStore","data","registerStreamUpdates","sub","createWebsocketSubscription","invalidateObjectType","objectType","has","modified","revalidate","Promise","resolve","createPayload","params","resolvedList","resolvedData","isOptimistic","fetchMore","hasMore","status","lastUpdated","objectSet"],"sources":["ObjectSetQuery.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 { ObjectSet, Osdk, PageResult } from \"@osdk/api\";\nimport type { Observable, Subscription } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport { getWireObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport type { ObjectSetPayload } from \"../../ObjectSetPayload.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport { BaseListQuery } from \"../base-list/BaseListQuery.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Changes } from \"../Changes.js\";\nimport { getObjectTypesThatInvalidate } from \"../getObjectTypesThatInvalidate.js\";\nimport type { Entry } from \"../Layer.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { OrderBySortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport type {\n ObjectSetCacheKey,\n ObjectSetOperations,\n} from \"./ObjectSetCacheKey.js\";\nimport type { ObjectSetQueryOptions } from \"./ObjectSetQueryOptions.js\";\n\nexport class ObjectSetQuery extends BaseListQuery<\n ObjectSetCacheKey,\n ObjectSetPayload,\n ObjectSetQueryOptions\n> {\n #baseObjectSetWire: string;\n #operations: Canonical<ObjectSetOperations>;\n #composedObjectSet: ObjectSet<any, any>;\n #objectTypes: Set<string>;\n\n constructor(\n store: Store,\n subject: Observable<SubjectPayload<ObjectSetCacheKey>>,\n baseObjectSetWire: string,\n operations: Canonical<ObjectSetOperations>,\n cacheKey: ObjectSetCacheKey,\n opts: ObjectSetQueryOptions,\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: `ObjectSetQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n\n this.#baseObjectSetWire = baseObjectSetWire;\n this.#operations = operations;\n this.#composedObjectSet = this.#composeObjectSet(opts);\n this.#objectTypes = this.#extractObjectTypes(opts);\n if (opts.autoFetchMore === true) {\n this.minResultsToLoad = Number.MAX_SAFE_INTEGER;\n } else if (typeof opts.autoFetchMore === \"number\") {\n this.minResultsToLoad = Math.max(0, opts.autoFetchMore);\n } else {\n this.minResultsToLoad = opts.pageSize || 0;\n }\n }\n\n public override get rdpConfig(): Canonical<Rdp> | null {\n return this.#operations.withProperties ?? null;\n }\n\n #composeObjectSet(opts: ObjectSetQueryOptions): ObjectSet<any, any> {\n let result = opts.baseObjectSet;\n\n if (opts.withProperties) {\n result = result.withProperties(opts.withProperties);\n }\n if (opts.where) {\n result = result.where(opts.where);\n }\n if (opts.union && opts.union.length > 0) {\n result = result.union(...opts.union);\n }\n if (opts.intersect && opts.intersect.length > 0) {\n result = result.intersect(...opts.intersect);\n }\n if (opts.subtract && opts.subtract.length > 0) {\n result = result.subtract(...opts.subtract);\n }\n if (opts.pivotTo) {\n result = result.pivotTo(opts.pivotTo);\n }\n\n return result;\n }\n\n #extractObjectTypes(opts: ObjectSetQueryOptions): Set<string> {\n const types = new Set<string>();\n const baseWire = JSON.parse(this.#baseObjectSetWire);\n if (baseWire.type) {\n types.add(baseWire.type);\n }\n\n if (opts.union) {\n for (const os of opts.union) {\n const wire = getWireObjectSet(os);\n if (wire.type) {\n types.add(wire.type);\n }\n }\n }\n\n if (opts.intersect) {\n for (const os of opts.intersect) {\n const wire = getWireObjectSet(os);\n if (wire.type) {\n types.add(wire.type);\n }\n }\n }\n\n if (opts.subtract) {\n for (const os of opts.subtract) {\n const wire = getWireObjectSet(os);\n if (wire.type) {\n types.add(wire.type);\n }\n }\n }\n\n return types;\n }\n\n /**\n * Register changes to the cache specific to ObjectSetQuery\n */\n protected registerCacheChanges(batch: BatchContext): void {\n batch.changes.registerObjectSet(this.cacheKey);\n }\n\n /**\n * Implements fetchPageData from BaseListQuery template method\n * Fetches a page of data from the composed ObjectSet\n */\n protected async fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>> {\n if (\n this.#operations.orderBy\n && Object.keys(this.#operations.orderBy).length > 0\n && !(this.sortingStrategy instanceof OrderBySortingStrategy)\n ) {\n const wireObjectSet = getWireObjectSet(this.#composedObjectSet);\n const { resultType } = await getObjectTypesThatInvalidate(\n this.store.client[additionalContext],\n wireObjectSet,\n );\n this.sortingStrategy = new OrderBySortingStrategy(\n resultType.apiName,\n this.#operations.orderBy,\n );\n }\n\n // Fetch the data with pagination\n const resp = await this.#composedObjectSet.fetchPage({\n $nextPageToken: this.nextPageToken,\n $pageSize: this.getEffectiveFetchPageSize(),\n $includeRid: true,\n // OrderBy is already applied in the composed ObjectSet\n ...(this.#operations.orderBy\n && Object.keys(this.#operations.orderBy).length > 0\n ? { $orderBy: this.#operations.orderBy }\n : {}),\n });\n\n if (signal?.aborted) {\n throw new Error(\"Aborted\");\n }\n\n this.nextPageToken = resp.nextPageToken;\n\n return resp;\n }\n\n protected handleFetchError(\n error: unknown,\n _status: Status,\n batch: BatchContext,\n ): Entry<ObjectSetCacheKey> {\n this.logger?.error(\"error\", error);\n this.store.subjects.get(this.cacheKey).error(error);\n\n const existingTotalCount = batch.read(this.cacheKey)?.value?.totalCount;\n return this.writeToStore(\n { data: [], totalCount: existingTotalCount },\n \"error\",\n batch,\n );\n }\n\n registerStreamUpdates(sub: Subscription): void {\n this.createWebsocketSubscription(\n this.#composedObjectSet,\n sub,\n \"observeObjectSet\",\n );\n }\n\n invalidateObjectType = async (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n if (this.#objectTypes.has(objectType)) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n }\n return Promise.resolve();\n };\n\n protected createPayload(\n params: {\n resolvedData: any[];\n isOptimistic: boolean;\n status: Status;\n lastUpdated: number;\n totalCount?: string;\n },\n ): ObjectSetPayload {\n return {\n resolvedList: params.resolvedData,\n isOptimistic: params.isOptimistic,\n fetchMore: this.fetchMore,\n hasMore: this.nextPageToken != null,\n status: params.status,\n lastUpdated: params.lastUpdated,\n objectSet: this.#composedObjectSet,\n totalCount: params.totalCount,\n };\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAASA,iBAAiB,QAAQ,oBAAoB;AACtD,SAASC,gBAAgB,QAAQ,uCAAuC;AAGxE,SAASC,aAAa,QAAQ,+BAA+B;AAI7D,SAASC,4BAA4B,QAAQ,oCAAoC;AAGjF,SAASC,sBAAsB,QAAQ,+BAA+B;AAStE,OAAO,MAAMC,cAAc,SAASH,aAAa,CAI/C;EACA,CAACI,iBAAiB;EAClB,CAACC,UAAU;EACX,CAACC,iBAAiB;EAClB,CAACC,WAAW;EAEZC,WAAWA,CACTC,KAAY,EACZC,OAAsD,EACtDN,iBAAyB,EACzBC,UAA0C,EAC1CM,QAA2B,EAC3BC,IAA2B,EAC3B;IACA,KAAK,CACHH,KAAK,EACLC,OAAO,EACPE,IAAI,EACJD,QAAQ,EACRE,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GAEjCN,KAAK,CAACO,MAAM,CAAClB,iBAAiB,CAAC,CAACmB,MAAM,EAAEC,KAAK,CAAC,CAAC,CAAC,EAAE;MAChDC,SAAS,EAAE,kBACTR,QAAQ,CAACS,SAAS,CAACC,GAAG,CAACC,CAAC,IAAIC,IAAI,CAACC,SAAS,CAACF,CAAC,CAAC,CAAC,CAACG,IAAI,CAAC,IAAI,CAAC;IAE7D,CAAC,CAAC,GAEFC,SACN,CAAC;IAED,IAAI,CAAC,CAACtB,iBAAiB,GAAGA,iBAAiB;IAC3C,IAAI,CAAC,CAACC,UAAU,GAAGA,UAAU;IAC7B,IAAI,CAAC,CAACC,iBAAiB,GAAG,IAAI,CAAC,CAACqB,gBAAgB,CAACf,IAAI,CAAC;IACtD,IAAI,CAAC,CAACL,WAAW,GAAG,IAAI,CAAC,CAACqB,kBAAkB,CAAChB,IAAI,CAAC;IAClD,IAAIA,IAAI,CAACiB,aAAa,KAAK,IAAI,EAAE;MAC/B,IAAI,CAACC,gBAAgB,GAAGC,MAAM,CAACC,gBAAgB;IACjD,CAAC,MAAM,IAAI,OAAOpB,IAAI,CAACiB,aAAa,KAAK,QAAQ,EAAE;MACjD,IAAI,CAACC,gBAAgB,GAAGG,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEtB,IAAI,CAACiB,aAAa,CAAC;IACzD,CAAC,MAAM;MACL,IAAI,CAACC,gBAAgB,GAAGlB,IAAI,CAACuB,QAAQ,IAAI,CAAC;IAC5C;EACF;EAEA,IAAoBC,SAASA,CAAA,EAA0B;IACrD,OAAO,IAAI,CAAC,CAAC/B,UAAU,CAACgC,cAAc,IAAI,IAAI;EAChD;EAEA,CAACV,gBAAgBW,CAAC1B,IAA2B,EAAuB;IAClE,IAAI2B,MAAM,GAAG3B,IAAI,CAAC4B,aAAa;IAE/B,IAAI5B,IAAI,CAACyB,cAAc,EAAE;MACvBE,MAAM,GAAGA,MAAM,CAACF,cAAc,CAACzB,IAAI,CAACyB,cAAc,CAAC;IACrD;IACA,IAAIzB,IAAI,CAAC6B,KAAK,EAAE;MACdF,MAAM,GAAGA,MAAM,CAACE,KAAK,CAAC7B,IAAI,CAAC6B,KAAK,CAAC;IACnC;IACA,IAAI7B,IAAI,CAAC8B,KAAK,IAAI9B,IAAI,CAAC8B,KAAK,CAACC,MAAM,GAAG,CAAC,EAAE;MACvCJ,MAAM,GAAGA,MAAM,CAACG,KAAK,CAAC,GAAG9B,IAAI,CAAC8B,KAAK,CAAC;IACtC;IACA,IAAI9B,IAAI,CAACgC,SAAS,IAAIhC,IAAI,CAACgC,SAAS,CAACD,MAAM,GAAG,CAAC,EAAE;MAC/CJ,MAAM,GAAGA,MAAM,CAACK,SAAS,CAAC,GAAGhC,IAAI,CAACgC,SAAS,CAAC;IAC9C;IACA,IAAIhC,IAAI,CAACiC,QAAQ,IAAIjC,IAAI,CAACiC,QAAQ,CAACF,MAAM,GAAG,CAAC,EAAE;MAC7CJ,MAAM,GAAGA,MAAM,CAACM,QAAQ,CAAC,GAAGjC,IAAI,CAACiC,QAAQ,CAAC;IAC5C;IACA,IAAIjC,IAAI,CAACkC,OAAO,EAAE;MAChBP,MAAM,GAAGA,MAAM,CAACO,OAAO,CAAClC,IAAI,CAACkC,OAAO,CAAC;IACvC;IAEA,OAAOP,MAAM;EACf;EAEA,CAACX,kBAAkBmB,CAACnC,IAA2B,EAAe;IAC5D,MAAMoC,KAAK,GAAG,IAAIC,GAAG,CAAS,CAAC;IAC/B,MAAMC,QAAQ,GAAG3B,IAAI,CAAC4B,KAAK,CAAC,IAAI,CAAC,CAAC/C,iBAAiB,CAAC;IACpD,IAAI8C,QAAQ,CAACE,IAAI,EAAE;MACjBJ,KAAK,CAACK,GAAG,CAACH,QAAQ,CAACE,IAAI,CAAC;IAC1B;IAEA,IAAIxC,IAAI,CAAC8B,KAAK,EAAE;MACd,KAAK,MAAMY,EAAE,IAAI1C,IAAI,CAAC8B,KAAK,EAAE;QAC3B,MAAMa,IAAI,GAAGxD,gBAAgB,CAACuD,EAAE,CAAC;QACjC,IAAIC,IAAI,CAACH,IAAI,EAAE;UACbJ,KAAK,CAACK,GAAG,CAACE,IAAI,CAACH,IAAI,CAAC;QACtB;MACF;IACF;IAEA,IAAIxC,IAAI,CAACgC,SAAS,EAAE;MAClB,KAAK,MAAMU,EAAE,IAAI1C,IAAI,CAACgC,SAAS,EAAE;QAC/B,MAAMW,IAAI,GAAGxD,gBAAgB,CAACuD,EAAE,CAAC;QACjC,IAAIC,IAAI,CAACH,IAAI,EAAE;UACbJ,KAAK,CAACK,GAAG,CAACE,IAAI,CAACH,IAAI,CAAC;QACtB;MACF;IACF;IAEA,IAAIxC,IAAI,CAACiC,QAAQ,EAAE;MACjB,KAAK,MAAMS,EAAE,IAAI1C,IAAI,CAACiC,QAAQ,EAAE;QAC9B,MAAMU,IAAI,GAAGxD,gBAAgB,CAACuD,EAAE,CAAC;QACjC,IAAIC,IAAI,CAACH,IAAI,EAAE;UACbJ,KAAK,CAACK,GAAG,CAACE,IAAI,CAACH,IAAI,CAAC;QACtB;MACF;IACF;IAEA,OAAOJ,KAAK;EACd;;EAEA;AACF;AACA;EACYQ,oBAAoBA,CAACC,KAAmB,EAAQ;IACxDA,KAAK,CAACC,OAAO,CAACC,iBAAiB,CAAC,IAAI,CAAChD,QAAQ,CAAC;EAChD;;EAEA;AACF;AACA;AACA;EACE,MAAgBiD,aAAaA,CAC3BC,MAA+B,EACU;IACzC,IACE,IAAI,CAAC,CAACxD,UAAU,CAACyD,OAAO,IACrBC,MAAM,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC3D,UAAU,CAACyD,OAAO,CAAC,CAACnB,MAAM,GAAG,CAAC,IAChD,EAAE,IAAI,CAACsB,eAAe,YAAY/D,sBAAsB,CAAC,EAC5D;MACA,MAAMgE,aAAa,GAAGnE,gBAAgB,CAAC,IAAI,CAAC,CAACO,iBAAiB,CAAC;MAC/D,MAAM;QAAE6D;MAAW,CAAC,GAAG,MAAMlE,4BAA4B,CACvD,IAAI,CAACQ,KAAK,CAACO,MAAM,CAAClB,iBAAiB,CAAC,EACpCoE,aACF,CAAC;MACD,IAAI,CAACD,eAAe,GAAG,IAAI/D,sBAAsB,CAC/CiE,UAAU,CAACC,OAAO,EAClB,IAAI,CAAC,CAAC/D,UAAU,CAACyD,OACnB,CAAC;IACH;;IAEA;IACA,MAAMO,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC/D,iBAAiB,CAACgE,SAAS,CAAC;MACnDC,cAAc,EAAE,IAAI,CAACC,aAAa;MAClCC,SAAS,EAAE,IAAI,CAACC,yBAAyB,CAAC,CAAC;MAC3CC,WAAW,EAAE,IAAI;MACjB;MACA,IAAI,IAAI,CAAC,CAACtE,UAAU,CAACyD,OAAO,IACrBC,MAAM,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC3D,UAAU,CAACyD,OAAO,CAAC,CAACnB,MAAM,GAAG,CAAC,GACnD;QAAEiC,QAAQ,EAAE,IAAI,CAAC,CAACvE,UAAU,CAACyD;MAAQ,CAAC,GACtC,CAAC,CAAC;IACR,CAAC,CAAC;IAEF,IAAID,MAAM,EAAEgB,OAAO,EAAE;MACnB,MAAM,IAAIC,KAAK,CAAC,SAAS,CAAC;IAC5B;IAEA,IAAI,CAACN,aAAa,GAAGH,IAAI,CAACG,aAAa;IAEvC,OAAOH,IAAI;EACb;EAEUU,gBAAgBA,CACxBC,KAAc,EACdC,OAAe,EACfxB,KAAmB,EACO;IAC1B,IAAI,CAACxC,MAAM,EAAE+D,KAAK,CAAC,OAAO,EAAEA,KAAK,CAAC;IAClC,IAAI,CAACvE,KAAK,CAACyE,QAAQ,CAACC,GAAG,CAAC,IAAI,CAACxE,QAAQ,CAAC,CAACqE,KAAK,CAACA,KAAK,CAAC;IAEnD,MAAMI,kBAAkB,GAAG3B,KAAK,CAAC4B,IAAI,CAAC,IAAI,CAAC1E,QAAQ,CAAC,EAAE2E,KAAK,EAAEC,UAAU;IACvE,OAAO,IAAI,CAACC,YAAY,CACtB;MAAEC,IAAI,EAAE,EAAE;MAAEF,UAAU,EAAEH;IAAmB,CAAC,EAC5C,OAAO,EACP3B,KACF,CAAC;EACH;EAEAiC,qBAAqBA,CAACC,GAAiB,EAAQ;IAC7C,IAAI,CAACC,2BAA2B,CAC9B,IAAI,CAAC,CAACtF,iBAAiB,EACvBqF,GAAG,EACH,kBACF,CAAC;EACH;EAEAE,oBAAoB,GAAG,MAAAA,CACrBC,UAAkB,EAClBpC,OAA4B,KACV;IAClB,IAAI,IAAI,CAAC,CAACnD,WAAW,CAACwF,GAAG,CAACD,UAAU,CAAC,EAAE;MACrCpC,OAAO,EAAEsC,QAAQ,CAAC3C,GAAG,CAAC,IAAI,CAAC1C,QAAQ,CAAC;MACpC,OAAO,IAAI,CAACsF,UAAU,CAAC,IAAI,CAAC;IAC9B;IACA,OAAOC,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B,CAAC;EAESC,aAAaA,CACrBC,MAMC,EACiB;IAClB,OAAO;MACLC,YAAY,EAAED,MAAM,CAACE,YAAY;MACjCC,YAAY,EAAEH,MAAM,CAACG,YAAY;MACjCC,SAAS,EAAE,IAAI,CAACA,SAAS;MACzBC,OAAO,EAAE,IAAI,CAAClC,aAAa,IAAI,IAAI;MACnCmC,MAAM,EAAEN,MAAM,CAACM,MAAM;MACrBC,WAAW,EAAEP,MAAM,CAACO,WAAW;MAC/BC,SAAS,EAAE,IAAI,CAAC,CAACvG,iBAAiB;MAClCiF,UAAU,EAAEc,MAAM,CAACd;IACrB,CAAC;EACH;AACF","ignoreList":[]}
|
package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expectStandardObserveLink.js","names":["createDefer","expectSingleLinkCallAndClear","mockLinkSubCallback","waitForCall","defer","expectStandardObserveLink","store","srcObject","srcLinkName","targetType","expected","linkSubFn","links","observe","linkName","srcType","type","apiName","$apiName","pk","$primaryKey","status","payload"],"sources":["expectStandardObserveLink.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 { ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport type { Observer } from \"type-fest\";\nimport type { MockedObject } from \"vitest\";\nimport type { ObjectHolder } from \"../../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { SpecificLinkPayload } from \"../../../LinkPayload.js\";\nimport type { Store } from \"../../Store.js\";\nimport {\n createDefer,\n expectSingleLinkCallAndClear,\n mockLinkSubCallback,\n waitForCall,\n} from \"../../testUtils.js\";\n\nconst defer = createDefer();\n\n/**\n * Utility function for testing link observation behavior between objects\n *\n * This function provides the following guarantees:\n * - Sets up a link subscription using the Store's observeLinks method\n * - Validates that an initial \"loading\" state is emitted with empty results\n * - Waits for the link data to be fetched and emitted\n * - Validates the \"loaded\" state contains the expected linked objects\n * - Returns both the link payload and mock subscription function for further assertions\n *\n * This helper creates a standardized test flow for link observations that:\n * 1. Creates a subscription to observe links from source to target objects\n * 2. Verifies the initial loading state is emitted with empty results\n * 3. Waits for the data loading to complete\n * 4. Verifies the loaded state with the expected linked objects\n * 5. Provides the result objects for additional assertions in tests\n *\n * @typeParam S - The source object type definition\n * @typeParam T - The target object type definition\n */\nexport async function expectStandardObserveLink<\n S extends ObjectTypeDefinition,\n T extends ObjectTypeDefinition,\n>(\n {\n store,\n srcObject,\n srcLinkName,\n targetType,\n expected,\n }: {\n /** The Store instance to use for observation */\n store: Store;\n /** The source object that contains the link */\n srcObject: Osdk.Instance<S>;\n /** The name of the link field to observe */\n srcLinkName: string;\n /** The type definition of the linked objects */\n targetType: T;\n /** The expected linked objects that should be returned */\n expected: ObjectHolder<Osdk.Instance<T>>[];\n },\n): Promise<{\n /** The link payload containing the linked objects and metadata */\n payload: SpecificLinkPayload | undefined;\n /** The mocked subscription callback for further testing assertions */\n linkSubFn: MockedObject<\n Observer<\n SpecificLinkPayload | undefined\n >\n >;\n}> {\n const linkSubFn = mockLinkSubCallback();\n defer(\n store.links.observe({\n linkName: srcLinkName,\n srcType: { type: \"object\", apiName: srcObject.$apiName },\n pk: srcObject.$primaryKey,\n }, linkSubFn),\n );\n\n await waitForCall(linkSubFn);\n expectSingleLinkCallAndClear(linkSubFn, [], { status: \"loading\" });\n\n await waitForCall(linkSubFn);\n\n const payload = expectSingleLinkCallAndClear(linkSubFn, expected, {\n status: \"loaded\",\n });\n\n return { payload, linkSubFn };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA,SACEA,WAAW,EACXC,4BAA4B,EAC5BC,mBAAmB,EACnBC,WAAW,QACN,oBAAoB;AAE3B,MAAMC,KAAK,GAAGJ,WAAW,CAAC,CAAC;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeK,yBAAyBA,CAI7C;EACEC,KAAK;EACLC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC;AAYF,CAAC,EAUA;EACD,MAAMC,SAAS,GAAGT,mBAAmB,CAAC,CAAC;EACvCE,KAAK,CACHE,KAAK,CAACM,KAAK,CAACC,OAAO,CAAC;IAClBC,QAAQ,EAAEN,WAAW;IACrBO,OAAO,EAAE;MAAEC,IAAI,EAAE,QAAQ;MAAEC,OAAO,EAAEV,SAAS,CAACW;IAAS,CAAC;IACxDC,
|
|
1
|
+
{"version":3,"file":"expectStandardObserveLink.js","names":["createDefer","expectSingleLinkCallAndClear","mockLinkSubCallback","waitForCall","defer","expectStandardObserveLink","store","srcObject","srcLinkName","targetType","expected","linkSubFn","links","observe","linkName","srcType","type","apiName","$apiName","sourceUnderlyingObjectType","$objectType","pk","$primaryKey","status","payload"],"sources":["expectStandardObserveLink.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 { ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport type { Observer } from \"type-fest\";\nimport type { MockedObject } from \"vitest\";\nimport type { ObjectHolder } from \"../../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { SpecificLinkPayload } from \"../../../LinkPayload.js\";\nimport type { Store } from \"../../Store.js\";\nimport {\n createDefer,\n expectSingleLinkCallAndClear,\n mockLinkSubCallback,\n waitForCall,\n} from \"../../testUtils.js\";\n\nconst defer = createDefer();\n\n/**\n * Utility function for testing link observation behavior between objects\n *\n * This function provides the following guarantees:\n * - Sets up a link subscription using the Store's observeLinks method\n * - Validates that an initial \"loading\" state is emitted with empty results\n * - Waits for the link data to be fetched and emitted\n * - Validates the \"loaded\" state contains the expected linked objects\n * - Returns both the link payload and mock subscription function for further assertions\n *\n * This helper creates a standardized test flow for link observations that:\n * 1. Creates a subscription to observe links from source to target objects\n * 2. Verifies the initial loading state is emitted with empty results\n * 3. Waits for the data loading to complete\n * 4. Verifies the loaded state with the expected linked objects\n * 5. Provides the result objects for additional assertions in tests\n *\n * @typeParam S - The source object type definition\n * @typeParam T - The target object type definition\n */\nexport async function expectStandardObserveLink<\n S extends ObjectTypeDefinition,\n T extends ObjectTypeDefinition,\n>(\n {\n store,\n srcObject,\n srcLinkName,\n targetType,\n expected,\n }: {\n /** The Store instance to use for observation */\n store: Store;\n /** The source object that contains the link */\n srcObject: Osdk.Instance<S>;\n /** The name of the link field to observe */\n srcLinkName: string;\n /** The type definition of the linked objects */\n targetType: T;\n /** The expected linked objects that should be returned */\n expected: ObjectHolder<Osdk.Instance<T>>[];\n },\n): Promise<{\n /** The link payload containing the linked objects and metadata */\n payload: SpecificLinkPayload | undefined;\n /** The mocked subscription callback for further testing assertions */\n linkSubFn: MockedObject<\n Observer<\n SpecificLinkPayload | undefined\n >\n >;\n}> {\n const linkSubFn = mockLinkSubCallback();\n defer(\n store.links.observe({\n linkName: srcLinkName,\n srcType: { type: \"object\", apiName: srcObject.$apiName },\n sourceUnderlyingObjectType: srcObject.$objectType,\n pk: srcObject.$primaryKey,\n }, linkSubFn),\n );\n\n await waitForCall(linkSubFn);\n expectSingleLinkCallAndClear(linkSubFn, [], { status: \"loading\" });\n\n await waitForCall(linkSubFn);\n\n const payload = expectSingleLinkCallAndClear(linkSubFn, expected, {\n status: \"loaded\",\n });\n\n return { payload, linkSubFn };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA,SACEA,WAAW,EACXC,4BAA4B,EAC5BC,mBAAmB,EACnBC,WAAW,QACN,oBAAoB;AAE3B,MAAMC,KAAK,GAAGJ,WAAW,CAAC,CAAC;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeK,yBAAyBA,CAI7C;EACEC,KAAK;EACLC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC;AAYF,CAAC,EAUA;EACD,MAAMC,SAAS,GAAGT,mBAAmB,CAAC,CAAC;EACvCE,KAAK,CACHE,KAAK,CAACM,KAAK,CAACC,OAAO,CAAC;IAClBC,QAAQ,EAAEN,WAAW;IACrBO,OAAO,EAAE;MAAEC,IAAI,EAAE,QAAQ;MAAEC,OAAO,EAAEV,SAAS,CAACW;IAAS,CAAC;IACxDC,0BAA0B,EAAEZ,SAAS,CAACa,WAAW;IACjDC,EAAE,EAAEd,SAAS,CAACe;EAChB,CAAC,EAAEX,SAAS,CACd,CAAC;EAED,MAAMR,WAAW,CAACQ,SAAS,CAAC;EAC5BV,4BAA4B,CAACU,SAAS,EAAE,EAAE,EAAE;IAAEY,MAAM,EAAE;EAAU,CAAC,CAAC;EAElE,MAAMpB,WAAW,CAACQ,SAAS,CAAC;EAE5B,MAAMa,OAAO,GAAGvB,4BAA4B,CAACU,SAAS,EAAED,QAAQ,EAAE;IAChEa,MAAM,EAAE;EACV,CAAC,CAAC;EAEF,OAAO;IAAEC,OAAO;IAAEb;EAAU,CAAC;AAC/B","ignoreList":[]}
|