@osdk/client 2.4.2 → 2.5.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 +106 -93
- 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 +4 -0
- package/build/browser/actions/applyAction.js.map +1 -1
- package/build/browser/createClient.js +6 -2
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createMinimalClient.js +2 -1
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +17 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/browser/fetchMetadata.test.js +11 -0
- package/build/browser/fetchMetadata.test.js.map +1 -1
- package/build/browser/index.js +3 -1
- package/build/browser/index.js.map +1 -1
- package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
- package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
- package/build/browser/intellisense.test.js +14 -4
- package/build/browser/intellisense.test.js.map +1 -1
- package/build/browser/object/Cache.js +1 -1
- package/build/browser/object/Cache.js.map +1 -1
- package/build/browser/object/Cache.test.js +1 -1
- package/build/browser/object/Cache.test.js.map +1 -1
- package/build/browser/object/SimpleCache.js +1 -1
- package/build/browser/object/SimpleCache.js.map +1 -1
- package/build/browser/object/aggregate.js +2 -0
- package/build/browser/object/aggregate.js.map +1 -1
- package/build/browser/object/aggregate.test.js +30 -0
- package/build/browser/object/aggregate.test.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
- package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
- package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.js +4 -0
- package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +14 -0
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/object/fetchPage.js +96 -21
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/object/fetchPage.test.js +35 -1
- package/build/browser/object/fetchPage.test.js.map +1 -1
- package/build/browser/object/geotimeseriesreference.test.js +0 -2
- package/build/browser/object/geotimeseriesreference.test.js.map +1 -1
- package/build/browser/object/mediaUpload.js +3 -0
- package/build/browser/object/mediaUpload.js.map +1 -1
- package/build/browser/objectSet/ObjectSet.test.js +6 -0
- package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +31 -9
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +3 -1
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/observable/LinkPayload.js +2 -0
- package/build/browser/observable/LinkPayload.js.map +1 -0
- package/build/browser/observable/ObjectPayload.js.map +1 -1
- package/build/browser/observable/ObservableClient/ObserveLink.js +17 -0
- package/build/browser/observable/ObservableClient/ObserveLink.js.map +1 -0
- package/build/browser/observable/ObservableClient/common.js +2 -0
- package/build/browser/observable/ObservableClient/common.js.map +1 -0
- package/build/browser/observable/ObservableClient.js +20 -0
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/Unsubscribable.js +2 -0
- package/build/browser/observable/Unsubscribable.js.map +1 -0
- package/build/browser/observable/internal/AbstractHelper.js +54 -0
- package/build/browser/observable/internal/AbstractHelper.js.map +1 -0
- package/build/browser/observable/internal/BatchContext.js +2 -0
- package/build/browser/observable/internal/BatchContext.js.map +1 -0
- package/build/browser/observable/internal/BulkObjectLoader.js +3 -3
- package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/browser/observable/internal/CacheKeys.js +65 -25
- package/build/browser/observable/internal/CacheKeys.js.map +1 -1
- package/build/browser/observable/internal/Changes.js +6 -0
- package/build/browser/observable/internal/Changes.js.map +1 -1
- package/build/browser/observable/internal/KnownCacheKey.js +2 -0
- package/build/browser/observable/internal/KnownCacheKey.js.map +1 -0
- package/build/browser/observable/internal/Layer.js +0 -8
- package/build/browser/observable/internal/Layer.js.map +1 -1
- package/build/browser/observable/internal/Layers.js +151 -0
- package/build/browser/observable/internal/Layers.js.map +1 -0
- package/build/browser/observable/internal/ObservableClientImpl.js +54 -3
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/OrderByCanonicalizer.js +1 -37
- package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/Queries.js +40 -0
- package/build/browser/observable/internal/Queries.js.map +1 -0
- package/build/browser/observable/internal/Query.js +45 -4
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/QuerySubscription.js +48 -0
- package/build/browser/observable/internal/QuerySubscription.js.map +1 -0
- package/build/browser/observable/internal/Store.invalidation.test.js +646 -0
- package/build/browser/observable/internal/Store.invalidation.test.js.map +1 -0
- package/build/browser/observable/internal/Store.js +87 -308
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +330 -73
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/SubjectPayload.js +2 -0
- package/build/browser/observable/internal/SubjectPayload.js.map +1 -0
- package/build/browser/observable/internal/Subjects.js +55 -0
- package/build/browser/observable/internal/Subjects.js.map +1 -0
- package/build/browser/observable/internal/UnsubscribableWrapper.js +30 -0
- package/build/browser/observable/internal/UnsubscribableWrapper.js.map +1 -0
- package/build/browser/observable/internal/WeakRefTrie.js +61 -0
- package/build/browser/observable/internal/WeakRefTrie.js.map +1 -0
- package/build/browser/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
- package/build/browser/observable/internal/actions/ActionApplication.js.map +1 -0
- package/build/{esm/observable/internal → browser/observable/internal/actions}/OptimisticJob.js +15 -6
- package/build/browser/observable/internal/actions/OptimisticJob.js.map +1 -0
- package/build/browser/observable/internal/base-list/BaseCollectionQuery.js +2 -0
- package/build/browser/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
- package/build/browser/observable/internal/base-list/BaseListQuery.js +411 -0
- package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -0
- package/build/browser/observable/internal/base-list/createCollectionConnectable.js +50 -0
- package/build/browser/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
- package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js +597 -0
- package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
- package/build/browser/observable/internal/base-list/removeDuplicates.js +36 -0
- package/build/browser/observable/internal/base-list/removeDuplicates.js.map +1 -0
- package/build/browser/observable/internal/createInitEntry.js +25 -0
- package/build/browser/observable/internal/createInitEntry.js.map +1 -0
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.js +216 -0
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
- package/build/browser/observable/internal/isObjectInstance.js +23 -0
- package/build/browser/observable/internal/isObjectInstance.js.map +1 -0
- package/build/browser/observable/internal/links/LinksHelper.js +37 -0
- package/build/browser/observable/internal/links/LinksHelper.js.map +1 -0
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js +2 -0
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
- package/build/browser/observable/internal/links/SpecificLinkQuery.js +185 -0
- package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -0
- package/build/browser/observable/internal/list/InterfaceListQuery.js +83 -0
- package/build/browser/observable/internal/list/InterfaceListQuery.js.map +1 -0
- package/build/browser/observable/internal/list/ListCacheKey.js +2 -0
- package/build/browser/observable/internal/list/ListCacheKey.js.map +1 -0
- package/build/browser/observable/internal/list/ListQuery.js +372 -0
- package/build/browser/observable/internal/list/ListQuery.js.map +1 -0
- package/build/browser/observable/internal/list/ListQueryOptions.js +2 -0
- package/build/browser/observable/internal/list/ListQueryOptions.js.map +1 -0
- package/build/browser/observable/internal/list/ListsHelper.js +51 -0
- package/build/browser/observable/internal/list/ListsHelper.js.map +1 -0
- package/build/browser/observable/internal/list/ObjectListQuery.js +48 -0
- package/build/browser/observable/internal/list/ObjectListQuery.js.map +1 -0
- package/build/browser/observable/internal/object/ObjectCacheKey.js +2 -0
- package/build/browser/observable/internal/object/ObjectCacheKey.js.map +1 -0
- package/build/browser/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +27 -18
- package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -0
- package/build/browser/observable/internal/object/ObjectsHelper.js +48 -0
- package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -0
- package/build/browser/observable/internal/sorting/SortingStrategy.js +78 -0
- package/build/browser/observable/internal/sorting/SortingStrategy.js.map +1 -0
- package/build/browser/observable/internal/testUtils/invalidateList.js +23 -0
- package/build/browser/observable/internal/testUtils/invalidateList.js.map +1 -0
- package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
- package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
- package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
- package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
- package/build/browser/observable/internal/testUtils.js +72 -10
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/ontology/loadActionMetadata.js +3 -1
- package/build/browser/ontology/loadActionMetadata.js.map +1 -1
- package/build/browser/ontology/loadFullObjectMetadata.js +2 -1
- package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/browser/ontology/loadInterfaceMetadata.js +2 -1
- package/build/browser/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/browser/public/unstable-do-not-use.js.map +1 -1
- package/build/browser/util/UserAgent.js +2 -2
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/browser/util/exponentialBackoff.js +51 -0
- package/build/browser/util/exponentialBackoff.js.map +1 -0
- package/build/browser/util/exponentialBackoff.test.js +81 -0
- package/build/browser/util/exponentialBackoff.test.js.map +1 -0
- package/build/browser/util/extractObjectOrInterfaceType.js +9 -1
- package/build/browser/util/extractObjectOrInterfaceType.js.map +1 -1
- package/build/browser/util/extractObjectOrInterfaceType.test.js +2 -2
- package/build/browser/util/extractObjectOrInterfaceType.test.js.map +1 -1
- package/build/browser/util/streamutils.js +1 -1
- package/build/browser/util/streamutils.js.map +1 -1
- package/build/browser/util/toDataValue.js +15 -1
- package/build/browser/util/toDataValue.js.map +1 -1
- package/build/browser/util/toDataValue.test.js +42 -2
- package/build/browser/util/toDataValue.test.js.map +1 -1
- package/build/cjs/{chunk-633AI7EA.cjs → chunk-GVGP7T5P.cjs} +407 -257
- package/build/cjs/chunk-GVGP7T5P.cjs.map +1 -0
- package/build/cjs/{chunk-26WFEZQO.cjs → chunk-YADG7KA6.cjs} +136 -84
- package/build/cjs/chunk-YADG7KA6.cjs.map +1 -0
- package/build/cjs/{createClient-BJo8T7Js.d.cts → createClient-mOlFts15.d.cts} +1 -0
- package/build/cjs/index.cjs +11 -7
- package/build/cjs/index.d.cts +2 -2
- package/build/cjs/public/internal.cjs +8 -8
- package/build/cjs/public/unstable-do-not-use.cjs +1502 -851
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +183 -13
- 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 +4 -0
- package/build/esm/actions/applyAction.js.map +1 -1
- package/build/esm/createClient.js +6 -2
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createMinimalClient.js +2 -1
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +17 -0
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/esm/fetchMetadata.test.js +11 -0
- package/build/esm/fetchMetadata.test.js.map +1 -1
- package/build/esm/index.js +3 -1
- package/build/esm/index.js.map +1 -1
- package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
- package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
- package/build/esm/intellisense.test.js +14 -4
- package/build/esm/intellisense.test.js.map +1 -1
- package/build/esm/object/Cache.js +1 -1
- package/build/esm/object/Cache.js.map +1 -1
- package/build/esm/object/Cache.test.js +1 -1
- package/build/esm/object/Cache.test.js.map +1 -1
- package/build/esm/object/SimpleCache.js +1 -1
- package/build/esm/object/SimpleCache.js.map +1 -1
- package/build/esm/object/aggregate.js +2 -0
- package/build/esm/object/aggregate.js.map +1 -1
- package/build/esm/object/aggregate.test.js +30 -0
- package/build/esm/object/aggregate.test.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
- package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
- package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.js +4 -0
- package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +14 -0
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/object/fetchPage.js +96 -21
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/object/fetchPage.test.js +35 -1
- package/build/esm/object/fetchPage.test.js.map +1 -1
- package/build/esm/object/geotimeseriesreference.test.js +0 -2
- package/build/esm/object/geotimeseriesreference.test.js.map +1 -1
- package/build/esm/object/mediaUpload.js +3 -0
- package/build/esm/object/mediaUpload.js.map +1 -1
- package/build/esm/objectSet/ObjectSet.test.js +6 -0
- package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +31 -9
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +3 -1
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/observable/LinkPayload.js +2 -0
- package/build/esm/observable/LinkPayload.js.map +1 -0
- package/build/esm/observable/ObjectPayload.js.map +1 -1
- package/build/esm/observable/ObservableClient/ObserveLink.js +17 -0
- package/build/esm/observable/ObservableClient/ObserveLink.js.map +1 -0
- package/build/esm/observable/ObservableClient/common.js +2 -0
- package/build/esm/observable/ObservableClient/common.js.map +1 -0
- package/build/esm/observable/ObservableClient.js +20 -0
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/Unsubscribable.js +2 -0
- package/build/esm/observable/Unsubscribable.js.map +1 -0
- package/build/esm/observable/internal/AbstractHelper.js +54 -0
- package/build/esm/observable/internal/AbstractHelper.js.map +1 -0
- package/build/esm/observable/internal/BatchContext.js +2 -0
- package/build/esm/observable/internal/BatchContext.js.map +1 -0
- package/build/esm/observable/internal/BulkObjectLoader.js +3 -3
- package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/esm/observable/internal/CacheKeys.js +65 -25
- package/build/esm/observable/internal/CacheKeys.js.map +1 -1
- package/build/esm/observable/internal/Changes.js +6 -0
- package/build/esm/observable/internal/Changes.js.map +1 -1
- package/build/esm/observable/internal/KnownCacheKey.js +2 -0
- package/build/esm/observable/internal/KnownCacheKey.js.map +1 -0
- package/build/esm/observable/internal/Layer.js +0 -8
- package/build/esm/observable/internal/Layer.js.map +1 -1
- package/build/esm/observable/internal/Layers.js +151 -0
- package/build/esm/observable/internal/Layers.js.map +1 -0
- package/build/esm/observable/internal/ObservableClientImpl.js +54 -3
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/OrderByCanonicalizer.js +1 -37
- package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/Queries.js +40 -0
- package/build/esm/observable/internal/Queries.js.map +1 -0
- package/build/esm/observable/internal/Query.js +45 -4
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/QuerySubscription.js +48 -0
- package/build/esm/observable/internal/QuerySubscription.js.map +1 -0
- package/build/esm/observable/internal/Store.invalidation.test.js +646 -0
- package/build/esm/observable/internal/Store.invalidation.test.js.map +1 -0
- package/build/esm/observable/internal/Store.js +87 -308
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +330 -73
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/SubjectPayload.js +2 -0
- package/build/esm/observable/internal/SubjectPayload.js.map +1 -0
- package/build/esm/observable/internal/Subjects.js +55 -0
- package/build/esm/observable/internal/Subjects.js.map +1 -0
- package/build/esm/observable/internal/UnsubscribableWrapper.js +30 -0
- package/build/esm/observable/internal/UnsubscribableWrapper.js.map +1 -0
- package/build/esm/observable/internal/WeakRefTrie.js +61 -0
- package/build/esm/observable/internal/WeakRefTrie.js.map +1 -0
- package/build/esm/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
- package/build/esm/observable/internal/actions/ActionApplication.js.map +1 -0
- package/build/{browser/observable/internal → esm/observable/internal/actions}/OptimisticJob.js +15 -6
- package/build/esm/observable/internal/actions/OptimisticJob.js.map +1 -0
- package/build/esm/observable/internal/base-list/BaseCollectionQuery.js +2 -0
- package/build/esm/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
- package/build/esm/observable/internal/base-list/BaseListQuery.js +411 -0
- package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -0
- package/build/esm/observable/internal/base-list/createCollectionConnectable.js +50 -0
- package/build/esm/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
- package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js +597 -0
- package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
- package/build/esm/observable/internal/base-list/removeDuplicates.js +36 -0
- package/build/esm/observable/internal/base-list/removeDuplicates.js.map +1 -0
- package/build/esm/observable/internal/createInitEntry.js +25 -0
- package/build/esm/observable/internal/createInitEntry.js.map +1 -0
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.js +216 -0
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
- package/build/esm/observable/internal/isObjectInstance.js +23 -0
- package/build/esm/observable/internal/isObjectInstance.js.map +1 -0
- package/build/esm/observable/internal/links/LinksHelper.js +37 -0
- package/build/esm/observable/internal/links/LinksHelper.js.map +1 -0
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js +2 -0
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
- package/build/esm/observable/internal/links/SpecificLinkQuery.js +185 -0
- package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -0
- package/build/esm/observable/internal/list/InterfaceListQuery.js +83 -0
- package/build/esm/observable/internal/list/InterfaceListQuery.js.map +1 -0
- package/build/esm/observable/internal/list/ListCacheKey.js +2 -0
- package/build/esm/observable/internal/list/ListCacheKey.js.map +1 -0
- package/build/esm/observable/internal/list/ListQuery.js +372 -0
- package/build/esm/observable/internal/list/ListQuery.js.map +1 -0
- package/build/esm/observable/internal/list/ListQueryOptions.js +2 -0
- package/build/esm/observable/internal/list/ListQueryOptions.js.map +1 -0
- package/build/esm/observable/internal/list/ListsHelper.js +51 -0
- package/build/esm/observable/internal/list/ListsHelper.js.map +1 -0
- package/build/esm/observable/internal/list/ObjectListQuery.js +48 -0
- package/build/esm/observable/internal/list/ObjectListQuery.js.map +1 -0
- package/build/esm/observable/internal/object/ObjectCacheKey.js +2 -0
- package/build/esm/observable/internal/object/ObjectCacheKey.js.map +1 -0
- package/build/esm/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +27 -18
- package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -0
- package/build/esm/observable/internal/object/ObjectsHelper.js +48 -0
- package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -0
- package/build/esm/observable/internal/sorting/SortingStrategy.js +78 -0
- package/build/esm/observable/internal/sorting/SortingStrategy.js.map +1 -0
- package/build/esm/observable/internal/testUtils/invalidateList.js +23 -0
- package/build/esm/observable/internal/testUtils/invalidateList.js.map +1 -0
- package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
- package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
- package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
- package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
- package/build/esm/observable/internal/testUtils.js +72 -10
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/ontology/loadActionMetadata.js +3 -1
- package/build/esm/ontology/loadActionMetadata.js.map +1 -1
- package/build/esm/ontology/loadFullObjectMetadata.js +2 -1
- package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/esm/ontology/loadInterfaceMetadata.js +2 -1
- package/build/esm/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/esm/public/unstable-do-not-use.js.map +1 -1
- package/build/esm/util/UserAgent.js +2 -2
- package/build/esm/util/UserAgent.js.map +1 -1
- package/build/esm/util/exponentialBackoff.js +51 -0
- package/build/esm/util/exponentialBackoff.js.map +1 -0
- package/build/esm/util/exponentialBackoff.test.js +81 -0
- package/build/esm/util/exponentialBackoff.test.js.map +1 -0
- package/build/esm/util/extractObjectOrInterfaceType.js +9 -1
- package/build/esm/util/extractObjectOrInterfaceType.js.map +1 -1
- package/build/esm/util/extractObjectOrInterfaceType.test.js +2 -2
- package/build/esm/util/extractObjectOrInterfaceType.test.js.map +1 -1
- package/build/esm/util/streamutils.js +1 -1
- package/build/esm/util/streamutils.js.map +1 -1
- package/build/esm/util/toDataValue.js +15 -1
- package/build/esm/util/toDataValue.js.map +1 -1
- package/build/esm/util/toDataValue.test.js +42 -2
- package/build/esm/util/toDataValue.test.js.map +1 -1
- package/build/types/Client.d.ts +1 -1
- package/build/types/MinimalClientContext.d.ts +1 -0
- package/build/types/MinimalClientContext.d.ts.map +1 -1
- package/build/types/actions/applyAction.d.ts.map +1 -1
- package/build/types/createClient.d.ts +1 -0
- package/build/types/createClient.d.ts.map +1 -1
- package/build/types/index.d.ts +1 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/object/fetchPage.d.ts.map +1 -1
- package/build/types/object/mediaUpload.d.ts +2 -1
- package/build/types/object/mediaUpload.d.ts.map +1 -1
- package/build/types/observable/LinkPayload.d.ts +9 -0
- package/build/types/observable/LinkPayload.d.ts.map +1 -0
- package/build/types/observable/ObjectPayload.d.ts +4 -0
- package/build/types/observable/ObjectPayload.d.ts.map +1 -1
- package/build/types/observable/ObservableClient/ObserveLink.d.ts +32 -0
- package/build/types/observable/ObservableClient/ObserveLink.d.ts.map +1 -0
- package/build/types/observable/ObservableClient/common.d.ts +67 -0
- package/build/types/observable/ObservableClient/common.d.ts.map +1 -0
- package/build/types/observable/ObservableClient.d.ts +103 -15
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/Unsubscribable.d.ts +3 -0
- package/build/types/observable/Unsubscribable.d.ts.map +1 -0
- package/build/types/observable/internal/AbstractHelper.d.ts +17 -0
- package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -0
- package/build/types/observable/internal/BatchContext.d.ts +11 -0
- package/build/types/observable/internal/BatchContext.d.ts.map +1 -0
- package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -1
- package/build/types/observable/internal/CacheKeys.d.ts +12 -6
- package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
- package/build/types/observable/internal/Changes.d.ts +8 -5
- package/build/types/observable/internal/Changes.d.ts.map +1 -1
- package/build/types/observable/internal/KnownCacheKey.d.ts +4 -0
- package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/Layer.d.ts +6 -7
- package/build/types/observable/internal/Layer.d.ts.map +1 -1
- package/build/types/observable/internal/Layers.d.ts +26 -0
- package/build/types/observable/internal/Layers.d.ts.map +1 -0
- package/build/types/observable/internal/OrderByCanonicalizer.d.ts +0 -7
- package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/Queries.d.ts +9 -0
- package/build/types/observable/internal/Queries.d.ts.map +1 -0
- package/build/types/observable/internal/Query.d.ts +23 -6
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- package/build/types/observable/internal/QuerySubscription.d.ts +1 -0
- package/build/types/observable/internal/QuerySubscription.d.ts.map +1 -0
- package/build/types/observable/internal/Store.d.ts +41 -51
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/Store.invalidation.test.d.ts +1 -0
- package/build/types/observable/internal/Store.invalidation.test.d.ts.map +1 -0
- package/build/types/observable/internal/Store.test.d.ts +4 -1
- package/build/types/observable/internal/Store.test.d.ts.map +1 -1
- package/build/types/observable/internal/SubjectPayload.d.ts +5 -0
- package/build/types/observable/internal/SubjectPayload.d.ts.map +1 -0
- package/build/types/observable/internal/Subjects.d.ts +16 -0
- package/build/types/observable/internal/Subjects.d.ts.map +1 -0
- package/build/types/observable/internal/UnsubscribableWrapper.d.ts +1 -0
- package/build/types/observable/internal/UnsubscribableWrapper.d.ts.map +1 -0
- package/build/types/observable/internal/WeakRefTrie.d.ts +13 -0
- package/build/types/observable/internal/WeakRefTrie.d.ts.map +1 -0
- package/build/types/observable/internal/{ActionApplication.d.ts → actions/ActionApplication.d.ts} +2 -2
- package/build/types/observable/internal/{ActionApplication.d.ts.map → actions/ActionApplication.d.ts.map} +1 -1
- package/build/types/observable/internal/{OptimisticJob.d.ts → actions/OptimisticJob.d.ts} +4 -4
- package/build/types/observable/internal/actions/OptimisticJob.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/BaseCollectionQuery.d.ts +64 -0
- package/build/types/observable/internal/base-list/BaseCollectionQuery.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts +145 -0
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts +39 -0
- package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/createCollectionConnectable.test.d.ts +1 -0
- package/build/types/observable/internal/base-list/createCollectionConnectable.test.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/removeDuplicates.d.ts +11 -0
- package/build/types/observable/internal/base-list/removeDuplicates.d.ts.map +1 -0
- package/build/types/observable/internal/createInitEntry.d.ts +3 -0
- package/build/types/observable/internal/createInitEntry.d.ts.map +1 -0
- package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts +9 -0
- package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts.map +1 -0
- package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts +1 -0
- package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts.map +1 -0
- package/build/types/observable/internal/isObjectInstance.d.ts +5 -0
- package/build/types/observable/internal/isObjectInstance.d.ts.map +1 -0
- package/build/types/observable/internal/links/LinksHelper.d.ts +31 -0
- package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -0
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +17 -0
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +47 -0
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -0
- package/build/types/observable/internal/list/InterfaceListQuery.d.ts +18 -0
- package/build/types/observable/internal/list/InterfaceListQuery.d.ts.map +1 -0
- package/build/types/observable/internal/list/ListCacheKey.d.ts +7 -0
- package/build/types/observable/internal/list/ListCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/list/ListQuery.d.ts +106 -0
- package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -0
- package/build/types/observable/internal/list/ListQueryOptions.d.ts +4 -0
- package/build/types/observable/internal/list/ListQueryOptions.d.ts.map +1 -0
- package/build/types/observable/internal/list/ListsHelper.d.ts +19 -0
- package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -0
- package/build/types/observable/internal/list/ObjectListQuery.d.ts +18 -0
- package/build/types/observable/internal/list/ObjectListQuery.d.ts.map +1 -0
- package/build/types/observable/internal/object/ObjectCacheKey.d.ts +5 -0
- package/build/types/observable/internal/object/ObjectCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/{ObjectQuery.d.ts → object/ObjectQuery.d.ts} +11 -9
- package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -0
- package/build/types/observable/internal/object/ObjectsHelper.d.ts +11 -0
- package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -0
- package/build/types/observable/internal/sorting/SortingStrategy.d.ts +41 -0
- package/build/types/observable/internal/sorting/SortingStrategy.d.ts.map +1 -0
- package/build/types/observable/internal/testUtils/invalidateList.d.ts +9 -0
- package/build/types/observable/internal/testUtils/invalidateList.d.ts.map +1 -0
- package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts +46 -0
- package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts.map +1 -0
- package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts +26 -0
- package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts.map +1 -0
- package/build/types/observable/internal/testUtils.d.ts +26 -4
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/build/types/public/unstable-do-not-use.d.ts +4 -2
- package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
- package/build/types/util/exponentialBackoff.d.ts +14 -0
- package/build/types/util/exponentialBackoff.d.ts.map +1 -0
- package/build/types/util/exponentialBackoff.test.d.ts +1 -0
- package/build/types/util/exponentialBackoff.test.d.ts.map +1 -0
- package/package.json +27 -27
- package/build/browser/observable/internal/ActionApplication.js.map +0 -1
- package/build/browser/observable/internal/ListQuery.js +0 -618
- package/build/browser/observable/internal/ListQuery.js.map +0 -1
- package/build/browser/observable/internal/ObjectQuery.js.map +0 -1
- package/build/browser/observable/internal/OptimisticJob.js.map +0 -1
- package/build/cjs/chunk-26WFEZQO.cjs.map +0 -1
- package/build/cjs/chunk-633AI7EA.cjs.map +0 -1
- package/build/esm/observable/internal/ActionApplication.js.map +0 -1
- package/build/esm/observable/internal/ListQuery.js +0 -618
- package/build/esm/observable/internal/ListQuery.js.map +0 -1
- package/build/esm/observable/internal/ObjectQuery.js.map +0 -1
- package/build/esm/observable/internal/OptimisticJob.js.map +0 -1
- package/build/types/observable/internal/ListQuery.d.ts +0 -88
- package/build/types/observable/internal/ListQuery.d.ts.map +0 -1
- package/build/types/observable/internal/ObjectQuery.d.ts.map +0 -1
- package/build/types/observable/internal/OptimisticJob.d.ts.map +0 -1
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
|
|
17
17
|
import deepEqual from "fast-deep-equal";
|
|
18
18
|
import { BehaviorSubject, connectable, map } from "rxjs";
|
|
19
|
-
import { additionalContext } from "
|
|
20
|
-
import { getBulkObjectLoader } from "
|
|
21
|
-
import { Query } from "
|
|
22
|
-
import { tombstone } from "
|
|
19
|
+
import { additionalContext } from "../../../Client.js";
|
|
20
|
+
import { getBulkObjectLoader } from "../BulkObjectLoader.js";
|
|
21
|
+
import { Query } from "../Query.js";
|
|
22
|
+
import { tombstone } from "../tombstone.js";
|
|
23
23
|
export class ObjectQuery extends Query {
|
|
24
24
|
#apiName;
|
|
25
25
|
#pk;
|
|
@@ -53,6 +53,11 @@ export class ObjectQuery extends Query {
|
|
|
53
53
|
methodName: "_fetchAndStore"
|
|
54
54
|
}).debug("calling _fetchAndStore");
|
|
55
55
|
}
|
|
56
|
+
|
|
57
|
+
// TODO: In the future, implement tracking of network requests to ensure
|
|
58
|
+
// we're not making unnecessary network calls. This would need dedicated
|
|
59
|
+
// tests separate from subscription notification tests.
|
|
60
|
+
|
|
56
61
|
const obj = await getBulkObjectLoader(this.store.client).fetch(this.#apiName, this.#pk);
|
|
57
62
|
this.store.batch({}, batch => {
|
|
58
63
|
this.writeToStore(obj, "loaded", batch);
|
|
@@ -61,10 +66,20 @@ export class ObjectQuery extends Query {
|
|
|
61
66
|
writeToStore(data, status, batch) {
|
|
62
67
|
const entry = batch.read(this.cacheKey);
|
|
63
68
|
if (entry && deepEqual(data, entry.value)) {
|
|
69
|
+
// Check if both data AND status are the same
|
|
70
|
+
if (entry.status === status) {
|
|
71
|
+
if (process.env.NODE_ENV !== "production") {
|
|
72
|
+
this.logger?.child({
|
|
73
|
+
methodName: "writeToStore"
|
|
74
|
+
}).debug(`Object was deep equal and status unchanged (${status}), skipping update`);
|
|
75
|
+
}
|
|
76
|
+
// Return the existing entry without writing to avoid unnecessary notifications
|
|
77
|
+
return entry;
|
|
78
|
+
}
|
|
64
79
|
if (process.env.NODE_ENV !== "production") {
|
|
65
80
|
this.logger?.child({
|
|
66
81
|
methodName: "writeToStore"
|
|
67
|
-
}).debug(`Object was deep equal, just setting status`);
|
|
82
|
+
}).debug(`Object was deep equal, just setting status (old status: ${entry.status}, new status: ${status})`);
|
|
68
83
|
}
|
|
69
84
|
// must do a "full write" here so that the lastUpdated is updated but we
|
|
70
85
|
// don't want to retrigger anyone's memoization on the value!
|
|
@@ -109,18 +124,12 @@ export class ObjectQuery extends Query {
|
|
|
109
124
|
batch.changes.deleteObject(this.cacheKey);
|
|
110
125
|
return ret;
|
|
111
126
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
export function storeOsdkInstances(store, values, batch) {
|
|
120
|
-
// update the cache for any object that has changed
|
|
121
|
-
// and save the mapped values to return
|
|
122
|
-
return values.map(v => {
|
|
123
|
-
return store.getObjectQuery(v.$apiName, v.$primaryKey).writeToStore(v, "loaded", batch).cacheKey;
|
|
124
|
-
});
|
|
127
|
+
invalidateObjectType = (objectType, changes) => {
|
|
128
|
+
if (this.#apiName === objectType) {
|
|
129
|
+
changes?.modified.add(this.cacheKey);
|
|
130
|
+
return this.revalidate(true);
|
|
131
|
+
}
|
|
132
|
+
return Promise.resolve();
|
|
133
|
+
};
|
|
125
134
|
}
|
|
126
135
|
//# sourceMappingURL=ObjectQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectQuery.js","names":["deepEqual","BehaviorSubject","connectable","map","additionalContext","getBulkObjectLoader","Query","tombstone","ObjectQuery","apiName","pk","constructor","store","subject","type","cacheKey","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","x","JSON","stringify","join","undefined","_createConnectable","pipe","status","object","value","lastUpdated","isOptimistic","connector","_fetchAndStore","methodName","debug","obj","fetch","batch","writeToStore","data","entry","read","write","ret","changes","registerObject","deleteFromStore","delete","deleteObject","invalidateObjectType","objectType","modified","add","revalidate","Promise","resolve"],"sources":["ObjectQuery.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, PrimaryKeyType } from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport type { Connectable, Observable, Subject } from \"rxjs\";\nimport { BehaviorSubject, connectable, map } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type {\n CommonObserveOptions,\n Status,\n} from \"../../ObservableClient/common.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport { getBulkObjectLoader } from \"../BulkObjectLoader.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Entry } from \"../Layer.js\";\nimport { Query } from \"../Query.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport type { ObjectCacheKey } from \"./ObjectCacheKey.js\";\n\nexport class ObjectQuery extends Query<\n ObjectCacheKey,\n ObjectPayload,\n CommonObserveOptions\n> {\n #apiName: string;\n #pk: string | number | boolean;\n\n constructor(\n store: Store,\n subject: Subject<SubjectPayload<ObjectCacheKey>>,\n type: string,\n pk: PrimaryKeyType<ObjectTypeDefinition>,\n cacheKey: ObjectCacheKey,\n opts: CommonObserveOptions,\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: `ObjectQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n this.#apiName = type;\n this.#pk = pk;\n }\n\n protected _createConnectable(\n subject: Observable<SubjectPayload<ObjectCacheKey>>,\n ): Connectable<ObjectPayload> {\n return connectable<ObjectPayload>(\n subject.pipe(\n map((x) => {\n return {\n status: x.status,\n object: x.value,\n lastUpdated: x.lastUpdated,\n isOptimistic: x.isOptimistic,\n };\n }),\n ),\n {\n connector: () =>\n new BehaviorSubject<ObjectPayload>({\n status: \"init\",\n object: undefined,\n lastUpdated: 0,\n isOptimistic: false,\n }),\n },\n );\n }\n\n async _fetchAndStore(): Promise<void> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"_fetchAndStore\" }).debug(\n \"calling _fetchAndStore\",\n );\n }\n\n // TODO: In the future, implement tracking of network requests to ensure\n // we're not making unnecessary network calls. This would need dedicated\n // tests separate from subscription notification tests.\n\n const obj = await getBulkObjectLoader(this.store.client)\n .fetch(this.#apiName, this.#pk);\n\n this.store.batch({}, (batch) => {\n this.writeToStore(obj, \"loaded\", batch);\n });\n }\n\n writeToStore(\n data: ObjectHolder,\n status: Status,\n batch: BatchContext,\n ): Entry<ObjectCacheKey> {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(data, entry.value)) {\n // Check if both data AND status are the same\n if (entry.status === status) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `Object was deep equal and status unchanged (${status}), skipping update`,\n );\n }\n // Return the existing entry without writing to avoid unnecessary notifications\n return entry;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `Object was deep equal, just setting status (old status: ${entry.status}, new status: ${status})`,\n );\n }\n // must do a \"full write\" here so that the lastUpdated is updated but we\n // don't want to retrigger anyone's memoization on the value!\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n JSON.stringify({ status }),\n data,\n );\n }\n const ret = batch.write(this.cacheKey, data, status);\n batch.changes.registerObject(this.cacheKey, data, /* isNew */ !entry);\n\n return ret;\n }\n\n deleteFromStore(\n status: Status,\n batch: BatchContext,\n ): Entry<ObjectCacheKey> | undefined {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(tombstone, entry.value)) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n `Object was deep equal, just setting status`,\n );\n }\n // must do a \"full write\" here so that the lastUpdated is updated but we\n // don't want to retrigger anyone's memoization on the value!\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n JSON.stringify({ status }),\n );\n }\n\n // if there is no entry then there is nothing to do\n if (!entry || !entry.value) {\n return;\n }\n\n const ret = batch.delete(this.cacheKey, status);\n batch.changes.deleteObject(this.cacheKey);\n\n return ret;\n }\n\n invalidateObjectType = (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n if (this.#apiName === objectType) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n }\n return Promise.resolve();\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { AbstractHelper } from "../AbstractHelper.js";
|
|
18
|
+
import { ObjectQuery } from "./ObjectQuery.js";
|
|
19
|
+
export class ObjectsHelper extends AbstractHelper {
|
|
20
|
+
observe(options, subFn) {
|
|
21
|
+
return super.observe(options, subFn);
|
|
22
|
+
}
|
|
23
|
+
getQuery(options) {
|
|
24
|
+
const apiName = typeof options.apiName === "string" ? options.apiName : options.apiName.apiName;
|
|
25
|
+
const {
|
|
26
|
+
pk
|
|
27
|
+
} = options;
|
|
28
|
+
const objectCacheKey = this.cacheKeys.get("object", apiName, pk);
|
|
29
|
+
return this.store.queries.get(objectCacheKey, () => new ObjectQuery(this.store, this.store.subjects.get(objectCacheKey), apiName, pk, objectCacheKey, {
|
|
30
|
+
dedupeInterval: 0
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Internal helper method for writing objects to the store and returning their
|
|
36
|
+
* object keys
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
storeOsdkInstances(values, batch) {
|
|
40
|
+
// update the cache for any object that has changed
|
|
41
|
+
// and save the mapped values to return
|
|
42
|
+
return values.map(v => this.getQuery({
|
|
43
|
+
apiName: v.$apiName,
|
|
44
|
+
pk: v.$primaryKey
|
|
45
|
+
}).writeToStore(v, "loaded", batch).cacheKey);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ObjectsHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectsHelper.js","names":["AbstractHelper","ObjectQuery","ObjectsHelper","observe","options","subFn","getQuery","apiName","pk","objectCacheKey","cacheKeys","get","store","queries","subjects","dedupeInterval","storeOsdkInstances","values","batch","map","v","$apiName","$primaryKey","writeToStore","cacheKey"],"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 type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type { ObserveObjectOptions } from \"../../ObservableClient.js\";\nimport type { Observer } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.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 ): 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 );\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\n * @internal\n */\n public storeOsdkInstances(\n values: Array<ObjectHolder> | Array<Osdk.Instance<any, any, any>>,\n batch: BatchContext,\n ): ObjectCacheKey[] {\n // update the cache for any object that has changed\n // and save the mapped values to return\n return values.map(v =>\n this.getQuery({\n apiName: v.$apiName,\n pk: v.$primaryKey as string | number,\n }).writeToStore(\n v as ObjectHolder,\n \"loaded\",\n batch,\n ).cacheKey\n );\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWA,SAASA,cAAc,QAAQ,sBAAsB;AAIrD,SAASC,WAAW,QAAQ,kBAAkB;AAE9C,OAAO,MAAMC,aAAa,SAASF,cAAc,CAG/C;EACAG,OAAOA,CACLC,OAAgC,EAChCC,KAA8B,EACE;IAChC,OAAO,KAAK,CAACF,OAAO,CAACC,OAAO,EAAEC,KAAK,CAAC;EACtC;EAEAC,QAAQA,CACNF,OAAgC,EACnB;IACb,MAAMG,OAAO,GAAG,OAAOH,OAAO,CAACG,OAAO,KAAK,QAAQ,GAC/CH,OAAO,CAACG,OAAO,GACfH,OAAO,CAACG,OAAO,CAACA,OAAO;IAC3B,MAAM;MAAEC;IAAG,CAAC,GAAGJ,OAAO;IAEtB,MAAMK,cAAc,GAAG,IAAI,CAACC,SAAS,CAACC,GAAG,CACvC,QAAQ,EACRJ,OAAO,EACPC,EACF,CAAC;IAED,OAAO,IAAI,CAACI,KAAK,CAACC,OAAO,CAACF,GAAG,CAACF,cAAc,EAAE,MAC5C,IAAIR,WAAW,CACb,IAAI,CAACW,KAAK,EACV,IAAI,CAACA,KAAK,CAACE,QAAQ,CAACH,GAAG,CAACF,cAAc,CAAC,EACvCF,OAAO,EACPC,EAAE,EACFC,cAAc,EACd;MAAEM,cAAc,EAAE;IAAE,CACtB,CAAC,CAAC;EACN;;EAEA;AACF;AACA;AACA;AACA;EACSC,kBAAkBA,CACvBC,MAAiE,EACjEC,KAAmB,EACD;IAClB;IACA;IACA,OAAOD,MAAM,CAACE,GAAG,CAACC,CAAC,IACjB,IAAI,CAACd,QAAQ,CAAC;MACZC,OAAO,EAAEa,CAAC,CAACC,QAAQ;MACnBb,EAAE,EAAEY,CAAC,CAACE;IACR,CAAC,CAAC,CAACC,YAAY,CACbH,CAAC,EACD,QAAQ,EACRF,KACF,CAAC,CAACM,QACJ,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Strategy interface for collection sorting
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* No-operation sorting strategy that preserves original order
|
|
23
|
+
*/
|
|
24
|
+
export class NoOpSortingStrategy {
|
|
25
|
+
sortCacheKeys(objectCacheKeys) {
|
|
26
|
+
return objectCacheKeys;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Sorting strategy for OrderBy clauses
|
|
31
|
+
*/
|
|
32
|
+
export class OrderBySortingStrategy {
|
|
33
|
+
constructor(apiName, orderBy) {
|
|
34
|
+
this.apiName = apiName;
|
|
35
|
+
this.orderBy = orderBy;
|
|
36
|
+
this.sortFns = createOrderBySortFns(orderBy);
|
|
37
|
+
}
|
|
38
|
+
sortCacheKeys(objectCacheKeys, batch) {
|
|
39
|
+
if (Object.keys(this.orderBy).length === 0) {
|
|
40
|
+
return objectCacheKeys;
|
|
41
|
+
}
|
|
42
|
+
return objectCacheKeys.sort((a, b) => {
|
|
43
|
+
for (const sortFn of this.sortFns) {
|
|
44
|
+
const ret = sortFn(batch.read(a)?.value?.$as(this.apiName), batch.read(b)?.value?.$as(this.apiName));
|
|
45
|
+
if (ret !== 0) {
|
|
46
|
+
return ret;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return 0;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Creates sort functions for an orderBy clause
|
|
56
|
+
* @param orderBy - The order by clause
|
|
57
|
+
* @returns Array of sort functions
|
|
58
|
+
*/
|
|
59
|
+
export function createOrderBySortFns(orderBy) {
|
|
60
|
+
return Object.entries(orderBy).map(([key, order]) => {
|
|
61
|
+
return (a, b) => {
|
|
62
|
+
const aValue = a?.[key];
|
|
63
|
+
const bValue = b?.[key];
|
|
64
|
+
if (aValue == null && bValue == null) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
if (aValue == null) {
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
if (bValue == null) {
|
|
71
|
+
return -1;
|
|
72
|
+
}
|
|
73
|
+
const m = order === "asc" ? -1 : 1;
|
|
74
|
+
return aValue < bValue ? m : aValue > bValue ? -m : 0;
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=SortingStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SortingStrategy.js","names":["NoOpSortingStrategy","sortCacheKeys","objectCacheKeys","OrderBySortingStrategy","constructor","apiName","orderBy","sortFns","createOrderBySortFns","batch","Object","keys","length","sort","a","b","sortFn","ret","read","value","$as","entries","map","key","order","aValue","bValue","m"],"sources":["SortingStrategy.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 { InterfaceHolder } from \"../../../object/convertWireToOsdkObjects/InterfaceHolder.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { ObjectCacheKey } from \"../object/ObjectCacheKey.js\";\n\n/**\n * Strategy interface for collection sorting\n */\nexport interface SortingStrategy {\n /**\n * Sort an array of object cache keys\n * @param objectCacheKeys - Keys to sort\n * @param batch - Batch context for reading objects\n * @returns Sorted array of keys\n */\n sortCacheKeys(\n objectCacheKeys: ObjectCacheKey[],\n batch: BatchContext,\n ): ObjectCacheKey[];\n}\n\n/**\n * No-operation sorting strategy that preserves original order\n */\nexport class NoOpSortingStrategy implements SortingStrategy {\n sortCacheKeys(\n objectCacheKeys: ObjectCacheKey[],\n _batch: BatchContext,\n ): ObjectCacheKey[] {\n return objectCacheKeys;\n }\n}\n\ntype ObjectInterfaceComparer = (\n a: ObjectHolder | InterfaceHolder | undefined,\n b: ObjectHolder | InterfaceHolder | undefined,\n) => number;\n\n/**\n * Sorting strategy for OrderBy clauses\n */\nexport class OrderBySortingStrategy implements SortingStrategy {\n private readonly sortFns: Array<ObjectInterfaceComparer>;\n\n constructor(\n private readonly apiName: string,\n private readonly orderBy: Canonical<\n Record<string, \"asc\" | \"desc\" | undefined>\n >,\n ) {\n this.sortFns = createOrderBySortFns(orderBy);\n }\n\n sortCacheKeys(\n objectCacheKeys: ObjectCacheKey[],\n batch: BatchContext,\n ): ObjectCacheKey[] {\n if (Object.keys(this.orderBy).length === 0) {\n return objectCacheKeys;\n }\n\n return objectCacheKeys.sort((a, b) => {\n for (const sortFn of this.sortFns) {\n const ret = sortFn(\n batch.read(a)?.value?.$as(this.apiName),\n batch.read(b)?.value?.$as(this.apiName),\n );\n if (ret !== 0) {\n return ret;\n }\n }\n return 0;\n });\n }\n}\n\n/**\n * Creates sort functions for an orderBy clause\n * @param orderBy - The order by clause\n * @returns Array of sort functions\n */\nexport function createOrderBySortFns(\n orderBy: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>,\n): ObjectInterfaceComparer[] {\n return Object.entries(orderBy).map(([key, order]) => {\n return (\n a: ObjectHolder | InterfaceHolder | undefined,\n b: ObjectHolder | InterfaceHolder | undefined,\n ): number => {\n const aValue = a?.[key];\n const bValue = b?.[key];\n\n if (aValue == null && bValue == null) {\n return 0;\n }\n if (aValue == null) {\n return 1;\n }\n if (bValue == null) {\n return -1;\n }\n const m = order === \"asc\" ? -1 : 1;\n return aValue < bValue ? m : aValue > bValue ? -m : 0;\n };\n });\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;;AAcA;AACA;AACA;AACA,OAAO,MAAMA,mBAAmB,CAA4B;EAC1DC,aAAaA,CACXC,eAAiC,EAEf;IAClB,OAAOA,eAAe;EACxB;AACF;AAOA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,CAA4B;EAG7DC,WAAWA,CACQC,OAAe,EACfC,OAEhB,EACD;IAAA,KAJiBD,OAAe,GAAfA,OAAe;IAAA,KACfC,OAEhB,GAFgBA,OAEhB;IAED,IAAI,CAACC,OAAO,GAAGC,oBAAoB,CAACF,OAAO,CAAC;EAC9C;EAEAL,aAAaA,CACXC,eAAiC,EACjCO,KAAmB,EACD;IAClB,IAAIC,MAAM,CAACC,IAAI,CAAC,IAAI,CAACL,OAAO,CAAC,CAACM,MAAM,KAAK,CAAC,EAAE;MAC1C,OAAOV,eAAe;IACxB;IAEA,OAAOA,eAAe,CAACW,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;MACpC,KAAK,MAAMC,MAAM,IAAI,IAAI,CAACT,OAAO,EAAE;QACjC,MAAMU,GAAG,GAAGD,MAAM,CAChBP,KAAK,CAACS,IAAI,CAACJ,CAAC,CAAC,EAAEK,KAAK,EAAEC,GAAG,CAAC,IAAI,CAACf,OAAO,CAAC,EACvCI,KAAK,CAACS,IAAI,CAACH,CAAC,CAAC,EAAEI,KAAK,EAAEC,GAAG,CAAC,IAAI,CAACf,OAAO,CACxC,CAAC;QACD,IAAIY,GAAG,KAAK,CAAC,EAAE;UACb,OAAOA,GAAG;QACZ;MACF;MACA,OAAO,CAAC;IACV,CAAC,CAAC;EACJ;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAST,oBAAoBA,CAClCF,OAA8D,EACnC;EAC3B,OAAOI,MAAM,CAACW,OAAO,CAACf,OAAO,CAAC,CAACgB,GAAG,CAAC,CAAC,CAACC,GAAG,EAAEC,KAAK,CAAC,KAAK;IACnD,OAAO,CACLV,CAA6C,EAC7CC,CAA6C,KAClC;MACX,MAAMU,MAAM,GAAGX,CAAC,GAAGS,GAAG,CAAC;MACvB,MAAMG,MAAM,GAAGX,CAAC,GAAGQ,GAAG,CAAC;MAEvB,IAAIE,MAAM,IAAI,IAAI,IAAIC,MAAM,IAAI,IAAI,EAAE;QACpC,OAAO,CAAC;MACV;MACA,IAAID,MAAM,IAAI,IAAI,EAAE;QAClB,OAAO,CAAC;MACV;MACA,IAAIC,MAAM,IAAI,IAAI,EAAE;QAClB,OAAO,CAAC,CAAC;MACX;MACA,MAAMC,CAAC,GAAGH,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;MAClC,OAAOC,MAAM,GAAGC,MAAM,GAAGC,CAAC,GAAGF,MAAM,GAAGC,MAAM,GAAG,CAACC,CAAC,GAAG,CAAC;IACvD,CAAC;EACH,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export async function invalidateList(store, args) {
|
|
18
|
+
const where = store.whereCanonicalizer.canonicalize(args.where ?? {});
|
|
19
|
+
const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});
|
|
20
|
+
const cacheKey = store.cacheKeys.get("list", args.type.type, args.type.apiName, where, orderBy);
|
|
21
|
+
await store.queries.peek(cacheKey)?.revalidate(true);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=invalidateList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidateList.js","names":["invalidateList","store","args","where","whereCanonicalizer","canonicalize","orderBy","orderByCanonicalizer","cacheKey","cacheKeys","get","type","apiName","queries","peek","revalidate"],"sources":["invalidateList.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, WhereClause } from \"@osdk/api\";\nimport type { OrderBy } from \"../../ObservableClient.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { ListCacheKey } from \"../list/ListCacheKey.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { Store } from \"../Store.js\";\n\nexport async function invalidateList<T extends ObjectTypeDefinition>(\n store: Store,\n args: {\n type: Pick<T, \"apiName\" | \"type\">;\n where?: WhereClause<T> | SimpleWhereClause;\n orderBy?: OrderBy<T>;\n },\n): Promise<void> {\n const where = store.whereCanonicalizer.canonicalize(args.where ?? {});\n const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});\n\n const cacheKey = store.cacheKeys.get<ListCacheKey>(\n \"list\",\n args.type.type,\n args.type.apiName,\n where,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n await store.queries.peek(cacheKey)?.revalidate(true);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA,OAAO,eAAeA,cAAcA,CAClCC,KAAY,EACZC,IAIC,EACc;EACf,MAAMC,KAAK,GAAGF,KAAK,CAACG,kBAAkB,CAACC,YAAY,CAACH,IAAI,CAACC,KAAK,IAAI,CAAC,CAAC,CAAC;EACrE,MAAMG,OAAO,GAAGL,KAAK,CAACM,oBAAoB,CAACF,YAAY,CAACH,IAAI,CAACI,OAAO,IAAI,CAAC,CAAC,CAAC;EAE3E,MAAME,QAAQ,GAAGP,KAAK,CAACQ,SAAS,CAACC,GAAG,CAClC,MAAM,EACNR,IAAI,CAACS,IAAI,CAACA,IAAI,EACdT,IAAI,CAACS,IAAI,CAACC,OAAO,EACjBT,KAAK,EACLG,OACF,CAAC;EAED,MAAML,KAAK,CAACY,OAAO,CAACC,IAAI,CAACN,QAAQ,CAAC,EAAEO,UAAU,CAAC,IAAI,CAAC;AACtD","ignoreList":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { createDefer, expectSingleLinkCallAndClear, mockLinkSubCallback, waitForCall } from "../../testUtils.js";
|
|
18
|
+
const defer = createDefer();
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Utility function for testing link observation behavior between objects
|
|
22
|
+
*
|
|
23
|
+
* This function provides the following guarantees:
|
|
24
|
+
* - Sets up a link subscription using the Store's observeLinks method
|
|
25
|
+
* - Validates that an initial "loading" state is emitted with empty results
|
|
26
|
+
* - Waits for the link data to be fetched and emitted
|
|
27
|
+
* - Validates the "loaded" state contains the expected linked objects
|
|
28
|
+
* - Returns both the link payload and mock subscription function for further assertions
|
|
29
|
+
*
|
|
30
|
+
* This helper creates a standardized test flow for link observations that:
|
|
31
|
+
* 1. Creates a subscription to observe links from source to target objects
|
|
32
|
+
* 2. Verifies the initial loading state is emitted with empty results
|
|
33
|
+
* 3. Waits for the data loading to complete
|
|
34
|
+
* 4. Verifies the loaded state with the expected linked objects
|
|
35
|
+
* 5. Provides the result objects for additional assertions in tests
|
|
36
|
+
*
|
|
37
|
+
* @typeParam S - The source object type definition
|
|
38
|
+
* @typeParam T - The target object type definition
|
|
39
|
+
*/
|
|
40
|
+
export async function expectStandardObserveLink({
|
|
41
|
+
store,
|
|
42
|
+
srcObject,
|
|
43
|
+
srcLinkName,
|
|
44
|
+
targetType,
|
|
45
|
+
expected
|
|
46
|
+
}) {
|
|
47
|
+
const linkSubFn = mockLinkSubCallback();
|
|
48
|
+
defer(store.links.observe({
|
|
49
|
+
linkName: srcLinkName,
|
|
50
|
+
srcType: {
|
|
51
|
+
type: "object",
|
|
52
|
+
apiName: srcObject.$apiName
|
|
53
|
+
},
|
|
54
|
+
pk: srcObject.$primaryKey
|
|
55
|
+
}, linkSubFn));
|
|
56
|
+
await waitForCall(linkSubFn);
|
|
57
|
+
expectSingleLinkCallAndClear(linkSubFn, [], {
|
|
58
|
+
status: "loading"
|
|
59
|
+
});
|
|
60
|
+
await waitForCall(linkSubFn);
|
|
61
|
+
const payload = expectSingleLinkCallAndClear(linkSubFn, expected, {
|
|
62
|
+
status: "loaded"
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
payload,
|
|
66
|
+
linkSubFn
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=expectStandardObserveLink.js.map
|
|
@@ -0,0 +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,EAAE,EAAEZ,SAAS,CAACa;EAChB,CAAC,EAAET,SAAS,CACd,CAAC;EAED,MAAMR,WAAW,CAACQ,SAAS,CAAC;EAC5BV,4BAA4B,CAACU,SAAS,EAAE,EAAE,EAAE;IAAEU,MAAM,EAAE;EAAU,CAAC,CAAC;EAElE,MAAMlB,WAAW,CAACQ,SAAS,CAAC;EAE5B,MAAMW,OAAO,GAAGrB,4BAA4B,CAACU,SAAS,EAAED,QAAQ,EAAE;IAChEW,MAAM,EAAE;EACV,CAAC,CAAC;EAEF,OAAO;IAAEC,OAAO;IAAEX;EAAU,CAAC;AAC/B","ignoreList":[]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { expect } from "vitest";
|
|
18
|
+
import { createDefer, expectSingleObjectCallAndClear, mockSingleSubCallback, waitForCall } from "../../testUtils.js";
|
|
19
|
+
const defer = createDefer();
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Utility function for testing object observation behavior
|
|
23
|
+
*
|
|
24
|
+
* This function provides the following guarantees:
|
|
25
|
+
* - Validates the initial "loading" state is emitted
|
|
26
|
+
* - Waits for the subscription callback to be called again
|
|
27
|
+
* - Validates the "loaded" state with the expected object containing apiName and primaryKey
|
|
28
|
+
* - Returns both the observed object and mock subscription function for further assertions
|
|
29
|
+
*
|
|
30
|
+
* @param cache - The Store instance to use for observation
|
|
31
|
+
* @param apiName - The API name for the object to observe
|
|
32
|
+
* @param primaryKey - The primary key of the object to observe
|
|
33
|
+
* @returns A promise that resolves to the observed object and the mocked subscription callback
|
|
34
|
+
*/
|
|
35
|
+
export async function expectStandardObserveObject({
|
|
36
|
+
cache,
|
|
37
|
+
type,
|
|
38
|
+
primaryKey
|
|
39
|
+
}) {
|
|
40
|
+
const subFn = mockSingleSubCallback();
|
|
41
|
+
defer(cache.objects.observe({
|
|
42
|
+
apiName: type,
|
|
43
|
+
pk: primaryKey
|
|
44
|
+
}, subFn));
|
|
45
|
+
expectSingleObjectCallAndClear(subFn, undefined, "loading");
|
|
46
|
+
await waitForCall(subFn);
|
|
47
|
+
const obj = expectSingleObjectCallAndClear(subFn, expect.objectContaining({
|
|
48
|
+
$apiName: type.apiName,
|
|
49
|
+
$primaryKey: primaryKey
|
|
50
|
+
}), "loaded");
|
|
51
|
+
return {
|
|
52
|
+
payload: obj,
|
|
53
|
+
subFn
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=expectStandardObserveObject.js.map
|
package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expectStandardObserveObject.js","names":["expect","createDefer","expectSingleObjectCallAndClear","mockSingleSubCallback","waitForCall","defer","expectStandardObserveObject","cache","type","primaryKey","subFn","objects","observe","apiName","pk","undefined","obj","objectContaining","$apiName","$primaryKey","payload"],"sources":["expectStandardObserveObject.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, PrimaryKeyType } from \"@osdk/api\";\nimport { expect } from \"vitest\";\nimport type { TypedObjectPayload } from \"../../../ObjectPayload.js\";\nimport type { Store } from \"../../Store.js\";\nimport type { MockedSingleSubCallback } from \"../../testUtils.js\";\nimport {\n createDefer,\n expectSingleObjectCallAndClear,\n mockSingleSubCallback,\n waitForCall,\n} from \"../../testUtils.js\";\n\nconst defer = createDefer();\n\n/**\n * Utility function for testing object observation behavior\n *\n * This function provides the following guarantees:\n * - Validates the initial \"loading\" state is emitted\n * - Waits for the subscription callback to be called again\n * - Validates the \"loaded\" state with the expected object containing apiName and primaryKey\n * - Returns both the observed object and mock subscription function for further assertions\n *\n * @param cache - The Store instance to use for observation\n * @param apiName - The API name for the object to observe\n * @param primaryKey - The primary key of the object to observe\n * @returns A promise that resolves to the observed object and the mocked subscription callback\n */\nexport async function expectStandardObserveObject<\n T extends ObjectTypeDefinition,\n>(\n { cache, type, primaryKey }: {\n cache: Store;\n type: T;\n primaryKey: PrimaryKeyType<T>;\n },\n): Promise<{\n payload: TypedObjectPayload<T>;\n subFn: MockedSingleSubCallback;\n}> {\n const subFn = mockSingleSubCallback();\n defer(\n cache.objects.observe({\n apiName: type,\n pk: primaryKey,\n }, subFn),\n );\n\n expectSingleObjectCallAndClear(\n subFn,\n undefined,\n \"loading\",\n );\n\n await waitForCall(subFn);\n\n const obj = expectSingleObjectCallAndClear(\n subFn,\n expect.objectContaining({\n $apiName: type.apiName,\n $primaryKey: primaryKey,\n }),\n \"loaded\",\n );\n return { payload: obj as TypedObjectPayload<T>, subFn };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,MAAM,QAAQ,QAAQ;AAI/B,SACEC,WAAW,EACXC,8BAA8B,EAC9BC,qBAAqB,EACrBC,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,OAAO,eAAeK,2BAA2BA,CAG/C;EAAEC,KAAK;EAAEC,IAAI;EAAEC;AAIf,CAAC,EAIA;EACD,MAAMC,KAAK,GAAGP,qBAAqB,CAAC,CAAC;EACrCE,KAAK,CACHE,KAAK,CAACI,OAAO,CAACC,OAAO,CAAC;IACpBC,OAAO,EAAEL,IAAI;IACbM,EAAE,EAAEL;EACN,CAAC,EAAEC,KAAK,CACV,CAAC;EAEDR,8BAA8B,CAC5BQ,KAAK,EACLK,SAAS,EACT,SACF,CAAC;EAED,MAAMX,WAAW,CAACM,KAAK,CAAC;EAExB,MAAMM,GAAG,GAAGd,8BAA8B,CACxCQ,KAAK,EACLV,MAAM,CAACiB,gBAAgB,CAAC;IACtBC,QAAQ,EAAEV,IAAI,CAACK,OAAO;IACtBM,WAAW,EAAEV;EACf,CAAC,CAAC,EACF,QACF,CAAC;EACD,OAAO;IAAEW,OAAO,EAAEJ,GAA4B;IAAEN;EAAM,CAAC;AACzD","ignoreList":[]}
|
|
@@ -15,22 +15,25 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { Chalk } from "chalk";
|
|
18
|
+
import { inspect } from "node:util";
|
|
18
19
|
import pDefer from "p-defer";
|
|
19
20
|
import invariant from "tiny-invariant";
|
|
20
21
|
import { afterEach, beforeEach, expect, vi, vitest } from "vitest";
|
|
21
22
|
import { additionalContext } from "../../Client.js";
|
|
22
|
-
import { storeOsdkInstances } from "./ObjectQuery.js";
|
|
23
23
|
const chalk = new Chalk(); // new Chalk({ level: 3 });
|
|
24
24
|
|
|
25
25
|
function mockLog(...args) {
|
|
26
26
|
// eslint-disable-next-line no-console
|
|
27
27
|
console.log(chalk.yellow("mockClient"), ...args);
|
|
28
28
|
}
|
|
29
|
-
// interface Logger.LogFn {
|
|
30
|
-
// (obj: unknown, msg?: string, ...args: any[]): void;
|
|
31
|
-
// (msg: string, ...args: any[]): void;
|
|
32
|
-
// }
|
|
33
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Testing utilities for ObservableClient implementation.
|
|
32
|
+
* - Mock creation helpers for client, observers, and callbacks
|
|
33
|
+
* - Expectation utilities for validating payloads
|
|
34
|
+
* - Tools for managing test lifecycle and cleanup
|
|
35
|
+
* - Creates a colorized logger for test environments
|
|
36
|
+
*/
|
|
34
37
|
export function createTestLogger(bindings, options) {
|
|
35
38
|
const colors = {
|
|
36
39
|
debug: [chalk.cyan, chalk.bgCyan],
|
|
@@ -71,6 +74,10 @@ export function createTestLogger(bindings, options) {
|
|
|
71
74
|
isLevelEnabled: vi.fn(() => true)
|
|
72
75
|
};
|
|
73
76
|
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Creates mocked client helpers with deferred promise control
|
|
80
|
+
*/
|
|
74
81
|
export function createClientMockHelper() {
|
|
75
82
|
const client = vitest.fn();
|
|
76
83
|
const logger = createTestLogger({});
|
|
@@ -183,6 +190,10 @@ export function createClientMockHelper() {
|
|
|
183
190
|
}
|
|
184
191
|
};
|
|
185
192
|
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Manages test subscriptions with automatic cleanup
|
|
196
|
+
*/
|
|
186
197
|
export function createDefer() {
|
|
187
198
|
let subscriptions;
|
|
188
199
|
beforeEach(() => {
|
|
@@ -199,6 +210,18 @@ export function createDefer() {
|
|
|
199
210
|
return x;
|
|
200
211
|
};
|
|
201
212
|
}
|
|
213
|
+
export function expectSingleLinkCallAndClear(subFn, resolvedList, payloadOptions = {}) {
|
|
214
|
+
if (vitest.isFakeTimers()) {
|
|
215
|
+
vitest.runOnlyPendingTimers();
|
|
216
|
+
}
|
|
217
|
+
expect(subFn.next).toHaveBeenCalledExactlyOnceWith(linkPayloadContaining({
|
|
218
|
+
...payloadOptions,
|
|
219
|
+
resolvedList: resolvedList
|
|
220
|
+
}));
|
|
221
|
+
const ret = subFn.next.mock.calls[0][0];
|
|
222
|
+
subFn.next.mockClear();
|
|
223
|
+
return ret;
|
|
224
|
+
}
|
|
202
225
|
export function expectSingleListCallAndClear(subFn, resolvedList, payloadOptions = {}) {
|
|
203
226
|
if (vitest.isFakeTimers()) {
|
|
204
227
|
vitest.runOnlyPendingTimers();
|
|
@@ -209,12 +232,18 @@ export function expectSingleListCallAndClear(subFn, resolvedList, payloadOptions
|
|
|
209
232
|
}));
|
|
210
233
|
subFn.next.mockClear();
|
|
211
234
|
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Validates object payload emissions in tests
|
|
238
|
+
*/
|
|
212
239
|
export function expectSingleObjectCallAndClear(subFn, object, status) {
|
|
213
240
|
expect(subFn.next).toHaveBeenCalledExactlyOnceWith(expect.objectContaining({
|
|
214
241
|
object,
|
|
215
242
|
status: status ?? expect.any(String)
|
|
216
243
|
}));
|
|
244
|
+
const ret = subFn.next.mock.calls[0][0];
|
|
217
245
|
subFn.next.mockClear();
|
|
246
|
+
return ret;
|
|
218
247
|
}
|
|
219
248
|
export async function waitForCall(subFn, times = 1) {
|
|
220
249
|
if ("next" in subFn && "error" in subFn && "complete" in subFn) {
|
|
@@ -223,8 +252,16 @@ export async function waitForCall(subFn, times = 1) {
|
|
|
223
252
|
try {
|
|
224
253
|
await vi.waitFor(() => {
|
|
225
254
|
expect(subFn).toHaveBeenCalledTimes(times);
|
|
255
|
+
}, {
|
|
256
|
+
interval: 0
|
|
226
257
|
});
|
|
227
258
|
} catch (e) {
|
|
259
|
+
// eslint-disable-next-line no-console
|
|
260
|
+
console.log(`We are going to fail waiting for ${times} calls because these are our calls: `, inspect(subFn.mock.calls, {
|
|
261
|
+
depth: 9,
|
|
262
|
+
colors: true,
|
|
263
|
+
compact: 2
|
|
264
|
+
}));
|
|
228
265
|
// we don't need the error, it will retrigger on the next line
|
|
229
266
|
// and that provides better behavior in the vitest vscode
|
|
230
267
|
// plugin. This places the error in the test itself instead of
|
|
@@ -286,9 +323,16 @@ export function mockObserver() {
|
|
|
286
323
|
complete: vitest.fn()
|
|
287
324
|
};
|
|
288
325
|
}
|
|
326
|
+
|
|
327
|
+
// todo: find uses of this and replace with direct call to mockObserver<ListPayload | undefined>
|
|
289
328
|
export function mockListSubCallback() {
|
|
290
329
|
return mockObserver();
|
|
291
330
|
}
|
|
331
|
+
|
|
332
|
+
// todo: find uses of this and replace with direct call to mockObserver<SpecificLinkPayload | undefined>
|
|
333
|
+
export function mockLinkSubCallback() {
|
|
334
|
+
return mockObserver();
|
|
335
|
+
}
|
|
292
336
|
export function cacheEntryContaining(x) {
|
|
293
337
|
return {
|
|
294
338
|
cacheKey: x.cacheKey ?? expect.any(Object),
|
|
@@ -318,6 +362,16 @@ export function listPayloadContaining(x) {
|
|
|
318
362
|
lastUpdated: x.lastUpdated ?? expect.anything()
|
|
319
363
|
};
|
|
320
364
|
}
|
|
365
|
+
export function linkPayloadContaining(x) {
|
|
366
|
+
return {
|
|
367
|
+
fetchMore: x.fetchMore ?? expect.any(Function),
|
|
368
|
+
hasMore: x.hasMore ?? expect.any(Boolean),
|
|
369
|
+
resolvedList: x.resolvedList ?? expect.anything(),
|
|
370
|
+
isOptimistic: expect.any(Boolean),
|
|
371
|
+
status: x.status ?? expect.anything(),
|
|
372
|
+
lastUpdated: x.lastUpdated ?? expect.anything()
|
|
373
|
+
};
|
|
374
|
+
}
|
|
321
375
|
export function applyCustomMatchers() {
|
|
322
376
|
expect.extend({
|
|
323
377
|
toBeGreaterThan: (r, e) => {
|
|
@@ -356,21 +410,29 @@ export function updateList(store, {
|
|
|
356
410
|
optimisticId
|
|
357
411
|
});
|
|
358
412
|
}
|
|
359
|
-
const query = store.
|
|
413
|
+
const query = store.lists.getQuery({
|
|
414
|
+
...opts,
|
|
415
|
+
type,
|
|
416
|
+
where: where ?? {},
|
|
417
|
+
orderBy: orderBy ?? {}
|
|
418
|
+
});
|
|
360
419
|
store.batch({
|
|
361
420
|
optimisticId
|
|
362
421
|
}, batch => {
|
|
363
|
-
const objectCacheKeys = storeOsdkInstances(
|
|
364
|
-
query._updateList(objectCacheKeys,
|
|
422
|
+
const objectCacheKeys = store.objects.storeOsdkInstances(objects, batch);
|
|
423
|
+
query._updateList(objectCacheKeys, "loaded", batch, false);
|
|
365
424
|
});
|
|
366
425
|
}
|
|
367
426
|
export function getObject(store, type, pk) {
|
|
368
|
-
return store.getValue(store.
|
|
427
|
+
return store.getValue(store.cacheKeys.get("object", type, pk))?.value;
|
|
369
428
|
}
|
|
370
429
|
export function updateObject(store, value, {
|
|
371
430
|
optimisticId
|
|
372
431
|
} = {}) {
|
|
373
|
-
const query = store.
|
|
432
|
+
const query = store.objects.getQuery({
|
|
433
|
+
apiName: value.$apiName,
|
|
434
|
+
pk: value.$primaryKey
|
|
435
|
+
});
|
|
374
436
|
store.batch({
|
|
375
437
|
optimisticId
|
|
376
438
|
}, batch => {
|