@osdk/client 2.8.0-beta.26 → 2.8.0-beta.28
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 +29 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +1 -17
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/browser/object/SimpleOsdkProperties.js.map +1 -1
- package/build/browser/observable/ObservableClient/MediaObservableTypes.js +2 -0
- package/build/browser/observable/ObservableClient/MediaObservableTypes.js.map +1 -0
- package/build/browser/observable/ObservableClient/MediaTypes.js +2 -0
- package/build/browser/observable/ObservableClient/MediaTypes.js.map +1 -0
- package/build/browser/observable/internal/Changes.js.map +1 -1
- package/build/browser/observable/internal/GenericCanonicalizer.js +72 -0
- package/build/browser/observable/internal/GenericCanonicalizer.js.map +1 -0
- package/build/browser/observable/internal/IntersectCanonicalizer.js +1 -1
- package/build/browser/observable/internal/IntersectCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/KnownCacheKey.js.map +1 -1
- package/build/browser/observable/internal/ListQueryView.js +21 -9
- package/build/browser/observable/internal/ListQueryView.js.map +1 -1
- package/build/browser/observable/internal/ObjectSetArrayCanonicalizer.js +34 -0
- package/build/browser/observable/internal/ObjectSetArrayCanonicalizer.js.map +1 -0
- package/build/browser/observable/internal/Store.js +26 -2
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/list/ListQuery.js +0 -9
- package/build/browser/observable/internal/list/ListQuery.js.map +1 -1
- package/build/browser/observable/internal/media/BlobMemoryManager.js +116 -0
- package/build/browser/observable/internal/media/BlobMemoryManager.js.map +1 -0
- package/build/browser/observable/internal/media/MediaMetadataCacheKey.js +2 -0
- package/build/browser/observable/internal/media/MediaMetadataCacheKey.js.map +1 -0
- package/build/browser/observable/internal/media/MediaMetadataQuery.js +159 -0
- package/build/browser/observable/internal/media/MediaMetadataQuery.js.map +1 -0
- package/build/browser/observable/internal/media/getMediaCacheKey.js +28 -0
- package/build/browser/observable/internal/media/getMediaCacheKey.js.map +1 -0
- package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js +5 -4
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js +180 -27
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
- package/build/browser/util/UserAgent.js +2 -2
- package/build/cjs/{chunk-YKQ5QTEF.cjs → chunk-66XI45ES.cjs} +39 -39
- package/build/cjs/{chunk-YKQ5QTEF.cjs.map → chunk-66XI45ES.cjs.map} +1 -1
- package/build/cjs/{chunk-BWOPPEUP.cjs → chunk-SV4AIIV4.cjs} +2 -19
- package/build/cjs/chunk-SV4AIIV4.cjs.map +1 -0
- package/build/cjs/index.cjs +10 -10
- package/build/cjs/public/internal.cjs +8 -8
- package/build/cjs/public/unstable-do-not-use.cjs +353 -111
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +1 -17
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/esm/object/SimpleOsdkProperties.js.map +1 -1
- package/build/esm/observable/ObservableClient/MediaObservableTypes.js +2 -0
- package/build/esm/observable/ObservableClient/MediaObservableTypes.js.map +1 -0
- package/build/esm/observable/ObservableClient/MediaTypes.js +2 -0
- package/build/esm/observable/ObservableClient/MediaTypes.js.map +1 -0
- package/build/esm/observable/internal/Changes.js.map +1 -1
- package/build/esm/observable/internal/GenericCanonicalizer.js +72 -0
- package/build/esm/observable/internal/GenericCanonicalizer.js.map +1 -0
- package/build/esm/observable/internal/IntersectCanonicalizer.js +1 -1
- package/build/esm/observable/internal/IntersectCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/KnownCacheKey.js.map +1 -1
- package/build/esm/observable/internal/ListQueryView.js +21 -9
- package/build/esm/observable/internal/ListQueryView.js.map +1 -1
- package/build/esm/observable/internal/ObjectSetArrayCanonicalizer.js +34 -0
- package/build/esm/observable/internal/ObjectSetArrayCanonicalizer.js.map +1 -0
- package/build/esm/observable/internal/Store.js +26 -2
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/list/ListQuery.js +0 -9
- package/build/esm/observable/internal/list/ListQuery.js.map +1 -1
- package/build/esm/observable/internal/media/BlobMemoryManager.js +116 -0
- package/build/esm/observable/internal/media/BlobMemoryManager.js.map +1 -0
- package/build/esm/observable/internal/media/MediaMetadataCacheKey.js +2 -0
- package/build/esm/observable/internal/media/MediaMetadataCacheKey.js.map +1 -0
- package/build/esm/observable/internal/media/MediaMetadataQuery.js +159 -0
- package/build/esm/observable/internal/media/MediaMetadataQuery.js.map +1 -0
- package/build/esm/observable/internal/media/getMediaCacheKey.js +28 -0
- package/build/esm/observable/internal/media/getMediaCacheKey.js.map +1 -0
- package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js +5 -4
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js +180 -27
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
- package/build/esm/util/UserAgent.js +2 -2
- package/build/types/observable/ObservableClient/MediaObservableTypes.d.ts +35 -0
- package/build/types/observable/ObservableClient/MediaObservableTypes.d.ts.map +1 -0
- package/build/types/observable/ObservableClient/MediaTypes.d.ts +1 -0
- package/build/types/observable/ObservableClient/MediaTypes.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/GenericCanonicalizer.d.ts +8 -0
- package/build/types/observable/internal/GenericCanonicalizer.d.ts.map +1 -0
- package/build/types/observable/internal/IntersectCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/KnownCacheKey.d.ts +2 -1
- package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/ListQueryView.d.ts.map +1 -1
- package/build/types/observable/internal/ObjectSetArrayCanonicalizer.d.ts +7 -0
- package/build/types/observable/internal/ObjectSetArrayCanonicalizer.d.ts.map +1 -0
- package/build/types/observable/internal/Store.d.ts +4 -0
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/media/BlobMemoryManager.d.ts +10 -0
- package/build/types/observable/internal/media/BlobMemoryManager.d.ts.map +1 -0
- package/build/types/observable/internal/media/MediaMetadataCacheKey.d.ts +4 -0
- package/build/types/observable/internal/media/MediaMetadataCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/media/MediaMetadataQuery.d.ts +23 -0
- package/build/types/observable/internal/media/MediaMetadataQuery.d.ts.map +1 -0
- package/build/types/observable/internal/media/getMediaCacheKey.d.ts +2 -0
- package/build/types/observable/internal/media/getMediaCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts +3 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts +4 -1
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts.map +1 -1
- package/package.json +9 -9
- package/build/cjs/chunk-BWOPPEUP.cjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# @osdk/client
|
|
2
2
|
|
|
3
|
+
## 2.8.0-beta.28
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- f294f5a: Remove literal support before GA.
|
|
8
|
+
- 2855223: fix autoFetchMore not working when another subscriber creates the shared query first
|
|
9
|
+
- d284bf2: add media types, caching, and metadata query
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [f294f5a]
|
|
14
|
+
- Updated dependencies [d284bf2]
|
|
15
|
+
- Updated dependencies [b68cebd]
|
|
16
|
+
- @osdk/api@2.8.0-beta.28
|
|
17
|
+
- @osdk/client.unstable@2.8.0-beta.28
|
|
18
|
+
- @osdk/generator-converters@2.8.0-beta.28
|
|
19
|
+
|
|
20
|
+
## 2.8.0-beta.27
|
|
21
|
+
|
|
22
|
+
### Minor Changes
|
|
23
|
+
|
|
24
|
+
- fceb4ce: Fix canonicalization for order-independent where clauses and orderBy keys, add ObjectSetArrayCanonicalizer for set operations, improve ObjectSetQuery with in-memory updates and deletion handling
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- @osdk/api@2.8.0-beta.27
|
|
29
|
+
- @osdk/client.unstable@2.8.0-beta.27
|
|
30
|
+
- @osdk/generator-converters@2.8.0-beta.27
|
|
31
|
+
|
|
3
32
|
## 2.8.0-beta.26
|
|
4
33
|
|
|
5
34
|
### Minor Changes
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import invariant from "tiny-invariant";
|
|
18
18
|
import { modernToLegacyWhereClause } from "../internal/conversions/modernToLegacyWhereClause.js";
|
|
19
19
|
import { derivedPropertyDefinitionFactory } from "./derivedPropertyDefinitionFactory.js";
|
|
20
|
+
|
|
20
21
|
/** @internal */
|
|
21
22
|
export function createWithPropertiesObjectSet(objectType, objectSet, definitionMap, fromBaseObjectSet = false) {
|
|
22
23
|
return {
|
|
@@ -107,23 +108,6 @@ export function createWithPropertiesObjectSet(objectType, objectSet, definitionM
|
|
|
107
108
|
const selectorResult = derivedPropertyDefinitionFactory(wrappedObjectSet, definitionMap);
|
|
108
109
|
definitionMap.set(selectorResult, wrappedObjectSet);
|
|
109
110
|
return selectorResult;
|
|
110
|
-
},
|
|
111
|
-
constant: {
|
|
112
|
-
double: () => {
|
|
113
|
-
process.env.NODE_ENV !== "production" ? invariant(false, "Not supported") : invariant(false);
|
|
114
|
-
},
|
|
115
|
-
integer: () => {
|
|
116
|
-
process.env.NODE_ENV !== "production" ? invariant(false, "Not supported") : invariant(false);
|
|
117
|
-
},
|
|
118
|
-
long: () => {
|
|
119
|
-
process.env.NODE_ENV !== "production" ? invariant(false, "Not supported") : invariant(false);
|
|
120
|
-
},
|
|
121
|
-
datetime: () => {
|
|
122
|
-
process.env.NODE_ENV !== "production" ? invariant(false, "Not supported") : invariant(false);
|
|
123
|
-
},
|
|
124
|
-
timestamp: () => {
|
|
125
|
-
process.env.NODE_ENV !== "production" ? invariant(false, "Not supported") : invariant(false);
|
|
126
|
-
}
|
|
127
111
|
}
|
|
128
112
|
};
|
|
129
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createWithPropertiesObjectSet.js","names":["invariant","modernToLegacyWhereClause","derivedPropertyDefinitionFactory","createWithPropertiesObjectSet","objectType","objectSet","definitionMap","fromBaseObjectSet","pivotTo","link","type","where","clause","rdpNames","Set","keys","aggregate","aggregation","opt","splitAggregation","split","length","process","env","NODE_ENV","aggregationPropertyName","aggregationOperation","aggregationOperationDefinition","selectedPropertyApiName","approximatePercentile","percentile","limit","undefined","wrappedObjectSet","operation","selectorResult","set","selectProperty","name","apiName"
|
|
1
|
+
{"version":3,"file":"createWithPropertiesObjectSet.js","names":["invariant","modernToLegacyWhereClause","derivedPropertyDefinitionFactory","createWithPropertiesObjectSet","objectType","objectSet","definitionMap","fromBaseObjectSet","pivotTo","link","type","where","clause","rdpNames","Set","keys","aggregate","aggregation","opt","splitAggregation","split","length","process","env","NODE_ENV","aggregationPropertyName","aggregationOperation","aggregationOperationDefinition","selectedPropertyApiName","approximatePercentile","percentile","limit","undefined","wrappedObjectSet","operation","selectorResult","set","selectProperty","name","apiName"],"sources":["createWithPropertiesObjectSet.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { DerivedProperty, ObjectOrInterfaceDefinition } from \"@osdk/api\";\nimport type {\n DerivedPropertyDefinition,\n ObjectSet as WireObjectSet,\n SelectedPropertyOperation,\n} from \"@osdk/foundry.ontologies\";\nimport invariant from \"tiny-invariant\";\nimport { modernToLegacyWhereClause } from \"../internal/conversions/modernToLegacyWhereClause.js\";\nimport { derivedPropertyDefinitionFactory } from \"./derivedPropertyDefinitionFactory.js\";\n\n/** @internal */\nexport function createWithPropertiesObjectSet<\n Q extends ObjectOrInterfaceDefinition,\n>(\n objectType: Q,\n objectSet: WireObjectSet,\n definitionMap: Map<any, DerivedPropertyDefinition>,\n fromBaseObjectSet: boolean = false,\n): DerivedProperty.SelectPropertyBuilder<Q, false> {\n return {\n pivotTo: (link) => {\n return createWithPropertiesObjectSet(objectType, {\n type: \"searchAround\",\n objectSet,\n link,\n }, definitionMap);\n },\n where: (clause) => {\n const rdpNames = new Set(definitionMap.keys());\n return createWithPropertiesObjectSet(objectType, {\n type: \"filter\",\n objectSet: objectSet,\n where: modernToLegacyWhereClause(clause, objectType, rdpNames),\n }, definitionMap);\n },\n aggregate: (aggregation: string, opt: any) => {\n const splitAggregation = aggregation.split(\":\");\n invariant(\n splitAggregation.length === 2 || splitAggregation[0] === \"$count\",\n \"Invalid aggregation format\",\n );\n const [aggregationPropertyName, aggregationOperation] = splitAggregation;\n let aggregationOperationDefinition: SelectedPropertyOperation;\n switch (aggregationOperation) {\n case \"sum\":\n case \"avg\":\n case \"min\":\n case \"max\":\n case \"exactDistinct\":\n case \"approximateDistinct\":\n aggregationOperationDefinition = {\n type: aggregationOperation,\n selectedPropertyApiName: aggregationPropertyName,\n };\n break;\n case \"approximatePercentile\":\n aggregationOperationDefinition = {\n type: \"approximatePercentile\",\n selectedPropertyApiName: aggregationPropertyName,\n approximatePercentile: opt?.percentile ?? .5,\n };\n break;\n case \"collectSet\":\n case \"collectList\":\n aggregationOperationDefinition = {\n type: aggregationOperation,\n selectedPropertyApiName: aggregationPropertyName,\n limit: opt?.limit ?? 100,\n };\n break;\n case undefined:\n if (aggregationPropertyName === \"$count\") {\n aggregationOperationDefinition = {\n type: \"count\",\n };\n break;\n }\n default:\n invariant(\n false,\n \"Invalid aggregation operation \" + aggregationOperation,\n );\n }\n const wrappedObjectSet: DerivedPropertyDefinition = {\n type: \"selection\",\n objectSet: objectSet,\n operation: aggregationOperationDefinition,\n };\n const selectorResult: DerivedProperty.Definition<any, any> =\n derivedPropertyDefinitionFactory(wrappedObjectSet, definitionMap);\n definitionMap.set(selectorResult, wrappedObjectSet);\n return selectorResult as any;\n },\n selectProperty: (name) => {\n if (fromBaseObjectSet) {\n const wrappedObjectSet: DerivedPropertyDefinition = {\n type: \"property\",\n apiName: name,\n };\n const selectorResult: DerivedProperty.Definition<any, any> =\n derivedPropertyDefinitionFactory(wrappedObjectSet, definitionMap);\n definitionMap.set(selectorResult, wrappedObjectSet);\n return selectorResult as any;\n }\n const wrappedObjectSet: DerivedPropertyDefinition = {\n type: \"selection\",\n objectSet: objectSet,\n operation: {\n type: \"get\",\n selectedPropertyApiName: name,\n },\n };\n const selectorResult: DerivedProperty.Definition<any, any> =\n derivedPropertyDefinitionFactory(wrappedObjectSet, definitionMap);\n definitionMap.set(selectorResult, wrappedObjectSet);\n return selectorResult as any;\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimpleOsdkProperties.js","names":[],"sources":["SimpleOsdkProperties.ts"],"sourcesContent":["/*\n * Copyright 2023 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\n/**\n * Represents a \"pure\" object from the wire that has its special properties with\n * $ prefix and is ready to be converted to an Osdk object.\n *\n * This object intentionally does not have any generics attached to keep it simple\n * to use.\n *\n * @internal\n */\nexport interface SimpleOsdkProperties {\n $apiName: string;\n $objectType: string;\n $primaryKey: string | number
|
|
1
|
+
{"version":3,"file":"SimpleOsdkProperties.js","names":[],"sources":["SimpleOsdkProperties.ts"],"sourcesContent":["/*\n * Copyright 2023 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\n/**\n * Represents a \"pure\" object from the wire that has its special properties with\n * $ prefix and is ready to be converted to an Osdk object.\n *\n * This object intentionally does not have any generics attached to keep it simple\n * to use.\n *\n * @internal\n */\nexport interface SimpleOsdkProperties {\n $apiName: string;\n $objectType: string;\n $primaryKey: string | number;\n $title: string | undefined;\n $rid?: string;\n\n [key: string]:\n | string\n | Array<string>\n | number\n | Array<number>\n | boolean\n | Array<boolean>\n | undefined;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaObservableTypes.js","names":[],"sources":["MediaObservableTypes.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 { MediaMetadata } from \"@osdk/api\";\nimport type { Status } from \"./common.js\";\n\nexport interface MediaMetadataPayload {\n metadata: MediaMetadata | undefined;\n status: Status;\n lastUpdated: number;\n isOptimistic: boolean;\n}\n\nexport interface MediaMetadataObserveOptions {\n mode?: \"offline\" | \"force\";\n dedupeInterval?: number;\n preview?: boolean;\n}\n\nexport interface MediaContentPayload {\n metadata: MediaMetadata | undefined;\n content: Blob | undefined;\n url: string | undefined;\n previewUrl: string | undefined;\n dimensions: { width: number; height: number } | undefined;\n status: Status;\n isStale: boolean;\n isPreview: boolean;\n lastUpdated: number;\n error: Error | undefined;\n}\n\nexport interface MediaContentObserveOptions {\n dedupeInterval?: number;\n preview?: boolean;\n placeholder?: \"preview\" | \"none\";\n priority?: \"high\" | \"low\";\n staleTime?: number;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaTypes.js","names":[],"sources":["MediaTypes.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\nexport type { MediaPropertyLocation } from \"@osdk/api\";\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Changes.js","names":["DEBUG_ONLY__cacheKeyToString","MultiMap","Changes","modifiedObjects","addedObjects","added","Set","modified","deleted","registerObject","cacheKey","data","isNew","set","$objectType","$apiName","add","deleteObject","registerList","key","registerLink","deleteLink","registerObjectSet","registerFunction","isEmpty","size","createChangedObjects","DEBUG_ONLY__changesToString","changes","process","env","NODE_ENV","JSON","stringify","multimapHelper","listHelper","Error","Array","from","map","multimap","Object","fromEntries","associations","type","objects","o","$primaryKey"],"sources":["Changes.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 { ObjectHolder } from \"../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { AggregationCacheKey } from \"./aggregation/AggregationCacheKey.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { DEBUG_ONLY__cacheKeyToString } from \"./CacheKey.js\";\nimport { MultiMap } from \"./collections/MultiMap.js\";\nimport type { FunctionCacheKey } from \"./function/FunctionCacheKey.js\";\nimport type { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./list/ListCacheKey.js\";\nimport type { ObjectCacheKey } from \"./object/ObjectCacheKey.js\";\nimport type { ObjectSetCacheKey } from \"./objectset/ObjectSetCacheKey.js\";\n\nexport class Changes {\n modifiedObjects: MultiMap<string, ObjectHolder> = new MultiMap();\n addedObjects: MultiMap<string, ObjectHolder> = new MultiMap();\n\n added: Set<\n | AggregationCacheKey\n | FunctionCacheKey\n | ListCacheKey\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ObjectSetCacheKey\n > = new Set();\n modified: Set<\n | AggregationCacheKey\n | FunctionCacheKey\n | ListCacheKey\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ObjectSetCacheKey\n > = new Set();\n deleted: Set<\n | AggregationCacheKey\n | FunctionCacheKey\n | ListCacheKey\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ObjectSetCacheKey\n > = new Set();\n\n registerObject = (\n cacheKey: ObjectCacheKey,\n data: ObjectHolder,\n isNew: boolean,\n ): void => {\n this[isNew ? \"addedObjects\" : \"modifiedObjects\"].set(\n data.$objectType ?? data.$apiName,\n data,\n );\n this[isNew ? \"added\" : \"modified\"].add(cacheKey);\n };\n\n deleteObject = (cacheKey: ObjectCacheKey): void => {\n this.deleted.add(cacheKey);\n };\n\n registerList = (key: ListCacheKey): void => {\n this.modified.add(key);\n };\n\n registerLink = (cacheKey: SpecificLinkCacheKey): void => {\n this.modified.add(cacheKey);\n };\n\n deleteLink = (cacheKey: SpecificLinkCacheKey): void => {\n this.deleted.add(cacheKey);\n };\n\n registerObjectSet = (key: ObjectSetCacheKey): void => {\n this.modified.add(key);\n };\n\n registerFunction = (key: FunctionCacheKey): void => {\n this.modified.add(key);\n };\n\n isEmpty(): boolean {\n return (\n this.modifiedObjects.size === 0\n && this.addedObjects.size === 0\n && this.added.size === 0\n && this.modified.size === 0\n && this.deleted.size === 0\n );\n }\n}\n\nexport function createChangedObjects(): Changes {\n return new Changes();\n}\n\nexport function DEBUG_ONLY__changesToString(changes: Changes): string {\n if (process.env.NODE_ENV !== \"production\") {\n return JSON.stringify(\n {\n modifiedObjects: multimapHelper(changes.modifiedObjects),\n addedObjects: multimapHelper(changes.addedObjects),\n added: listHelper(changes.added),\n modified: listHelper(changes.modified),\n },\n null,\n 2,\n );\n } else {\n throw new Error(\"not implemented\");\n }\n}\n\nfunction listHelper(set: Set<CacheKey>) {\n return Array.from(set).map(DEBUG_ONLY__cacheKeyToString);\n}\n\nfunction multimapHelper(\n multimap: MultiMap<string, ObjectHolder>,\n) {\n return Object.fromEntries(\n Array.from(multimap.associations()).map(\n ([type, objects]) => {\n return [type, objects.map(o => o.$primaryKey)];\n },\n ),\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,SAASA,4BAA4B,QAAQ,eAAe;AAC5D,SAASC,QAAQ,QAAQ,2BAA2B;
|
|
1
|
+
{"version":3,"file":"Changes.js","names":["DEBUG_ONLY__cacheKeyToString","MultiMap","Changes","modifiedObjects","addedObjects","added","Set","modified","deleted","registerObject","cacheKey","data","isNew","set","$objectType","$apiName","add","deleteObject","registerList","key","registerLink","deleteLink","registerObjectSet","registerFunction","isEmpty","size","createChangedObjects","DEBUG_ONLY__changesToString","changes","process","env","NODE_ENV","JSON","stringify","multimapHelper","listHelper","Error","Array","from","map","multimap","Object","fromEntries","associations","type","objects","o","$primaryKey"],"sources":["Changes.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 { ObjectHolder } from \"../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { AggregationCacheKey } from \"./aggregation/AggregationCacheKey.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { DEBUG_ONLY__cacheKeyToString } from \"./CacheKey.js\";\nimport { MultiMap } from \"./collections/MultiMap.js\";\nimport type { FunctionCacheKey } from \"./function/FunctionCacheKey.js\";\nimport type { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./list/ListCacheKey.js\";\nimport type { MediaMetadataCacheKey } from \"./media/MediaMetadataCacheKey.js\";\nimport type { ObjectCacheKey } from \"./object/ObjectCacheKey.js\";\nimport type { ObjectSetCacheKey } from \"./objectset/ObjectSetCacheKey.js\";\n\nexport class Changes {\n modifiedObjects: MultiMap<string, ObjectHolder> = new MultiMap();\n addedObjects: MultiMap<string, ObjectHolder> = new MultiMap();\n\n added: Set<\n | AggregationCacheKey\n | FunctionCacheKey\n | ListCacheKey\n | MediaMetadataCacheKey\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ObjectSetCacheKey\n > = new Set();\n modified: Set<\n | AggregationCacheKey\n | FunctionCacheKey\n | ListCacheKey\n | MediaMetadataCacheKey\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ObjectSetCacheKey\n > = new Set();\n deleted: Set<\n | AggregationCacheKey\n | FunctionCacheKey\n | ListCacheKey\n | MediaMetadataCacheKey\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ObjectSetCacheKey\n > = new Set();\n\n registerObject = (\n cacheKey: ObjectCacheKey,\n data: ObjectHolder,\n isNew: boolean,\n ): void => {\n this[isNew ? \"addedObjects\" : \"modifiedObjects\"].set(\n data.$objectType ?? data.$apiName,\n data,\n );\n this[isNew ? \"added\" : \"modified\"].add(cacheKey);\n };\n\n deleteObject = (cacheKey: ObjectCacheKey): void => {\n this.deleted.add(cacheKey);\n };\n\n registerList = (key: ListCacheKey): void => {\n this.modified.add(key);\n };\n\n registerLink = (cacheKey: SpecificLinkCacheKey): void => {\n this.modified.add(cacheKey);\n };\n\n deleteLink = (cacheKey: SpecificLinkCacheKey): void => {\n this.deleted.add(cacheKey);\n };\n\n registerObjectSet = (key: ObjectSetCacheKey): void => {\n this.modified.add(key);\n };\n\n registerFunction = (key: FunctionCacheKey): void => {\n this.modified.add(key);\n };\n\n isEmpty(): boolean {\n return (\n this.modifiedObjects.size === 0\n && this.addedObjects.size === 0\n && this.added.size === 0\n && this.modified.size === 0\n && this.deleted.size === 0\n );\n }\n}\n\nexport function createChangedObjects(): Changes {\n return new Changes();\n}\n\nexport function DEBUG_ONLY__changesToString(changes: Changes): string {\n if (process.env.NODE_ENV !== \"production\") {\n return JSON.stringify(\n {\n modifiedObjects: multimapHelper(changes.modifiedObjects),\n addedObjects: multimapHelper(changes.addedObjects),\n added: listHelper(changes.added),\n modified: listHelper(changes.modified),\n },\n null,\n 2,\n );\n } else {\n throw new Error(\"not implemented\");\n }\n}\n\nfunction listHelper(set: Set<CacheKey>) {\n return Array.from(set).map(DEBUG_ONLY__cacheKeyToString);\n}\n\nfunction multimapHelper(\n multimap: MultiMap<string, ObjectHolder>,\n) {\n return Object.fromEntries(\n Array.from(multimap.associations()).map(\n ([type, objects]) => {\n return [type, objects.map(o => o.$primaryKey)];\n },\n ),\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
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 { Trie } from "@wry/trie";
|
|
18
|
+
import deepEqual from "fast-deep-equal";
|
|
19
|
+
import { CachingCanonicalizer } from "./Canonicalizer.js";
|
|
20
|
+
|
|
21
|
+
// Limits how deep we recurse into nested objects when building the trie
|
|
22
|
+
// fingerprint. Beyond this depth, objects land in the same trie bucket and
|
|
23
|
+
// deepEqual handles disambiguation.
|
|
24
|
+
const MAX_FINGERPRINT_DEPTH = 5;
|
|
25
|
+
export class GenericCanonicalizer extends CachingCanonicalizer {
|
|
26
|
+
#trie = new Trie();
|
|
27
|
+
#existingValues = new Map();
|
|
28
|
+
canonicalize(input) {
|
|
29
|
+
return super.canonicalize(input);
|
|
30
|
+
}
|
|
31
|
+
lookupOrCreate(input) {
|
|
32
|
+
const structuralKey = this.#collectSortedKeys(input);
|
|
33
|
+
const cacheKey = this.#trie.lookupArray(structuralKey);
|
|
34
|
+
const entry = this.#existingValues.get(cacheKey) ?? {
|
|
35
|
+
values: []
|
|
36
|
+
};
|
|
37
|
+
this.#existingValues.set(cacheKey, entry);
|
|
38
|
+
for (let i = entry.values.length - 1; i >= 0; i--) {
|
|
39
|
+
const existing = entry.values[i].deref();
|
|
40
|
+
if (!existing) {
|
|
41
|
+
entry.values.splice(i, 1);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (deepEqual(existing, input)) {
|
|
45
|
+
return existing;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const canonical = input;
|
|
49
|
+
entry.values.push(new WeakRef(canonical));
|
|
50
|
+
return canonical;
|
|
51
|
+
}
|
|
52
|
+
#collectSortedKeys(obj, depth = 0) {
|
|
53
|
+
if (depth > MAX_FINGERPRINT_DEPTH || !obj || typeof obj !== "object") {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
if (Array.isArray(obj)) {
|
|
57
|
+
const result = ["[]", String(obj.length)];
|
|
58
|
+
for (const item of obj) {
|
|
59
|
+
result.push(...this.#collectSortedKeys(item, depth + 1));
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
const record = obj;
|
|
64
|
+
const result = [];
|
|
65
|
+
for (const key of Object.keys(record).sort()) {
|
|
66
|
+
result.push(key);
|
|
67
|
+
result.push(...this.#collectSortedKeys(record[key], depth + 1));
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=GenericCanonicalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenericCanonicalizer.js","names":["Trie","deepEqual","CachingCanonicalizer","MAX_FINGERPRINT_DEPTH","GenericCanonicalizer","trie","existingValues","Map","canonicalize","input","lookupOrCreate","structuralKey","collectSortedKeys","cacheKey","lookupArray","entry","get","values","set","i","length","existing","deref","splice","canonical","push","WeakRef","#collectSortedKeys","obj","depth","Array","isArray","result","String","item","record","key","Object","keys","sort"],"sources":["GenericCanonicalizer.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 { Trie } from \"@wry/trie\";\nimport deepEqual from \"fast-deep-equal\";\nimport type { Canonical } from \"./Canonical.js\";\nimport { CachingCanonicalizer } from \"./Canonicalizer.js\";\n\n// Limits how deep we recurse into nested objects when building the trie\n// fingerprint. Beyond this depth, objects land in the same trie bucket and\n// deepEqual handles disambiguation.\nconst MAX_FINGERPRINT_DEPTH = 5;\n\nexport class GenericCanonicalizer extends CachingCanonicalizer<object, object> {\n #trie = new Trie<object>();\n #existingValues: Map<object, { values: WeakRef<Canonical<object>>[] }> =\n new Map();\n\n canonicalize<T extends object>(input: T): Canonical<T>;\n canonicalize<T extends object>(\n input: T | undefined,\n ): Canonical<T> | undefined;\n canonicalize<T extends object>(\n input: T | undefined,\n ): Canonical<T> | undefined {\n return super.canonicalize(input as object) as Canonical<T> | undefined;\n }\n\n protected lookupOrCreate(input: object): Canonical<object> {\n const structuralKey = this.#collectSortedKeys(input);\n const cacheKey = this.#trie.lookupArray(structuralKey);\n const entry = this.#existingValues.get(cacheKey)\n ?? { values: [] as WeakRef<Canonical<object>>[] };\n this.#existingValues.set(cacheKey, entry);\n\n for (let i = entry.values.length - 1; i >= 0; i--) {\n const existing = entry.values[i].deref();\n if (!existing) {\n entry.values.splice(i, 1);\n continue;\n }\n if (deepEqual(existing, input)) {\n return existing;\n }\n }\n\n const canonical = input as Canonical<object>;\n entry.values.push(new WeakRef(canonical));\n return canonical;\n }\n\n #collectSortedKeys(obj: unknown, depth = 0): string[] {\n if (depth > MAX_FINGERPRINT_DEPTH || !obj || typeof obj !== \"object\") {\n return [];\n }\n if (Array.isArray(obj)) {\n const result = [\"[]\", String(obj.length)];\n for (const item of obj) {\n result.push(...this.#collectSortedKeys(item, depth + 1));\n }\n return result;\n }\n const record = obj as Record<string, unknown>;\n const result: string[] = [];\n for (const key of Object.keys(record).sort()) {\n result.push(key);\n result.push(...this.#collectSortedKeys(record[key], depth + 1));\n }\n return result;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,IAAI,QAAQ,WAAW;AAChC,OAAOC,SAAS,MAAM,iBAAiB;AAEvC,SAASC,oBAAoB,QAAQ,oBAAoB;;AAEzD;AACA;AACA;AACA,MAAMC,qBAAqB,GAAG,CAAC;AAE/B,OAAO,MAAMC,oBAAoB,SAASF,oBAAoB,CAAiB;EAC7E,CAACG,IAAI,GAAG,IAAIL,IAAI,CAAS,CAAC;EAC1B,CAACM,cAAc,GACb,IAAIC,GAAG,CAAC,CAAC;EAMXC,YAAYA,CACVC,KAAoB,EACM;IAC1B,OAAO,KAAK,CAACD,YAAY,CAACC,KAAe,CAAC;EAC5C;EAEUC,cAAcA,CAACD,KAAa,EAAqB;IACzD,MAAME,aAAa,GAAG,IAAI,CAAC,CAACC,iBAAiB,CAACH,KAAK,CAAC;IACpD,MAAMI,QAAQ,GAAG,IAAI,CAAC,CAACR,IAAI,CAACS,WAAW,CAACH,aAAa,CAAC;IACtD,MAAMI,KAAK,GAAG,IAAI,CAAC,CAACT,cAAc,CAACU,GAAG,CAACH,QAAQ,CAAC,IAC3C;MAAEI,MAAM,EAAE;IAAmC,CAAC;IACnD,IAAI,CAAC,CAACX,cAAc,CAACY,GAAG,CAACL,QAAQ,EAAEE,KAAK,CAAC;IAEzC,KAAK,IAAII,CAAC,GAAGJ,KAAK,CAACE,MAAM,CAACG,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;MACjD,MAAME,QAAQ,GAAGN,KAAK,CAACE,MAAM,CAACE,CAAC,CAAC,CAACG,KAAK,CAAC,CAAC;MACxC,IAAI,CAACD,QAAQ,EAAE;QACbN,KAAK,CAACE,MAAM,CAACM,MAAM,CAACJ,CAAC,EAAE,CAAC,CAAC;QACzB;MACF;MACA,IAAIlB,SAAS,CAACoB,QAAQ,EAAEZ,KAAK,CAAC,EAAE;QAC9B,OAAOY,QAAQ;MACjB;IACF;IAEA,MAAMG,SAAS,GAAGf,KAA0B;IAC5CM,KAAK,CAACE,MAAM,CAACQ,IAAI,CAAC,IAAIC,OAAO,CAACF,SAAS,CAAC,CAAC;IACzC,OAAOA,SAAS;EAClB;EAEA,CAACZ,iBAAiBe,CAACC,GAAY,EAAEC,KAAK,GAAG,CAAC,EAAY;IACpD,IAAIA,KAAK,GAAG1B,qBAAqB,IAAI,CAACyB,GAAG,IAAI,OAAOA,GAAG,KAAK,QAAQ,EAAE;MACpE,OAAO,EAAE;IACX;IACA,IAAIE,KAAK,CAACC,OAAO,CAACH,GAAG,CAAC,EAAE;MACtB,MAAMI,MAAM,GAAG,CAAC,IAAI,EAAEC,MAAM,CAACL,GAAG,CAACR,MAAM,CAAC,CAAC;MACzC,KAAK,MAAMc,IAAI,IAAIN,GAAG,EAAE;QACtBI,MAAM,CAACP,IAAI,CAAC,GAAG,IAAI,CAAC,CAACb,iBAAiB,CAACsB,IAAI,EAAEL,KAAK,GAAG,CAAC,CAAC,CAAC;MAC1D;MACA,OAAOG,MAAM;IACf;IACA,MAAMG,MAAM,GAAGP,GAA8B;IAC7C,MAAMI,MAAgB,GAAG,EAAE;IAC3B,KAAK,MAAMI,GAAG,IAAIC,MAAM,CAACC,IAAI,CAACH,MAAM,CAAC,CAACI,IAAI,CAAC,CAAC,EAAE;MAC5CP,MAAM,CAACP,IAAI,CAACW,GAAG,CAAC;MAChBJ,MAAM,CAACP,IAAI,CAAC,GAAG,IAAI,CAAC,CAACb,iBAAiB,CAACuB,MAAM,CAACC,GAAG,CAAC,EAAEP,KAAK,GAAG,CAAC,CAAC,CAAC;IACjE;IACA,OAAOG,MAAM;EACf;AACF","ignoreList":[]}
|
|
@@ -23,7 +23,7 @@ export class IntersectCanonicalizer extends CachingCanonicalizer {
|
|
|
23
23
|
}
|
|
24
24
|
lookupOrCreate(intersectWith) {
|
|
25
25
|
const canonicalClauses = intersectWith.map(item => this.whereCanonicalizer.canonicalize(item.where ?? {}));
|
|
26
|
-
const structuralKey = canonicalClauses.map(clause => JSON.stringify(clause)).join("||");
|
|
26
|
+
const structuralKey = canonicalClauses.map(clause => JSON.stringify(clause)).sort().join("||");
|
|
27
27
|
let canonical = this.structuralCache.get(structuralKey);
|
|
28
28
|
if (!canonical) {
|
|
29
29
|
canonical = canonicalClauses;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntersectCanonicalizer.js","names":["CachingCanonicalizer","IntersectCanonicalizer","structuralCache","Map","constructor","whereCanonicalizer","lookupOrCreate","intersectWith","canonicalClauses","map","item","canonicalize","where","structuralKey","clause","JSON","stringify","join","canonical","get","set"],"sources":["IntersectCanonicalizer.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 ObjectOrInterfaceDefinition,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type { Canonical } from \"./Canonical.js\";\nimport { CachingCanonicalizer } from \"./Canonicalizer.js\";\nimport type { SimpleWhereClause } from \"./SimpleWhereClause.js\";\nimport type { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\ntype IntersectWithInput<\n T extends ObjectOrInterfaceDefinition = ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n SimplePropertyDef\n >,\n> = Array<{ where: WhereClause<T, RDPs> }>;\n\nexport class IntersectCanonicalizer extends CachingCanonicalizer<\n IntersectWithInput,\n Array<Canonical<SimpleWhereClause>>\n> {\n private structuralCache = new Map<\n string,\n Canonical<Array<Canonical<SimpleWhereClause>>>\n >();\n\n constructor(private whereCanonicalizer: WhereClauseCanonicalizer) {\n super();\n }\n\n protected lookupOrCreate(\n intersectWith: IntersectWithInput,\n ): Canonical<Array<Canonical<SimpleWhereClause>>> {\n const canonicalClauses = intersectWith.map((item) =>\n this.whereCanonicalizer.canonicalize(item.where ?? {})\n );\n\n const structuralKey = canonicalClauses\n .map((clause) => JSON.stringify(clause))\n .join(\"||\");\n\n let canonical = this.structuralCache.get(structuralKey);\n\n if (!canonical) {\n canonical = canonicalClauses as Canonical<\n Array<Canonical<SimpleWhereClause>>\n >;\n this.structuralCache.set(structuralKey, canonical);\n }\n\n return canonical;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA,SAASA,oBAAoB,QAAQ,oBAAoB;AAYzD,OAAO,MAAMC,sBAAsB,SAASD,oBAAoB,CAG9D;EACQE,eAAe,GAAG,IAAIC,GAAG,CAG/B,CAAC;EAEHC,WAAWA,CAASC,kBAA4C,EAAE;IAChE,KAAK,CAAC,CAAC;IAAC,KADUA,kBAA4C,GAA5CA,kBAA4C;EAEhE;EAEUC,cAAcA,CACtBC,aAAiC,EACe;IAChD,MAAMC,gBAAgB,GAAGD,aAAa,CAACE,GAAG,CAAEC,IAAI,IAC9C,IAAI,CAACL,kBAAkB,CAACM,YAAY,CAACD,IAAI,CAACE,KAAK,IAAI,CAAC,CAAC,CACvD,CAAC;IAED,MAAMC,aAAa,GAAGL,gBAAgB,CACnCC,GAAG,CAAEK,MAAM,IAAKC,IAAI,CAACC,SAAS,CAACF,MAAM,CAAC,CAAC,CACvCG,IAAI,CAAC,IAAI,CAAC;IAEb,IAAIC,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"IntersectCanonicalizer.js","names":["CachingCanonicalizer","IntersectCanonicalizer","structuralCache","Map","constructor","whereCanonicalizer","lookupOrCreate","intersectWith","canonicalClauses","map","item","canonicalize","where","structuralKey","clause","JSON","stringify","sort","join","canonical","get","set"],"sources":["IntersectCanonicalizer.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 ObjectOrInterfaceDefinition,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type { Canonical } from \"./Canonical.js\";\nimport { CachingCanonicalizer } from \"./Canonicalizer.js\";\nimport type { SimpleWhereClause } from \"./SimpleWhereClause.js\";\nimport type { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\ntype IntersectWithInput<\n T extends ObjectOrInterfaceDefinition = ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n SimplePropertyDef\n >,\n> = Array<{ where: WhereClause<T, RDPs> }>;\n\nexport class IntersectCanonicalizer extends CachingCanonicalizer<\n IntersectWithInput,\n Array<Canonical<SimpleWhereClause>>\n> {\n private structuralCache = new Map<\n string,\n Canonical<Array<Canonical<SimpleWhereClause>>>\n >();\n\n constructor(private whereCanonicalizer: WhereClauseCanonicalizer) {\n super();\n }\n\n protected lookupOrCreate(\n intersectWith: IntersectWithInput,\n ): Canonical<Array<Canonical<SimpleWhereClause>>> {\n const canonicalClauses = intersectWith.map((item) =>\n this.whereCanonicalizer.canonicalize(item.where ?? {})\n );\n\n const structuralKey = canonicalClauses\n .map((clause) => JSON.stringify(clause))\n .sort()\n .join(\"||\");\n\n let canonical = this.structuralCache.get(structuralKey);\n\n if (!canonical) {\n canonical = canonicalClauses as Canonical<\n Array<Canonical<SimpleWhereClause>>\n >;\n this.structuralCache.set(structuralKey, canonical);\n }\n\n return canonical;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA,SAASA,oBAAoB,QAAQ,oBAAoB;AAYzD,OAAO,MAAMC,sBAAsB,SAASD,oBAAoB,CAG9D;EACQE,eAAe,GAAG,IAAIC,GAAG,CAG/B,CAAC;EAEHC,WAAWA,CAASC,kBAA4C,EAAE;IAChE,KAAK,CAAC,CAAC;IAAC,KADUA,kBAA4C,GAA5CA,kBAA4C;EAEhE;EAEUC,cAAcA,CACtBC,aAAiC,EACe;IAChD,MAAMC,gBAAgB,GAAGD,aAAa,CAACE,GAAG,CAAEC,IAAI,IAC9C,IAAI,CAACL,kBAAkB,CAACM,YAAY,CAACD,IAAI,CAACE,KAAK,IAAI,CAAC,CAAC,CACvD,CAAC;IAED,MAAMC,aAAa,GAAGL,gBAAgB,CACnCC,GAAG,CAAEK,MAAM,IAAKC,IAAI,CAACC,SAAS,CAACF,MAAM,CAAC,CAAC,CACvCG,IAAI,CAAC,CAAC,CACNC,IAAI,CAAC,IAAI,CAAC;IAEb,IAAIC,SAAS,GAAG,IAAI,CAACjB,eAAe,CAACkB,GAAG,CAACP,aAAa,CAAC;IAEvD,IAAI,CAACM,SAAS,EAAE;MACdA,SAAS,GAAGX,gBAEX;MACD,IAAI,CAACN,eAAe,CAACmB,GAAG,CAACR,aAAa,EAAEM,SAAS,CAAC;IACpD;IAEA,OAAOA,SAAS;EAClB;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KnownCacheKey.js","names":[],"sources":["KnownCacheKey.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 { AggregationCacheKey } from \"./aggregation/AggregationCacheKey.js\";\nimport type { FunctionCacheKey } from \"./function/FunctionCacheKey.js\";\nimport type { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./list/ListCacheKey.js\";\nimport type { ObjectCacheKey } from \"./object/ObjectCacheKey.js\";\nimport type { ObjectSetCacheKey } from \"./objectset/ObjectSetCacheKey.js\";\n\nexport type KnownCacheKey =\n | AggregationCacheKey\n | FunctionCacheKey\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ListCacheKey\n | ObjectSetCacheKey;\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"KnownCacheKey.js","names":[],"sources":["KnownCacheKey.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 { AggregationCacheKey } from \"./aggregation/AggregationCacheKey.js\";\nimport type { FunctionCacheKey } from \"./function/FunctionCacheKey.js\";\nimport type { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./list/ListCacheKey.js\";\nimport type { MediaMetadataCacheKey } from \"./media/MediaMetadataCacheKey.js\";\nimport type { ObjectCacheKey } from \"./object/ObjectCacheKey.js\";\nimport type { ObjectSetCacheKey } from \"./objectset/ObjectSetCacheKey.js\";\n\nexport type KnownCacheKey =\n | AggregationCacheKey\n | FunctionCacheKey\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ListCacheKey\n | MediaMetadataCacheKey\n | ObjectSetCacheKey;\n"],"mappings":"","ignoreList":[]}
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
* - Slices the shared data to the subscriber's viewLimit
|
|
31
31
|
* - Provides a fetchMore that increments viewLimit and fetches if needed
|
|
32
32
|
* - Reports hasMore based on both local viewLimit and server pagination
|
|
33
|
+
* - Drives autoFetchMore page-by-page when enabled (per-subscriber concern)
|
|
33
34
|
*/
|
|
34
35
|
let viewIdCounter = 0;
|
|
35
36
|
export class ListQueryView {
|
|
@@ -37,7 +38,7 @@ export class ListQueryView {
|
|
|
37
38
|
#viewLimit;
|
|
38
39
|
#pageSize;
|
|
39
40
|
#viewId;
|
|
40
|
-
#
|
|
41
|
+
#autoFetchMinimum;
|
|
41
42
|
#fetchMore;
|
|
42
43
|
#pendingFetchMore;
|
|
43
44
|
#lastPayload;
|
|
@@ -46,11 +47,8 @@ export class ListQueryView {
|
|
|
46
47
|
this.#query = query;
|
|
47
48
|
this.#pageSize = pageSize;
|
|
48
49
|
this.#viewId = `view_${++viewIdCounter}`;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
// Otherwise, limit to their pageSize
|
|
52
|
-
this.#hasAutoFetch = autoFetchMore === true || typeof autoFetchMore === "number" && autoFetchMore > 0;
|
|
53
|
-
this.#viewLimit = this.#hasAutoFetch ? Number.MAX_SAFE_INTEGER : pageSize;
|
|
50
|
+
this.#autoFetchMinimum = autoFetchMore === true ? Number.MAX_SAFE_INTEGER : typeof autoFetchMore === "number" && autoFetchMore > 0 ? autoFetchMore : 0;
|
|
51
|
+
this.#viewLimit = this.#autoFetchMinimum > 0 ? Number.MAX_SAFE_INTEGER : pageSize;
|
|
54
52
|
|
|
55
53
|
// Memoize fetchMore to maintain stable function identity
|
|
56
54
|
this.#fetchMore = this.#createFetchMore();
|
|
@@ -63,8 +61,10 @@ export class ListQueryView {
|
|
|
63
61
|
const sub = this.#query.subscribe({
|
|
64
62
|
next: payload => {
|
|
65
63
|
this.#lastPayload = payload;
|
|
66
|
-
observer
|
|
67
|
-
|
|
64
|
+
this.#observer?.next?.(this.#transformPayload(payload));
|
|
65
|
+
const loadedCount = payload.resolvedList?.length ?? 0;
|
|
66
|
+
const fetchThreshold = this.#autoFetchMinimum > 0 ? this.#autoFetchMinimum : this.#viewLimit;
|
|
67
|
+
if (payload.status === "loaded" && this.#query.hasMorePages() && loadedCount < fetchThreshold) {
|
|
68
68
|
void this.#query.fetchMore();
|
|
69
69
|
}
|
|
70
70
|
},
|
|
@@ -88,12 +88,24 @@ export class ListQueryView {
|
|
|
88
88
|
#transformPayload(payload) {
|
|
89
89
|
const resolvedList = payload.resolvedList;
|
|
90
90
|
const loadedCount = resolvedList?.length ?? 0;
|
|
91
|
+
let status = payload.status;
|
|
92
|
+
|
|
93
|
+
// When auto-fetching and below threshold with more pages available,
|
|
94
|
+
// report "loading" to prevent status oscillation
|
|
95
|
+
if (this.#autoFetchMinimum > 0 && status === "loaded" && this.#query.hasMorePages() && loadedCount < this.#autoFetchMinimum) {
|
|
96
|
+
status = "loading";
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// When query says "loading" but we have enough for our view, report "loaded"
|
|
100
|
+
if (loadedCount >= this.#viewLimit && status === "loading") {
|
|
101
|
+
status = "loaded";
|
|
102
|
+
}
|
|
91
103
|
return {
|
|
92
104
|
...payload,
|
|
93
105
|
resolvedList: resolvedList?.slice(0, this.#viewLimit),
|
|
94
106
|
hasMore: this.#viewLimit < loadedCount || payload.hasMore,
|
|
95
107
|
fetchMore: this.#fetchMore,
|
|
96
|
-
status
|
|
108
|
+
status
|
|
97
109
|
};
|
|
98
110
|
}
|
|
99
111
|
#createFetchMore() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListQueryView.js","names":["viewIdCounter","ListQueryView","query","viewLimit","pageSize","viewId","hasAutoFetch","fetchMore","pendingFetchMore","lastPayload","observer","constructor","autoFetchMore","Number","MAX_SAFE_INTEGER","createFetchMore","registerFetchPageSize","subscribe","sub","next","payload","transformPayload","status","resolvedList","length","hasMorePages","error","err","complete","add","unregisterFetchPageSize","undefined","reEmitWithNewViewLimit","#reEmitWithNewViewLimit","#transformPayload","loadedCount","slice","hasMore","#createFetchMore","getLoadedCount","hasMoreOnServer","finally","Promise","resolve"],"sources":["ListQueryView.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 { Subscription } from \"rxjs\";\nimport type { Observer } from \"../ObservableClient/common.js\";\nimport type { BaseListPayloadShape } from \"./base-list/BaseListQuery.js\";\n\n/**\n * Interface for the query methods that ListQueryView needs.\n * This allows ListQueryView to work with any query that supports these operations.\n */\nexport interface ListQueryViewTarget<PAYLOAD extends BaseListPayloadShape> {\n subscribe(observer: Observer<PAYLOAD>): Subscription;\n registerFetchPageSize(viewId: string, pageSize: number): void;\n unregisterFetchPageSize(viewId: string): void;\n getLoadedCount(): number;\n hasMorePages(): boolean;\n notifySubscribers(): void;\n fetchMore(): Promise<void>;\n}\n\n/**\n * A view into a shared ListQuery cache.\n *\n * Each subscriber gets their own View instance that tracks how much of the\n * shared cache they want to see (viewLimit). This allows multiple components\n * with different pageSize requirements to share the same underlying cache.\n *\n * The View:\n * - Slices the shared data to the subscriber's viewLimit\n * - Provides a fetchMore that increments viewLimit and fetches if needed\n * - Reports hasMore based on both local viewLimit and server pagination\n */\nlet viewIdCounter = 0;\n\nexport class ListQueryView<PAYLOAD extends BaseListPayloadShape> {\n #query: ListQueryViewTarget<PAYLOAD>;\n #viewLimit: number;\n #pageSize: number;\n #viewId: string;\n #hasAutoFetch: boolean;\n #fetchMore: () => Promise<void>;\n #pendingFetchMore: Promise<void> | undefined;\n #lastPayload: PAYLOAD | undefined;\n #observer: Observer<PAYLOAD> | undefined;\n\n constructor(\n query: ListQueryViewTarget<PAYLOAD>,\n pageSize: number,\n autoFetchMore?: boolean | number,\n ) {\n this.#query = query;\n this.#pageSize = pageSize;\n this.#viewId = `view_${++viewIdCounter}`;\n\n // With autoFetchMore, subscriber sees all loaded data (no view limit)\n // Otherwise, limit to their pageSize\n this.#hasAutoFetch = autoFetchMore === true\n || (typeof autoFetchMore === \"number\" && autoFetchMore > 0);\n this.#viewLimit = this.#hasAutoFetch ? Number.MAX_SAFE_INTEGER : pageSize;\n\n // Memoize fetchMore to maintain stable function identity\n this.#fetchMore = this.#createFetchMore();\n\n // Tell the query to fetch with at least this pageSize\n query.registerFetchPageSize(this.#viewId, pageSize);\n }\n\n subscribe(observer: Observer<PAYLOAD>): Subscription {\n this.#observer = observer;\n const sub = this.#query.subscribe({\n next: (payload) => {\n this.#lastPayload = payload;\n observer.next?.(this.#transformPayload(payload));\n\n if (\n !this.#hasAutoFetch\n && payload.status === \"loaded\"\n && (payload.resolvedList?.length ?? 0) < this.#viewLimit\n && this.#query.hasMorePages()\n ) {\n void this.#query.fetchMore();\n }\n },\n error: (err) => observer.error?.(err),\n complete: () => observer.complete?.(),\n });\n\n // Cleanup: unregister pageSize when subscriber unsubscribes\n sub.add(() => {\n this.#query.unregisterFetchPageSize(this.#viewId);\n this.#observer = undefined;\n this.#lastPayload = undefined;\n });\n\n return sub;\n }\n\n #reEmitWithNewViewLimit(): void {\n if (this.#lastPayload && this.#observer) {\n this.#observer.next?.(this.#transformPayload(this.#lastPayload));\n }\n }\n\n #transformPayload(payload: PAYLOAD): PAYLOAD {\n const resolvedList = payload.resolvedList;\n const loadedCount = resolvedList?.length ?? 0;\n\n return {\n ...payload,\n resolvedList: resolvedList?.slice(0, this.#viewLimit),\n hasMore: this.#viewLimit < loadedCount || payload.hasMore,\n fetchMore: this.#fetchMore,\n status: loadedCount >= this.#viewLimit && payload.status === \"loading\"\n ? \"loaded\"\n : payload.status,\n };\n }\n\n #createFetchMore(): () => Promise<void> {\n return () => {\n if (this.#pendingFetchMore) {\n return this.#pendingFetchMore;\n }\n\n this.#viewLimit += this.#pageSize;\n\n const loadedCount = this.#query.getLoadedCount();\n const hasMoreOnServer = this.#query.hasMorePages();\n\n if (this.#viewLimit > loadedCount && hasMoreOnServer) {\n // Need to fetch more data from server\n this.#pendingFetchMore = this.#query.fetchMore().finally(() => {\n this.#pendingFetchMore = undefined;\n });\n return this.#pendingFetchMore;\n }\n\n // We have enough data in cache, just re-emit with new viewLimit (sync)\n this.#reEmitWithNewViewLimit();\n return Promise.resolve();\n };\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAIA,aAAa,GAAG,CAAC;AAErB,OAAO,MAAMC,aAAa,CAAuC;EAC/D,CAACC,KAAK;EACN,CAACC,SAAS;EACV,CAACC,QAAQ;EACT,CAACC,MAAM;EACP,CAACC,YAAY;EACb,CAACC,SAAS;EACV,CAACC,gBAAgB;EACjB,CAACC,WAAW;EACZ,CAACC,QAAQ;EAETC,WAAWA,CACTT,KAAmC,EACnCE,QAAgB,EAChBQ,aAAgC,EAChC;IACA,IAAI,CAAC,CAACV,KAAK,GAAGA,KAAK;IACnB,IAAI,CAAC,CAACE,QAAQ,GAAGA,QAAQ;IACzB,IAAI,CAAC,CAACC,MAAM,GAAG,QAAQ,EAAEL,aAAa,EAAE;;IAExC;IACA;IACA,IAAI,CAAC,CAACM,YAAY,GAAGM,aAAa,KAAK,IAAI,IACrC,OAAOA,aAAa,KAAK,QAAQ,IAAIA,aAAa,GAAG,CAAE;IAC7D,IAAI,CAAC,CAACT,SAAS,GAAG,IAAI,CAAC,CAACG,YAAY,GAAGO,MAAM,CAACC,gBAAgB,GAAGV,QAAQ;;IAEzE;IACA,IAAI,CAAC,CAACG,SAAS,GAAG,IAAI,CAAC,CAACQ,eAAe,CAAC,CAAC;;IAEzC;IACAb,KAAK,CAACc,qBAAqB,CAAC,IAAI,CAAC,CAACX,MAAM,EAAED,QAAQ,CAAC;EACrD;EAEAa,SAASA,CAACP,QAA2B,EAAgB;IACnD,IAAI,CAAC,CAACA,QAAQ,GAAGA,QAAQ;IACzB,MAAMQ,GAAG,GAAG,IAAI,CAAC,CAAChB,KAAK,CAACe,SAAS,CAAC;MAChCE,IAAI,EAAGC,OAAO,IAAK;QACjB,IAAI,CAAC,CAACX,WAAW,GAAGW,OAAO;QAC3BV,QAAQ,CAACS,IAAI,GAAG,IAAI,CAAC,CAACE,gBAAgB,CAACD,OAAO,CAAC,CAAC;QAEhD,IACE,CAAC,IAAI,CAAC,CAACd,YAAY,IAChBc,OAAO,CAACE,MAAM,KAAK,QAAQ,IAC3B,CAACF,OAAO,CAACG,YAAY,EAAEC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAACrB,SAAS,IACrD,IAAI,CAAC,CAACD,KAAK,CAACuB,YAAY,CAAC,CAAC,EAC7B;UACA,KAAK,IAAI,CAAC,CAACvB,KAAK,CAACK,SAAS,CAAC,CAAC;QAC9B;MACF,CAAC;MACDmB,KAAK,EAAGC,GAAG,IAAKjB,QAAQ,CAACgB,KAAK,GAAGC,GAAG,CAAC;MACrCC,QAAQ,EAAEA,CAAA,KAAMlB,QAAQ,CAACkB,QAAQ,GAAG;IACtC,CAAC,CAAC;;IAEF;IACAV,GAAG,CAACW,GAAG,CAAC,MAAM;MACZ,IAAI,CAAC,CAAC3B,KAAK,CAAC4B,uBAAuB,CAAC,IAAI,CAAC,CAACzB,MAAM,CAAC;MACjD,IAAI,CAAC,CAACK,QAAQ,GAAGqB,SAAS;MAC1B,IAAI,CAAC,CAACtB,WAAW,GAAGsB,SAAS;IAC/B,CAAC,CAAC;IAEF,OAAOb,GAAG;EACZ;EAEA,CAACc,sBAAsBC,CAAA,EAAS;IAC9B,IAAI,IAAI,CAAC,CAACxB,WAAW,IAAI,IAAI,CAAC,CAACC,QAAQ,EAAE;MACvC,IAAI,CAAC,CAACA,QAAQ,CAACS,IAAI,GAAG,IAAI,CAAC,CAACE,gBAAgB,CAAC,IAAI,CAAC,CAACZ,WAAW,CAAC,CAAC;IAClE;EACF;EAEA,CAACY,gBAAgBa,CAACd,OAAgB,EAAW;IAC3C,MAAMG,YAAY,GAAGH,OAAO,CAACG,YAAY;IACzC,MAAMY,WAAW,GAAGZ,YAAY,EAAEC,MAAM,IAAI,CAAC;IAE7C,OAAO;MACL,GAAGJ,OAAO;MACVG,YAAY,EAAEA,YAAY,EAAEa,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAACjC,SAAS,CAAC;MACrDkC,OAAO,EAAE,IAAI,CAAC,CAAClC,SAAS,GAAGgC,WAAW,IAAIf,OAAO,CAACiB,OAAO;MACzD9B,SAAS,EAAE,IAAI,CAAC,CAACA,SAAS;MAC1Be,MAAM,EAAEa,WAAW,IAAI,IAAI,CAAC,CAAChC,SAAS,IAAIiB,OAAO,CAACE,MAAM,KAAK,SAAS,GAClE,QAAQ,GACRF,OAAO,CAACE;IACd,CAAC;EACH;EAEA,CAACP,eAAeuB,CAAA,EAAwB;IACtC,OAAO,MAAM;MACX,IAAI,IAAI,CAAC,CAAC9B,gBAAgB,EAAE;QAC1B,OAAO,IAAI,CAAC,CAACA,gBAAgB;MAC/B;MAEA,IAAI,CAAC,CAACL,SAAS,IAAI,IAAI,CAAC,CAACC,QAAQ;MAEjC,MAAM+B,WAAW,GAAG,IAAI,CAAC,CAACjC,KAAK,CAACqC,cAAc,CAAC,CAAC;MAChD,MAAMC,eAAe,GAAG,IAAI,CAAC,CAACtC,KAAK,CAACuB,YAAY,CAAC,CAAC;MAElD,IAAI,IAAI,CAAC,CAACtB,SAAS,GAAGgC,WAAW,IAAIK,eAAe,EAAE;QACpD;QACA,IAAI,CAAC,CAAChC,gBAAgB,GAAG,IAAI,CAAC,CAACN,KAAK,CAACK,SAAS,CAAC,CAAC,CAACkC,OAAO,CAAC,MAAM;UAC7D,IAAI,CAAC,CAACjC,gBAAgB,GAAGuB,SAAS;QACpC,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,CAACvB,gBAAgB;MAC/B;;MAEA;MACA,IAAI,CAAC,CAACwB,sBAAsB,CAAC,CAAC;MAC9B,OAAOU,OAAO,CAACC,OAAO,CAAC,CAAC;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ListQueryView.js","names":["viewIdCounter","ListQueryView","query","viewLimit","pageSize","viewId","autoFetchMinimum","fetchMore","pendingFetchMore","lastPayload","observer","constructor","autoFetchMore","Number","MAX_SAFE_INTEGER","createFetchMore","registerFetchPageSize","subscribe","sub","next","payload","transformPayload","loadedCount","resolvedList","length","fetchThreshold","status","hasMorePages","error","err","complete","add","unregisterFetchPageSize","undefined","reEmitWithNewViewLimit","#reEmitWithNewViewLimit","#transformPayload","slice","hasMore","#createFetchMore","getLoadedCount","hasMoreOnServer","finally","Promise","resolve"],"sources":["ListQueryView.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 { Subscription } from \"rxjs\";\nimport type { Observer, Status } from \"../ObservableClient/common.js\";\nimport type { BaseListPayloadShape } from \"./base-list/BaseListQuery.js\";\n\n/**\n * Interface for the query methods that ListQueryView needs.\n * This allows ListQueryView to work with any query that supports these operations.\n */\nexport interface ListQueryViewTarget<PAYLOAD extends BaseListPayloadShape> {\n subscribe(observer: Observer<PAYLOAD>): Subscription;\n registerFetchPageSize(viewId: string, pageSize: number): void;\n unregisterFetchPageSize(viewId: string): void;\n getLoadedCount(): number;\n hasMorePages(): boolean;\n notifySubscribers(): void;\n fetchMore(): Promise<void>;\n}\n\n/**\n * A view into a shared ListQuery cache.\n *\n * Each subscriber gets their own View instance that tracks how much of the\n * shared cache they want to see (viewLimit). This allows multiple components\n * with different pageSize requirements to share the same underlying cache.\n *\n * The View:\n * - Slices the shared data to the subscriber's viewLimit\n * - Provides a fetchMore that increments viewLimit and fetches if needed\n * - Reports hasMore based on both local viewLimit and server pagination\n * - Drives autoFetchMore page-by-page when enabled (per-subscriber concern)\n */\nlet viewIdCounter = 0;\n\nexport class ListQueryView<PAYLOAD extends BaseListPayloadShape> {\n #query: ListQueryViewTarget<PAYLOAD>;\n #viewLimit: number;\n #pageSize: number;\n #viewId: string;\n #autoFetchMinimum: number;\n #fetchMore: () => Promise<void>;\n #pendingFetchMore: Promise<void> | undefined;\n #lastPayload: PAYLOAD | undefined;\n #observer: Observer<PAYLOAD> | undefined;\n\n constructor(\n query: ListQueryViewTarget<PAYLOAD>,\n pageSize: number,\n autoFetchMore?: boolean | number,\n ) {\n this.#query = query;\n this.#pageSize = pageSize;\n this.#viewId = `view_${++viewIdCounter}`;\n\n this.#autoFetchMinimum = autoFetchMore === true\n ? Number.MAX_SAFE_INTEGER\n : (typeof autoFetchMore === \"number\" && autoFetchMore > 0)\n ? autoFetchMore\n : 0;\n this.#viewLimit = this.#autoFetchMinimum > 0\n ? Number.MAX_SAFE_INTEGER\n : pageSize;\n\n // Memoize fetchMore to maintain stable function identity\n this.#fetchMore = this.#createFetchMore();\n\n // Tell the query to fetch with at least this pageSize\n query.registerFetchPageSize(this.#viewId, pageSize);\n }\n\n subscribe(observer: Observer<PAYLOAD>): Subscription {\n this.#observer = observer;\n const sub = this.#query.subscribe({\n next: (payload) => {\n this.#lastPayload = payload;\n this.#observer?.next?.(this.#transformPayload(payload));\n\n const loadedCount = payload.resolvedList?.length ?? 0;\n const fetchThreshold = this.#autoFetchMinimum > 0\n ? this.#autoFetchMinimum\n : this.#viewLimit;\n\n if (\n payload.status === \"loaded\"\n && this.#query.hasMorePages()\n && loadedCount < fetchThreshold\n ) {\n void this.#query.fetchMore();\n }\n },\n error: (err) => observer.error?.(err),\n complete: () => observer.complete?.(),\n });\n\n // Cleanup: unregister pageSize when subscriber unsubscribes\n sub.add(() => {\n this.#query.unregisterFetchPageSize(this.#viewId);\n this.#observer = undefined;\n this.#lastPayload = undefined;\n });\n\n return sub;\n }\n\n #reEmitWithNewViewLimit(): void {\n if (this.#lastPayload && this.#observer) {\n this.#observer.next?.(this.#transformPayload(this.#lastPayload));\n }\n }\n\n #transformPayload(payload: PAYLOAD): PAYLOAD {\n const resolvedList = payload.resolvedList;\n const loadedCount = resolvedList?.length ?? 0;\n\n let status: Status = payload.status;\n\n // When auto-fetching and below threshold with more pages available,\n // report \"loading\" to prevent status oscillation\n if (\n this.#autoFetchMinimum > 0\n && status === \"loaded\"\n && this.#query.hasMorePages()\n && loadedCount < this.#autoFetchMinimum\n ) {\n status = \"loading\";\n }\n\n // When query says \"loading\" but we have enough for our view, report \"loaded\"\n if (loadedCount >= this.#viewLimit && status === \"loading\") {\n status = \"loaded\";\n }\n\n return {\n ...payload,\n resolvedList: resolvedList?.slice(0, this.#viewLimit),\n hasMore: this.#viewLimit < loadedCount || payload.hasMore,\n fetchMore: this.#fetchMore,\n status,\n };\n }\n\n #createFetchMore(): () => Promise<void> {\n return () => {\n if (this.#pendingFetchMore) {\n return this.#pendingFetchMore;\n }\n\n this.#viewLimit += this.#pageSize;\n\n const loadedCount = this.#query.getLoadedCount();\n const hasMoreOnServer = this.#query.hasMorePages();\n\n if (this.#viewLimit > loadedCount && hasMoreOnServer) {\n // Need to fetch more data from server\n this.#pendingFetchMore = this.#query.fetchMore().finally(() => {\n this.#pendingFetchMore = undefined;\n });\n return this.#pendingFetchMore;\n }\n\n // We have enough data in cache, just re-emit with new viewLimit (sync)\n this.#reEmitWithNewViewLimit();\n return Promise.resolve();\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
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 { WeakRefTrie } from "./WeakRefTrie.js";
|
|
18
|
+
export class ObjectSetArrayCanonicalizer {
|
|
19
|
+
#unionTrie = new WeakRefTrie();
|
|
20
|
+
#intersectTrie = new WeakRefTrie();
|
|
21
|
+
#subtractTrie = new WeakRefTrie();
|
|
22
|
+
canonicalizeUnion(items) {
|
|
23
|
+
const sorted = [...items].sort();
|
|
24
|
+
return this.#unionTrie.lookupArray(sorted);
|
|
25
|
+
}
|
|
26
|
+
canonicalizeIntersect(items) {
|
|
27
|
+
const sorted = [...items].sort();
|
|
28
|
+
return this.#intersectTrie.lookupArray(sorted);
|
|
29
|
+
}
|
|
30
|
+
canonicalizeSubtract(items) {
|
|
31
|
+
return this.#subtractTrie.lookupArray(items);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=ObjectSetArrayCanonicalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectSetArrayCanonicalizer.js","names":["WeakRefTrie","ObjectSetArrayCanonicalizer","unionTrie","intersectTrie","subtractTrie","canonicalizeUnion","items","sorted","sort","lookupArray","canonicalizeIntersect","canonicalizeSubtract"],"sources":["ObjectSetArrayCanonicalizer.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 { WeakRefTrie } from \"./WeakRefTrie.js\";\n\nexport class ObjectSetArrayCanonicalizer {\n #unionTrie = new WeakRefTrie<string[]>();\n #intersectTrie = new WeakRefTrie<string[]>();\n #subtractTrie = new WeakRefTrie<string[]>();\n\n canonicalizeUnion(items: string[]): Canonical<string[]> {\n const sorted = [...items].sort();\n return this.#unionTrie.lookupArray(sorted) as Canonical<string[]>;\n }\n\n canonicalizeIntersect(items: string[]): Canonical<string[]> {\n const sorted = [...items].sort();\n return this.#intersectTrie.lookupArray(sorted) as Canonical<string[]>;\n }\n\n canonicalizeSubtract(items: string[]): Canonical<string[]> {\n return this.#subtractTrie.lookupArray(items) as Canonical<string[]>;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,WAAW,QAAQ,kBAAkB;AAE9C,OAAO,MAAMC,2BAA2B,CAAC;EACvC,CAACC,SAAS,GAAG,IAAIF,WAAW,CAAW,CAAC;EACxC,CAACG,aAAa,GAAG,IAAIH,WAAW,CAAW,CAAC;EAC5C,CAACI,YAAY,GAAG,IAAIJ,WAAW,CAAW,CAAC;EAE3CK,iBAAiBA,CAACC,KAAe,EAAuB;IACtD,MAAMC,MAAM,GAAG,CAAC,GAAGD,KAAK,CAAC,CAACE,IAAI,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,CAACN,SAAS,CAACO,WAAW,CAACF,MAAM,CAAC;EAC5C;EAEAG,qBAAqBA,CAACJ,KAAe,EAAuB;IAC1D,MAAMC,MAAM,GAAG,CAAC,GAAGD,KAAK,CAAC,CAACE,IAAI,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,CAACL,aAAa,CAACM,WAAW,CAACF,MAAM,CAAC;EAChD;EAEAI,oBAAoBA,CAACL,KAAe,EAAuB;IACzD,OAAO,IAAI,CAAC,CAACF,YAAY,CAACK,WAAW,CAACH,KAAK,CAAC;EAC9C;AACF","ignoreList":[]}
|
|
@@ -24,6 +24,7 @@ import { DEBUG_ONLY__cacheKeyToString } from "./CacheKey.js";
|
|
|
24
24
|
import { CacheKeys } from "./CacheKeys.js";
|
|
25
25
|
import { createChangedObjects, DEBUG_ONLY__changesToString } from "./Changes.js";
|
|
26
26
|
import { FunctionsHelper } from "./function/FunctionsHelper.js";
|
|
27
|
+
import { GenericCanonicalizer } from "./GenericCanonicalizer.js";
|
|
27
28
|
import { IntersectCanonicalizer } from "./IntersectCanonicalizer.js";
|
|
28
29
|
import { Layers } from "./Layers.js";
|
|
29
30
|
import { LinksHelper } from "./links/LinksHelper.js";
|
|
@@ -33,6 +34,7 @@ import { API_NAME_IDX as OBJECT_API_NAME_IDX, RDP_CONFIG_IDX as OBJECT_RDP_CONFI
|
|
|
33
34
|
import { ObjectCacheKeyRegistry } from "./object/ObjectCacheKeyRegistry.js";
|
|
34
35
|
import { ObjectsHelper } from "./object/ObjectsHelper.js";
|
|
35
36
|
import { ObjectSetHelper } from "./objectset/ObjectSetHelper.js";
|
|
37
|
+
import { ObjectSetArrayCanonicalizer } from "./ObjectSetArrayCanonicalizer.js";
|
|
36
38
|
import { OrderByCanonicalizer } from "./OrderByCanonicalizer.js";
|
|
37
39
|
import { PivotCanonicalizer } from "./PivotCanonicalizer.js";
|
|
38
40
|
import { Queries } from "./Queries.js";
|
|
@@ -60,6 +62,8 @@ export class Store {
|
|
|
60
62
|
pivotCanonicalizer = new PivotCanonicalizer();
|
|
61
63
|
ridListCanonicalizer = new RidListCanonicalizer();
|
|
62
64
|
selectCanonicalizer = new SelectCanonicalizer();
|
|
65
|
+
objectSetArrayCanonicalizer = new ObjectSetArrayCanonicalizer();
|
|
66
|
+
genericCanonicalizer = new GenericCanonicalizer();
|
|
63
67
|
|
|
64
68
|
/** @internal */
|
|
65
69
|
|
|
@@ -98,7 +102,7 @@ export class Store {
|
|
|
98
102
|
this.lists = new ListsHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer, this.rdpCanonicalizer, this.intersectCanonicalizer, this.pivotCanonicalizer, this.ridListCanonicalizer, this.selectCanonicalizer);
|
|
99
103
|
this.objects = new ObjectsHelper(this, this.cacheKeys);
|
|
100
104
|
this.links = new LinksHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer, this.selectCanonicalizer);
|
|
101
|
-
this.objectSets = new ObjectSetHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer, this.rdpCanonicalizer, this.selectCanonicalizer);
|
|
105
|
+
this.objectSets = new ObjectSetHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer, this.rdpCanonicalizer, this.selectCanonicalizer, this.objectSetArrayCanonicalizer);
|
|
102
106
|
}
|
|
103
107
|
|
|
104
108
|
/**
|
|
@@ -253,6 +257,17 @@ export class Store {
|
|
|
253
257
|
* @returns true if the query should be notified based on object type changes
|
|
254
258
|
*/
|
|
255
259
|
#shouldPropagateForObjectTypeChanges(cacheKey, changes) {
|
|
260
|
+
if (cacheKey.type === "objectSet") {
|
|
261
|
+
const query = this.queries.peek(cacheKey);
|
|
262
|
+
if (query) {
|
|
263
|
+
for (const objectType of query.objectTypes) {
|
|
264
|
+
if (this.#changesAffectObjectType(changes, objectType)) {
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
256
271
|
const queryObjectType = this.#getQueryObjectType(cacheKey);
|
|
257
272
|
if (!queryObjectType) {
|
|
258
273
|
return false;
|
|
@@ -289,6 +304,8 @@ export class Store {
|
|
|
289
304
|
if (query) {
|
|
290
305
|
return query.rdpConfig;
|
|
291
306
|
}
|
|
307
|
+
} else if (cacheKey.type === "mediaMetadata") {
|
|
308
|
+
return undefined;
|
|
292
309
|
}
|
|
293
310
|
// Links and other types would also be at LIST_RDP_IDX
|
|
294
311
|
}
|
|
@@ -309,6 +326,8 @@ export class Store {
|
|
|
309
326
|
return cacheKey.otherKeys[LIST_API_NAME_IDX];
|
|
310
327
|
} else if (cacheKey.type === "aggregation") {
|
|
311
328
|
return cacheKey.otherKeys[AGGREGATION_API_NAME_IDX];
|
|
329
|
+
} else if (cacheKey.type === "mediaMetadata") {
|
|
330
|
+
return cacheKey.otherKeys[0];
|
|
312
331
|
}
|
|
313
332
|
// Links would have apiName at a different position
|
|
314
333
|
}
|
|
@@ -334,6 +353,11 @@ export class Store {
|
|
|
334
353
|
if (modifiedForType && modifiedForType.length > 0) {
|
|
335
354
|
return true;
|
|
336
355
|
}
|
|
356
|
+
for (const deletedKey of changes.deleted) {
|
|
357
|
+
if (deletedKey.type === "object" && deletedKey.otherKeys[OBJECT_API_NAME_IDX] === objectType) {
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
337
361
|
return false;
|
|
338
362
|
}
|
|
339
363
|
|
|
@@ -359,7 +383,7 @@ export class Store {
|
|
|
359
383
|
}
|
|
360
384
|
const promises = [];
|
|
361
385
|
for (const cacheKey of this.layers.truth.keys()) {
|
|
362
|
-
if (changes && changes.modified.has(cacheKey)) {
|
|
386
|
+
if (cacheKey.type !== "mediaMetadata" && changes && changes.modified.has(cacheKey)) {
|
|
363
387
|
continue;
|
|
364
388
|
}
|
|
365
389
|
const query = this.queries.peek(cacheKey);
|