@osdk/client 2.8.0-beta.25 → 2.8.0-beta.27
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 +28 -0
- package/build/browser/actions/applyAction.js +4 -4
- package/build/browser/actions/applyAction.js.map +1 -1
- package/build/browser/fetchMetadata.js +1 -1
- package/build/browser/fetchMetadata.js.map +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js +11 -0
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/browser/internal/conversions/toIntervalQuery.js +56 -0
- package/build/browser/internal/conversions/toIntervalQuery.js.map +1 -0
- package/build/browser/object/SimpleOsdkProperties.js.map +1 -1
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/internal/BulkObjectLoader.js +16 -11
- package/build/browser/observable/internal/BulkObjectLoader.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/ObjectSetArrayCanonicalizer.js +34 -0
- package/build/browser/observable/internal/ObjectSetArrayCanonicalizer.js.map +1 -0
- package/build/browser/observable/internal/Store.js +21 -1
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/evaluateFilter.js +1 -0
- package/build/browser/observable/internal/evaluateFilter.js.map +1 -1
- package/build/browser/observable/internal/list/ListCacheKey.js +1 -0
- package/build/browser/observable/internal/list/ListCacheKey.js.map +1 -1
- package/build/browser/observable/internal/list/ListQuery.js +3 -0
- 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 +3 -2
- package/build/browser/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectQuery.js +6 -3
- package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectsHelper.js +3 -2
- package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js +8 -4
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js +183 -27
- 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/util/UserAgent.js +2 -2
- package/build/cjs/{chunk-R7OP6A6S.cjs → chunk-BWOPPEUP.cjs} +82 -34
- package/build/cjs/chunk-BWOPPEUP.cjs.map +1 -0
- package/build/cjs/{chunk-3RY4ECUB.cjs → chunk-ZPGIIKEZ.cjs} +44 -44
- package/build/cjs/chunk-ZPGIIKEZ.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 +371 -114
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +12 -0
- package/build/esm/actions/applyAction.js +4 -4
- package/build/esm/actions/applyAction.js.map +1 -1
- package/build/esm/fetchMetadata.js +1 -1
- package/build/esm/fetchMetadata.js.map +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js +11 -0
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/esm/internal/conversions/toIntervalQuery.js +56 -0
- package/build/esm/internal/conversions/toIntervalQuery.js.map +1 -0
- package/build/esm/object/SimpleOsdkProperties.js.map +1 -1
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/internal/BulkObjectLoader.js +16 -11
- package/build/esm/observable/internal/BulkObjectLoader.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/ObjectSetArrayCanonicalizer.js +34 -0
- package/build/esm/observable/internal/ObjectSetArrayCanonicalizer.js.map +1 -0
- package/build/esm/observable/internal/Store.js +21 -1
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/evaluateFilter.js +1 -0
- package/build/esm/observable/internal/evaluateFilter.js.map +1 -1
- package/build/esm/observable/internal/list/ListCacheKey.js +1 -0
- package/build/esm/observable/internal/list/ListCacheKey.js.map +1 -1
- package/build/esm/observable/internal/list/ListQuery.js +3 -0
- 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 +3 -2
- package/build/esm/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectQuery.js +6 -3
- package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectsHelper.js +3 -2
- package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js +8 -4
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js +183 -27
- 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/util/UserAgent.js +2 -2
- package/build/types/actions/applyAction.d.ts.map +1 -1
- package/build/types/internal/conversions/toIntervalQuery.d.ts +7 -0
- package/build/types/internal/conversions/toIntervalQuery.d.ts.map +1 -0
- package/build/types/observable/ObservableClient.d.ts +7 -0
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/internal/BulkObjectLoader.d.ts +1 -1
- package/build/types/observable/internal/BulkObjectLoader.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/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/ListCacheKey.d.ts +2 -1
- package/build/types/observable/internal/list/ListCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListQueryOptions.d.ts +1 -0
- package/build/types/observable/internal/list/ListQueryOptions.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -1
- 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.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts +1 -0
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts +3 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts +4 -1
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetQueryOptions.d.ts +6 -0
- package/build/types/observable/internal/objectset/ObjectSetQueryOptions.d.ts.map +1 -1
- package/package.json +8 -8
- package/build/cjs/chunk-3RY4ECUB.cjs.map +0 -1
- package/build/cjs/chunk-R7OP6A6S.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BulkObjectLoader.js","names":["PalantirApiError","pDefer","additionalContext","DefaultMap","DefaultWeakMap","weakCache","c","BulkObjectLoader","getBulkObjectLoader","client","get","m","data","timer","undefined","logger","maxWait","maxEntries","constructor","fetch","apiName","primaryKey","defType","select","deferred","selectKey","length","sort","join","entry","push","reject","promise","setTimeout","loadObjects","clearTimeout","#loadObjects","arr","delete","loadFn","loadInterfaceObjects","loadObjectTypeObjects","catch","e","error","errorMessage","Error","message","String","#loadObjectTypeObjects","objectDef","type","objMetadata","fetchMetadata","pks","map","x","whereClause","primaryKeyApiName","$eq","$in","where","fetchPage","$pageSize","$includeRid","$select","object","find","$primaryKey","resolve","#loadInterfaceObjects","interfaceMetadata","implementingTypes","implementedBy","foundObjects","Map","objectTypeName","remainingPks","filter","pk","has","obj","set"],"sources":["BulkObjectLoader.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n InterfaceDefinition,\n Logger,\n ObjectTypeDefinition,\n} from \"@osdk/api\";\nimport { PalantirApiError } from \"@osdk/shared.net.errors\";\nimport type { DeferredPromise } from \"p-defer\";\nimport pDefer from \"p-defer\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport type {\n ObjectHolder,\n} from \"../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { DefType } from \"../../util/interfaceUtils.js\";\nimport { DefaultMap } from \"./collections/DefaultMap.js\";\nimport { DefaultWeakMap } from \"./collections/DefaultWeakMap.js\";\n\ninterface InternalValue {\n primaryKey: string;\n deferred: DeferredPromise<ObjectHolder>;\n}\n\ninterface Accumulator {\n data: InternalValue[];\n timer?: ReturnType<typeof setTimeout>;\n defType?: DefType;\n select?: readonly string[];\n}\n\nconst weakCache = new DefaultWeakMap<Client, BulkObjectLoader>(c =>\n new BulkObjectLoader(c)\n);\n\nexport function getBulkObjectLoader(client: Client): BulkObjectLoader {\n return weakCache.get(client);\n}\n\nexport class BulkObjectLoader {\n #client: Client;\n\n #m = new DefaultMap<string, Accumulator>(() => ({\n data: [],\n timer: undefined,\n }));\n #logger: Logger | undefined;\n #maxWait: number;\n #maxEntries: number;\n\n constructor(client: Client, maxWait = 25, maxEntries = 100) {\n this.#client = client;\n this.#logger = client[additionalContext].logger;\n this.#maxWait = maxWait;\n this.#maxEntries = maxEntries;\n }\n\n public async fetch(\n apiName: string,\n primaryKey: string | number | boolean,\n defType: DefType = \"object\",\n select?: readonly string[],\n ): Promise<ObjectHolder> {\n const deferred = pDefer<ObjectHolder>();\n\n const selectKey = select && select.length > 0\n ? `${apiName}\\0${[...select].sort().join(\",\")}`\n : apiName;\n const entry = this.#m.get(selectKey);\n entry.data.push({\n primaryKey: primaryKey as string,\n deferred,\n });\n\n if (entry.defType === undefined) {\n entry.defType = defType;\n entry.select = select;\n } else if (entry.defType !== defType) {\n deferred.reject(\n new PalantirApiError(\n `Conflicting defType for ${apiName}: existing=${entry.defType}, new=${defType}`,\n ),\n );\n return deferred.promise;\n }\n\n if (!entry.timer) {\n entry.timer = setTimeout(() => {\n this.#loadObjects(\n apiName,\n entry.data,\n entry.defType ?? \"object\",\n entry.select,\n );\n }, this.#maxWait);\n }\n\n if (entry.data.length >= this.#maxEntries) {\n clearTimeout(entry.timer);\n this.#loadObjects(\n apiName,\n entry.data,\n entry.defType ?? \"object\",\n entry.select,\n );\n }\n\n return await deferred.promise;\n }\n\n #loadObjects(\n apiName: string,\n arr: InternalValue[],\n defType: DefType,\n select?: readonly string[],\n ) {\n const selectKey = select && select.length > 0\n ? `${apiName}\\0${[...select].sort().join(\",\")}`\n : apiName;\n this.#m.delete(selectKey);\n\n const loadFn = defType === \"interface\"\n ? this.#loadInterfaceObjects(apiName, arr, select)\n : this.#loadObjectTypeObjects(apiName, arr, select);\n\n loadFn.catch((e: unknown) => {\n this.#logger?.error(\"Unhandled exception\", e);\n for (const { primaryKey, deferred } of arr) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n deferred.reject(\n new PalantirApiError(\n `Failed to load ${apiName} with pk ${primaryKey}: ${errorMessage}`,\n ),\n );\n }\n });\n }\n\n async #loadObjectTypeObjects(\n apiName: string,\n arr: InternalValue[],\n select?: readonly string[],\n ) {\n const objectDef = { type: \"object\", apiName } as ObjectTypeDefinition;\n const objMetadata = await this.#client.fetchMetadata(objectDef);\n\n const pks = arr.map(x => x.primaryKey);\n\n // Use $eq for single object fetches (this is for public app compatibility)\n // Use $in for batch fetches\n const whereClause = pks.length === 1\n ? { [objMetadata.primaryKeyApiName]: { $eq: pks[0] } }\n : { [objMetadata.primaryKeyApiName]: { $in: pks } };\n\n const { data } = await this.#client(objectDef)\n .where(whereClause).fetchPage({\n $pageSize: pks.length,\n $includeRid: true,\n ...(select && select.length > 0\n ? { $select: select }\n : {}),\n });\n\n for (const { primaryKey, deferred } of arr) {\n const object = data.find(x => x.$primaryKey === primaryKey) as\n | ObjectHolder\n | undefined;\n if (object) {\n deferred.resolve(object);\n } else {\n deferred.reject(\n new PalantirApiError(`Object not found: ${primaryKey}`),\n );\n }\n }\n }\n\n async #loadInterfaceObjects(\n apiName: string,\n arr: InternalValue[],\n select?: readonly string[],\n ) {\n const pks = arr.map(x => x.primaryKey);\n\n const interfaceDef = {\n type: \"interface\",\n apiName,\n } as InterfaceDefinition;\n\n const interfaceMetadata = await this.#client.fetchMetadata(interfaceDef);\n const implementingTypes = interfaceMetadata.implementedBy ?? [];\n\n const foundObjects = new Map<string | number, ObjectHolder>();\n\n for (const objectTypeName of implementingTypes) {\n const objectDef = {\n type: \"object\",\n apiName: objectTypeName,\n } as ObjectTypeDefinition;\n const objMetadata = await this.#client.fetchMetadata(objectDef);\n\n const remainingPks = pks.filter(pk => !foundObjects.has(pk));\n if (remainingPks.length === 0) {\n break;\n }\n\n const whereClause = remainingPks.length === 1\n ? { [objMetadata.primaryKeyApiName]: { $eq: remainingPks[0] } }\n : { [objMetadata.primaryKeyApiName]: { $in: remainingPks } };\n\n const { data } = await this.#client(objectDef)\n .where(whereClause).fetchPage({\n $pageSize: remainingPks.length,\n ...(select && select.length > 0\n ? { $select: select }\n : {}),\n });\n\n for (const obj of data) {\n foundObjects.set(obj.$primaryKey, obj as ObjectHolder);\n }\n }\n\n for (const { primaryKey, deferred } of arr) {\n const object = foundObjects.get(primaryKey);\n if (object) {\n deferred.resolve(object);\n } else {\n deferred.reject(\n new PalantirApiError(\n `Interface ${apiName} object not found: ${primaryKey}`,\n ),\n );\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"BulkObjectLoader.js","names":["PalantirApiError","pDefer","additionalContext","DefaultMap","DefaultWeakMap","weakCache","c","BulkObjectLoader","getBulkObjectLoader","client","get","m","data","timer","undefined","logger","maxWait","maxEntries","constructor","fetch","apiName","primaryKey","defType","select","loadPropertySecurityMetadata","deferred","securitySuffix","selectKey","length","sort","join","entry","push","reject","promise","setTimeout","loadObjects","clearTimeout","#loadObjects","arr","delete","loadFn","loadInterfaceObjects","loadObjectTypeObjects","catch","e","error","errorMessage","Error","message","String","#loadObjectTypeObjects","objectDef","type","objMetadata","fetchMetadata","pks","map","x","whereClause","primaryKeyApiName","$eq","$in","where","fetchPage","$pageSize","$includeRid","$select","$loadPropertySecurityMetadata","object","find","$primaryKey","resolve","#loadInterfaceObjects","interfaceMetadata","implementingTypes","implementedBy","foundObjects","Map","objectTypeName","remainingPks","filter","pk","has","obj","set"],"sources":["BulkObjectLoader.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n InterfaceDefinition,\n Logger,\n ObjectTypeDefinition,\n} from \"@osdk/api\";\nimport { PalantirApiError } from \"@osdk/shared.net.errors\";\nimport type { DeferredPromise } from \"p-defer\";\nimport pDefer from \"p-defer\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport type {\n ObjectHolder,\n} from \"../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { DefType } from \"../../util/interfaceUtils.js\";\nimport { DefaultMap } from \"./collections/DefaultMap.js\";\nimport { DefaultWeakMap } from \"./collections/DefaultWeakMap.js\";\n\ninterface InternalValue {\n primaryKey: string;\n deferred: DeferredPromise<ObjectHolder>;\n}\n\ninterface Accumulator {\n data: InternalValue[];\n timer?: ReturnType<typeof setTimeout>;\n defType?: DefType;\n select?: readonly string[];\n loadPropertySecurityMetadata?: boolean;\n}\n\nconst weakCache = new DefaultWeakMap<Client, BulkObjectLoader>(c =>\n new BulkObjectLoader(c)\n);\n\nexport function getBulkObjectLoader(client: Client): BulkObjectLoader {\n return weakCache.get(client);\n}\n\nexport class BulkObjectLoader {\n #client: Client;\n\n #m = new DefaultMap<string, Accumulator>(() => ({\n data: [],\n timer: undefined,\n }));\n #logger: Logger | undefined;\n #maxWait: number;\n #maxEntries: number;\n\n constructor(client: Client, maxWait = 25, maxEntries = 100) {\n this.#client = client;\n this.#logger = client[additionalContext].logger;\n this.#maxWait = maxWait;\n this.#maxEntries = maxEntries;\n }\n\n public async fetch(\n apiName: string,\n primaryKey: string | number | boolean,\n defType: DefType = \"object\",\n select?: readonly string[],\n loadPropertySecurityMetadata?: boolean,\n ): Promise<ObjectHolder> {\n const deferred = pDefer<ObjectHolder>();\n\n const securitySuffix = loadPropertySecurityMetadata ? \"\\0sec\" : \"\";\n const selectKey = select && select.length > 0\n ? `${apiName}\\0${[...select].sort().join(\",\")}${securitySuffix}`\n : `${apiName}${securitySuffix}`;\n const entry = this.#m.get(selectKey);\n entry.data.push({\n primaryKey: primaryKey as string,\n deferred,\n });\n\n if (entry.defType === undefined) {\n entry.defType = defType;\n entry.select = select;\n entry.loadPropertySecurityMetadata = loadPropertySecurityMetadata;\n } else if (entry.defType !== defType) {\n deferred.reject(\n new PalantirApiError(\n `Conflicting defType for ${apiName}: existing=${entry.defType}, new=${defType}`,\n ),\n );\n return deferred.promise;\n }\n\n if (!entry.timer) {\n entry.timer = setTimeout(() => {\n this.#loadObjects(\n apiName,\n entry.data,\n entry.defType ?? \"object\",\n entry.select,\n entry.loadPropertySecurityMetadata,\n );\n }, this.#maxWait);\n }\n\n if (entry.data.length >= this.#maxEntries) {\n clearTimeout(entry.timer);\n this.#loadObjects(\n apiName,\n entry.data,\n entry.defType ?? \"object\",\n entry.select,\n entry.loadPropertySecurityMetadata,\n );\n }\n\n return await deferred.promise;\n }\n\n #loadObjects(\n apiName: string,\n arr: InternalValue[],\n defType: DefType,\n select?: readonly string[],\n loadPropertySecurityMetadata?: boolean,\n ) {\n const securitySuffix = loadPropertySecurityMetadata ? \"\\0sec\" : \"\";\n const selectKey = select && select.length > 0\n ? `${apiName}\\0${[...select].sort().join(\",\")}${securitySuffix}`\n : `${apiName}${securitySuffix}`;\n this.#m.delete(selectKey);\n\n const loadFn = defType === \"interface\"\n ? this.#loadInterfaceObjects(\n apiName,\n arr,\n select,\n loadPropertySecurityMetadata,\n )\n : this.#loadObjectTypeObjects(\n apiName,\n arr,\n select,\n loadPropertySecurityMetadata,\n );\n\n loadFn.catch((e: unknown) => {\n this.#logger?.error(\"Unhandled exception\", e);\n for (const { primaryKey, deferred } of arr) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n deferred.reject(\n new PalantirApiError(\n `Failed to load ${apiName} with pk ${primaryKey}: ${errorMessage}`,\n ),\n );\n }\n });\n }\n\n async #loadObjectTypeObjects(\n apiName: string,\n arr: InternalValue[],\n select?: readonly string[],\n loadPropertySecurityMetadata?: boolean,\n ) {\n const objectDef = { type: \"object\", apiName } as ObjectTypeDefinition;\n const objMetadata = await this.#client.fetchMetadata(objectDef);\n\n const pks = arr.map(x => x.primaryKey);\n\n // Use $eq for single object fetches (this is for public app compatibility)\n // Use $in for batch fetches\n const whereClause = pks.length === 1\n ? { [objMetadata.primaryKeyApiName]: { $eq: pks[0] } }\n : { [objMetadata.primaryKeyApiName]: { $in: pks } };\n\n const { data } = await this.#client(objectDef)\n .where(whereClause).fetchPage({\n $pageSize: pks.length,\n $includeRid: true,\n ...(select && select.length > 0\n ? { $select: select }\n : {}),\n $loadPropertySecurityMetadata: loadPropertySecurityMetadata ?? false,\n });\n\n for (const { primaryKey, deferred } of arr) {\n const object = data.find(x => x.$primaryKey === primaryKey) as\n | ObjectHolder\n | undefined;\n if (object) {\n deferred.resolve(object);\n } else {\n deferred.reject(\n new PalantirApiError(`Object not found: ${primaryKey}`),\n );\n }\n }\n }\n\n async #loadInterfaceObjects(\n apiName: string,\n arr: InternalValue[],\n select?: readonly string[],\n loadPropertySecurityMetadata?: boolean,\n ) {\n const pks = arr.map(x => x.primaryKey);\n\n const interfaceDef = {\n type: \"interface\",\n apiName,\n } as InterfaceDefinition;\n\n const interfaceMetadata = await this.#client.fetchMetadata(interfaceDef);\n const implementingTypes = interfaceMetadata.implementedBy ?? [];\n\n const foundObjects = new Map<string | number, ObjectHolder>();\n\n for (const objectTypeName of implementingTypes) {\n const objectDef = {\n type: \"object\",\n apiName: objectTypeName,\n } as ObjectTypeDefinition;\n const objMetadata = await this.#client.fetchMetadata(objectDef);\n\n const remainingPks = pks.filter(pk => !foundObjects.has(pk));\n if (remainingPks.length === 0) {\n break;\n }\n\n const whereClause = remainingPks.length === 1\n ? { [objMetadata.primaryKeyApiName]: { $eq: remainingPks[0] } }\n : { [objMetadata.primaryKeyApiName]: { $in: remainingPks } };\n\n const { data } = await this.#client(objectDef)\n .where(whereClause).fetchPage({\n $pageSize: remainingPks.length,\n ...(select && select.length > 0\n ? { $select: select }\n : {}),\n $loadPropertySecurityMetadata:\n (loadPropertySecurityMetadata ?? false) as boolean,\n });\n\n for (const obj of data) {\n foundObjects.set(obj.$primaryKey, obj as ObjectHolder);\n }\n }\n\n for (const { primaryKey, deferred } of arr) {\n const object = foundObjects.get(primaryKey);\n if (object) {\n deferred.resolve(object);\n } else {\n deferred.reject(\n new PalantirApiError(\n `Interface ${apiName} object not found: ${primaryKey}`,\n ),\n );\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":[]}
|
|
@@ -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;
|
|
@@ -334,6 +349,11 @@ export class Store {
|
|
|
334
349
|
if (modifiedForType && modifiedForType.length > 0) {
|
|
335
350
|
return true;
|
|
336
351
|
}
|
|
352
|
+
for (const deletedKey of changes.deleted) {
|
|
353
|
+
if (deletedKey.type === "object" && deletedKey.otherKeys[OBJECT_API_NAME_IDX] === objectType) {
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
337
357
|
return false;
|
|
338
358
|
}
|
|
339
359
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.js","names":["invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","API_NAME_IDX","AGGREGATION_API_NAME_IDX","RDP_IDX","AGGREGATION_RDP_IDX","AggregationsHelper","DEBUG_ONLY__cacheKeyToString","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","FunctionsHelper","IntersectCanonicalizer","Layers","LinksHelper","LIST_API_NAME_IDX","LIST_RDP_IDX","ListsHelper","OBJECT_API_NAME_IDX","RDP_CONFIG_IDX","OBJECT_RDP_CONFIG_IDX","ObjectCacheKeyRegistry","ObjectsHelper","ObjectSetHelper","OrderByCanonicalizer","PivotCanonicalizer","Queries","RdpCanonicalizer","RidListCanonicalizer","SelectCanonicalizer","WhereClauseCanonicalizer","Store","whereCanonicalizer","orderByCanonicalizer","rdpCanonicalizer","intersectCanonicalizer","pivotCanonicalizer","ridListCanonicalizer","selectCanonicalizer","queries","pendingCleanup","Map","objectCacheKeyRegistry","layers","logger","onRevalidate","maybeRevalidateQueries","bind","subjects","constructor","client","child","msgPrefix","cacheKeys","onDestroy","cleanupCacheKey","aggregations","functions","lists","objects","links","objectSets","key","subject","peek","console","log","JSON","stringify","closed","observed","type","otherKeys","process","env","NODE_ENV","delete","applyAction","action","args","opts","validateAction","result","$validateOnly","$returnEdits","getValue","cacheKey","top","get","batch","optimisticId","changes","batchFn","invalidateObject","apiName","pk","variants","getVariants","promises","size","push","getQuery","undefined","revalidate","query","Promise","allSettled","#maybeRevalidateQueries","methodName","isEmpty","debug","keys","maybeUpdateAndRevalidate","shouldPropagateToQuery","promise","all","#shouldPropagateToQuery","modified","has","shouldPropagateForObjectTypeChanges","queryRdpConfig","getQueryRdpConfig","#shouldPropagateForObjectTypeChanges","queryObjectType","getQueryObjectType","affected","changesAffectObjectType","queryKey","addedCount","addedObjects","length","modifiedCount","modifiedObjects","#getQueryRdpConfig","Array","isArray","rdpConfig","#getQueryObjectType","#changesAffectObjectType","objectType","addedForType","modifiedForType","invalidateObjectType","info","truth","then","invalidateAll","invalidateObjects","objectsArray","obj","$objectType","$primaryKey","invalidateFunction","params","invalidateFunctionsByObject","primaryKey"],"sources":["Store.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 ActionDefinition,\n ActionEditResponse,\n ActionValidationResponse,\n Logger,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n QueryDefinition,\n} from \"@osdk/api\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport { ActionApplication } from \"./actions/ActionApplication.js\";\nimport {\n API_NAME_IDX as AGGREGATION_API_NAME_IDX,\n RDP_IDX as AGGREGATION_RDP_IDX,\n} from \"./aggregation/AggregationCacheKey.js\";\nimport { AggregationsHelper } from \"./aggregation/AggregationsHelper.js\";\nimport type { BatchContext } from \"./BatchContext.js\";\nimport { DEBUG_ONLY__cacheKeyToString } from \"./CacheKey.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport {\n type Changes,\n createChangedObjects,\n DEBUG_ONLY__changesToString,\n} from \"./Changes.js\";\nimport { FunctionsHelper } from \"./function/FunctionsHelper.js\";\nimport { IntersectCanonicalizer } from \"./IntersectCanonicalizer.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\nimport { Layers } from \"./Layers.js\";\nimport { LinksHelper } from \"./links/LinksHelper.js\";\nimport {\n API_NAME_IDX as LIST_API_NAME_IDX,\n RDP_IDX as LIST_RDP_IDX,\n} from \"./list/ListCacheKey.js\";\nimport { ListsHelper } from \"./list/ListsHelper.js\";\nimport {\n API_NAME_IDX as OBJECT_API_NAME_IDX,\n RDP_CONFIG_IDX as OBJECT_RDP_CONFIG_IDX,\n} from \"./object/ObjectCacheKey.js\";\nimport { ObjectCacheKeyRegistry } from \"./object/ObjectCacheKeyRegistry.js\";\nimport { ObjectsHelper } from \"./object/ObjectsHelper.js\";\nimport { ObjectSetHelper } from \"./objectset/ObjectSetHelper.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport { PivotCanonicalizer } from \"./PivotCanonicalizer.js\";\nimport { Queries } from \"./Queries.js\";\nimport { type Rdp, RdpCanonicalizer } from \"./RdpCanonicalizer.js\";\nimport { RidListCanonicalizer } from \"./RidListCanonicalizer.js\";\nimport { SelectCanonicalizer } from \"./SelectCanonicalizer.js\";\nimport type { Subjects } from \"./Subjects.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\n/**\n * Central data store with layered cache architecture.\n * - Truth layer: server state | Optimistic layers: pending changes\n * - Reference counting prevents memory leaks\n * - Batch operations ensure consistency\n */\nexport class Store {\n readonly whereCanonicalizer: WhereClauseCanonicalizer =\n new WhereClauseCanonicalizer();\n readonly orderByCanonicalizer: OrderByCanonicalizer =\n new OrderByCanonicalizer();\n readonly rdpCanonicalizer: RdpCanonicalizer = new RdpCanonicalizer();\n readonly intersectCanonicalizer: IntersectCanonicalizer =\n new IntersectCanonicalizer(this.whereCanonicalizer);\n readonly pivotCanonicalizer: PivotCanonicalizer = new PivotCanonicalizer();\n readonly ridListCanonicalizer: RidListCanonicalizer =\n new RidListCanonicalizer();\n readonly selectCanonicalizer: SelectCanonicalizer = new SelectCanonicalizer();\n\n readonly client: Client;\n\n /** @internal */\n readonly logger?: Logger;\n\n readonly cacheKeys: CacheKeys<KnownCacheKey>;\n readonly queries: Queries = new Queries();\n\n /**\n * Tracks cache keys with deferred cleanup. During React unmount-remount\n * cycles, a subscription may be cleaned up and immediately re-created.\n * By deferring cleanup to a microtask, we prevent propagateWrite from\n * skipping keys that are momentarily between subscriptions.\n *\n * The value is a count (not a boolean) so multiple unsubscribes within the\n * same tick schedule the correct number of releases.\n * @internal\n */\n readonly pendingCleanup: Map<KnownCacheKey, number> = new Map();\n\n readonly objectCacheKeyRegistry: ObjectCacheKeyRegistry =\n new ObjectCacheKeyRegistry();\n\n readonly layers: Layers = new Layers({\n logger: this.logger,\n onRevalidate: this.#maybeRevalidateQueries.bind(this),\n });\n readonly subjects: Subjects = this.layers.subjects;\n\n // these are hopefully temporary\n readonly aggregations: AggregationsHelper;\n readonly functions: FunctionsHelper;\n readonly lists: ListsHelper;\n readonly objects: ObjectsHelper;\n readonly links: LinksHelper;\n readonly objectSets: ObjectSetHelper;\n\n constructor(client: Client) {\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n this.client = client;\n\n this.cacheKeys = new CacheKeys<KnownCacheKey>({\n onDestroy: this.#cleanupCacheKey,\n });\n\n this.aggregations = new AggregationsHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.rdpCanonicalizer,\n this.intersectCanonicalizer,\n );\n this.functions = new FunctionsHelper(this, this.cacheKeys);\n this.lists = new ListsHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n this.rdpCanonicalizer,\n this.intersectCanonicalizer,\n this.pivotCanonicalizer,\n this.ridListCanonicalizer,\n this.selectCanonicalizer,\n );\n this.objects = new ObjectsHelper(this, this.cacheKeys);\n this.links = new LinksHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n this.selectCanonicalizer,\n );\n this.objectSets = new ObjectSetHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n this.rdpCanonicalizer,\n this.selectCanonicalizer,\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: KnownCacheKey) => {\n const subject = this.subjects.peek(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n this.subjects.delete(key);\n this.queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (action, args, opts) => {\n return await new ActionApplication(this).applyAction(action, args, opts);\n };\n\n validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse> = async (action, args) => {\n const result = await this.client(action).applyAction(args as any, {\n $validateOnly: true,\n $returnEdits: false,\n });\n return result as ActionValidationResponse;\n };\n\n public getValue<K extends KnownCacheKey>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.layers.top.get(cacheKey);\n }\n\n batch<X>(\n { optimisticId, changes = createChangedObjects() }: {\n optimisticId?: OptimisticId;\n changes?: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n changes: Changes;\n } {\n return this.layers.batch({ optimisticId, changes }, batchFn);\n }\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n const variants = this.objectCacheKeyRegistry.getVariants(apiName, pk);\n\n // Invalidate all variant cache entries\n // Using Promise.allSettled to ensure if one invalidation fails, others will still complete.\n // This prevents a single failing query from blocking invalidation of other cache variants for the same object.\n const promises: Promise<void>[] = [];\n\n if (variants.size === 0) {\n // No registered variants - create and revalidate the base variant (no RDP)\n promises.push(\n this.objects.getQuery({\n apiName,\n pk,\n }, undefined).revalidate(/* force */ true),\n );\n } else {\n // Revalidate all registered variants\n for (const key of variants) {\n const query = this.queries.peek(key);\n if (query) {\n promises.push(query.revalidate(/* force */ true));\n }\n }\n }\n\n return Promise.allSettled(promises);\n }\n\n async #maybeRevalidateQueries(\n changes: Changes,\n optimisticId?: OptimisticId | undefined,\n ): Promise<void> {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"maybeRevalidateQueries\" })\n : undefined;\n\n if (changes.isEmpty()) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"No changes, aborting\");\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(DEBUG_ONLY__changesToString(changes), { optimisticId });\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.queries.keys()) {\n const query = this.queries.peek(cacheKey);\n if (!query?.maybeUpdateAndRevalidate) {\n continue;\n }\n\n // Only propagate to queries that should receive these changes\n if (\n !this.#shouldPropagateToQuery(\n {\n cacheKey,\n maybeUpdateAndRevalidate: query.maybeUpdateAndRevalidate,\n },\n changes,\n optimisticId,\n )\n ) {\n continue;\n }\n\n const promise = query.maybeUpdateAndRevalidate(changes, optimisticId);\n if (promise) promises.push(promise);\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"in finally\", DEBUG_ONLY__changesToString(changes));\n }\n }\n }\n\n /**\n * Determines whether changes should propagate to a specific query.\n * Prevents unnecessary observable pipeline execution for cross-propagation.\n *\n * @param query - The query to check\n * @param changes - The changes that occurred\n * @param optimisticId - Optional optimistic update ID\n * @returns true if the query should be notified of these changes\n */\n #shouldPropagateToQuery(\n query: {\n cacheKey: KnownCacheKey;\n maybeUpdateAndRevalidate?: (\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ) => Promise<void> | undefined;\n },\n changes: Changes,\n optimisticId?: OptimisticId,\n ): boolean {\n // Always propagate optimistic updates (user-initiated actions need immediate feedback)\n if (optimisticId) {\n return true;\n }\n\n // If the query's own cache key was modified (direct fetch), always propagate\n if (changes.modified.has(query.cacheKey)) {\n return true;\n }\n\n // Check if the query's object type is affected by the changes\n if (this.#shouldPropagateForObjectTypeChanges(query.cacheKey, changes)) {\n return true;\n }\n\n // For other cross-propagation (e.g., RDP field updates from unrelated object types):\n // Only propagate to queries WITH RDP configurations\n const queryRdpConfig = this.#getQueryRdpConfig(query.cacheKey);\n\n // If query has no RDP, don't propagate unrelated object changes to it\n // (it will get updates from its own direct fetches only)\n return queryRdpConfig != null;\n }\n\n /**\n * Checks if changes to an object type should propagate to a query.\n * This ensures queries receive updates when objects of their type are added/modified.\n *\n * @param cacheKey - The cache key of the query\n * @param changes - The changes that occurred\n * @returns true if the query should be notified based on object type changes\n */\n #shouldPropagateForObjectTypeChanges(\n cacheKey: KnownCacheKey,\n changes: Changes,\n ): boolean {\n const queryObjectType = this.#getQueryObjectType(cacheKey);\n if (!queryObjectType) {\n return false;\n }\n\n const affected = this.#changesAffectObjectType(changes, queryObjectType);\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"shouldPropagateToQuery\" }).debug(\n `Query type: ${queryObjectType}, affected: ${affected}`,\n {\n queryKey: DEBUG_ONLY__cacheKeyToString(cacheKey),\n addedCount: changes.addedObjects.get(queryObjectType)?.length ?? 0,\n modifiedCount: changes.modifiedObjects.get(queryObjectType)?.length\n ?? 0,\n },\n );\n }\n\n return affected;\n }\n\n /**\n * Extracts RDP configuration from a cache key if present.\n *\n * @param cacheKey - The cache key to check\n * @returns The RDP configuration, null, or undefined\n */\n #getQueryRdpConfig(\n cacheKey: KnownCacheKey,\n ): Canonical<Rdp> | null | undefined {\n if (\"otherKeys\" in cacheKey && Array.isArray(cacheKey.otherKeys)) {\n if (cacheKey.type === \"object\") {\n return cacheKey.otherKeys[OBJECT_RDP_CONFIG_IDX];\n } else if (cacheKey.type === \"list\") {\n return cacheKey.otherKeys[LIST_RDP_IDX];\n } else if (cacheKey.type === \"aggregation\") {\n return cacheKey.otherKeys[AGGREGATION_RDP_IDX];\n } else if (cacheKey.type === \"objectSet\") {\n const query = this.queries.peek(cacheKey);\n if (query) {\n return query.rdpConfig;\n }\n }\n // Links and other types would also be at LIST_RDP_IDX\n }\n return undefined;\n }\n\n /**\n * Extracts the object type (apiName) from a cache key.\n *\n * @param cacheKey - The cache key to check\n * @returns The object type/apiName, or undefined if not applicable\n */\n #getQueryObjectType(cacheKey: KnownCacheKey): string | undefined {\n if (\"otherKeys\" in cacheKey && Array.isArray(cacheKey.otherKeys)) {\n if (cacheKey.type === \"object\") {\n return cacheKey.otherKeys[OBJECT_API_NAME_IDX];\n } else if (cacheKey.type === \"list\") {\n return cacheKey.otherKeys[LIST_API_NAME_IDX];\n } else if (cacheKey.type === \"aggregation\") {\n return cacheKey.otherKeys[AGGREGATION_API_NAME_IDX];\n }\n // Links would have apiName at a different position\n }\n return undefined;\n }\n\n /**\n * Checks if changes affect a specific object type.\n *\n * @param changes - The changes to check\n * @param objectType - The object type to check for\n * @returns true if the changes include added or modified objects of this type\n */\n #changesAffectObjectType(changes: Changes, objectType: string): boolean {\n // Check added objects (MultiMap.get returns an array)\n const addedForType = changes.addedObjects.get(objectType);\n if (addedForType && addedForType.length > 0) {\n return true;\n }\n\n // Check modified objects (MultiMap.get returns an array)\n const modifiedForType = changes.modifiedObjects.get(objectType);\n if (modifiedForType && modifiedForType.length > 0) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Invalidates all cache entries for a specific object type.\n * This will revalidate:\n * 1. All objects of the specified type\n * 2. All lists of the specified type\n * 3. All links where the source object is of the specified type\n *\n * @param apiName - The API name of the object type to invalidate\n * @param changes - Optional changes object to track what has been modified\n * @returns Promise that resolves when all invalidations are complete\n */\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n changes: Changes | undefined,\n ): Promise<void> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"invalidateObjectType\" }).info(\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<void>> = [];\n\n for (const cacheKey of this.layers.truth.keys()) {\n if (changes && changes.modified.has(cacheKey)) {\n continue;\n }\n const query = this.queries.peek(cacheKey);\n if (!query) continue;\n\n promises.push(query.invalidateObjectType(apiName, changes));\n }\n\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n\n public async invalidateAll(): Promise<void> {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.queries.keys()) {\n const query = this.queries.peek(cacheKey);\n if (query) {\n promises.push(query.revalidate(true));\n }\n }\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n\n public async invalidateObjects(\n objects:\n | Osdk.Instance<ObjectTypeDefinition>\n | ReadonlyArray<Osdk.Instance<ObjectTypeDefinition>>,\n ): Promise<void> {\n const objectsArray = Array.isArray(objects) ? objects : [objects];\n const promises: Array<Promise<unknown>> = [];\n\n for (const obj of objectsArray) {\n promises.push(this.invalidateObject(obj.$objectType, obj.$primaryKey));\n }\n\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n\n public async invalidateFunction(\n apiName: string | QueryDefinition<unknown>,\n params?: Record<string, unknown>,\n ): Promise<void> {\n return this.functions.invalidateFunction(apiName, params);\n }\n\n public async invalidateFunctionsByObject(\n apiName: string,\n primaryKey: string | number,\n ): Promise<void> {\n return this.functions.invalidateFunctionsByObject(apiName, primaryKey);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Store.js","names":["invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","API_NAME_IDX","AGGREGATION_API_NAME_IDX","RDP_IDX","AGGREGATION_RDP_IDX","AggregationsHelper","DEBUG_ONLY__cacheKeyToString","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","FunctionsHelper","GenericCanonicalizer","IntersectCanonicalizer","Layers","LinksHelper","LIST_API_NAME_IDX","LIST_RDP_IDX","ListsHelper","OBJECT_API_NAME_IDX","RDP_CONFIG_IDX","OBJECT_RDP_CONFIG_IDX","ObjectCacheKeyRegistry","ObjectsHelper","ObjectSetHelper","ObjectSetArrayCanonicalizer","OrderByCanonicalizer","PivotCanonicalizer","Queries","RdpCanonicalizer","RidListCanonicalizer","SelectCanonicalizer","WhereClauseCanonicalizer","Store","whereCanonicalizer","orderByCanonicalizer","rdpCanonicalizer","intersectCanonicalizer","pivotCanonicalizer","ridListCanonicalizer","selectCanonicalizer","objectSetArrayCanonicalizer","genericCanonicalizer","queries","pendingCleanup","Map","objectCacheKeyRegistry","layers","logger","onRevalidate","maybeRevalidateQueries","bind","subjects","constructor","client","child","msgPrefix","cacheKeys","onDestroy","cleanupCacheKey","aggregations","functions","lists","objects","links","objectSets","key","subject","peek","console","log","JSON","stringify","closed","observed","type","otherKeys","process","env","NODE_ENV","delete","applyAction","action","args","opts","validateAction","result","$validateOnly","$returnEdits","getValue","cacheKey","top","get","batch","optimisticId","changes","batchFn","invalidateObject","apiName","pk","variants","getVariants","promises","size","push","getQuery","undefined","revalidate","query","Promise","allSettled","#maybeRevalidateQueries","methodName","isEmpty","debug","keys","maybeUpdateAndRevalidate","shouldPropagateToQuery","promise","all","#shouldPropagateToQuery","modified","has","shouldPropagateForObjectTypeChanges","queryRdpConfig","getQueryRdpConfig","#shouldPropagateForObjectTypeChanges","objectType","objectTypes","changesAffectObjectType","queryObjectType","getQueryObjectType","affected","queryKey","addedCount","addedObjects","length","modifiedCount","modifiedObjects","#getQueryRdpConfig","Array","isArray","rdpConfig","#getQueryObjectType","#changesAffectObjectType","addedForType","modifiedForType","deletedKey","deleted","invalidateObjectType","info","truth","then","invalidateAll","invalidateObjects","objectsArray","obj","$objectType","$primaryKey","invalidateFunction","params","invalidateFunctionsByObject","primaryKey"],"sources":["Store.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 ActionDefinition,\n ActionEditResponse,\n ActionValidationResponse,\n Logger,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n QueryDefinition,\n} from \"@osdk/api\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport { ActionApplication } from \"./actions/ActionApplication.js\";\nimport {\n API_NAME_IDX as AGGREGATION_API_NAME_IDX,\n RDP_IDX as AGGREGATION_RDP_IDX,\n} from \"./aggregation/AggregationCacheKey.js\";\nimport { AggregationsHelper } from \"./aggregation/AggregationsHelper.js\";\nimport type { BatchContext } from \"./BatchContext.js\";\nimport { DEBUG_ONLY__cacheKeyToString } from \"./CacheKey.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport {\n type Changes,\n createChangedObjects,\n DEBUG_ONLY__changesToString,\n} from \"./Changes.js\";\nimport { FunctionsHelper } from \"./function/FunctionsHelper.js\";\nimport { GenericCanonicalizer } from \"./GenericCanonicalizer.js\";\nimport { IntersectCanonicalizer } from \"./IntersectCanonicalizer.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\nimport { Layers } from \"./Layers.js\";\nimport { LinksHelper } from \"./links/LinksHelper.js\";\nimport {\n API_NAME_IDX as LIST_API_NAME_IDX,\n RDP_IDX as LIST_RDP_IDX,\n} from \"./list/ListCacheKey.js\";\nimport { ListsHelper } from \"./list/ListsHelper.js\";\nimport {\n API_NAME_IDX as OBJECT_API_NAME_IDX,\n RDP_CONFIG_IDX as OBJECT_RDP_CONFIG_IDX,\n} from \"./object/ObjectCacheKey.js\";\nimport { ObjectCacheKeyRegistry } from \"./object/ObjectCacheKeyRegistry.js\";\nimport { ObjectsHelper } from \"./object/ObjectsHelper.js\";\nimport { ObjectSetHelper } from \"./objectset/ObjectSetHelper.js\";\nimport { ObjectSetArrayCanonicalizer } from \"./ObjectSetArrayCanonicalizer.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport { PivotCanonicalizer } from \"./PivotCanonicalizer.js\";\nimport { Queries } from \"./Queries.js\";\nimport { type Rdp, RdpCanonicalizer } from \"./RdpCanonicalizer.js\";\nimport { RidListCanonicalizer } from \"./RidListCanonicalizer.js\";\nimport { SelectCanonicalizer } from \"./SelectCanonicalizer.js\";\nimport type { Subjects } from \"./Subjects.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\n/**\n * Central data store with layered cache architecture.\n * - Truth layer: server state | Optimistic layers: pending changes\n * - Reference counting prevents memory leaks\n * - Batch operations ensure consistency\n */\nexport class Store {\n readonly whereCanonicalizer: WhereClauseCanonicalizer =\n new WhereClauseCanonicalizer();\n readonly orderByCanonicalizer: OrderByCanonicalizer =\n new OrderByCanonicalizer();\n readonly rdpCanonicalizer: RdpCanonicalizer = new RdpCanonicalizer();\n readonly intersectCanonicalizer: IntersectCanonicalizer =\n new IntersectCanonicalizer(this.whereCanonicalizer);\n readonly pivotCanonicalizer: PivotCanonicalizer = new PivotCanonicalizer();\n readonly ridListCanonicalizer: RidListCanonicalizer =\n new RidListCanonicalizer();\n readonly selectCanonicalizer: SelectCanonicalizer = new SelectCanonicalizer();\n readonly objectSetArrayCanonicalizer: ObjectSetArrayCanonicalizer =\n new ObjectSetArrayCanonicalizer();\n readonly genericCanonicalizer: GenericCanonicalizer =\n new GenericCanonicalizer();\n\n readonly client: Client;\n\n /** @internal */\n readonly logger?: Logger;\n\n readonly cacheKeys: CacheKeys<KnownCacheKey>;\n readonly queries: Queries = new Queries();\n\n /**\n * Tracks cache keys with deferred cleanup. During React unmount-remount\n * cycles, a subscription may be cleaned up and immediately re-created.\n * By deferring cleanup to a microtask, we prevent propagateWrite from\n * skipping keys that are momentarily between subscriptions.\n *\n * The value is a count (not a boolean) so multiple unsubscribes within the\n * same tick schedule the correct number of releases.\n * @internal\n */\n readonly pendingCleanup: Map<KnownCacheKey, number> = new Map();\n\n readonly objectCacheKeyRegistry: ObjectCacheKeyRegistry =\n new ObjectCacheKeyRegistry();\n\n readonly layers: Layers = new Layers({\n logger: this.logger,\n onRevalidate: this.#maybeRevalidateQueries.bind(this),\n });\n readonly subjects: Subjects = this.layers.subjects;\n\n // these are hopefully temporary\n readonly aggregations: AggregationsHelper;\n readonly functions: FunctionsHelper;\n readonly lists: ListsHelper;\n readonly objects: ObjectsHelper;\n readonly links: LinksHelper;\n readonly objectSets: ObjectSetHelper;\n\n constructor(client: Client) {\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n this.client = client;\n\n this.cacheKeys = new CacheKeys<KnownCacheKey>({\n onDestroy: this.#cleanupCacheKey,\n });\n\n this.aggregations = new AggregationsHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.rdpCanonicalizer,\n this.intersectCanonicalizer,\n );\n this.functions = new FunctionsHelper(this, this.cacheKeys);\n this.lists = new ListsHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n this.rdpCanonicalizer,\n this.intersectCanonicalizer,\n this.pivotCanonicalizer,\n this.ridListCanonicalizer,\n this.selectCanonicalizer,\n );\n this.objects = new ObjectsHelper(this, this.cacheKeys);\n this.links = new LinksHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n this.selectCanonicalizer,\n );\n this.objectSets = new ObjectSetHelper(\n this,\n this.cacheKeys,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n this.rdpCanonicalizer,\n this.selectCanonicalizer,\n this.objectSetArrayCanonicalizer,\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: KnownCacheKey) => {\n const subject = this.subjects.peek(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n this.subjects.delete(key);\n this.queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (action, args, opts) => {\n return await new ActionApplication(this).applyAction(action, args, opts);\n };\n\n validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse> = async (action, args) => {\n const result = await this.client(action).applyAction(args as any, {\n $validateOnly: true,\n $returnEdits: false,\n });\n return result as ActionValidationResponse;\n };\n\n public getValue<K extends KnownCacheKey>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.layers.top.get(cacheKey);\n }\n\n batch<X>(\n { optimisticId, changes = createChangedObjects() }: {\n optimisticId?: OptimisticId;\n changes?: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n changes: Changes;\n } {\n return this.layers.batch({ optimisticId, changes }, batchFn);\n }\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n const variants = this.objectCacheKeyRegistry.getVariants(apiName, pk);\n\n // Invalidate all variant cache entries\n // Using Promise.allSettled to ensure if one invalidation fails, others will still complete.\n // This prevents a single failing query from blocking invalidation of other cache variants for the same object.\n const promises: Promise<void>[] = [];\n\n if (variants.size === 0) {\n // No registered variants - create and revalidate the base variant (no RDP)\n promises.push(\n this.objects.getQuery({\n apiName,\n pk,\n }, undefined).revalidate(/* force */ true),\n );\n } else {\n // Revalidate all registered variants\n for (const key of variants) {\n const query = this.queries.peek(key);\n if (query) {\n promises.push(query.revalidate(/* force */ true));\n }\n }\n }\n\n return Promise.allSettled(promises);\n }\n\n async #maybeRevalidateQueries(\n changes: Changes,\n optimisticId?: OptimisticId | undefined,\n ): Promise<void> {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"maybeRevalidateQueries\" })\n : undefined;\n\n if (changes.isEmpty()) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"No changes, aborting\");\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(DEBUG_ONLY__changesToString(changes), { optimisticId });\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.queries.keys()) {\n const query = this.queries.peek(cacheKey);\n if (!query?.maybeUpdateAndRevalidate) {\n continue;\n }\n\n // Only propagate to queries that should receive these changes\n if (\n !this.#shouldPropagateToQuery(\n {\n cacheKey,\n maybeUpdateAndRevalidate: query.maybeUpdateAndRevalidate,\n },\n changes,\n optimisticId,\n )\n ) {\n continue;\n }\n\n const promise = query.maybeUpdateAndRevalidate(changes, optimisticId);\n if (promise) promises.push(promise);\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"in finally\", DEBUG_ONLY__changesToString(changes));\n }\n }\n }\n\n /**\n * Determines whether changes should propagate to a specific query.\n * Prevents unnecessary observable pipeline execution for cross-propagation.\n *\n * @param query - The query to check\n * @param changes - The changes that occurred\n * @param optimisticId - Optional optimistic update ID\n * @returns true if the query should be notified of these changes\n */\n #shouldPropagateToQuery(\n query: {\n cacheKey: KnownCacheKey;\n maybeUpdateAndRevalidate?: (\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ) => Promise<void> | undefined;\n },\n changes: Changes,\n optimisticId?: OptimisticId,\n ): boolean {\n // Always propagate optimistic updates (user-initiated actions need immediate feedback)\n if (optimisticId) {\n return true;\n }\n\n // If the query's own cache key was modified (direct fetch), always propagate\n if (changes.modified.has(query.cacheKey)) {\n return true;\n }\n\n // Check if the query's object type is affected by the changes\n if (this.#shouldPropagateForObjectTypeChanges(query.cacheKey, changes)) {\n return true;\n }\n\n // For other cross-propagation (e.g., RDP field updates from unrelated object types):\n // Only propagate to queries WITH RDP configurations\n const queryRdpConfig = this.#getQueryRdpConfig(query.cacheKey);\n\n // If query has no RDP, don't propagate unrelated object changes to it\n // (it will get updates from its own direct fetches only)\n return queryRdpConfig != null;\n }\n\n /**\n * Checks if changes to an object type should propagate to a query.\n * This ensures queries receive updates when objects of their type are added/modified.\n *\n * @param cacheKey - The cache key of the query\n * @param changes - The changes that occurred\n * @returns true if the query should be notified based on object type changes\n */\n #shouldPropagateForObjectTypeChanges(\n cacheKey: KnownCacheKey,\n changes: Changes,\n ): boolean {\n if (cacheKey.type === \"objectSet\") {\n const query = this.queries.peek(cacheKey);\n if (query) {\n for (const objectType of query.objectTypes) {\n if (this.#changesAffectObjectType(changes, objectType)) {\n return true;\n }\n }\n }\n return false;\n }\n\n const queryObjectType = this.#getQueryObjectType(cacheKey);\n if (!queryObjectType) {\n return false;\n }\n\n const affected = this.#changesAffectObjectType(changes, queryObjectType);\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"shouldPropagateToQuery\" }).debug(\n `Query type: ${queryObjectType}, affected: ${affected}`,\n {\n queryKey: DEBUG_ONLY__cacheKeyToString(cacheKey),\n addedCount: changes.addedObjects.get(queryObjectType)?.length ?? 0,\n modifiedCount: changes.modifiedObjects.get(queryObjectType)?.length\n ?? 0,\n },\n );\n }\n\n return affected;\n }\n\n /**\n * Extracts RDP configuration from a cache key if present.\n *\n * @param cacheKey - The cache key to check\n * @returns The RDP configuration, null, or undefined\n */\n #getQueryRdpConfig(\n cacheKey: KnownCacheKey,\n ): Canonical<Rdp> | null | undefined {\n if (\"otherKeys\" in cacheKey && Array.isArray(cacheKey.otherKeys)) {\n if (cacheKey.type === \"object\") {\n return cacheKey.otherKeys[OBJECT_RDP_CONFIG_IDX];\n } else if (cacheKey.type === \"list\") {\n return cacheKey.otherKeys[LIST_RDP_IDX];\n } else if (cacheKey.type === \"aggregation\") {\n return cacheKey.otherKeys[AGGREGATION_RDP_IDX];\n } else if (cacheKey.type === \"objectSet\") {\n const query = this.queries.peek(cacheKey);\n if (query) {\n return query.rdpConfig;\n }\n }\n // Links and other types would also be at LIST_RDP_IDX\n }\n return undefined;\n }\n\n /**\n * Extracts the object type (apiName) from a cache key.\n *\n * @param cacheKey - The cache key to check\n * @returns The object type/apiName, or undefined if not applicable\n */\n #getQueryObjectType(cacheKey: KnownCacheKey): string | undefined {\n if (\"otherKeys\" in cacheKey && Array.isArray(cacheKey.otherKeys)) {\n if (cacheKey.type === \"object\") {\n return cacheKey.otherKeys[OBJECT_API_NAME_IDX];\n } else if (cacheKey.type === \"list\") {\n return cacheKey.otherKeys[LIST_API_NAME_IDX];\n } else if (cacheKey.type === \"aggregation\") {\n return cacheKey.otherKeys[AGGREGATION_API_NAME_IDX];\n }\n // Links would have apiName at a different position\n }\n return undefined;\n }\n\n /**\n * Checks if changes affect a specific object type.\n *\n * @param changes - The changes to check\n * @param objectType - The object type to check for\n * @returns true if the changes include added or modified objects of this type\n */\n #changesAffectObjectType(changes: Changes, objectType: string): boolean {\n // Check added objects (MultiMap.get returns an array)\n const addedForType = changes.addedObjects.get(objectType);\n if (addedForType && addedForType.length > 0) {\n return true;\n }\n\n // Check modified objects (MultiMap.get returns an array)\n const modifiedForType = changes.modifiedObjects.get(objectType);\n if (modifiedForType && modifiedForType.length > 0) {\n return true;\n }\n\n for (const deletedKey of changes.deleted) {\n if (\n deletedKey.type === \"object\"\n && deletedKey.otherKeys[OBJECT_API_NAME_IDX] === objectType\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Invalidates all cache entries for a specific object type.\n * This will revalidate:\n * 1. All objects of the specified type\n * 2. All lists of the specified type\n * 3. All links where the source object is of the specified type\n *\n * @param apiName - The API name of the object type to invalidate\n * @param changes - Optional changes object to track what has been modified\n * @returns Promise that resolves when all invalidations are complete\n */\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n changes: Changes | undefined,\n ): Promise<void> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"invalidateObjectType\" }).info(\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<void>> = [];\n\n for (const cacheKey of this.layers.truth.keys()) {\n if (changes && changes.modified.has(cacheKey)) {\n continue;\n }\n const query = this.queries.peek(cacheKey);\n if (!query) continue;\n\n promises.push(query.invalidateObjectType(apiName, changes));\n }\n\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n\n public async invalidateAll(): Promise<void> {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.queries.keys()) {\n const query = this.queries.peek(cacheKey);\n if (query) {\n promises.push(query.revalidate(true));\n }\n }\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n\n public async invalidateObjects(\n objects:\n | Osdk.Instance<ObjectTypeDefinition>\n | ReadonlyArray<Osdk.Instance<ObjectTypeDefinition>>,\n ): Promise<void> {\n const objectsArray = Array.isArray(objects) ? objects : [objects];\n const promises: Array<Promise<unknown>> = [];\n\n for (const obj of objectsArray) {\n promises.push(this.invalidateObject(obj.$objectType, obj.$primaryKey));\n }\n\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n\n public async invalidateFunction(\n apiName: string | QueryDefinition<unknown>,\n params?: Record<string, unknown>,\n ): Promise<void> {\n return this.functions.invalidateFunction(apiName, params);\n }\n\n public async invalidateFunctionsByObject(\n apiName: string,\n primaryKey: string | number,\n ): Promise<void> {\n return this.functions.invalidateFunctionsByObject(apiName, primaryKey);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -44,6 +44,7 @@ export function evaluateFilter(f, realValue, expected, strict) {
|
|
|
44
44
|
case "$containsAllTerms":
|
|
45
45
|
case "$containsAllTermsInOrder":
|
|
46
46
|
case "$containsAnyTerm":
|
|
47
|
+
case "$interval":
|
|
47
48
|
case "$intersects":
|
|
48
49
|
case "$within":
|
|
49
50
|
// for these we will strictly say no and loosely say yes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluateFilter.js","names":["invariant","evaluateFilter","f","realValue","expected","strict","Array","isArray","includes","startsWith","process","env","NODE_ENV"],"sources":["evaluateFilter.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 { PossibleWhereClauseFilters } from \"@osdk/api\";\nimport invariant from \"tiny-invariant\";\n\n/**\n * Evaluates a where clause filter against a value.\n * This is a runtime evaluation function that handles different property types.\n */\nexport function evaluateFilter(\n f: PossibleWhereClauseFilters,\n realValue: any,\n expected: any,\n strict: boolean,\n): boolean {\n switch (f) {\n case \"$eq\":\n return realValue === expected;\n case \"$gt\":\n return realValue > expected;\n case \"$lt\":\n return realValue < expected;\n case \"$gte\":\n return realValue >= expected;\n case \"$lte\":\n return realValue <= expected;\n case \"$ne\":\n return realValue !== expected;\n case \"$in\":\n return Array.isArray(expected) && expected.includes(realValue);\n case \"$isNull\":\n return realValue == null;\n case \"$startsWith\":\n return realValue.startsWith(expected);\n case \"$contains\":\n case \"$containsAllTerms\":\n case \"$containsAllTermsInOrder\":\n case \"$containsAnyTerm\":\n case \"$intersects\":\n case \"$within\":\n // for these we will strictly say no and loosely say yes\n // so that they don't change things now but may if reloaded\n return !strict;\n\n default:\n // same thing here as the above cases but we will catch the\n // exhaustive check in dev\n if (process.env.NODE_ENV !== \"production\") {\n const exhaustive: never = f;\n invariant(false, `Unknown where filter ${f}`);\n }\n return !strict;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,SAAS,MAAM,gBAAgB;;AAEtC;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,CAA6B,EAC7BC,SAAc,EACdC,QAAa,EACbC,MAAe,EACN;EACT,QAAQH,CAAC;IACP,KAAK,KAAK;MACR,OAAOC,SAAS,KAAKC,QAAQ;IAC/B,KAAK,KAAK;MACR,OAAOD,SAAS,GAAGC,QAAQ;IAC7B,KAAK,KAAK;MACR,OAAOD,SAAS,GAAGC,QAAQ;IAC7B,KAAK,MAAM;MACT,OAAOD,SAAS,IAAIC,QAAQ;IAC9B,KAAK,MAAM;MACT,OAAOD,SAAS,IAAIC,QAAQ;IAC9B,KAAK,KAAK;MACR,OAAOD,SAAS,KAAKC,QAAQ;IAC/B,KAAK,KAAK;MACR,OAAOE,KAAK,CAACC,OAAO,CAACH,QAAQ,CAAC,IAAIA,QAAQ,CAACI,QAAQ,CAACL,SAAS,CAAC;IAChE,KAAK,SAAS;MACZ,OAAOA,SAAS,IAAI,IAAI;IAC1B,KAAK,aAAa;MAChB,OAAOA,SAAS,CAACM,UAAU,CAACL,QAAQ,CAAC;IACvC,KAAK,WAAW;IAChB,KAAK,mBAAmB;IACxB,KAAK,0BAA0B;IAC/B,KAAK,kBAAkB;IACvB,KAAK,aAAa;IAClB,KAAK,SAAS;MACZ;MACA;MACA,OAAO,CAACC,MAAM;IAEhB;MACE;MACA;MACA,IAAIK,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QAEzCF,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAAZ,SAAS,QAAQ,wBAAwBE,CAAC,EAAE,IAA5CF,SAAS;MACX;MACA,OAAO,CAACK,MAAM;EAClB;AACF","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"evaluateFilter.js","names":["invariant","evaluateFilter","f","realValue","expected","strict","Array","isArray","includes","startsWith","process","env","NODE_ENV"],"sources":["evaluateFilter.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 { PossibleWhereClauseFilters } from \"@osdk/api\";\nimport invariant from \"tiny-invariant\";\n\n/**\n * Evaluates a where clause filter against a value.\n * This is a runtime evaluation function that handles different property types.\n */\nexport function evaluateFilter(\n f: PossibleWhereClauseFilters,\n realValue: any,\n expected: any,\n strict: boolean,\n): boolean {\n switch (f) {\n case \"$eq\":\n return realValue === expected;\n case \"$gt\":\n return realValue > expected;\n case \"$lt\":\n return realValue < expected;\n case \"$gte\":\n return realValue >= expected;\n case \"$lte\":\n return realValue <= expected;\n case \"$ne\":\n return realValue !== expected;\n case \"$in\":\n return Array.isArray(expected) && expected.includes(realValue);\n case \"$isNull\":\n return realValue == null;\n case \"$startsWith\":\n return realValue.startsWith(expected);\n case \"$contains\":\n case \"$containsAllTerms\":\n case \"$containsAllTermsInOrder\":\n case \"$containsAnyTerm\":\n case \"$interval\":\n case \"$intersects\":\n case \"$within\":\n // for these we will strictly say no and loosely say yes\n // so that they don't change things now but may if reloaded\n return !strict;\n\n default:\n // same thing here as the above cases but we will catch the\n // exhaustive check in dev\n if (process.env.NODE_ENV !== \"production\") {\n const exhaustive: never = f;\n invariant(false, `Unknown where filter ${f}`);\n }\n return !strict;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,SAAS,MAAM,gBAAgB;;AAEtC;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,CAA6B,EAC7BC,SAAc,EACdC,QAAa,EACbC,MAAe,EACN;EACT,QAAQH,CAAC;IACP,KAAK,KAAK;MACR,OAAOC,SAAS,KAAKC,QAAQ;IAC/B,KAAK,KAAK;MACR,OAAOD,SAAS,GAAGC,QAAQ;IAC7B,KAAK,KAAK;MACR,OAAOD,SAAS,GAAGC,QAAQ;IAC7B,KAAK,MAAM;MACT,OAAOD,SAAS,IAAIC,QAAQ;IAC9B,KAAK,MAAM;MACT,OAAOD,SAAS,IAAIC,QAAQ;IAC9B,KAAK,KAAK;MACR,OAAOD,SAAS,KAAKC,QAAQ;IAC/B,KAAK,KAAK;MACR,OAAOE,KAAK,CAACC,OAAO,CAACH,QAAQ,CAAC,IAAIA,QAAQ,CAACI,QAAQ,CAACL,SAAS,CAAC;IAChE,KAAK,SAAS;MACZ,OAAOA,SAAS,IAAI,IAAI;IAC1B,KAAK,aAAa;MAChB,OAAOA,SAAS,CAACM,UAAU,CAACL,QAAQ,CAAC;IACvC,KAAK,WAAW;IAChB,KAAK,mBAAmB;IACxB,KAAK,0BAA0B;IAC/B,KAAK,kBAAkB;IACvB,KAAK,WAAW;IAChB,KAAK,aAAa;IAClB,KAAK,SAAS;MACZ;MACA;MACA,OAAO,CAACC,MAAM;IAEhB;MACE;MACA;MACA,IAAIK,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QAEzCF,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAAZ,SAAS,QAAQ,wBAAwBE,CAAC,EAAE,IAA5CF,SAAS;MACX;MACA,OAAO,CAACK,MAAM;EAClB;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListCacheKey.js","names":["TYPE_IDX","API_NAME_IDX","WHERE_IDX","ORDER_BY_IDX","RDP_IDX","INTERSECT_IDX","PIVOT_IDX","RIDS_IDX","SELECT_IDX"],"sources":["ListCacheKey.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { CollectionStorageData } from \"../base-list/BaseCollectionQuery.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { PivotInfo } from \"../PivotCanonicalizer.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { ListQuery } from \"./ListQuery.js\";\n\n// Index constants for accessing otherKeys array elements\nexport const TYPE_IDX = 0;\nexport const API_NAME_IDX = 1;\nexport const WHERE_IDX = 2;\nexport const ORDER_BY_IDX = 3;\nexport const RDP_IDX = 4;\nexport const INTERSECT_IDX = 5;\nexport const PIVOT_IDX = 6;\nexport const RIDS_IDX = 7;\nexport const SELECT_IDX = 8;\n\nexport interface ListStorageData extends CollectionStorageData {}\n\nexport interface ListCacheKey extends\n CacheKey<\n \"list\",\n ListStorageData,\n ListQuery,\n [\n type: \"object\" | \"interface\",\n apiName: string,\n whereClause: Canonical<SimpleWhereClause>,\n orderByClause: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>,\n rdpConfig?: Canonical<Rdp> | undefined,\n intersectWith?:\n | Canonical<Array<Canonical<SimpleWhereClause>>>\n | undefined,\n pivotInfo?: Canonical<PivotInfo> | undefined,\n rids?: Canonical<string[]> | undefined,\n select?: Canonical<readonly string[]> | undefined,\n ]\n >\n{\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA,OAAO,MAAMA,QAAQ,GAAG,CAAC;AACzB,OAAO,MAAMC,YAAY,GAAG,CAAC;AAC7B,OAAO,MAAMC,SAAS,GAAG,CAAC;AAC1B,OAAO,MAAMC,YAAY,GAAG,CAAC;AAC7B,OAAO,MAAMC,OAAO,GAAG,CAAC;AACxB,OAAO,MAAMC,aAAa,GAAG,CAAC;AAC9B,OAAO,MAAMC,SAAS,GAAG,CAAC;AAC1B,OAAO,MAAMC,QAAQ,GAAG,CAAC;AACzB,OAAO,MAAMC,UAAU,GAAG,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ListCacheKey.js","names":["TYPE_IDX","API_NAME_IDX","WHERE_IDX","ORDER_BY_IDX","RDP_IDX","INTERSECT_IDX","PIVOT_IDX","RIDS_IDX","SELECT_IDX","LOAD_PROPERTY_SECURITY_IDX"],"sources":["ListCacheKey.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { CollectionStorageData } from \"../base-list/BaseCollectionQuery.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { PivotInfo } from \"../PivotCanonicalizer.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { ListQuery } from \"./ListQuery.js\";\n\n// Index constants for accessing otherKeys array elements\nexport const TYPE_IDX = 0;\nexport const API_NAME_IDX = 1;\nexport const WHERE_IDX = 2;\nexport const ORDER_BY_IDX = 3;\nexport const RDP_IDX = 4;\nexport const INTERSECT_IDX = 5;\nexport const PIVOT_IDX = 6;\nexport const RIDS_IDX = 7;\nexport const SELECT_IDX = 8;\nexport const LOAD_PROPERTY_SECURITY_IDX = 9;\n\nexport interface ListStorageData extends CollectionStorageData {}\n\nexport interface ListCacheKey extends\n CacheKey<\n \"list\",\n ListStorageData,\n ListQuery,\n [\n type: \"object\" | \"interface\",\n apiName: string,\n whereClause: Canonical<SimpleWhereClause>,\n orderByClause: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>,\n rdpConfig?: Canonical<Rdp> | undefined,\n intersectWith?:\n | Canonical<Array<Canonical<SimpleWhereClause>>>\n | undefined,\n pivotInfo?: Canonical<PivotInfo> | undefined,\n rids?: Canonical<string[]> | undefined,\n select?: Canonical<readonly string[]> | undefined,\n loadPropertySecurity?: true | undefined,\n ]\n >\n{\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA,OAAO,MAAMA,QAAQ,GAAG,CAAC;AACzB,OAAO,MAAMC,YAAY,GAAG,CAAC;AAC7B,OAAO,MAAMC,SAAS,GAAG,CAAC;AAC1B,OAAO,MAAMC,YAAY,GAAG,CAAC;AAC7B,OAAO,MAAMC,OAAO,GAAG,CAAC;AACxB,OAAO,MAAMC,aAAa,GAAG,CAAC;AAC9B,OAAO,MAAMC,SAAS,GAAG,CAAC;AAC1B,OAAO,MAAMC,QAAQ,GAAG,CAAC;AACzB,OAAO,MAAMC,UAAU,GAAG,CAAC;AAC3B,OAAO,MAAMC,0BAA0B,GAAG,CAAC","ignoreList":[]}
|
|
@@ -140,6 +140,9 @@ export class ListQuery extends BaseListQuery {
|
|
|
140
140
|
// but shouldn't be needed ideally
|
|
141
141
|
...(Object.keys(this.#orderBy).length > 0 ? {
|
|
142
142
|
$orderBy: this.#orderBy
|
|
143
|
+
} : {}),
|
|
144
|
+
...(this.options.$loadPropertySecurityMetadata ? {
|
|
145
|
+
$loadPropertySecurityMetadata: true
|
|
143
146
|
} : {})
|
|
144
147
|
});
|
|
145
148
|
if (signal?.aborted) {
|