@osdk/client 2.5.2 → 2.6.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 +118 -73
- 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 +2 -1
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createClient.test.js +19 -1
- package/build/browser/createClient.test.js.map +1 -1
- package/build/browser/createMinimalClient.js +4 -2
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +19 -1
- 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 +2 -2
- package/build/browser/index.js.map +1 -1
- package/build/browser/internal/conversions/extractNamespace.js +22 -0
- package/build/browser/internal/conversions/extractNamespace.js.map +1 -0
- package/build/browser/internal/conversions/fullyQualifyPropName.js +26 -0
- package/build/browser/internal/conversions/fullyQualifyPropName.js.map +1 -0
- package/build/browser/internal/conversions/makeGeoFilterBbox.js +41 -0
- package/build/browser/internal/conversions/makeGeoFilterBbox.js.map +1 -0
- package/build/browser/internal/conversions/makeGeoFilterIntersects.js +29 -0
- package/build/browser/internal/conversions/makeGeoFilterIntersects.js.map +1 -0
- package/build/browser/internal/conversions/makeGeoFilterPolygon.js +30 -0
- package/build/browser/internal/conversions/makeGeoFilterPolygon.js.map +1 -0
- package/build/browser/internal/conversions/makeGeoFilterWithin.js +48 -0
- package/build/browser/internal/conversions/makeGeoFilterWithin.js.map +1 -0
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js +59 -105
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.test.js +309 -0
- package/build/browser/internal/conversions/modernToLegacyWhereClause.test.js.map +1 -1
- package/build/browser/object/aggregate.js +3 -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/InterfaceHolder.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +5 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +10 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +12 -0
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/object/fetchPage.js +13 -6
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/object/formatting/applyPropertyFormatter.js +58 -0
- package/build/browser/object/formatting/applyPropertyFormatter.js.map +1 -0
- package/build/browser/object/formatting/applyPropertyFormatter.test.js +726 -0
- package/build/browser/object/formatting/applyPropertyFormatter.test.js.map +1 -0
- package/build/browser/object/formatting/formatBoolean.js +23 -0
- package/build/browser/object/formatting/formatBoolean.js.map +1 -0
- package/build/browser/object/formatting/formatDateTime.js +158 -0
- package/build/browser/object/formatting/formatDateTime.js.map +1 -0
- package/build/browser/object/formatting/formatNumber.js +242 -0
- package/build/browser/object/formatting/formatNumber.js.map +1 -0
- package/build/browser/object/formatting/propertyFormattingUtils.js +39 -0
- package/build/browser/object/formatting/propertyFormattingUtils.js.map +1 -0
- package/build/browser/object/mediaUpload.js +3 -0
- package/build/browser/object/mediaUpload.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +17 -0
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +11 -0
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/internal/BulkObjectLoader.js +12 -4
- package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/browser/observable/internal/BulkObjectLoader.test.js +48 -0
- package/build/browser/observable/internal/BulkObjectLoader.test.js.map +1 -1
- package/build/browser/observable/internal/CacheKeys.js +9 -3
- package/build/browser/observable/internal/CacheKeys.js.map +1 -1
- package/build/browser/observable/internal/Canonicalizer.js +51 -0
- package/build/browser/observable/internal/Canonicalizer.js.map +1 -0
- package/build/browser/observable/internal/Changes.js.map +1 -1
- package/build/browser/observable/internal/IntersectCanonicalizer.js +35 -0
- package/build/browser/observable/internal/IntersectCanonicalizer.js.map +1 -0
- package/build/browser/observable/internal/KnownCacheKey.js.map +1 -1
- package/build/browser/observable/internal/ObservableClientImpl.js +3 -0
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/OrderByCanonicalizer.js +1 -4
- package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/PivotCanonicalizer.js +33 -0
- package/build/browser/observable/internal/PivotCanonicalizer.js.map +1 -0
- package/build/browser/observable/internal/RdpCanonicalizer.js +66 -0
- package/build/browser/observable/internal/RdpCanonicalizer.js.map +1 -0
- package/build/browser/observable/internal/RdpCanonicalizer.test.js +68 -0
- package/build/browser/observable/internal/RdpCanonicalizer.test.js.map +1 -0
- package/build/browser/observable/internal/SimpleWhereClause.js.map +1 -1
- package/build/browser/observable/internal/Store.js +172 -6
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/WhereClauseCanonicalizer.js +1 -1
- package/build/browser/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/actions/ActionApplication.js +1 -1
- package/build/browser/observable/internal/actions/ActionApplication.js.map +1 -1
- package/build/browser/observable/internal/actions/OptimisticJob.js +3 -3
- package/build/browser/observable/internal/actions/OptimisticJob.js.map +1 -1
- package/build/browser/observable/internal/aggregation/AggregationCacheKey.js +22 -0
- package/build/browser/observable/internal/aggregation/AggregationCacheKey.js.map +1 -0
- package/build/browser/observable/internal/aggregation/AggregationQuery.js +77 -0
- package/build/browser/observable/internal/aggregation/AggregationQuery.js.map +1 -0
- package/build/browser/observable/internal/aggregation/AggregationsHelper.js +54 -0
- package/build/browser/observable/internal/aggregation/AggregationsHelper.js.map +1 -0
- package/build/browser/observable/internal/aggregation/ObjectAggregationQuery.js +33 -0
- package/build/browser/observable/internal/aggregation/ObjectAggregationQuery.js.map +1 -0
- package/build/browser/observable/internal/base-list/BaseListQuery.js +145 -5
- package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/browser/observable/internal/base-list/createCollectionConnectable.js +0 -5
- package/build/browser/observable/internal/base-list/createCollectionConnectable.js.map +1 -1
- package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js +26 -13
- package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -1
- package/build/browser/observable/internal/evaluateFilter.js +61 -0
- package/build/browser/observable/internal/evaluateFilter.js.map +1 -0
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js +33 -1
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
- package/build/browser/observable/internal/list/InterfaceListQuery.js +8 -3
- package/build/browser/observable/internal/list/InterfaceListQuery.js.map +1 -1
- package/build/browser/observable/internal/list/ListCacheKey.js +24 -1
- package/build/browser/observable/internal/list/ListCacheKey.js.map +1 -1
- package/build/browser/observable/internal/list/ListQuery.js +35 -62
- package/build/browser/observable/internal/list/ListQuery.js.map +1 -1
- package/build/browser/observable/internal/list/ListQueryOptions.js.map +1 -1
- package/build/browser/observable/internal/list/ListsHelper.js +18 -8
- package/build/browser/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/browser/observable/internal/list/ObjectListQuery.js +51 -3
- package/build/browser/observable/internal/list/ObjectListQuery.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectCacheKey.js +20 -1
- package/build/browser/observable/internal/object/ObjectCacheKey.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectCacheKeyRegistry.js +126 -0
- package/build/browser/observable/internal/object/ObjectCacheKeyRegistry.js.map +1 -0
- package/build/browser/observable/internal/object/ObjectCacheKeyRegistry.test.js +173 -0
- package/build/browser/observable/internal/object/ObjectCacheKeyRegistry.test.js.map +1 -0
- package/build/browser/observable/internal/object/ObjectQuery.js +10 -58
- package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectsHelper.js +65 -5
- package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/browser/observable/internal/objectMatchesWhereClause.js +3 -37
- package/build/browser/observable/internal/objectMatchesWhereClause.js.map +1 -1
- package/build/browser/observable/internal/objectMatchesWhereClause.test.js +2 -1
- package/build/browser/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js +5 -1
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js +3 -0
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetQueryOptions.js.map +1 -1
- package/build/browser/observable/internal/testUtils/invalidateList.js +6 -1
- package/build/browser/observable/internal/testUtils/invalidateList.js.map +1 -1
- package/build/browser/observable/internal/testUtils.js +5 -3
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/observable/internal/types/ObjectUpdate.js +2 -0
- package/build/browser/observable/internal/types/ObjectUpdate.js.map +1 -0
- package/build/browser/observable/internal/utils/rdpFieldOperations.js +83 -0
- package/build/browser/observable/internal/utils/rdpFieldOperations.js.map +1 -0
- 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/internal-node.js +18 -0
- package/build/browser/public/internal-node.js.map +1 -0
- package/build/browser/public/unstable-do-not-use.js.map +1 -1
- package/build/browser/queries/applyQuery.js +5 -4
- package/build/browser/queries/applyQuery.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/extractObjectOrInterfaceType.js +5 -1
- package/build/browser/util/extractObjectOrInterfaceType.js.map +1 -1
- package/build/browser/util/extractObjectOrInterfaceType.test.js +21 -2
- package/build/browser/util/extractObjectOrInterfaceType.test.js.map +1 -1
- package/build/browser/util/toDataValue.js +16 -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-6SCDLAU2.cjs +57 -0
- package/build/cjs/chunk-6SCDLAU2.cjs.map +1 -0
- package/build/cjs/{chunk-SDFKR62Z.cjs → chunk-HJX4D4KL.cjs} +627 -63
- package/build/cjs/chunk-HJX4D4KL.cjs.map +1 -0
- package/build/cjs/{chunk-MEL46GIF.cjs → chunk-RO7XAQOS.cjs} +454 -242
- package/build/cjs/chunk-RO7XAQOS.cjs.map +1 -0
- package/build/cjs/{createClient-BJo8T7Js.d.cts → createClient-mOlFts15.d.cts} +1 -0
- package/build/cjs/{delay-QK4T7RVX.cjs → delay-KIUUJ5NJ.cjs} +4 -3
- package/build/cjs/delay-KIUUJ5NJ.cjs.map +1 -0
- package/build/cjs/index.cjs +24 -8
- package/build/cjs/index.cjs.map +1 -1
- package/build/cjs/index.d.cts +10 -3
- package/build/cjs/public/internal-node.cjs +193767 -0
- package/build/cjs/public/internal-node.cjs.map +1 -0
- package/build/cjs/public/internal-node.d.cts +29 -0
- package/build/cjs/public/internal.cjs +16 -9
- package/build/cjs/public/internal.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.cjs +1736 -868
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +43 -7
- 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 +2 -1
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createClient.test.js +19 -1
- package/build/esm/createClient.test.js.map +1 -1
- package/build/esm/createMinimalClient.js +4 -2
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +19 -1
- 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 +2 -2
- package/build/esm/index.js.map +1 -1
- package/build/esm/internal/conversions/extractNamespace.js +22 -0
- package/build/esm/internal/conversions/extractNamespace.js.map +1 -0
- package/build/esm/internal/conversions/fullyQualifyPropName.js +26 -0
- package/build/esm/internal/conversions/fullyQualifyPropName.js.map +1 -0
- package/build/esm/internal/conversions/makeGeoFilterBbox.js +41 -0
- package/build/esm/internal/conversions/makeGeoFilterBbox.js.map +1 -0
- package/build/esm/internal/conversions/makeGeoFilterIntersects.js +29 -0
- package/build/esm/internal/conversions/makeGeoFilterIntersects.js.map +1 -0
- package/build/esm/internal/conversions/makeGeoFilterPolygon.js +30 -0
- package/build/esm/internal/conversions/makeGeoFilterPolygon.js.map +1 -0
- package/build/esm/internal/conversions/makeGeoFilterWithin.js +48 -0
- package/build/esm/internal/conversions/makeGeoFilterWithin.js.map +1 -0
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js +59 -105
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.test.js +309 -0
- package/build/esm/internal/conversions/modernToLegacyWhereClause.test.js.map +1 -1
- package/build/esm/object/aggregate.js +3 -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/InterfaceHolder.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +5 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +10 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +12 -0
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/object/fetchPage.js +13 -6
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/object/formatting/applyPropertyFormatter.js +58 -0
- package/build/esm/object/formatting/applyPropertyFormatter.js.map +1 -0
- package/build/esm/object/formatting/applyPropertyFormatter.test.js +726 -0
- package/build/esm/object/formatting/applyPropertyFormatter.test.js.map +1 -0
- package/build/esm/object/formatting/formatBoolean.js +23 -0
- package/build/esm/object/formatting/formatBoolean.js.map +1 -0
- package/build/esm/object/formatting/formatDateTime.js +158 -0
- package/build/esm/object/formatting/formatDateTime.js.map +1 -0
- package/build/esm/object/formatting/formatNumber.js +242 -0
- package/build/esm/object/formatting/formatNumber.js.map +1 -0
- package/build/esm/object/formatting/propertyFormattingUtils.js +39 -0
- package/build/esm/object/formatting/propertyFormattingUtils.js.map +1 -0
- package/build/esm/object/mediaUpload.js +3 -0
- package/build/esm/object/mediaUpload.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +17 -0
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +11 -0
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/internal/BulkObjectLoader.js +12 -4
- package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/esm/observable/internal/BulkObjectLoader.test.js +48 -0
- package/build/esm/observable/internal/BulkObjectLoader.test.js.map +1 -1
- package/build/esm/observable/internal/CacheKeys.js +9 -3
- package/build/esm/observable/internal/CacheKeys.js.map +1 -1
- package/build/esm/observable/internal/Canonicalizer.js +51 -0
- package/build/esm/observable/internal/Canonicalizer.js.map +1 -0
- package/build/esm/observable/internal/Changes.js.map +1 -1
- package/build/esm/observable/internal/IntersectCanonicalizer.js +35 -0
- package/build/esm/observable/internal/IntersectCanonicalizer.js.map +1 -0
- package/build/esm/observable/internal/KnownCacheKey.js.map +1 -1
- package/build/esm/observable/internal/ObservableClientImpl.js +3 -0
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/OrderByCanonicalizer.js +1 -4
- package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/PivotCanonicalizer.js +33 -0
- package/build/esm/observable/internal/PivotCanonicalizer.js.map +1 -0
- package/build/esm/observable/internal/RdpCanonicalizer.js +66 -0
- package/build/esm/observable/internal/RdpCanonicalizer.js.map +1 -0
- package/build/esm/observable/internal/RdpCanonicalizer.test.js +68 -0
- package/build/esm/observable/internal/RdpCanonicalizer.test.js.map +1 -0
- package/build/esm/observable/internal/SimpleWhereClause.js.map +1 -1
- package/build/esm/observable/internal/Store.js +172 -6
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/WhereClauseCanonicalizer.js +1 -1
- package/build/esm/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/actions/ActionApplication.js +1 -1
- package/build/esm/observable/internal/actions/ActionApplication.js.map +1 -1
- package/build/esm/observable/internal/actions/OptimisticJob.js +3 -3
- package/build/esm/observable/internal/actions/OptimisticJob.js.map +1 -1
- package/build/esm/observable/internal/aggregation/AggregationCacheKey.js +22 -0
- package/build/esm/observable/internal/aggregation/AggregationCacheKey.js.map +1 -0
- package/build/esm/observable/internal/aggregation/AggregationQuery.js +77 -0
- package/build/esm/observable/internal/aggregation/AggregationQuery.js.map +1 -0
- package/build/esm/observable/internal/aggregation/AggregationsHelper.js +54 -0
- package/build/esm/observable/internal/aggregation/AggregationsHelper.js.map +1 -0
- package/build/esm/observable/internal/aggregation/ObjectAggregationQuery.js +33 -0
- package/build/esm/observable/internal/aggregation/ObjectAggregationQuery.js.map +1 -0
- package/build/esm/observable/internal/base-list/BaseListQuery.js +145 -5
- package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/esm/observable/internal/base-list/createCollectionConnectable.js +0 -5
- package/build/esm/observable/internal/base-list/createCollectionConnectable.js.map +1 -1
- package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js +26 -13
- package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -1
- package/build/esm/observable/internal/evaluateFilter.js +61 -0
- package/build/esm/observable/internal/evaluateFilter.js.map +1 -0
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js +33 -1
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
- package/build/esm/observable/internal/list/InterfaceListQuery.js +8 -3
- package/build/esm/observable/internal/list/InterfaceListQuery.js.map +1 -1
- package/build/esm/observable/internal/list/ListCacheKey.js +24 -1
- package/build/esm/observable/internal/list/ListCacheKey.js.map +1 -1
- package/build/esm/observable/internal/list/ListQuery.js +35 -62
- package/build/esm/observable/internal/list/ListQuery.js.map +1 -1
- package/build/esm/observable/internal/list/ListQueryOptions.js.map +1 -1
- package/build/esm/observable/internal/list/ListsHelper.js +18 -8
- package/build/esm/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/esm/observable/internal/list/ObjectListQuery.js +51 -3
- package/build/esm/observable/internal/list/ObjectListQuery.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectCacheKey.js +20 -1
- package/build/esm/observable/internal/object/ObjectCacheKey.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectCacheKeyRegistry.js +126 -0
- package/build/esm/observable/internal/object/ObjectCacheKeyRegistry.js.map +1 -0
- package/build/esm/observable/internal/object/ObjectCacheKeyRegistry.test.js +173 -0
- package/build/esm/observable/internal/object/ObjectCacheKeyRegistry.test.js.map +1 -0
- package/build/esm/observable/internal/object/ObjectQuery.js +10 -58
- package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectsHelper.js +65 -5
- package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/esm/observable/internal/objectMatchesWhereClause.js +3 -37
- package/build/esm/observable/internal/objectMatchesWhereClause.js.map +1 -1
- package/build/esm/observable/internal/objectMatchesWhereClause.test.js +2 -1
- package/build/esm/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js +5 -1
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js +3 -0
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetQueryOptions.js.map +1 -1
- package/build/esm/observable/internal/testUtils/invalidateList.js +6 -1
- package/build/esm/observable/internal/testUtils/invalidateList.js.map +1 -1
- package/build/esm/observable/internal/testUtils.js +5 -3
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/observable/internal/types/ObjectUpdate.js +2 -0
- package/build/esm/observable/internal/types/ObjectUpdate.js.map +1 -0
- package/build/esm/observable/internal/utils/rdpFieldOperations.js +83 -0
- package/build/esm/observable/internal/utils/rdpFieldOperations.js.map +1 -0
- 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/internal-node.js +18 -0
- package/build/esm/public/internal-node.js.map +1 -0
- package/build/esm/public/unstable-do-not-use.js.map +1 -1
- package/build/esm/queries/applyQuery.js +5 -4
- package/build/esm/queries/applyQuery.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/extractObjectOrInterfaceType.js +5 -1
- package/build/esm/util/extractObjectOrInterfaceType.js.map +1 -1
- package/build/esm/util/extractObjectOrInterfaceType.test.js +21 -2
- package/build/esm/util/extractObjectOrInterfaceType.test.js.map +1 -1
- package/build/esm/util/toDataValue.js +16 -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 +3 -1
- package/build/types/MinimalClientContext.d.ts.map +1 -1
- package/build/types/actions/applyAction.d.ts.map +1 -1
- package/build/types/createClient.d.ts +1 -0
- package/build/types/createClient.d.ts.map +1 -1
- package/build/types/index.d.ts +3 -3
- package/build/types/index.d.ts.map +1 -1
- package/build/types/internal/conversions/extractNamespace.d.ts +1 -0
- package/build/types/internal/conversions/extractNamespace.d.ts.map +1 -0
- package/build/types/internal/conversions/fullyQualifyPropName.d.ts +2 -0
- package/build/types/internal/conversions/fullyQualifyPropName.d.ts.map +1 -0
- package/build/types/internal/conversions/makeGeoFilterBbox.d.ts +3 -0
- package/build/types/internal/conversions/makeGeoFilterBbox.d.ts.map +1 -0
- package/build/types/internal/conversions/makeGeoFilterIntersects.d.ts +3 -0
- package/build/types/internal/conversions/makeGeoFilterIntersects.d.ts.map +1 -0
- package/build/types/internal/conversions/makeGeoFilterPolygon.d.ts +3 -0
- package/build/types/internal/conversions/makeGeoFilterPolygon.d.ts.map +1 -0
- package/build/types/internal/conversions/makeGeoFilterWithin.d.ts +3 -0
- package/build/types/internal/conversions/makeGeoFilterWithin.d.ts.map +1 -0
- package/build/types/internal/conversions/modernToLegacyWhereClause.d.ts +1 -1
- package/build/types/internal/conversions/modernToLegacyWhereClause.d.ts.map +1 -1
- package/build/types/object/fetchPage.d.ts.map +1 -1
- package/build/types/object/formatting/applyPropertyFormatter.d.ts +18 -0
- package/build/types/object/formatting/applyPropertyFormatter.d.ts.map +1 -0
- package/build/types/object/formatting/applyPropertyFormatter.test.d.ts +1 -0
- package/build/types/object/formatting/applyPropertyFormatter.test.d.ts.map +1 -0
- package/build/types/object/formatting/formatBoolean.d.ts +5 -0
- package/build/types/object/formatting/formatBoolean.d.ts.map +1 -0
- package/build/types/object/formatting/formatDateTime.d.ts +6 -0
- package/build/types/object/formatting/formatDateTime.d.ts.map +1 -0
- package/build/types/object/formatting/formatNumber.d.ts +15 -0
- package/build/types/object/formatting/formatNumber.d.ts.map +1 -0
- package/build/types/object/formatting/propertyFormattingUtils.d.ts +10 -0
- package/build/types/object/formatting/propertyFormattingUtils.d.ts.map +1 -0
- package/build/types/object/mediaUpload.d.ts +2 -1
- package/build/types/object/mediaUpload.d.ts.map +1 -1
- package/build/types/observable/ObservableClient.d.ts +60 -5
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -1
- package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
- package/build/types/observable/internal/Canonicalizer.d.ts +37 -0
- package/build/types/observable/internal/Canonicalizer.d.ts.map +1 -0
- package/build/types/observable/internal/Changes.d.ts +4 -3
- package/build/types/observable/internal/Changes.d.ts.map +1 -1
- package/build/types/observable/internal/IntersectCanonicalizer.d.ts +18 -0
- package/build/types/observable/internal/IntersectCanonicalizer.d.ts.map +1 -0
- package/build/types/observable/internal/KnownCacheKey.d.ts +2 -1
- package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/PivotCanonicalizer.d.ts +10 -0
- package/build/types/observable/internal/PivotCanonicalizer.d.ts.map +1 -0
- package/build/types/observable/internal/RdpCanonicalizer.d.ts +8 -0
- package/build/types/observable/internal/RdpCanonicalizer.d.ts.map +1 -0
- package/build/types/observable/internal/RdpCanonicalizer.test.d.ts +1 -0
- package/build/types/observable/internal/RdpCanonicalizer.test.d.ts.map +1 -0
- package/build/types/observable/internal/SimpleWhereClause.d.ts +6 -2
- package/build/types/observable/internal/SimpleWhereClause.d.ts.map +1 -1
- package/build/types/observable/internal/Store.d.ts +10 -0
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts +5 -2
- package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/actions/ActionApplication.d.ts.map +1 -1
- package/build/types/observable/internal/aggregation/AggregationCacheKey.d.ts +12 -0
- package/build/types/observable/internal/aggregation/AggregationCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/aggregation/AggregationQuery.d.ts +49 -0
- package/build/types/observable/internal/aggregation/AggregationQuery.d.ts.map +1 -0
- package/build/types/observable/internal/aggregation/AggregationsHelper.d.ts +37 -0
- package/build/types/observable/internal/aggregation/AggregationsHelper.d.ts.map +1 -0
- package/build/types/observable/internal/aggregation/ObjectAggregationQuery.d.ts +5 -0
- package/build/types/observable/internal/aggregation/ObjectAggregationQuery.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts +48 -2
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts +1 -23
- package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts.map +1 -1
- package/build/types/observable/internal/evaluateFilter.d.ts +6 -0
- package/build/types/observable/internal/evaluateFilter.d.ts.map +1 -0
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +5 -0
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/list/InterfaceListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListCacheKey.d.ts +10 -1
- package/build/types/observable/internal/list/ListCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListQuery.d.ts +12 -15
- package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListQueryOptions.d.ts +9 -1
- package/build/types/observable/internal/list/ListQueryOptions.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListsHelper.d.ts +7 -1
- 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/ObjectCacheKey.d.ts +6 -1
- package/build/types/observable/internal/object/ObjectCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectCacheKeyRegistry.d.ts +60 -0
- package/build/types/observable/internal/object/ObjectCacheKeyRegistry.d.ts.map +1 -0
- package/build/types/observable/internal/object/ObjectCacheKeyRegistry.test.d.ts +1 -0
- package/build/types/observable/internal/object/ObjectCacheKeyRegistry.test.d.ts.map +1 -0
- package/build/types/observable/internal/object/ObjectQuery.d.ts +1 -1
- package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectsHelper.d.ts +15 -1
- package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/objectMatchesWhereClause.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts +2 -1
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetQueryOptions.d.ts +1 -0
- package/build/types/observable/internal/objectset/ObjectSetQueryOptions.d.ts.map +1 -1
- package/build/types/observable/internal/testUtils.d.ts +1 -1
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/build/types/observable/internal/types/ObjectUpdate.d.ts +11 -0
- package/build/types/observable/internal/types/ObjectUpdate.d.ts.map +1 -0
- package/build/types/observable/internal/utils/rdpFieldOperations.d.ts +5 -0
- package/build/types/observable/internal/utils/rdpFieldOperations.d.ts.map +1 -0
- package/build/types/public/internal-node.d.ts +2 -0
- package/build/types/public/internal-node.d.ts.map +1 -0
- package/build/types/public/unstable-do-not-use.d.ts +1 -1
- package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
- package/build/types/queries/applyQuery.d.ts.map +1 -1
- package/internal-node.d.ts +17 -0
- package/package.json +23 -13
- package/build/cjs/chunk-MEL46GIF.cjs.map +0 -1
- package/build/cjs/chunk-Q7SFCCGT.cjs +0 -11
- package/build/cjs/chunk-Q7SFCCGT.cjs.map +0 -1
- package/build/cjs/chunk-SDFKR62Z.cjs.map +0 -1
- package/build/cjs/delay-QK4T7RVX.cjs.map +0 -1
|
@@ -0,0 +1,126 @@
|
|
|
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 { extractRdpFieldNames } from "../utils/rdpFieldOperations.js";
|
|
18
|
+
/**
|
|
19
|
+
* Registry that tracks relationships between object cache keys with different RDP configurations.
|
|
20
|
+
* This ensures we propagate updates across all "variants" of the same object.
|
|
21
|
+
*/
|
|
22
|
+
export class ObjectCacheKeyRegistry {
|
|
23
|
+
/**
|
|
24
|
+
* Map from base key (apiName:primaryKey) to all related cache key variants and metadata
|
|
25
|
+
*/
|
|
26
|
+
baseToVariants = new Map();
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Metadata for each cache key (apiName, primaryKey, rdpConfig)
|
|
30
|
+
*/
|
|
31
|
+
keyMetadata = new WeakMap();
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Register a cache key variant for an object
|
|
35
|
+
*/
|
|
36
|
+
register(cacheKey, apiName, primaryKey, rdpConfig) {
|
|
37
|
+
const baseKey = this.makeBaseKey(apiName, primaryKey);
|
|
38
|
+
const primaryKeyStr = String(primaryKey);
|
|
39
|
+
this.keyMetadata.set(cacheKey, {
|
|
40
|
+
apiName,
|
|
41
|
+
primaryKey: primaryKeyStr,
|
|
42
|
+
rdpConfig,
|
|
43
|
+
rdpFieldSet: rdpConfig ? extractRdpFieldNames(rdpConfig) : undefined
|
|
44
|
+
});
|
|
45
|
+
let entry = this.baseToVariants.get(baseKey);
|
|
46
|
+
if (!entry) {
|
|
47
|
+
entry = {
|
|
48
|
+
variants: new Set(),
|
|
49
|
+
apiName,
|
|
50
|
+
primaryKey: primaryKeyStr
|
|
51
|
+
};
|
|
52
|
+
this.baseToVariants.set(baseKey, entry);
|
|
53
|
+
}
|
|
54
|
+
entry.variants.add(cacheKey);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get all variant cache keys for a specific object
|
|
59
|
+
*/
|
|
60
|
+
getVariants(apiName, primaryKey) {
|
|
61
|
+
const baseKey = this.makeBaseKey(apiName, primaryKey);
|
|
62
|
+
const entry = this.baseToVariants.get(baseKey);
|
|
63
|
+
return new Set(entry?.variants ?? []);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Unregister a cache key when it's being cleaned up
|
|
68
|
+
*/
|
|
69
|
+
unregister(cacheKey) {
|
|
70
|
+
const metadata = this.keyMetadata.get(cacheKey);
|
|
71
|
+
if (!metadata) return;
|
|
72
|
+
const baseKey = this.makeBaseKey(metadata.apiName, metadata.primaryKey);
|
|
73
|
+
const entry = this.baseToVariants.get(baseKey);
|
|
74
|
+
if (entry) {
|
|
75
|
+
entry.variants.delete(cacheKey);
|
|
76
|
+
if (entry.variants.size === 0) {
|
|
77
|
+
this.baseToVariants.delete(baseKey);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
this.keyMetadata.delete(cacheKey);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get metadata for a cache key
|
|
85
|
+
*/
|
|
86
|
+
getMetadata(cacheKey) {
|
|
87
|
+
return this.keyMetadata.get(cacheKey);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Get the count of variants for a specific object
|
|
92
|
+
*/
|
|
93
|
+
getVariantCount(apiName, primaryKey) {
|
|
94
|
+
const baseKey = this.makeBaseKey(apiName, primaryKey);
|
|
95
|
+
return this.baseToVariants.get(baseKey)?.variants.size ?? 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Generate a base key from apiName and primaryKey
|
|
100
|
+
*/
|
|
101
|
+
makeBaseKey(apiName, primaryKey) {
|
|
102
|
+
return `${apiName}:${primaryKey}`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Check if a cache key has RDP configuration
|
|
107
|
+
*/
|
|
108
|
+
hasRdpConfig(cacheKey) {
|
|
109
|
+
return this.keyMetadata.get(cacheKey)?.rdpConfig != null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Get the RDP configuration for a cache key
|
|
114
|
+
*/
|
|
115
|
+
getRdpConfig(cacheKey) {
|
|
116
|
+
return this.keyMetadata.get(cacheKey)?.rdpConfig;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Get the cached RDP field set for a cache key
|
|
121
|
+
*/
|
|
122
|
+
getRdpFieldSet(cacheKey) {
|
|
123
|
+
return this.keyMetadata.get(cacheKey)?.rdpFieldSet ?? new Set();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=ObjectCacheKeyRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectCacheKeyRegistry.js","names":["extractRdpFieldNames","ObjectCacheKeyRegistry","baseToVariants","Map","keyMetadata","WeakMap","register","cacheKey","apiName","primaryKey","rdpConfig","baseKey","makeBaseKey","primaryKeyStr","String","set","rdpFieldSet","undefined","entry","get","variants","Set","add","getVariants","unregister","metadata","delete","size","getMetadata","getVariantCount","hasRdpConfig","getRdpConfig","getRdpFieldSet"],"sources":["ObjectCacheKeyRegistry.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 { Canonical } from \"../Canonical.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { extractRdpFieldNames } from \"../utils/rdpFieldOperations.js\";\nimport type { ObjectCacheKey } from \"./ObjectCacheKey.js\";\n\ninterface CacheKeyMetadata {\n apiName: string;\n primaryKey: string;\n rdpConfig?: Canonical<Rdp>;\n rdpFieldSet?: ReadonlySet<string>;\n}\n\ninterface BaseKeyEntry {\n variants: Set<ObjectCacheKey>;\n apiName: string;\n primaryKey: string;\n}\n\n/**\n * Registry that tracks relationships between object cache keys with different RDP configurations.\n * This ensures we propagate updates across all \"variants\" of the same object.\n */\nexport class ObjectCacheKeyRegistry {\n /**\n * Map from base key (apiName:primaryKey) to all related cache key variants and metadata\n */\n private baseToVariants = new Map<string, BaseKeyEntry>();\n\n /**\n * Metadata for each cache key (apiName, primaryKey, rdpConfig)\n */\n private keyMetadata = new WeakMap<ObjectCacheKey, CacheKeyMetadata>();\n\n /**\n * Register a cache key variant for an object\n */\n register(\n cacheKey: ObjectCacheKey,\n apiName: string,\n primaryKey: string | number | boolean,\n rdpConfig?: Canonical<Rdp>,\n ): void {\n const baseKey = this.makeBaseKey(apiName, primaryKey);\n const primaryKeyStr = String(primaryKey);\n\n this.keyMetadata.set(cacheKey, {\n apiName,\n primaryKey: primaryKeyStr,\n rdpConfig,\n rdpFieldSet: rdpConfig ? extractRdpFieldNames(rdpConfig) : undefined,\n });\n\n let entry = this.baseToVariants.get(baseKey);\n if (!entry) {\n entry = {\n variants: new Set(),\n apiName,\n primaryKey: primaryKeyStr,\n };\n this.baseToVariants.set(baseKey, entry);\n }\n entry.variants.add(cacheKey);\n }\n\n /**\n * Get all variant cache keys for a specific object\n */\n getVariants(\n apiName: string,\n primaryKey: string | number | boolean,\n ): Set<ObjectCacheKey> {\n const baseKey = this.makeBaseKey(apiName, primaryKey);\n const entry = this.baseToVariants.get(baseKey);\n return new Set(entry?.variants ?? []);\n }\n\n /**\n * Unregister a cache key when it's being cleaned up\n */\n unregister(cacheKey: ObjectCacheKey): void {\n const metadata = this.keyMetadata.get(cacheKey);\n if (!metadata) return;\n\n const baseKey = this.makeBaseKey(metadata.apiName, metadata.primaryKey);\n const entry = this.baseToVariants.get(baseKey);\n\n if (entry) {\n entry.variants.delete(cacheKey);\n if (entry.variants.size === 0) {\n this.baseToVariants.delete(baseKey);\n }\n }\n\n this.keyMetadata.delete(cacheKey);\n }\n\n /**\n * Get metadata for a cache key\n */\n getMetadata(cacheKey: ObjectCacheKey): CacheKeyMetadata | undefined {\n return this.keyMetadata.get(cacheKey);\n }\n\n /**\n * Get the count of variants for a specific object\n */\n getVariantCount(\n apiName: string,\n primaryKey: string | number | boolean,\n ): number {\n const baseKey = this.makeBaseKey(apiName, primaryKey);\n return this.baseToVariants.get(baseKey)?.variants.size ?? 0;\n }\n\n /**\n * Generate a base key from apiName and primaryKey\n */\n private makeBaseKey(\n apiName: string,\n primaryKey: string | number | boolean,\n ): string {\n return `${apiName}:${primaryKey}`;\n }\n\n /**\n * Check if a cache key has RDP configuration\n */\n hasRdpConfig(cacheKey: ObjectCacheKey): boolean {\n return this.keyMetadata.get(cacheKey)?.rdpConfig != null;\n }\n\n /**\n * Get the RDP configuration for a cache key\n */\n getRdpConfig(cacheKey: ObjectCacheKey): Canonical<Rdp> | undefined {\n return this.keyMetadata.get(cacheKey)?.rdpConfig;\n }\n\n /**\n * Get the cached RDP field set for a cache key\n */\n getRdpFieldSet(cacheKey: ObjectCacheKey): ReadonlySet<string> {\n return this.keyMetadata.get(cacheKey)?.rdpFieldSet ?? new Set();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,173 @@
|
|
|
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 { describe, expect, it } from "vitest";
|
|
18
|
+
import { ObjectCacheKeyRegistry } from "./ObjectCacheKeyRegistry.js";
|
|
19
|
+
/**
|
|
20
|
+
* Helper function to create mock RDP objects for testing.
|
|
21
|
+
* Creates an RDP config with the specified field names, where each field
|
|
22
|
+
* is a mock Creator function.
|
|
23
|
+
*/
|
|
24
|
+
function createMockRdp(...fields) {
|
|
25
|
+
const rdp = {};
|
|
26
|
+
for (const field of fields) {
|
|
27
|
+
rdp[field] = () => ({});
|
|
28
|
+
}
|
|
29
|
+
return rdp;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Helper function to create a properly typed mock ObjectCacheKey for testing
|
|
34
|
+
*/
|
|
35
|
+
function createMockObjectCacheKey(apiName, pk, rdpConfig) {
|
|
36
|
+
return {
|
|
37
|
+
type: "object",
|
|
38
|
+
otherKeys: [apiName, pk, rdpConfig],
|
|
39
|
+
__cacheKey: {
|
|
40
|
+
value: {},
|
|
41
|
+
query: {},
|
|
42
|
+
args: [apiName, pk, rdpConfig]
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
describe("ObjectCacheKeyRegistry", () => {
|
|
47
|
+
it("registers and retrieves variant cache keys", () => {
|
|
48
|
+
const registry = new ObjectCacheKeyRegistry();
|
|
49
|
+
const mockRdpAddress = createMockRdp("address", "mockType");
|
|
50
|
+
const mockRdpPhone = createMockRdp("phone", "mockType");
|
|
51
|
+
const key1 = createMockObjectCacheKey("Employee", "emp1", undefined);
|
|
52
|
+
const key2 = createMockObjectCacheKey("Employee", "emp1", mockRdpAddress);
|
|
53
|
+
const key3 = createMockObjectCacheKey("Employee", "emp1", mockRdpPhone);
|
|
54
|
+
const unrelatedKey = createMockObjectCacheKey("Employee", "emp2", undefined);
|
|
55
|
+
registry.register(key1, "Employee", "emp1", undefined);
|
|
56
|
+
registry.register(key2, "Employee", "emp1", mockRdpAddress);
|
|
57
|
+
registry.register(key3, "Employee", "emp1", mockRdpPhone);
|
|
58
|
+
registry.register(unrelatedKey, "Employee", "emp2", undefined);
|
|
59
|
+
const variants = registry.getVariants("Employee", "emp1");
|
|
60
|
+
expect(variants.size).toBe(3);
|
|
61
|
+
expect(variants.has(key1)).toBe(true);
|
|
62
|
+
expect(variants.has(key2)).toBe(true);
|
|
63
|
+
expect(variants.has(key3)).toBe(true);
|
|
64
|
+
expect(variants.has(unrelatedKey)).toBe(false);
|
|
65
|
+
|
|
66
|
+
// Unrelated key should have its own set
|
|
67
|
+
const unrelated = registry.getVariants("Employee", "emp2");
|
|
68
|
+
expect(unrelated.size).toBe(1);
|
|
69
|
+
expect(unrelated.has(unrelatedKey)).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
it("handles un-registration correctly", () => {
|
|
72
|
+
const registry = new ObjectCacheKeyRegistry();
|
|
73
|
+
const mockRdp = createMockRdp("address", "mockType");
|
|
74
|
+
const key1 = createMockObjectCacheKey("Employee", "emp1", undefined);
|
|
75
|
+
const key2 = createMockObjectCacheKey("Employee", "emp1", mockRdp);
|
|
76
|
+
registry.register(key1, "Employee", "emp1", undefined);
|
|
77
|
+
registry.register(key2, "Employee", "emp1", mockRdp);
|
|
78
|
+
|
|
79
|
+
// Both keys should be related
|
|
80
|
+
expect(registry.getVariants("Employee", "emp1").size).toBe(2);
|
|
81
|
+
registry.unregister(key1);
|
|
82
|
+
|
|
83
|
+
// key2 should now be alone
|
|
84
|
+
const related = registry.getVariants("Employee", "emp1");
|
|
85
|
+
expect(related.size).toBe(1);
|
|
86
|
+
expect(related.has(key2)).toBe(true);
|
|
87
|
+
expect(related.has(key1)).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
it("getVariants returns all variants for an object", () => {
|
|
90
|
+
const registry = new ObjectCacheKeyRegistry();
|
|
91
|
+
const key1 = createMockObjectCacheKey("Employee", "emp1", undefined);
|
|
92
|
+
const key2 = createMockObjectCacheKey("Employee", "emp1", createMockRdp("address"));
|
|
93
|
+
registry.register(key1, "Employee", "emp1", undefined);
|
|
94
|
+
registry.register(key2, "Employee", "emp1", createMockRdp("address"));
|
|
95
|
+
const variants = registry.getVariants("Employee", "emp1");
|
|
96
|
+
expect(variants.size).toBe(2);
|
|
97
|
+
expect(variants.has(key1)).toBe(true);
|
|
98
|
+
expect(variants.has(key2)).toBe(true);
|
|
99
|
+
|
|
100
|
+
// Non-existent object should return empty set
|
|
101
|
+
const empty = registry.getVariants("Employee", "emp999");
|
|
102
|
+
expect(empty.size).toBe(0);
|
|
103
|
+
});
|
|
104
|
+
it("correctly identifies RDP configuration", () => {
|
|
105
|
+
const registry = new ObjectCacheKeyRegistry();
|
|
106
|
+
const keyWithoutRdp = createMockObjectCacheKey("Employee", "emp1", undefined);
|
|
107
|
+
const keyWithRdp = createMockObjectCacheKey("Employee", "emp1", createMockRdp("address"));
|
|
108
|
+
registry.register(keyWithoutRdp, "Employee", "emp1", undefined);
|
|
109
|
+
registry.register(keyWithRdp, "Employee", "emp1", createMockRdp("address"));
|
|
110
|
+
expect(registry.hasRdpConfig(keyWithoutRdp)).toBe(false);
|
|
111
|
+
expect(registry.hasRdpConfig(keyWithRdp)).toBe(true);
|
|
112
|
+
expect(registry.getRdpConfig(keyWithoutRdp)).toBeUndefined();
|
|
113
|
+
const rdpConfig = registry.getRdpConfig(keyWithRdp);
|
|
114
|
+
expect(rdpConfig).toBeDefined();
|
|
115
|
+
expect(Object.keys(rdpConfig)).toEqual(["address"]);
|
|
116
|
+
expect(typeof rdpConfig.address).toBe("function");
|
|
117
|
+
});
|
|
118
|
+
it("getVariantCount returns correct count of variants", () => {
|
|
119
|
+
const registry = new ObjectCacheKeyRegistry();
|
|
120
|
+
const key1 = createMockObjectCacheKey("Employee", "emp1", undefined);
|
|
121
|
+
const key2 = createMockObjectCacheKey("Employee", "emp1", createMockRdp("address"));
|
|
122
|
+
const key3 = createMockObjectCacheKey("Employee", "emp1", createMockRdp("phone"));
|
|
123
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(0);
|
|
124
|
+
registry.register(key1, "Employee", "emp1", undefined);
|
|
125
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(1);
|
|
126
|
+
registry.register(key2, "Employee", "emp1", createMockRdp("address"));
|
|
127
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(2);
|
|
128
|
+
registry.register(key3, "Employee", "emp1", createMockRdp("phone"));
|
|
129
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(3);
|
|
130
|
+
registry.unregister(key1);
|
|
131
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(2);
|
|
132
|
+
expect(registry.getVariantCount("Employee", "emp999")).toBe(0);
|
|
133
|
+
});
|
|
134
|
+
it("handles registering same key multiple times", () => {
|
|
135
|
+
const registry = new ObjectCacheKeyRegistry();
|
|
136
|
+
const key1 = createMockObjectCacheKey("Employee", "emp1", undefined);
|
|
137
|
+
registry.register(key1, "Employee", "emp1", undefined);
|
|
138
|
+
registry.register(key1, "Employee", "emp1", undefined);
|
|
139
|
+
registry.register(key1, "Employee", "emp1", undefined);
|
|
140
|
+
|
|
141
|
+
// Should still have only one variant despite multiple registrations
|
|
142
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(1);
|
|
143
|
+
registry.unregister(key1);
|
|
144
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(0);
|
|
145
|
+
});
|
|
146
|
+
it("handles unregistering non-existent keys gracefully", () => {
|
|
147
|
+
const registry = new ObjectCacheKeyRegistry();
|
|
148
|
+
const key1 = createMockObjectCacheKey("Employee", "emp1", undefined);
|
|
149
|
+
const key2 = createMockObjectCacheKey("Employee", "emp2", undefined);
|
|
150
|
+
registry.register(key1, "Employee", "emp1", undefined);
|
|
151
|
+
|
|
152
|
+
// Unregistering non-existent key should not throw
|
|
153
|
+
registry.unregister(key2);
|
|
154
|
+
|
|
155
|
+
// key1 should still be registered
|
|
156
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(1);
|
|
157
|
+
});
|
|
158
|
+
it("properly cleans up memory when all variants are unregistered", () => {
|
|
159
|
+
const registry = new ObjectCacheKeyRegistry();
|
|
160
|
+
const key1 = createMockObjectCacheKey("Employee", "emp1", undefined);
|
|
161
|
+
const key2 = createMockObjectCacheKey("Employee", "emp1", createMockRdp("address"));
|
|
162
|
+
registry.register(key1, "Employee", "emp1", undefined);
|
|
163
|
+
registry.register(key2, "Employee", "emp1", createMockRdp("address"));
|
|
164
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(2);
|
|
165
|
+
registry.unregister(key1);
|
|
166
|
+
registry.unregister(key2);
|
|
167
|
+
|
|
168
|
+
// Should return 0 as the entire entry should be cleaned up
|
|
169
|
+
expect(registry.getVariantCount("Employee", "emp1")).toBe(0);
|
|
170
|
+
expect(registry.getVariants("Employee", "emp1").size).toBe(0);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=ObjectCacheKeyRegistry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectCacheKeyRegistry.test.js","names":["describe","expect","it","ObjectCacheKeyRegistry","createMockRdp","fields","rdp","field","createMockObjectCacheKey","apiName","pk","rdpConfig","type","otherKeys","__cacheKey","value","query","args","registry","mockRdpAddress","mockRdpPhone","key1","undefined","key2","key3","unrelatedKey","register","variants","getVariants","size","toBe","has","unrelated","mockRdp","unregister","related","empty","keyWithoutRdp","keyWithRdp","hasRdpConfig","getRdpConfig","toBeUndefined","toBeDefined","Object","keys","toEqual","address","getVariantCount"],"sources":["ObjectCacheKeyRegistry.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n DerivedProperty,\n ObjectOrInterfaceDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { describe, expect, it } from \"vitest\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { ObjectCacheKey } from \"./ObjectCacheKey.js\";\nimport { ObjectCacheKeyRegistry } from \"./ObjectCacheKeyRegistry.js\";\nimport type { ObjectQuery } from \"./ObjectQuery.js\";\n\n/**\n * Helper function to create mock RDP objects for testing.\n * Creates an RDP config with the specified field names, where each field\n * is a mock Creator function.\n */\nfunction createMockRdp(...fields: string[]): Canonical<Rdp> {\n const rdp: Rdp = {};\n for (const field of fields) {\n rdp[field] = () => ({} as DerivedProperty.Definition<\n SimplePropertyDef,\n ObjectOrInterfaceDefinition\n >);\n }\n return rdp as Canonical<Rdp>;\n}\n\n/**\n * Helper function to create a properly typed mock ObjectCacheKey for testing\n */\nfunction createMockObjectCacheKey(\n apiName: string,\n pk: string,\n rdpConfig?: Canonical<Rdp>,\n): ObjectCacheKey {\n return {\n type: \"object\" as const,\n otherKeys: [apiName, pk, rdpConfig],\n __cacheKey: {\n value: {} as ObjectHolder,\n query: {} as ObjectQuery,\n args: [apiName, pk, rdpConfig],\n },\n };\n}\n\ndescribe(\"ObjectCacheKeyRegistry\", () => {\n it(\"registers and retrieves variant cache keys\", () => {\n const registry = new ObjectCacheKeyRegistry();\n\n const mockRdpAddress = createMockRdp(\"address\", \"mockType\");\n const mockRdpPhone = createMockRdp(\"phone\", \"mockType\");\n\n const key1 = createMockObjectCacheKey(\"Employee\", \"emp1\", undefined);\n const key2 = createMockObjectCacheKey(\"Employee\", \"emp1\", mockRdpAddress);\n const key3 = createMockObjectCacheKey(\"Employee\", \"emp1\", mockRdpPhone);\n const unrelatedKey = createMockObjectCacheKey(\n \"Employee\",\n \"emp2\",\n undefined,\n );\n\n registry.register(key1, \"Employee\", \"emp1\", undefined);\n registry.register(key2, \"Employee\", \"emp1\", mockRdpAddress);\n registry.register(key3, \"Employee\", \"emp1\", mockRdpPhone);\n registry.register(unrelatedKey, \"Employee\", \"emp2\", undefined);\n\n const variants = registry.getVariants(\"Employee\", \"emp1\");\n expect(variants.size).toBe(3);\n expect(variants.has(key1)).toBe(true);\n expect(variants.has(key2)).toBe(true);\n expect(variants.has(key3)).toBe(true);\n expect(variants.has(unrelatedKey)).toBe(false);\n\n // Unrelated key should have its own set\n const unrelated = registry.getVariants(\"Employee\", \"emp2\");\n expect(unrelated.size).toBe(1);\n expect(unrelated.has(unrelatedKey)).toBe(true);\n });\n\n it(\"handles un-registration correctly\", () => {\n const registry = new ObjectCacheKeyRegistry();\n\n const mockRdp = createMockRdp(\"address\", \"mockType\");\n const key1 = createMockObjectCacheKey(\"Employee\", \"emp1\", undefined);\n const key2 = createMockObjectCacheKey(\"Employee\", \"emp1\", mockRdp);\n\n registry.register(key1, \"Employee\", \"emp1\", undefined);\n registry.register(key2, \"Employee\", \"emp1\", mockRdp);\n\n // Both keys should be related\n expect(registry.getVariants(\"Employee\", \"emp1\").size).toBe(2);\n\n registry.unregister(key1);\n\n // key2 should now be alone\n const related = registry.getVariants(\"Employee\", \"emp1\");\n expect(related.size).toBe(1);\n expect(related.has(key2)).toBe(true);\n expect(related.has(key1)).toBe(false);\n });\n\n it(\"getVariants returns all variants for an object\", () => {\n const registry = new ObjectCacheKeyRegistry();\n\n const key1 = createMockObjectCacheKey(\"Employee\", \"emp1\", undefined);\n const key2 = createMockObjectCacheKey(\n \"Employee\",\n \"emp1\",\n createMockRdp(\"address\"),\n );\n\n registry.register(key1, \"Employee\", \"emp1\", undefined);\n registry.register(\n key2,\n \"Employee\",\n \"emp1\",\n createMockRdp(\"address\"),\n );\n\n const variants = registry.getVariants(\"Employee\", \"emp1\");\n expect(variants.size).toBe(2);\n expect(variants.has(key1)).toBe(true);\n expect(variants.has(key2)).toBe(true);\n\n // Non-existent object should return empty set\n const empty = registry.getVariants(\"Employee\", \"emp999\");\n expect(empty.size).toBe(0);\n });\n\n it(\"correctly identifies RDP configuration\", () => {\n const registry = new ObjectCacheKeyRegistry();\n\n const keyWithoutRdp = createMockObjectCacheKey(\n \"Employee\",\n \"emp1\",\n undefined,\n );\n const keyWithRdp = createMockObjectCacheKey(\n \"Employee\",\n \"emp1\",\n createMockRdp(\"address\"),\n );\n\n registry.register(keyWithoutRdp, \"Employee\", \"emp1\", undefined);\n registry.register(\n keyWithRdp,\n \"Employee\",\n \"emp1\",\n createMockRdp(\"address\"),\n );\n\n expect(registry.hasRdpConfig(keyWithoutRdp)).toBe(false);\n expect(registry.hasRdpConfig(keyWithRdp)).toBe(true);\n\n expect(registry.getRdpConfig(keyWithoutRdp)).toBeUndefined();\n\n const rdpConfig = registry.getRdpConfig(keyWithRdp);\n expect(rdpConfig).toBeDefined();\n expect(Object.keys(rdpConfig!)).toEqual([\"address\"]);\n expect(typeof rdpConfig!.address).toBe(\"function\");\n });\n\n it(\"getVariantCount returns correct count of variants\", () => {\n const registry = new ObjectCacheKeyRegistry();\n\n const key1 = createMockObjectCacheKey(\"Employee\", \"emp1\", undefined);\n const key2 = createMockObjectCacheKey(\n \"Employee\",\n \"emp1\",\n createMockRdp(\"address\"),\n );\n const key3 = createMockObjectCacheKey(\n \"Employee\",\n \"emp1\",\n createMockRdp(\"phone\"),\n );\n\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(0);\n\n registry.register(key1, \"Employee\", \"emp1\", undefined);\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(1);\n\n registry.register(\n key2,\n \"Employee\",\n \"emp1\",\n createMockRdp(\"address\"),\n );\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(2);\n\n registry.register(\n key3,\n \"Employee\",\n \"emp1\",\n createMockRdp(\"phone\"),\n );\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(3);\n\n registry.unregister(key1);\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(2);\n\n expect(registry.getVariantCount(\"Employee\", \"emp999\")).toBe(0);\n });\n\n it(\"handles registering same key multiple times\", () => {\n const registry = new ObjectCacheKeyRegistry();\n\n const key1 = createMockObjectCacheKey(\"Employee\", \"emp1\", undefined);\n\n registry.register(key1, \"Employee\", \"emp1\", undefined);\n registry.register(key1, \"Employee\", \"emp1\", undefined);\n registry.register(key1, \"Employee\", \"emp1\", undefined);\n\n // Should still have only one variant despite multiple registrations\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(1);\n\n registry.unregister(key1);\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(0);\n });\n\n it(\"handles unregistering non-existent keys gracefully\", () => {\n const registry = new ObjectCacheKeyRegistry();\n\n const key1 = createMockObjectCacheKey(\"Employee\", \"emp1\", undefined);\n const key2 = createMockObjectCacheKey(\"Employee\", \"emp2\", undefined);\n\n registry.register(key1, \"Employee\", \"emp1\", undefined);\n\n // Unregistering non-existent key should not throw\n registry.unregister(key2);\n\n // key1 should still be registered\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(1);\n });\n\n it(\"properly cleans up memory when all variants are unregistered\", () => {\n const registry = new ObjectCacheKeyRegistry();\n\n const key1 = createMockObjectCacheKey(\"Employee\", \"emp1\", undefined);\n const key2 = createMockObjectCacheKey(\n \"Employee\",\n \"emp1\",\n createMockRdp(\"address\"),\n );\n\n registry.register(key1, \"Employee\", \"emp1\", undefined);\n registry.register(\n key2,\n \"Employee\",\n \"emp1\",\n createMockRdp(\"address\"),\n );\n\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(2);\n\n registry.unregister(key1);\n registry.unregister(key2);\n\n // Should return 0 as the entire entry should be cleaned up\n expect(registry.getVariantCount(\"Employee\", \"emp1\")).toBe(0);\n expect(registry.getVariants(\"Employee\", \"emp1\").size).toBe(0);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import deepEqual from "fast-deep-equal";
|
|
18
17
|
import { BehaviorSubject, connectable, map } from "rxjs";
|
|
19
18
|
import { additionalContext } from "../../../Client.js";
|
|
20
19
|
import { getBulkObjectLoader } from "../BulkObjectLoader.js";
|
|
21
20
|
import { Query } from "../Query.js";
|
|
22
21
|
import { tombstone } from "../tombstone.js";
|
|
22
|
+
import { RDP_CONFIG_IDX } from "./ObjectCacheKey.js";
|
|
23
23
|
export class ObjectQuery extends Query {
|
|
24
24
|
#apiName;
|
|
25
25
|
#pk;
|
|
@@ -64,65 +64,17 @@ export class ObjectQuery extends Query {
|
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
66
|
writeToStore(data, status, batch) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
}
|
|
79
|
-
if (process.env.NODE_ENV !== "production") {
|
|
80
|
-
this.logger?.child({
|
|
81
|
-
methodName: "writeToStore"
|
|
82
|
-
}).debug(`Object was deep equal, just setting status (old status: ${entry.status}, new status: ${status})`);
|
|
83
|
-
}
|
|
84
|
-
// must do a "full write" here so that the lastUpdated is updated but we
|
|
85
|
-
// don't want to retrigger anyone's memoization on the value!
|
|
86
|
-
return batch.write(this.cacheKey, entry.value, status);
|
|
87
|
-
}
|
|
88
|
-
if (process.env.NODE_ENV !== "production") {
|
|
89
|
-
this.logger?.child({
|
|
90
|
-
methodName: "writeToStore"
|
|
91
|
-
}).debug(JSON.stringify({
|
|
92
|
-
status
|
|
93
|
-
}), data);
|
|
94
|
-
}
|
|
95
|
-
const ret = batch.write(this.cacheKey, data, status);
|
|
96
|
-
batch.changes.registerObject(this.cacheKey, data, /* isNew */!entry);
|
|
97
|
-
return ret;
|
|
67
|
+
batch.read(this.cacheKey);
|
|
68
|
+
const rdpConfig = this.cacheKey.otherKeys[RDP_CONFIG_IDX];
|
|
69
|
+
this.store.objectCacheKeyRegistry.register(this.cacheKey, this.#apiName, this.#pk, rdpConfig);
|
|
70
|
+
this.store.objects.propagateWrite(this.cacheKey, data, status, batch);
|
|
71
|
+
return batch.read(this.cacheKey);
|
|
98
72
|
}
|
|
99
73
|
deleteFromStore(status, batch) {
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
methodName: "deleteFromStore"
|
|
105
|
-
}).debug(`Object was deep equal, just setting status`);
|
|
106
|
-
}
|
|
107
|
-
// must do a "full write" here so that the lastUpdated is updated but we
|
|
108
|
-
// don't want to retrigger anyone's memoization on the value!
|
|
109
|
-
return batch.write(this.cacheKey, entry.value, status);
|
|
110
|
-
}
|
|
111
|
-
if (process.env.NODE_ENV !== "production") {
|
|
112
|
-
this.logger?.child({
|
|
113
|
-
methodName: "deleteFromStore"
|
|
114
|
-
}).debug(JSON.stringify({
|
|
115
|
-
status
|
|
116
|
-
}));
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// if there is no entry then there is nothing to do
|
|
120
|
-
if (!entry || !entry.value) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
const ret = batch.delete(this.cacheKey, status);
|
|
124
|
-
batch.changes.deleteObject(this.cacheKey);
|
|
125
|
-
return ret;
|
|
74
|
+
const rdpConfig = this.cacheKey.otherKeys[RDP_CONFIG_IDX];
|
|
75
|
+
this.store.objectCacheKeyRegistry.register(this.cacheKey, this.#apiName, this.#pk, rdpConfig);
|
|
76
|
+
this.store.objects.propagateWrite(this.cacheKey, tombstone, status, batch);
|
|
77
|
+
return batch.read(this.cacheKey);
|
|
126
78
|
}
|
|
127
79
|
invalidateObjectType = (objectType, changes) => {
|
|
128
80
|
if (this.#apiName === objectType) {
|
|
@@ -1 +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":[]}
|
|
1
|
+
{"version":3,"file":"ObjectQuery.js","names":["BehaviorSubject","connectable","map","additionalContext","getBulkObjectLoader","Query","tombstone","RDP_CONFIG_IDX","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","read","rdpConfig","objectCacheKeyRegistry","register","objects","propagateWrite","deleteFromStore","invalidateObjectType","objectType","changes","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 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, RDP_CONFIG_IDX } 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 const rdpConfig = this.cacheKey.otherKeys[RDP_CONFIG_IDX];\n\n this.store.objectCacheKeyRegistry.register(\n this.cacheKey,\n this.#apiName,\n this.#pk,\n rdpConfig,\n );\n\n this.store.objects.propagateWrite(this.cacheKey, data, status, batch);\n\n return batch.read(this.cacheKey)!;\n }\n\n deleteFromStore(\n status: Status,\n batch: BatchContext,\n ): Entry<ObjectCacheKey> | undefined {\n const rdpConfig = this.cacheKey.otherKeys[RDP_CONFIG_IDX];\n\n this.store.objectCacheKeyRegistry.register(\n this.cacheKey,\n this.#apiName,\n this.#pk,\n rdpConfig,\n );\n\n this.store.objects.propagateWrite(\n this.cacheKey,\n tombstone,\n status,\n batch,\n );\n\n return batch.read(this.cacheKey);\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":[]}
|
|
@@ -14,18 +14,21 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import deepEqual from "fast-deep-equal";
|
|
17
18
|
import { AbstractHelper } from "../AbstractHelper.js";
|
|
19
|
+
import { tombstone } from "../tombstone.js";
|
|
20
|
+
import { mergeObjectFields } from "../utils/rdpFieldOperations.js";
|
|
18
21
|
import { ObjectQuery } from "./ObjectQuery.js";
|
|
19
22
|
export class ObjectsHelper extends AbstractHelper {
|
|
20
23
|
observe(options, subFn) {
|
|
21
24
|
return super.observe(options, subFn);
|
|
22
25
|
}
|
|
23
|
-
getQuery(options) {
|
|
26
|
+
getQuery(options, rdpConfig) {
|
|
24
27
|
const apiName = typeof options.apiName === "string" ? options.apiName : options.apiName.apiName;
|
|
25
28
|
const {
|
|
26
29
|
pk
|
|
27
30
|
} = options;
|
|
28
|
-
const objectCacheKey = this.cacheKeys.get("object", apiName, pk);
|
|
31
|
+
const objectCacheKey = this.cacheKeys.get("object", apiName, pk, rdpConfig ?? undefined);
|
|
29
32
|
return this.store.queries.get(objectCacheKey, () => new ObjectQuery(this.store, this.store.subjects.get(objectCacheKey), apiName, pk, objectCacheKey, {
|
|
30
33
|
dedupeInterval: 0
|
|
31
34
|
}));
|
|
@@ -33,16 +36,73 @@ export class ObjectsHelper extends AbstractHelper {
|
|
|
33
36
|
|
|
34
37
|
/**
|
|
35
38
|
* Internal helper method for writing objects to the store and returning their
|
|
36
|
-
* object keys
|
|
39
|
+
* object keys. For list queries with RDPs, the rdpConfig is included in the
|
|
40
|
+
* cache key to ensure proper data isolation.
|
|
37
41
|
* @internal
|
|
38
42
|
*/
|
|
39
|
-
storeOsdkInstances(values, batch) {
|
|
43
|
+
storeOsdkInstances(values, batch, rdpConfig) {
|
|
40
44
|
// update the cache for any object that has changed
|
|
41
45
|
// and save the mapped values to return
|
|
42
46
|
return values.map(v => this.getQuery({
|
|
43
47
|
apiName: v.$apiName,
|
|
44
48
|
pk: v.$primaryKey
|
|
45
|
-
}).writeToStore(v, "loaded", batch).cacheKey);
|
|
49
|
+
}, rdpConfig).writeToStore(v, "loaded", batch).cacheKey);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Write an object to cache and propagate to all related cache keys
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
propagateWrite(sourceCacheKey, value, status, batch) {
|
|
57
|
+
const existing = batch.read(sourceCacheKey);
|
|
58
|
+
const dataChanged = !existing || existing.value === undefined || value === tombstone || !deepEqual(existing.value, value);
|
|
59
|
+
const statusChanged = !existing || existing.status !== status;
|
|
60
|
+
if (!dataChanged && !statusChanged) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const valueToWrite = !dataChanged && existing ? existing.value : value;
|
|
64
|
+
batch.write(sourceCacheKey, valueToWrite, status);
|
|
65
|
+
if (value !== tombstone) {
|
|
66
|
+
batch.changes.registerObject(sourceCacheKey, value, !existing);
|
|
67
|
+
}
|
|
68
|
+
const metadata = this.store.objectCacheKeyRegistry.getMetadata(sourceCacheKey);
|
|
69
|
+
const relatedKeys = metadata ? this.store.objectCacheKeyRegistry.getVariants(metadata.apiName, metadata.primaryKey) : new Set([sourceCacheKey]);
|
|
70
|
+
for (const targetKey of relatedKeys) {
|
|
71
|
+
if (targetKey === sourceCacheKey || !this.isKeyActive(targetKey)) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (value === tombstone) {
|
|
75
|
+
batch.write(targetKey, tombstone, status);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const targetCurrentValue = batch.read(targetKey)?.value;
|
|
79
|
+
const merged = this.mergeForTarget(value, targetCurrentValue && this.isObjectHolder(targetCurrentValue) ? targetCurrentValue : undefined, sourceCacheKey, targetKey);
|
|
80
|
+
batch.write(targetKey, merged, status);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Check if a cache key is actively observed
|
|
86
|
+
*/
|
|
87
|
+
isKeyActive(key) {
|
|
88
|
+
const subject = this.store.subjects.peek(key);
|
|
89
|
+
return subject?.observed === true;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Type guard to check if a value is an ObjectHolder
|
|
94
|
+
*/
|
|
95
|
+
isObjectHolder(value) {
|
|
96
|
+
return value != null && typeof value === "object" && "$apiName" in value && "$primaryKey" in value;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Merge object data for a specific target cache key, preserving RDP fields
|
|
101
|
+
*/
|
|
102
|
+
mergeForTarget(sourceValue, targetCurrentValue, sourceCacheKey, targetCacheKey) {
|
|
103
|
+
const sourceRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(sourceCacheKey);
|
|
104
|
+
const targetRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(targetCacheKey);
|
|
105
|
+
return mergeObjectFields(sourceValue, sourceRdpFields, targetRdpFields, targetCurrentValue);
|
|
46
106
|
}
|
|
47
107
|
}
|
|
48
108
|
//# sourceMappingURL=ObjectsHelper.js.map
|