@osdk/client 2.8.0-beta.26 → 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.
Files changed (50) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/build/browser/object/SimpleOsdkProperties.js.map +1 -1
  3. package/build/browser/observable/internal/GenericCanonicalizer.js +72 -0
  4. package/build/browser/observable/internal/GenericCanonicalizer.js.map +1 -0
  5. package/build/browser/observable/internal/IntersectCanonicalizer.js +1 -1
  6. package/build/browser/observable/internal/IntersectCanonicalizer.js.map +1 -1
  7. package/build/browser/observable/internal/ObjectSetArrayCanonicalizer.js +34 -0
  8. package/build/browser/observable/internal/ObjectSetArrayCanonicalizer.js.map +1 -0
  9. package/build/browser/observable/internal/Store.js +21 -1
  10. package/build/browser/observable/internal/Store.js.map +1 -1
  11. package/build/browser/observable/internal/list/ListQuery.js.map +1 -1
  12. package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
  13. package/build/browser/observable/internal/objectset/ObjectSetHelper.js +5 -4
  14. package/build/browser/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
  15. package/build/browser/observable/internal/objectset/ObjectSetQuery.js +180 -27
  16. package/build/browser/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
  17. package/build/browser/util/UserAgent.js +2 -2
  18. package/build/cjs/{chunk-YKQ5QTEF.cjs → chunk-ZPGIIKEZ.cjs} +4 -4
  19. package/build/cjs/{chunk-YKQ5QTEF.cjs.map → chunk-ZPGIIKEZ.cjs.map} +1 -1
  20. package/build/cjs/index.cjs +7 -7
  21. package/build/cjs/public/unstable-do-not-use.cjs +294 -57
  22. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  23. package/build/esm/object/SimpleOsdkProperties.js.map +1 -1
  24. package/build/esm/observable/internal/GenericCanonicalizer.js +72 -0
  25. package/build/esm/observable/internal/GenericCanonicalizer.js.map +1 -0
  26. package/build/esm/observable/internal/IntersectCanonicalizer.js +1 -1
  27. package/build/esm/observable/internal/IntersectCanonicalizer.js.map +1 -1
  28. package/build/esm/observable/internal/ObjectSetArrayCanonicalizer.js +34 -0
  29. package/build/esm/observable/internal/ObjectSetArrayCanonicalizer.js.map +1 -0
  30. package/build/esm/observable/internal/Store.js +21 -1
  31. package/build/esm/observable/internal/Store.js.map +1 -1
  32. package/build/esm/observable/internal/list/ListQuery.js.map +1 -1
  33. package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
  34. package/build/esm/observable/internal/objectset/ObjectSetHelper.js +5 -4
  35. package/build/esm/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
  36. package/build/esm/observable/internal/objectset/ObjectSetQuery.js +180 -27
  37. package/build/esm/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
  38. package/build/esm/util/UserAgent.js +2 -2
  39. package/build/types/observable/internal/GenericCanonicalizer.d.ts +8 -0
  40. package/build/types/observable/internal/GenericCanonicalizer.d.ts.map +1 -0
  41. package/build/types/observable/internal/IntersectCanonicalizer.d.ts.map +1 -1
  42. package/build/types/observable/internal/ObjectSetArrayCanonicalizer.d.ts +7 -0
  43. package/build/types/observable/internal/ObjectSetArrayCanonicalizer.d.ts.map +1 -0
  44. package/build/types/observable/internal/Store.d.ts +4 -0
  45. package/build/types/observable/internal/Store.d.ts.map +1 -1
  46. package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts +3 -1
  47. package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts.map +1 -1
  48. package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts +4 -1
  49. package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts.map +1 -1
  50. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectsHelper.js","names":["deepEqual","UnderlyingOsdkObject","getDefType","AbstractHelper","tombstone","mergeObjectFields","mergeSelectFields","ObjectQuery","ObjectsHelper","observe","options","subFn","getQuery","rdpConfig","apiName","pk","select","$loadPropertySecurityMetadata","defType","objectCacheKey","cacheKeys","get","undefined","store","queries","subjects","dedupeInterval","storeOsdkInstances","values","batch","selectFields","map","v","$objectType","$apiName","$primaryKey","writeToStore","cacheKey","propagateWrite","sourceCacheKey","value","status","existing","read","dataChanged","statusChanged","valueToWrite","existingHolder","canMergeSelectFields","size","isObjectHolder","expectedRdpFields","objectCacheKeyRegistry","getRdpFieldSet","underlying","actualRdpFields","Set","field","add","write","changes","registerObject","metadata","getMetadata","relatedKeys","getVariants","primaryKey","targetKey","isKeyActive","targetCurrentValue","merged","mergeForTarget","key","subject","peek","observed","pendingCleanup","sourceValue","targetCacheKey","sourceRdpFields","targetRdpFields"],"sources":["ObjectsHelper.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 { ObjectOrInterfaceDefinition, Osdk } from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport { UnderlyingOsdkObject } from \"../../../object/convertWireToOsdkObjects/InternalSymbols.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport { getDefType } from \"../../../util/interfaceUtils.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type { ObserveObjectOptions } from \"../../ObservableClient.js\";\nimport type { Observer, Status } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport {\n mergeObjectFields,\n mergeSelectFields,\n} from \"../utils/rdpFieldOperations.js\";\nimport { type ObjectCacheKey } from \"./ObjectCacheKey.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\n\nexport class ObjectsHelper extends AbstractHelper<\n ObjectQuery,\n ObserveObjectOptions<any>\n> {\n observe<T extends ObjectOrInterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): QuerySubscription<ObjectQuery> {\n return super.observe(options, subFn);\n }\n\n getQuery<T extends ObjectOrInterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n rdpConfig?: Canonical<Rdp> | null,\n ): ObjectQuery {\n const apiName = typeof options.apiName === \"string\"\n ? options.apiName\n : options.apiName.apiName;\n const { pk, select, $loadPropertySecurityMetadata } = options;\n\n const defType = getDefType(options.apiName);\n\n const objectCacheKey = this.cacheKeys.get<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n rdpConfig ?? undefined,\n );\n\n return this.store.queries.get(objectCacheKey, () =>\n new ObjectQuery(\n this.store,\n this.store.subjects.get(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n defType,\n select,\n $loadPropertySecurityMetadata,\n ));\n }\n\n /**\n * Internal helper method for writing objects to the store and returning their\n * object keys. For list queries with RDPs, the rdpConfig is included in the\n * cache key to ensure proper data isolation.\n * @internal\n */\n public storeOsdkInstances(\n values: Array<ObjectHolder> | Array<Osdk.Instance<any, any, any>>,\n batch: BatchContext,\n rdpConfig?: Canonical<Rdp> | null,\n selectFields?: ReadonlySet<string>,\n ): ObjectCacheKey[] {\n return values.map(v =>\n this.getQuery({\n apiName: v.$objectType ?? v.$apiName,\n pk: v.$primaryKey as string | number,\n }, rdpConfig).writeToStore(\n v as ObjectHolder,\n \"loaded\",\n batch,\n selectFields,\n ).cacheKey\n );\n }\n\n /**\n * Write an object to cache and propagate to all related cache keys\n * @internal\n */\n public propagateWrite(\n sourceCacheKey: ObjectCacheKey,\n value: ObjectHolder | typeof tombstone,\n status: Status,\n batch: BatchContext,\n selectFields?: ReadonlySet<string>,\n ): void {\n const existing = batch.read(sourceCacheKey);\n const dataChanged = !existing\n || existing.value === undefined\n || value === tombstone\n || !deepEqual(existing.value, value);\n const statusChanged = !existing || existing.status !== status;\n\n if (!dataChanged && !statusChanged) {\n return;\n }\n\n let valueToWrite = !dataChanged && existing ? existing.value : value;\n\n // When a $select-filtered fetch returns partial objects, merge with\n // existing cached data to preserve fields not in the select set.\n const existingHolder = existing?.value;\n const canMergeSelectFields = dataChanged\n && selectFields\n && selectFields.size > 0\n && existingHolder\n && this.isObjectHolder(existingHolder);\n\n if (canMergeSelectFields && valueToWrite !== tombstone) {\n valueToWrite = mergeSelectFields(\n valueToWrite,\n selectFields,\n existingHolder,\n );\n }\n\n // When an object (e.g. from a subscription update) is written to a cache\n // key that has RDP configuration, the incoming value may lack derived\n // property values. Merge with the existing cached value so that RDP fields\n // not present in the incoming object are preserved.\n if (\n valueToWrite !== tombstone\n && existing?.value\n && this.isObjectHolder(existing.value)\n ) {\n const expectedRdpFields = this.store.objectCacheKeyRegistry\n .getRdpFieldSet(sourceCacheKey);\n if (expectedRdpFields.size > 0) {\n const underlying = valueToWrite[UnderlyingOsdkObject];\n const actualRdpFields = new Set<string>();\n for (const field of expectedRdpFields) {\n if (underlying && field in underlying) {\n actualRdpFields.add(field);\n }\n }\n\n if (actualRdpFields.size !== expectedRdpFields.size) {\n valueToWrite = mergeObjectFields(\n valueToWrite,\n actualRdpFields,\n expectedRdpFields,\n existing.value,\n );\n }\n }\n }\n\n batch.write(sourceCacheKey, valueToWrite, status);\n\n if (value !== tombstone) {\n batch.changes.registerObject(sourceCacheKey, value, !existing);\n }\n\n const metadata = this.store.objectCacheKeyRegistry.getMetadata(\n sourceCacheKey,\n );\n\n const relatedKeys = metadata\n ? this.store.objectCacheKeyRegistry.getVariants(\n metadata.apiName,\n metadata.primaryKey,\n )\n : new Set([sourceCacheKey]);\n\n for (const targetKey of relatedKeys) {\n if (targetKey === sourceCacheKey || !this.isKeyActive(targetKey)) {\n continue;\n }\n\n if (value === tombstone) {\n batch.write(targetKey, tombstone, status);\n continue;\n }\n\n const targetCurrentValue = batch.read(targetKey)?.value;\n const merged = this.mergeForTarget(\n value,\n targetCurrentValue && this.isObjectHolder(targetCurrentValue)\n ? targetCurrentValue\n : undefined,\n sourceCacheKey,\n targetKey,\n );\n\n batch.write(targetKey, merged, status);\n }\n }\n\n /**\n * Check if a cache key is actively observed or pending cleanup.\n * During React unmount-remount cycles, a key may be momentarily\n * unobserved while its cleanup is deferred to a microtask.\n * We still propagate to such keys to prevent stale data when\n * the subscription is re-established.\n */\n private isKeyActive(key: ObjectCacheKey): boolean {\n const subject = this.store.subjects.peek(key);\n if (subject?.observed === true) {\n return true;\n }\n return (this.store.pendingCleanup.get(key) ?? 0) > 0;\n }\n\n /**\n * Type guard to check if a value is an ObjectHolder\n */\n private isObjectHolder(\n value: ObjectHolder | undefined,\n ): value is ObjectHolder {\n return value != null\n && typeof value === \"object\"\n && \"$apiName\" in value\n && \"$primaryKey\" in value;\n }\n\n /**\n * Merge object data for a specific target cache key, preserving RDP fields\n */\n private mergeForTarget(\n sourceValue: ObjectHolder,\n targetCurrentValue: ObjectHolder | undefined,\n sourceCacheKey: ObjectCacheKey,\n targetCacheKey: ObjectCacheKey,\n ): ObjectHolder {\n const sourceRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n sourceCacheKey,\n );\n const targetRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n targetCacheKey,\n );\n\n return mergeObjectFields(\n sourceValue,\n sourceRdpFields,\n targetRdpFields,\n targetCurrentValue,\n );\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,SAAS,MAAM,iBAAiB;AACvC,SAASC,oBAAoB,QAAQ,6DAA6D;AAElG,SAASC,UAAU,QAAQ,iCAAiC;AAI5D,SAASC,cAAc,QAAQ,sBAAsB;AAKrD,SAASC,SAAS,QAAQ,iBAAiB;AAC3C,SACEC,iBAAiB,EACjBC,iBAAiB,QACZ,gCAAgC;AAEvC,SAASC,WAAW,QAAQ,kBAAkB;AAE9C,OAAO,MAAMC,aAAa,SAASL,cAAc,CAG/C;EACAM,OAAOA,CACLC,OAAgC,EAChCC,KAA8B,EACE;IAChC,OAAO,KAAK,CAACF,OAAO,CAACC,OAAO,EAAEC,KAAK,CAAC;EACtC;EAEAC,QAAQA,CACNF,OAAgC,EAChCG,SAAiC,EACpB;IACb,MAAMC,OAAO,GAAG,OAAOJ,OAAO,CAACI,OAAO,KAAK,QAAQ,GAC/CJ,OAAO,CAACI,OAAO,GACfJ,OAAO,CAACI,OAAO,CAACA,OAAO;IAC3B,MAAM;MAAEC,EAAE;MAAEC,MAAM;MAAEC;IAA8B,CAAC,GAAGP,OAAO;IAE7D,MAAMQ,OAAO,GAAGhB,UAAU,CAACQ,OAAO,CAACI,OAAO,CAAC;IAE3C,MAAMK,cAAc,GAAG,IAAI,CAACC,SAAS,CAACC,GAAG,CACvC,QAAQ,EACRP,OAAO,EACPC,EAAE,EACFF,SAAS,IAAIS,SACf,CAAC;IAED,OAAO,IAAI,CAACC,KAAK,CAACC,OAAO,CAACH,GAAG,CAACF,cAAc,EAAE,MAC5C,IAAIZ,WAAW,CACb,IAAI,CAACgB,KAAK,EACV,IAAI,CAACA,KAAK,CAACE,QAAQ,CAACJ,GAAG,CAACF,cAAc,CAAC,EACvCL,OAAO,EACPC,EAAE,EACFI,cAAc,EACd;MAAEO,cAAc,EAAE;IAAE,CAAC,EACrBR,OAAO,EACPF,MAAM,EACNC,6BACF,CAAC,CAAC;EACN;;EAEA;AACF;AACA;AACA;AACA;AACA;EACSU,kBAAkBA,CACvBC,MAAiE,EACjEC,KAAmB,EACnBhB,SAAiC,EACjCiB,YAAkC,EAChB;IAClB,OAAOF,MAAM,CAACG,GAAG,CAACC,CAAC,IACjB,IAAI,CAACpB,QAAQ,CAAC;MACZE,OAAO,EAAEkB,CAAC,CAACC,WAAW,IAAID,CAAC,CAACE,QAAQ;MACpCnB,EAAE,EAAEiB,CAAC,CAACG;IACR,CAAC,EAAEtB,SAAS,CAAC,CAACuB,YAAY,CACxBJ,CAAC,EACD,QAAQ,EACRH,KAAK,EACLC,YACF,CAAC,CAACO,QACJ,CAAC;EACH;;EAEA;AACF;AACA;AACA;EACSC,cAAcA,CACnBC,cAA8B,EAC9BC,KAAsC,EACtCC,MAAc,EACdZ,KAAmB,EACnBC,YAAkC,EAC5B;IACN,MAAMY,QAAQ,GAAGb,KAAK,CAACc,IAAI,CAACJ,cAAc,CAAC;IAC3C,MAAMK,WAAW,GAAG,CAACF,QAAQ,IACxBA,QAAQ,CAACF,KAAK,KAAKlB,SAAS,IAC5BkB,KAAK,KAAKpC,SAAS,IACnB,CAACJ,SAAS,CAAC0C,QAAQ,CAACF,KAAK,EAAEA,KAAK,CAAC;IACtC,MAAMK,aAAa,GAAG,CAACH,QAAQ,IAAIA,QAAQ,CAACD,MAAM,KAAKA,MAAM;IAE7D,IAAI,CAACG,WAAW,IAAI,CAACC,aAAa,EAAE;MAClC;IACF;IAEA,IAAIC,YAAY,GAAG,CAACF,WAAW,IAAIF,QAAQ,GAAGA,QAAQ,CAACF,KAAK,GAAGA,KAAK;;IAEpE;IACA;IACA,MAAMO,cAAc,GAAGL,QAAQ,EAAEF,KAAK;IACtC,MAAMQ,oBAAoB,GAAGJ,WAAW,IACnCd,YAAY,IACZA,YAAY,CAACmB,IAAI,GAAG,CAAC,IACrBF,cAAc,IACd,IAAI,CAACG,cAAc,CAACH,cAAc,CAAC;IAExC,IAAIC,oBAAoB,IAAIF,YAAY,KAAK1C,SAAS,EAAE;MACtD0C,YAAY,GAAGxC,iBAAiB,CAC9BwC,YAAY,EACZhB,YAAY,EACZiB,cACF,CAAC;IACH;;IAEA;IACA;IACA;IACA;IACA,IACED,YAAY,KAAK1C,SAAS,IACvBsC,QAAQ,EAAEF,KAAK,IACf,IAAI,CAACU,cAAc,CAACR,QAAQ,CAACF,KAAK,CAAC,EACtC;MACA,MAAMW,iBAAiB,GAAG,IAAI,CAAC5B,KAAK,CAAC6B,sBAAsB,CACxDC,cAAc,CAACd,cAAc,CAAC;MACjC,IAAIY,iBAAiB,CAACF,IAAI,GAAG,CAAC,EAAE;QAC9B,MAAMK,UAAU,GAAGR,YAAY,CAAC7C,oBAAoB,CAAC;QACrD,MAAMsD,eAAe,GAAG,IAAIC,GAAG,CAAS,CAAC;QACzC,KAAK,MAAMC,KAAK,IAAIN,iBAAiB,EAAE;UACrC,IAAIG,UAAU,IAAIG,KAAK,IAAIH,UAAU,EAAE;YACrCC,eAAe,CAACG,GAAG,CAACD,KAAK,CAAC;UAC5B;QACF;QAEA,IAAIF,eAAe,CAACN,IAAI,KAAKE,iBAAiB,CAACF,IAAI,EAAE;UACnDH,YAAY,GAAGzC,iBAAiB,CAC9ByC,YAAY,EACZS,eAAe,EACfJ,iBAAiB,EACjBT,QAAQ,CAACF,KACX,CAAC;QACH;MACF;IACF;IAEAX,KAAK,CAAC8B,KAAK,CAACpB,cAAc,EAAEO,YAAY,EAAEL,MAAM,CAAC;IAEjD,IAAID,KAAK,KAAKpC,SAAS,EAAE;MACvByB,KAAK,CAAC+B,OAAO,CAACC,cAAc,CAACtB,cAAc,EAAEC,KAAK,EAAE,CAACE,QAAQ,CAAC;IAChE;IAEA,MAAMoB,QAAQ,GAAG,IAAI,CAACvC,KAAK,CAAC6B,sBAAsB,CAACW,WAAW,CAC5DxB,cACF,CAAC;IAED,MAAMyB,WAAW,GAAGF,QAAQ,GACxB,IAAI,CAACvC,KAAK,CAAC6B,sBAAsB,CAACa,WAAW,CAC7CH,QAAQ,CAAChD,OAAO,EAChBgD,QAAQ,CAACI,UACX,CAAC,GACC,IAAIV,GAAG,CAAC,CAACjB,cAAc,CAAC,CAAC;IAE7B,KAAK,MAAM4B,SAAS,IAAIH,WAAW,EAAE;MACnC,IAAIG,SAAS,KAAK5B,cAAc,IAAI,CAAC,IAAI,CAAC6B,WAAW,CAACD,SAAS,CAAC,EAAE;QAChE;MACF;MAEA,IAAI3B,KAAK,KAAKpC,SAAS,EAAE;QACvByB,KAAK,CAAC8B,KAAK,CAACQ,SAAS,EAAE/D,SAAS,EAAEqC,MAAM,CAAC;QACzC;MACF;MAEA,MAAM4B,kBAAkB,GAAGxC,KAAK,CAACc,IAAI,CAACwB,SAAS,CAAC,EAAE3B,KAAK;MACvD,MAAM8B,MAAM,GAAG,IAAI,CAACC,cAAc,CAChC/B,KAAK,EACL6B,kBAAkB,IAAI,IAAI,CAACnB,cAAc,CAACmB,kBAAkB,CAAC,GACzDA,kBAAkB,GAClB/C,SAAS,EACbiB,cAAc,EACd4B,SACF,CAAC;MAEDtC,KAAK,CAAC8B,KAAK,CAACQ,SAAS,EAAEG,MAAM,EAAE7B,MAAM,CAAC;IACxC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACU2B,WAAWA,CAACI,GAAmB,EAAW;IAChD,MAAMC,OAAO,GAAG,IAAI,CAAClD,KAAK,CAACE,QAAQ,CAACiD,IAAI,CAACF,GAAG,CAAC;IAC7C,IAAIC,OAAO,EAAEE,QAAQ,KAAK,IAAI,EAAE;MAC9B,OAAO,IAAI;IACb;IACA,OAAO,CAAC,IAAI,CAACpD,KAAK,CAACqD,cAAc,CAACvD,GAAG,CAACmD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;EACtD;;EAEA;AACF;AACA;EACUtB,cAAcA,CACpBV,KAA+B,EACR;IACvB,OAAOA,KAAK,IAAI,IAAI,IACf,OAAOA,KAAK,KAAK,QAAQ,IACzB,UAAU,IAAIA,KAAK,IACnB,aAAa,IAAIA,KAAK;EAC7B;;EAEA;AACF;AACA;EACU+B,cAAcA,CACpBM,WAAyB,EACzBR,kBAA4C,EAC5C9B,cAA8B,EAC9BuC,cAA8B,EAChB;IACd,MAAMC,eAAe,GAAG,IAAI,CAACxD,KAAK,CAAC6B,sBAAsB,CAACC,cAAc,CACtEd,cACF,CAAC;IACD,MAAMyC,eAAe,GAAG,IAAI,CAACzD,KAAK,CAAC6B,sBAAsB,CAACC,cAAc,CACtEyB,cACF,CAAC;IAED,OAAOzE,iBAAiB,CACtBwE,WAAW,EACXE,eAAe,EACfC,eAAe,EACfX,kBACF,CAAC;EACH;AACF","ignoreList":[]}
1
+ {"version":3,"file":"ObjectsHelper.js","names":["deepEqual","UnderlyingOsdkObject","getDefType","AbstractHelper","tombstone","mergeObjectFields","mergeSelectFields","ObjectQuery","ObjectsHelper","observe","options","subFn","getQuery","rdpConfig","apiName","pk","select","$loadPropertySecurityMetadata","defType","objectCacheKey","cacheKeys","get","undefined","store","queries","subjects","dedupeInterval","storeOsdkInstances","values","batch","selectFields","map","v","$objectType","$apiName","$primaryKey","writeToStore","cacheKey","propagateWrite","sourceCacheKey","value","status","existing","read","dataChanged","statusChanged","valueToWrite","existingHolder","canMergeSelectFields","size","isObjectHolder","expectedRdpFields","objectCacheKeyRegistry","getRdpFieldSet","underlying","actualRdpFields","Set","field","add","write","changes","registerObject","metadata","getMetadata","relatedKeys","getVariants","primaryKey","targetKey","isKeyActive","targetCurrentValue","merged","mergeForTarget","key","subject","peek","observed","pendingCleanup","sourceValue","targetCacheKey","sourceRdpFields","targetRdpFields"],"sources":["ObjectsHelper.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 { ObjectOrInterfaceDefinition, Osdk } from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport { UnderlyingOsdkObject } from \"../../../object/convertWireToOsdkObjects/InternalSymbols.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport { getDefType } from \"../../../util/interfaceUtils.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type { ObserveObjectOptions } from \"../../ObservableClient.js\";\nimport type { Observer, Status } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport {\n mergeObjectFields,\n mergeSelectFields,\n} from \"../utils/rdpFieldOperations.js\";\nimport { type ObjectCacheKey } from \"./ObjectCacheKey.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\n\nexport class ObjectsHelper extends AbstractHelper<\n ObjectQuery,\n ObserveObjectOptions<any>\n> {\n observe<T extends ObjectOrInterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): QuerySubscription<ObjectQuery> {\n return super.observe(options, subFn);\n }\n\n getQuery<T extends ObjectOrInterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n rdpConfig?: Canonical<Rdp> | null,\n ): ObjectQuery {\n const apiName = typeof options.apiName === \"string\"\n ? options.apiName\n : options.apiName.apiName;\n const { pk, select, $loadPropertySecurityMetadata } = options;\n\n const defType = getDefType(options.apiName);\n\n const objectCacheKey = this.cacheKeys.get<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n rdpConfig ?? undefined,\n );\n\n return this.store.queries.get(objectCacheKey, () =>\n new ObjectQuery(\n this.store,\n this.store.subjects.get(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n defType,\n select,\n $loadPropertySecurityMetadata,\n ));\n }\n\n /**\n * Internal helper method for writing objects to the store and returning their\n * object keys. For list queries with RDPs, the rdpConfig is included in the\n * cache key to ensure proper data isolation.\n * @internal\n */\n public storeOsdkInstances(\n values: Array<ObjectHolder> | Array<Osdk.Instance<any, any, any>>,\n batch: BatchContext,\n rdpConfig?: Canonical<Rdp> | null,\n selectFields?: ReadonlySet<string>,\n ): ObjectCacheKey[] {\n return values.map(v =>\n this.getQuery({\n apiName: v.$objectType ?? v.$apiName,\n pk: v.$primaryKey,\n }, rdpConfig).writeToStore(\n v as ObjectHolder,\n \"loaded\",\n batch,\n selectFields,\n ).cacheKey\n );\n }\n\n /**\n * Write an object to cache and propagate to all related cache keys\n * @internal\n */\n public propagateWrite(\n sourceCacheKey: ObjectCacheKey,\n value: ObjectHolder | typeof tombstone,\n status: Status,\n batch: BatchContext,\n selectFields?: ReadonlySet<string>,\n ): void {\n const existing = batch.read(sourceCacheKey);\n const dataChanged = !existing\n || existing.value === undefined\n || value === tombstone\n || !deepEqual(existing.value, value);\n const statusChanged = !existing || existing.status !== status;\n\n if (!dataChanged && !statusChanged) {\n return;\n }\n\n let valueToWrite = !dataChanged && existing ? existing.value : value;\n\n // When a $select-filtered fetch returns partial objects, merge with\n // existing cached data to preserve fields not in the select set.\n const existingHolder = existing?.value;\n const canMergeSelectFields = dataChanged\n && selectFields\n && selectFields.size > 0\n && existingHolder\n && this.isObjectHolder(existingHolder);\n\n if (canMergeSelectFields && valueToWrite !== tombstone) {\n valueToWrite = mergeSelectFields(\n valueToWrite,\n selectFields,\n existingHolder,\n );\n }\n\n // When an object (e.g. from a subscription update) is written to a cache\n // key that has RDP configuration, the incoming value may lack derived\n // property values. Merge with the existing cached value so that RDP fields\n // not present in the incoming object are preserved.\n if (\n valueToWrite !== tombstone\n && existing?.value\n && this.isObjectHolder(existing.value)\n ) {\n const expectedRdpFields = this.store.objectCacheKeyRegistry\n .getRdpFieldSet(sourceCacheKey);\n if (expectedRdpFields.size > 0) {\n const underlying = valueToWrite[UnderlyingOsdkObject];\n const actualRdpFields = new Set<string>();\n for (const field of expectedRdpFields) {\n if (underlying && field in underlying) {\n actualRdpFields.add(field);\n }\n }\n\n if (actualRdpFields.size !== expectedRdpFields.size) {\n valueToWrite = mergeObjectFields(\n valueToWrite,\n actualRdpFields,\n expectedRdpFields,\n existing.value,\n );\n }\n }\n }\n\n batch.write(sourceCacheKey, valueToWrite, status);\n\n if (value !== tombstone) {\n batch.changes.registerObject(sourceCacheKey, value, !existing);\n }\n\n const metadata = this.store.objectCacheKeyRegistry.getMetadata(\n sourceCacheKey,\n );\n\n const relatedKeys = metadata\n ? this.store.objectCacheKeyRegistry.getVariants(\n metadata.apiName,\n metadata.primaryKey,\n )\n : new Set([sourceCacheKey]);\n\n for (const targetKey of relatedKeys) {\n if (targetKey === sourceCacheKey || !this.isKeyActive(targetKey)) {\n continue;\n }\n\n if (value === tombstone) {\n batch.write(targetKey, tombstone, status);\n continue;\n }\n\n const targetCurrentValue = batch.read(targetKey)?.value;\n const merged = this.mergeForTarget(\n value,\n targetCurrentValue && this.isObjectHolder(targetCurrentValue)\n ? targetCurrentValue\n : undefined,\n sourceCacheKey,\n targetKey,\n );\n\n batch.write(targetKey, merged, status);\n }\n }\n\n /**\n * Check if a cache key is actively observed or pending cleanup.\n * During React unmount-remount cycles, a key may be momentarily\n * unobserved while its cleanup is deferred to a microtask.\n * We still propagate to such keys to prevent stale data when\n * the subscription is re-established.\n */\n private isKeyActive(key: ObjectCacheKey): boolean {\n const subject = this.store.subjects.peek(key);\n if (subject?.observed === true) {\n return true;\n }\n return (this.store.pendingCleanup.get(key) ?? 0) > 0;\n }\n\n /**\n * Type guard to check if a value is an ObjectHolder\n */\n private isObjectHolder(\n value: ObjectHolder | undefined,\n ): value is ObjectHolder {\n return value != null\n && typeof value === \"object\"\n && \"$apiName\" in value\n && \"$primaryKey\" in value;\n }\n\n /**\n * Merge object data for a specific target cache key, preserving RDP fields\n */\n private mergeForTarget(\n sourceValue: ObjectHolder,\n targetCurrentValue: ObjectHolder | undefined,\n sourceCacheKey: ObjectCacheKey,\n targetCacheKey: ObjectCacheKey,\n ): ObjectHolder {\n const sourceRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n sourceCacheKey,\n );\n const targetRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n targetCacheKey,\n );\n\n return mergeObjectFields(\n sourceValue,\n sourceRdpFields,\n targetRdpFields,\n targetCurrentValue,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -18,12 +18,13 @@ import { getWireObjectSet } from "../../../objectSet/createObjectSet.js";
18
18
  import { AbstractHelper } from "../AbstractHelper.js";
19
19
  import { ObjectSetQuery } from "./ObjectSetQuery.js";
20
20
  export class ObjectSetHelper extends AbstractHelper {
21
- constructor(store, cacheKeys, whereCanonicalizer, orderByCanonicalizer, rdpCanonicalizer, selectCanonicalizer) {
21
+ constructor(store, cacheKeys, whereCanonicalizer, orderByCanonicalizer, rdpCanonicalizer, selectCanonicalizer, objectSetArrayCanonicalizer) {
22
22
  super(store, cacheKeys);
23
23
  this.whereCanonicalizer = whereCanonicalizer;
24
24
  this.orderByCanonicalizer = orderByCanonicalizer;
25
25
  this.rdpCanonicalizer = rdpCanonicalizer;
26
26
  this.selectCanonicalizer = selectCanonicalizer;
27
+ this.objectSetArrayCanonicalizer = objectSetArrayCanonicalizer;
27
28
  }
28
29
  observe(options, subFn) {
29
30
  const ret = super.observe(options, subFn);
@@ -52,13 +53,13 @@ export class ObjectSetHelper extends AbstractHelper {
52
53
  operations.withProperties = this.rdpCanonicalizer.canonicalize(options.withProperties);
53
54
  }
54
55
  if (options.union && options.union.length > 0) {
55
- operations.union = options.union.map(os => JSON.stringify(getWireObjectSet(os)));
56
+ operations.union = this.objectSetArrayCanonicalizer.canonicalizeUnion(options.union.map(os => JSON.stringify(getWireObjectSet(os))));
56
57
  }
57
58
  if (options.intersect && options.intersect.length > 0) {
58
- operations.intersect = options.intersect.map(os => JSON.stringify(getWireObjectSet(os)));
59
+ operations.intersect = this.objectSetArrayCanonicalizer.canonicalizeIntersect(options.intersect.map(os => JSON.stringify(getWireObjectSet(os))));
59
60
  }
60
61
  if (options.subtract && options.subtract.length > 0) {
61
- operations.subtract = options.subtract.map(os => JSON.stringify(getWireObjectSet(os)));
62
+ operations.subtract = this.objectSetArrayCanonicalizer.canonicalizeSubtract(options.subtract.map(os => JSON.stringify(getWireObjectSet(os))));
62
63
  }
63
64
  if (options.pivotTo) {
64
65
  operations.pivotTo = options.pivotTo;
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectSetHelper.js","names":["getWireObjectSet","AbstractHelper","ObjectSetQuery","ObjectSetHelper","constructor","store","cacheKeys","whereCanonicalizer","orderByCanonicalizer","rdpCanonicalizer","selectCanonicalizer","observe","options","subFn","ret","streamUpdates","query","registerStreamUpdates","subscription","getQuery","baseObjectSet","baseObjectSetWire","JSON","stringify","operations","buildCanonicalizedOperations","objectSetCacheKey","get","queries","subjects","where","canonicalize","withProperties","union","length","map","os","intersect","subtract","pivotTo","orderBy","select","pageSize","$loadPropertySecurityMetadata","loadPropertySecurity"],"sources":["ObjectSetHelper.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getWireObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport type { ObjectSetPayload } from \"../../ObjectSetPayload.js\";\nimport type { Observer } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { CacheKeys } from \"../CacheKeys.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { KnownCacheKey } from \"../KnownCacheKey.js\";\nimport type { OrderByCanonicalizer } from \"../OrderByCanonicalizer.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { RdpCanonicalizer } from \"../RdpCanonicalizer.js\";\nimport type { SelectCanonicalizer } from \"../SelectCanonicalizer.js\";\nimport type { Store } from \"../Store.js\";\nimport type { WhereClauseCanonicalizer } from \"../WhereClauseCanonicalizer.js\";\nimport type {\n ObjectSetCacheKey,\n ObjectSetOperations,\n} from \"./ObjectSetCacheKey.js\";\nimport { ObjectSetQuery } from \"./ObjectSetQuery.js\";\nimport type { ObjectSetQueryOptions } from \"./ObjectSetQueryOptions.js\";\n\nexport class ObjectSetHelper extends AbstractHelper<\n ObjectSetQuery,\n ObjectSetQueryOptions\n> {\n whereCanonicalizer: WhereClauseCanonicalizer;\n orderByCanonicalizer: OrderByCanonicalizer;\n rdpCanonicalizer: RdpCanonicalizer;\n selectCanonicalizer: SelectCanonicalizer;\n\n constructor(\n store: Store,\n cacheKeys: CacheKeys<KnownCacheKey>,\n whereCanonicalizer: WhereClauseCanonicalizer,\n orderByCanonicalizer: OrderByCanonicalizer,\n rdpCanonicalizer: RdpCanonicalizer,\n selectCanonicalizer: SelectCanonicalizer,\n ) {\n super(store, cacheKeys);\n\n this.whereCanonicalizer = whereCanonicalizer;\n this.orderByCanonicalizer = orderByCanonicalizer;\n this.rdpCanonicalizer = rdpCanonicalizer;\n this.selectCanonicalizer = selectCanonicalizer;\n }\n\n observe(\n options: ObjectSetQueryOptions,\n subFn: Observer<ObjectSetPayload>,\n ): QuerySubscription<ObjectSetQuery> {\n const ret = super.observe(options, subFn);\n\n if (options.streamUpdates) {\n ret.query.registerStreamUpdates(ret.subscription);\n }\n return ret;\n }\n\n getQuery(options: ObjectSetQueryOptions): ObjectSetQuery {\n const { baseObjectSet } = options;\n const baseObjectSetWire = JSON.stringify(getWireObjectSet(baseObjectSet));\n const operations = this.buildCanonicalizedOperations(options);\n\n const objectSetCacheKey = this.cacheKeys.get<ObjectSetCacheKey>(\n \"objectSet\",\n baseObjectSetWire,\n operations,\n );\n\n return this.store.queries.get(objectSetCacheKey, () => {\n return new ObjectSetQuery(\n this.store,\n this.store.subjects.get(objectSetCacheKey),\n baseObjectSetWire,\n operations,\n objectSetCacheKey,\n options,\n );\n });\n }\n\n private buildCanonicalizedOperations(\n options: ObjectSetQueryOptions,\n ): Canonical<ObjectSetOperations> {\n const operations: ObjectSetOperations = {};\n\n if (options.where) {\n operations.where = this.whereCanonicalizer.canonicalize(options.where);\n }\n\n if (options.withProperties) {\n operations.withProperties = this.rdpCanonicalizer.canonicalize(\n options.withProperties,\n );\n }\n\n if (options.union && options.union.length > 0) {\n operations.union = options.union.map(os =>\n JSON.stringify(getWireObjectSet(os))\n );\n }\n\n if (options.intersect && options.intersect.length > 0) {\n operations.intersect = options.intersect.map(os =>\n JSON.stringify(getWireObjectSet(os))\n );\n }\n\n if (options.subtract && options.subtract.length > 0) {\n operations.subtract = options.subtract.map(os =>\n JSON.stringify(getWireObjectSet(os))\n );\n }\n\n if (options.pivotTo) {\n operations.pivotTo = options.pivotTo as string;\n }\n\n if (options.orderBy) {\n operations.orderBy = this.orderByCanonicalizer.canonicalize(\n options.orderBy,\n );\n }\n\n if (options.select && options.select.length > 0) {\n operations.select = this.selectCanonicalizer.canonicalize(options.select);\n }\n\n if (options.pageSize) {\n operations.pageSize = options.pageSize;\n }\n\n if (options.$loadPropertySecurityMetadata) {\n operations.loadPropertySecurity = true;\n }\n\n return operations as Canonical<ObjectSetOperations>;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ObjectSetHelper.js","names":["getWireObjectSet","AbstractHelper","ObjectSetQuery","ObjectSetHelper","constructor","store","cacheKeys","whereCanonicalizer","orderByCanonicalizer","rdpCanonicalizer","selectCanonicalizer","objectSetArrayCanonicalizer","observe","options","subFn","ret","streamUpdates","query","registerStreamUpdates","subscription","getQuery","baseObjectSet","baseObjectSetWire","JSON","stringify","operations","buildCanonicalizedOperations","objectSetCacheKey","get","queries","subjects","where","canonicalize","withProperties","union","length","canonicalizeUnion","map","os","intersect","canonicalizeIntersect","subtract","canonicalizeSubtract","pivotTo","orderBy","select","pageSize","$loadPropertySecurityMetadata","loadPropertySecurity"],"sources":["ObjectSetHelper.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getWireObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport type { ObjectSetPayload } from \"../../ObjectSetPayload.js\";\nimport type { Observer } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { CacheKeys } from \"../CacheKeys.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { KnownCacheKey } from \"../KnownCacheKey.js\";\nimport type { ObjectSetArrayCanonicalizer } from \"../ObjectSetArrayCanonicalizer.js\";\nimport type { OrderByCanonicalizer } from \"../OrderByCanonicalizer.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { RdpCanonicalizer } from \"../RdpCanonicalizer.js\";\nimport type { SelectCanonicalizer } from \"../SelectCanonicalizer.js\";\nimport type { Store } from \"../Store.js\";\nimport type { WhereClauseCanonicalizer } from \"../WhereClauseCanonicalizer.js\";\nimport type {\n ObjectSetCacheKey,\n ObjectSetOperations,\n} from \"./ObjectSetCacheKey.js\";\nimport { ObjectSetQuery } from \"./ObjectSetQuery.js\";\nimport type { ObjectSetQueryOptions } from \"./ObjectSetQueryOptions.js\";\n\nexport class ObjectSetHelper extends AbstractHelper<\n ObjectSetQuery,\n ObjectSetQueryOptions\n> {\n whereCanonicalizer: WhereClauseCanonicalizer;\n orderByCanonicalizer: OrderByCanonicalizer;\n rdpCanonicalizer: RdpCanonicalizer;\n selectCanonicalizer: SelectCanonicalizer;\n objectSetArrayCanonicalizer: ObjectSetArrayCanonicalizer;\n\n constructor(\n store: Store,\n cacheKeys: CacheKeys<KnownCacheKey>,\n whereCanonicalizer: WhereClauseCanonicalizer,\n orderByCanonicalizer: OrderByCanonicalizer,\n rdpCanonicalizer: RdpCanonicalizer,\n selectCanonicalizer: SelectCanonicalizer,\n objectSetArrayCanonicalizer: ObjectSetArrayCanonicalizer,\n ) {\n super(store, cacheKeys);\n\n this.whereCanonicalizer = whereCanonicalizer;\n this.orderByCanonicalizer = orderByCanonicalizer;\n this.rdpCanonicalizer = rdpCanonicalizer;\n this.selectCanonicalizer = selectCanonicalizer;\n this.objectSetArrayCanonicalizer = objectSetArrayCanonicalizer;\n }\n\n observe(\n options: ObjectSetQueryOptions,\n subFn: Observer<ObjectSetPayload>,\n ): QuerySubscription<ObjectSetQuery> {\n const ret = super.observe(options, subFn);\n\n if (options.streamUpdates) {\n ret.query.registerStreamUpdates(ret.subscription);\n }\n return ret;\n }\n\n getQuery(options: ObjectSetQueryOptions): ObjectSetQuery {\n const { baseObjectSet } = options;\n const baseObjectSetWire = JSON.stringify(getWireObjectSet(baseObjectSet));\n const operations = this.buildCanonicalizedOperations(options);\n\n const objectSetCacheKey = this.cacheKeys.get<ObjectSetCacheKey>(\n \"objectSet\",\n baseObjectSetWire,\n operations,\n );\n\n return this.store.queries.get(objectSetCacheKey, () => {\n return new ObjectSetQuery(\n this.store,\n this.store.subjects.get(objectSetCacheKey),\n baseObjectSetWire,\n operations,\n objectSetCacheKey,\n options,\n );\n });\n }\n\n private buildCanonicalizedOperations(\n options: ObjectSetQueryOptions,\n ): Canonical<ObjectSetOperations> {\n const operations: ObjectSetOperations = {};\n\n if (options.where) {\n operations.where = this.whereCanonicalizer.canonicalize(options.where);\n }\n\n if (options.withProperties) {\n operations.withProperties = this.rdpCanonicalizer.canonicalize(\n options.withProperties,\n );\n }\n\n if (options.union && options.union.length > 0) {\n operations.union = this.objectSetArrayCanonicalizer.canonicalizeUnion(\n options.union.map(os => JSON.stringify(getWireObjectSet(os))),\n );\n }\n\n if (options.intersect && options.intersect.length > 0) {\n operations.intersect = this.objectSetArrayCanonicalizer\n .canonicalizeIntersect(\n options.intersect.map(os => JSON.stringify(getWireObjectSet(os))),\n );\n }\n\n if (options.subtract && options.subtract.length > 0) {\n operations.subtract = this.objectSetArrayCanonicalizer\n .canonicalizeSubtract(\n options.subtract.map(os => JSON.stringify(getWireObjectSet(os))),\n );\n }\n\n if (options.pivotTo) {\n operations.pivotTo = options.pivotTo as string;\n }\n\n if (options.orderBy) {\n operations.orderBy = this.orderByCanonicalizer.canonicalize(\n options.orderBy,\n );\n }\n\n if (options.select && options.select.length > 0) {\n operations.select = this.selectCanonicalizer.canonicalize(options.select);\n }\n\n if (options.pageSize) {\n operations.pageSize = options.pageSize;\n }\n\n if (options.$loadPropertySecurityMetadata) {\n operations.loadPropertySecurity = true;\n }\n\n return operations as Canonical<ObjectSetOperations>;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -17,13 +17,18 @@
17
17
  import { additionalContext } from "../../../Client.js";
18
18
  import { getWireObjectSet } from "../../../objectSet/createObjectSet.js";
19
19
  import { BaseListQuery } from "../base-list/BaseListQuery.js";
20
+ import { DEBUG_ONLY__changesToString } from "../Changes.js";
20
21
  import { getObjectTypesThatInvalidate } from "../getObjectTypesThatInvalidate.js";
22
+ import { API_NAME_IDX as OBJECT_API_NAME_IDX } from "../object/ObjectCacheKey.js";
23
+ import { objectSortaMatchesWhereClause as objectMatchesWhereClause } from "../objectMatchesWhereClause.js";
21
24
  import { OrderBySortingStrategy } from "../sorting/SortingStrategy.js";
22
25
  export class ObjectSetQuery extends BaseListQuery {
23
26
  #baseObjectSetWire;
24
27
  #operations;
25
28
  #composedObjectSet;
26
29
  #objectTypes;
30
+ #requiresServerEvaluation;
31
+ #resultTypeApiName;
27
32
  constructor(store, subject, baseObjectSetWire, operations, cacheKey, opts) {
28
33
  super(store, subject, opts, cacheKey, process.env.NODE_ENV !== "production" ? store.client[additionalContext].logger?.child({}, {
29
34
  msgPrefix: `ObjectSetQuery<${cacheKey.otherKeys.map(x => JSON.stringify(x)).join(", ")}>`
@@ -31,7 +36,10 @@ export class ObjectSetQuery extends BaseListQuery {
31
36
  this.#baseObjectSetWire = baseObjectSetWire;
32
37
  this.#operations = operations;
33
38
  this.#composedObjectSet = this.#composeObjectSet(opts);
34
- this.#objectTypes = this.#extractObjectTypes(opts);
39
+ const baseWire = JSON.parse(baseObjectSetWire);
40
+ this.#objectTypes = this.#extractObjectTypes(baseWire, opts);
41
+ this.#requiresServerEvaluation = !!(operations.pivotTo || operations.union && operations.union.length > 0 || operations.intersect && operations.intersect.length > 0 || operations.subtract && operations.subtract.length > 0);
42
+ this.#resultTypeApiName = ObjectSetQuery.#extractTypeFromWireObjectSet(baseWire) ?? "";
35
43
  if (opts.autoFetchMore === true) {
36
44
  this.minResultsToLoad = Number.MAX_SAFE_INTEGER;
37
45
  } else if (typeof opts.autoFetchMore === "number") {
@@ -40,6 +48,9 @@ export class ObjectSetQuery extends BaseListQuery {
40
48
  this.minResultsToLoad = opts.pageSize || 0;
41
49
  }
42
50
  }
51
+ get objectTypes() {
52
+ return this.#objectTypes;
53
+ }
43
54
  get rdpConfig() {
44
55
  return this.#operations.withProperties ?? null;
45
56
  }
@@ -71,37 +82,36 @@ export class ObjectSetQuery extends BaseListQuery {
71
82
  }
72
83
  return result;
73
84
  }
74
- #extractObjectTypes(opts) {
85
+ #extractObjectTypes(baseWire, opts) {
75
86
  const types = new Set();
76
- const baseWire = JSON.parse(this.#baseObjectSetWire);
77
- if (baseWire.type) {
78
- types.add(baseWire.type);
79
- }
80
- if (opts.union) {
81
- for (const os of opts.union) {
82
- const wire = getWireObjectSet(os);
83
- if (wire.type) {
84
- types.add(wire.type);
85
- }
86
- }
87
+ const baseTypeName = ObjectSetQuery.#extractTypeFromWireObjectSet(baseWire);
88
+ if (baseTypeName) {
89
+ types.add(baseTypeName);
87
90
  }
88
- if (opts.intersect) {
89
- for (const os of opts.intersect) {
90
- const wire = getWireObjectSet(os);
91
- if (wire.type) {
92
- types.add(wire.type);
93
- }
94
- }
91
+ ObjectSetQuery.#addTypesFromObjectSets(opts.union, types);
92
+ ObjectSetQuery.#addTypesFromObjectSets(opts.intersect, types);
93
+ ObjectSetQuery.#addTypesFromObjectSets(opts.subtract, types);
94
+ return types;
95
+ }
96
+ static #addTypesFromObjectSets(sets, types) {
97
+ if (!sets) {
98
+ return;
95
99
  }
96
- if (opts.subtract) {
97
- for (const os of opts.subtract) {
98
- const wire = getWireObjectSet(os);
99
- if (wire.type) {
100
- types.add(wire.type);
101
- }
100
+ for (const os of sets) {
101
+ const typeName = ObjectSetQuery.#extractTypeFromWireObjectSet(getWireObjectSet(os));
102
+ if (typeName) {
103
+ types.add(typeName);
102
104
  }
103
105
  }
104
- return types;
106
+ }
107
+ static #extractTypeFromWireObjectSet(wire) {
108
+ if (wire.type === "base") {
109
+ return wire.objectType;
110
+ }
111
+ if (wire.type === "interfaceBase") {
112
+ return wire.interfaceType;
113
+ }
114
+ return undefined;
105
115
  }
106
116
 
107
117
  /**
@@ -158,6 +168,119 @@ export class ObjectSetQuery extends BaseListQuery {
158
168
  registerStreamUpdates(sub) {
159
169
  this.createWebsocketSubscription(this.#composedObjectSet, sub, "observeObjectSet");
160
170
  }
171
+ maybeUpdateAndRevalidate = (changes, optimisticId) => {
172
+ if (process.env.NODE_ENV !== "production") {
173
+ this.logger?.child({
174
+ methodName: "maybeUpdateAndRevalidate"
175
+ }).debug(DEBUG_ONLY__changesToString(changes));
176
+ this.logger?.child({
177
+ methodName: "maybeUpdateAndRevalidate"
178
+ }).debug(`Already in changes? ${changes.modified.has(this.cacheKey)}`);
179
+ }
180
+ if (changes.modified.has(this.cacheKey)) {
181
+ return;
182
+ }
183
+ changes.modified.add(this.cacheKey);
184
+ try {
185
+ if (this.#requiresServerEvaluation) {
186
+ return this.#handleServerRevalidation(changes);
187
+ }
188
+ return this.#handleLocalUpdate(changes, optimisticId);
189
+ } finally {
190
+ if (process.env.NODE_ENV !== "production") {
191
+ this.logger?.child({
192
+ methodName: "maybeUpdateAndRevalidate"
193
+ }).debug("in finally");
194
+ }
195
+ }
196
+ };
197
+ #handleServerRevalidation(changes) {
198
+ for (const objectType of this.#objectTypes) {
199
+ const added = changes.addedObjects.get(objectType);
200
+ const modified = changes.modifiedObjects.get(objectType);
201
+ if (added && added.length > 0 || modified && modified.length > 0) {
202
+ return this.revalidate(true);
203
+ }
204
+ }
205
+ for (const deletedKey of changes.deleted) {
206
+ if (deletedKey.type === "object" && this.#objectTypes.has(deletedKey.otherKeys[OBJECT_API_NAME_IDX])) {
207
+ return this.revalidate(true);
208
+ }
209
+ }
210
+ return undefined;
211
+ }
212
+ #getRelevantChanges(changes) {
213
+ const resultApiName = this.#resultTypeApiName;
214
+ const addedObjects = changes.addedObjects.get(resultApiName) ?? [];
215
+ const modifiedObjects = changes.modifiedObjects.get(resultApiName) ?? [];
216
+ let hasRelevantDeletions = false;
217
+ for (const key of changes.deleted) {
218
+ if (key.type === "object" && key.otherKeys[OBJECT_API_NAME_IDX] === resultApiName) {
219
+ hasRelevantDeletions = true;
220
+ break;
221
+ }
222
+ }
223
+ if (addedObjects.length === 0 && modifiedObjects.length === 0 && !hasRelevantDeletions) {
224
+ return undefined;
225
+ }
226
+ return {
227
+ addedObjects,
228
+ modifiedObjects
229
+ };
230
+ }
231
+ #handleLocalUpdate(changes, optimisticId) {
232
+ const whereClause = this.#operations.where;
233
+ const effectiveWhere = whereClause ?? this.store.whereCanonicalizer.canonicalize({
234
+ $and: []
235
+ });
236
+ const relevant = this.#getRelevantChanges(changes);
237
+ if (!relevant) {
238
+ return undefined;
239
+ }
240
+ const addedMatches = this.#classifyByWhereMatch(relevant.addedObjects, effectiveWhere);
241
+ const modifiedMatches = this.#classifyByWhereMatch(relevant.modifiedObjects, effectiveWhere);
242
+ const status = optimisticId || addedMatches.uncertain.size > 0 || modifiedMatches.uncertain.size > 0 ? "loading" : "loaded";
243
+ const {
244
+ retVal: needsRevalidation
245
+ } = this.store.batch({
246
+ optimisticId,
247
+ changes
248
+ }, batch => {
249
+ const existingKeys = new Set(batch.read(this.cacheKey)?.value?.data);
250
+ const {
251
+ newList,
252
+ needsRevalidation
253
+ } = reconcileListChanges(existingKeys, addedMatches.definite, relevant.modifiedObjects, modifiedMatches, changes.deleted, batch.optimisticWrite, obj => this.#getObjectCacheKey(obj));
254
+ const existingTotalCount = batch.read(this.cacheKey)?.value?.totalCount;
255
+ this._updateList(newList, status, batch, {
256
+ type: "clientOrdered"
257
+ }, existingTotalCount);
258
+ return needsRevalidation;
259
+ });
260
+ if (needsRevalidation) {
261
+ return this.revalidate(true);
262
+ }
263
+ return undefined;
264
+ }
265
+ #classifyByWhereMatch(objects, whereClause) {
266
+ const definite = new Set();
267
+ const uncertain = new Set();
268
+ for (const obj of objects) {
269
+ if (objectMatchesWhereClause(obj, whereClause, true)) {
270
+ definite.add(obj);
271
+ } else if (objectMatchesWhereClause(obj, whereClause, false)) {
272
+ uncertain.add(obj);
273
+ }
274
+ }
275
+ return {
276
+ definite,
277
+ uncertain
278
+ };
279
+ }
280
+ #getObjectCacheKey(obj) {
281
+ const pk = obj.$primaryKey;
282
+ return this.cacheKeys.get("object", obj.$objectType, pk, this.rdpConfig ?? undefined);
283
+ }
161
284
  invalidateObjectType = async (objectType, changes) => {
162
285
  if (this.#objectTypes.has(objectType)) {
163
286
  changes?.modified.add(this.cacheKey);
@@ -178,4 +301,34 @@ export class ObjectSetQuery extends BaseListQuery {
178
301
  };
179
302
  }
180
303
  }
304
+ function reconcileListChanges(existingKeys, addedDefiniteMatches, modifiedObjects, modifiedMatches, deleted, isOptimistic, getObjectCacheKey) {
305
+ const objectsToInsert = new Set(addedDefiniteMatches);
306
+ const keysToRemove = new Set(deleted);
307
+ let needsRevalidation = false;
308
+ for (const obj of modifiedObjects) {
309
+ if (modifiedMatches.definite.has(obj)) {
310
+ if (!existingKeys.has(getObjectCacheKey(obj))) {
311
+ objectsToInsert.add(obj);
312
+ }
313
+ } else if (!isOptimistic) {
314
+ keysToRemove.add(getObjectCacheKey(obj));
315
+ if (modifiedMatches.uncertain.has(obj)) {
316
+ needsRevalidation = true;
317
+ }
318
+ }
319
+ }
320
+ const newList = [];
321
+ for (const key of existingKeys) {
322
+ if (!keysToRemove.has(key)) {
323
+ newList.push(key);
324
+ }
325
+ }
326
+ for (const obj of objectsToInsert) {
327
+ newList.push(getObjectCacheKey(obj));
328
+ }
329
+ return {
330
+ newList,
331
+ needsRevalidation
332
+ };
333
+ }
181
334
  //# sourceMappingURL=ObjectSetQuery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectSetQuery.js","names":["additionalContext","getWireObjectSet","BaseListQuery","getObjectTypesThatInvalidate","OrderBySortingStrategy","ObjectSetQuery","baseObjectSetWire","operations","composedObjectSet","objectTypes","constructor","store","subject","cacheKey","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","map","x","JSON","stringify","join","undefined","composeObjectSet","extractObjectTypes","autoFetchMore","minResultsToLoad","Number","MAX_SAFE_INTEGER","Math","max","pageSize","rdpConfig","withProperties","selectFields","select","rawSelect","#composeObjectSet","result","baseObjectSet","where","union","length","intersect","subtract","pivotTo","#extractObjectTypes","types","Set","baseWire","parse","type","add","os","wire","registerCacheChanges","batch","changes","registerObjectSet","fetchPageData","signal","orderBy","Object","keys","sortingStrategy","wireObjectSet","resultType","apiName","resp","fetchPage","$nextPageToken","nextPageToken","$pageSize","getEffectiveFetchPageSize","$includeRid","$select","$orderBy","options","$loadPropertySecurityMetadata","aborted","Error","handleFetchError","error","_status","subjects","get","existingTotalCount","read","value","totalCount","writeToStore","data","registerStreamUpdates","sub","createWebsocketSubscription","invalidateObjectType","objectType","has","modified","revalidate","Promise","resolve","createPayload","params","resolvedList","resolvedData","isOptimistic","fetchMore","hasMore","status","lastUpdated","objectSet"],"sources":["ObjectSetQuery.ts"],"sourcesContent":["/*\n * Copyright 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 { ObjectSet, Osdk, PageResult } from \"@osdk/api\";\nimport type { Observable, Subscription } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport { getWireObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport type { ObjectSetPayload } from \"../../ObjectSetPayload.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport { BaseListQuery } from \"../base-list/BaseListQuery.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Changes } from \"../Changes.js\";\nimport { getObjectTypesThatInvalidate } from \"../getObjectTypesThatInvalidate.js\";\nimport type { Entry } from \"../Layer.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { OrderBySortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport type {\n ObjectSetCacheKey,\n ObjectSetOperations,\n} from \"./ObjectSetCacheKey.js\";\nimport type { ObjectSetQueryOptions } from \"./ObjectSetQueryOptions.js\";\n\nexport class ObjectSetQuery extends BaseListQuery<\n ObjectSetCacheKey,\n ObjectSetPayload,\n ObjectSetQueryOptions\n> {\n #baseObjectSetWire: string;\n #operations: Canonical<ObjectSetOperations>;\n #composedObjectSet: ObjectSet<any, any>;\n #objectTypes: Set<string>;\n\n constructor(\n store: Store,\n subject: Observable<SubjectPayload<ObjectSetCacheKey>>,\n baseObjectSetWire: string,\n operations: Canonical<ObjectSetOperations>,\n cacheKey: ObjectSetCacheKey,\n opts: ObjectSetQueryOptions,\n ) {\n super(\n store,\n subject,\n opts,\n cacheKey,\n process.env.NODE_ENV !== \"production\"\n ? (\n store.client[additionalContext].logger?.child({}, {\n msgPrefix: `ObjectSetQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n\n this.#baseObjectSetWire = baseObjectSetWire;\n this.#operations = operations;\n this.#composedObjectSet = this.#composeObjectSet(opts);\n this.#objectTypes = this.#extractObjectTypes(opts);\n if (opts.autoFetchMore === true) {\n this.minResultsToLoad = Number.MAX_SAFE_INTEGER;\n } else if (typeof opts.autoFetchMore === \"number\") {\n this.minResultsToLoad = Math.max(0, opts.autoFetchMore);\n } else {\n this.minResultsToLoad = opts.pageSize || 0;\n }\n }\n\n public override get rdpConfig(): Canonical<Rdp> | null {\n return this.#operations.withProperties ?? null;\n }\n\n public get selectFields(): Canonical<readonly string[]> | undefined {\n return this.#operations.select;\n }\n\n protected get rawSelect(): Canonical<readonly string[]> | undefined {\n return this.#operations.select;\n }\n\n #composeObjectSet(opts: ObjectSetQueryOptions): ObjectSet<any, any> {\n let result = opts.baseObjectSet;\n\n if (opts.withProperties) {\n result = result.withProperties(opts.withProperties);\n }\n if (opts.where) {\n result = result.where(opts.where);\n }\n if (opts.union && opts.union.length > 0) {\n result = result.union(...opts.union);\n }\n if (opts.intersect && opts.intersect.length > 0) {\n result = result.intersect(...opts.intersect);\n }\n if (opts.subtract && opts.subtract.length > 0) {\n result = result.subtract(...opts.subtract);\n }\n if (opts.pivotTo) {\n result = result.pivotTo(opts.pivotTo);\n }\n\n return result;\n }\n\n #extractObjectTypes(opts: ObjectSetQueryOptions): Set<string> {\n const types = new Set<string>();\n const baseWire = JSON.parse(this.#baseObjectSetWire);\n if (baseWire.type) {\n types.add(baseWire.type);\n }\n\n if (opts.union) {\n for (const os of opts.union) {\n const wire = getWireObjectSet(os);\n if (wire.type) {\n types.add(wire.type);\n }\n }\n }\n\n if (opts.intersect) {\n for (const os of opts.intersect) {\n const wire = getWireObjectSet(os);\n if (wire.type) {\n types.add(wire.type);\n }\n }\n }\n\n if (opts.subtract) {\n for (const os of opts.subtract) {\n const wire = getWireObjectSet(os);\n if (wire.type) {\n types.add(wire.type);\n }\n }\n }\n\n return types;\n }\n\n /**\n * Register changes to the cache specific to ObjectSetQuery\n */\n protected registerCacheChanges(batch: BatchContext): void {\n batch.changes.registerObjectSet(this.cacheKey);\n }\n\n /**\n * Implements fetchPageData from BaseListQuery template method\n * Fetches a page of data from the composed ObjectSet\n */\n protected async fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>> {\n if (\n this.#operations.orderBy\n && Object.keys(this.#operations.orderBy).length > 0\n && !(this.sortingStrategy instanceof OrderBySortingStrategy)\n ) {\n const wireObjectSet = getWireObjectSet(this.#composedObjectSet);\n const { resultType } = await getObjectTypesThatInvalidate(\n this.store.client[additionalContext],\n wireObjectSet,\n );\n this.sortingStrategy = new OrderBySortingStrategy(\n resultType.apiName,\n this.#operations.orderBy,\n );\n }\n\n // Fetch the data with pagination\n const resp = await this.#composedObjectSet.fetchPage({\n $nextPageToken: this.nextPageToken,\n $pageSize: this.getEffectiveFetchPageSize(),\n $includeRid: true,\n ...(this.#operations.select && this.#operations.select.length > 0\n ? { $select: this.#operations.select }\n : {}),\n // OrderBy is already applied in the composed ObjectSet\n ...(this.#operations.orderBy\n && Object.keys(this.#operations.orderBy).length > 0\n ? { $orderBy: this.#operations.orderBy }\n : {}),\n ...(this.options.$loadPropertySecurityMetadata\n ? { $loadPropertySecurityMetadata: true }\n : {}),\n });\n\n if (signal?.aborted) {\n throw new Error(\"Aborted\");\n }\n\n this.nextPageToken = resp.nextPageToken;\n\n return resp;\n }\n\n protected handleFetchError(\n error: unknown,\n _status: Status,\n batch: BatchContext,\n ): Entry<ObjectSetCacheKey> {\n this.logger?.error(\"error\", error);\n this.store.subjects.get(this.cacheKey).error(error);\n\n const existingTotalCount = batch.read(this.cacheKey)?.value?.totalCount;\n return this.writeToStore(\n { data: [], totalCount: existingTotalCount },\n \"error\",\n batch,\n );\n }\n\n registerStreamUpdates(sub: Subscription): void {\n this.createWebsocketSubscription(\n this.#composedObjectSet,\n sub,\n \"observeObjectSet\",\n );\n }\n\n invalidateObjectType = async (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n if (this.#objectTypes.has(objectType)) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n }\n return Promise.resolve();\n };\n\n protected createPayload(\n params: {\n resolvedData: any[] | undefined;\n isOptimistic: boolean;\n status: Status;\n lastUpdated: number;\n totalCount?: string;\n },\n ): ObjectSetPayload {\n return {\n resolvedList: params.resolvedData,\n isOptimistic: params.isOptimistic,\n fetchMore: this.fetchMore,\n hasMore: this.nextPageToken != null,\n status: params.status,\n lastUpdated: params.lastUpdated,\n objectSet: this.#composedObjectSet,\n totalCount: params.totalCount,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ObjectSetQuery.js","names":["additionalContext","getWireObjectSet","BaseListQuery","DEBUG_ONLY__changesToString","getObjectTypesThatInvalidate","API_NAME_IDX","OBJECT_API_NAME_IDX","objectSortaMatchesWhereClause","objectMatchesWhereClause","OrderBySortingStrategy","ObjectSetQuery","baseObjectSetWire","operations","composedObjectSet","objectTypes","requiresServerEvaluation","resultTypeApiName","constructor","store","subject","cacheKey","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","map","x","JSON","stringify","join","undefined","composeObjectSet","baseWire","parse","extractObjectTypes","pivotTo","union","length","intersect","subtract","extractTypeFromWireObjectSet","autoFetchMore","minResultsToLoad","Number","MAX_SAFE_INTEGER","Math","max","pageSize","rdpConfig","withProperties","selectFields","select","rawSelect","#composeObjectSet","result","baseObjectSet","where","#extractObjectTypes","types","Set","baseTypeName","add","addTypesFromObjectSets","#addTypesFromObjectSets","sets","os","typeName","#extractTypeFromWireObjectSet","wire","type","objectType","interfaceType","registerCacheChanges","batch","changes","registerObjectSet","fetchPageData","signal","orderBy","Object","keys","sortingStrategy","wireObjectSet","resultType","apiName","resp","fetchPage","$nextPageToken","nextPageToken","$pageSize","getEffectiveFetchPageSize","$includeRid","$select","$orderBy","options","$loadPropertySecurityMetadata","aborted","Error","handleFetchError","error","_status","subjects","get","existingTotalCount","read","value","totalCount","writeToStore","data","registerStreamUpdates","sub","createWebsocketSubscription","maybeUpdateAndRevalidate","optimisticId","methodName","debug","modified","has","handleServerRevalidation","handleLocalUpdate","#handleServerRevalidation","added","addedObjects","modifiedObjects","revalidate","deletedKey","deleted","getRelevantChanges","#getRelevantChanges","resultApiName","hasRelevantDeletions","key","#handleLocalUpdate","whereClause","effectiveWhere","whereCanonicalizer","canonicalize","$and","relevant","addedMatches","classifyByWhereMatch","modifiedMatches","status","uncertain","size","retVal","needsRevalidation","existingKeys","newList","reconcileListChanges","definite","optimisticWrite","obj","getObjectCacheKey","_updateList","#classifyByWhereMatch","objects","#getObjectCacheKey","pk","$primaryKey","cacheKeys","$objectType","invalidateObjectType","Promise","resolve","createPayload","params","resolvedList","resolvedData","isOptimistic","fetchMore","hasMore","lastUpdated","objectSet","addedDefiniteMatches","objectsToInsert","keysToRemove","push"],"sources":["ObjectSetQuery.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 { ObjectSet, Osdk, PageResult } from \"@osdk/api\";\nimport type { ObjectSet as WireObjectSet } from \"@osdk/foundry.ontologies\";\nimport type { Observable, Subscription } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport type { InterfaceHolder } from \"../../../object/convertWireToOsdkObjects/InterfaceHolder.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport { getWireObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport type { ObjectSetPayload } from \"../../ObjectSetPayload.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport { BaseListQuery } from \"../base-list/BaseListQuery.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport { type Changes, DEBUG_ONLY__changesToString } from \"../Changes.js\";\nimport { getObjectTypesThatInvalidate } from \"../getObjectTypesThatInvalidate.js\";\nimport type { Entry } from \"../Layer.js\";\nimport {\n API_NAME_IDX as OBJECT_API_NAME_IDX,\n type ObjectCacheKey,\n} from \"../object/ObjectCacheKey.js\";\nimport { objectSortaMatchesWhereClause as objectMatchesWhereClause } from \"../objectMatchesWhereClause.js\";\nimport type { OptimisticId } from \"../OptimisticId.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport { OrderBySortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport type {\n ObjectSetCacheKey,\n ObjectSetOperations,\n} from \"./ObjectSetCacheKey.js\";\nimport type { ObjectSetQueryOptions } from \"./ObjectSetQueryOptions.js\";\n\nexport class ObjectSetQuery extends BaseListQuery<\n ObjectSetCacheKey,\n ObjectSetPayload,\n ObjectSetQueryOptions\n> {\n #baseObjectSetWire: string;\n #operations: Canonical<ObjectSetOperations>;\n #composedObjectSet: ObjectSet<any, any>;\n #objectTypes: Set<string>;\n #requiresServerEvaluation: boolean;\n #resultTypeApiName: string;\n\n constructor(\n store: Store,\n subject: Observable<SubjectPayload<ObjectSetCacheKey>>,\n baseObjectSetWire: string,\n operations: Canonical<ObjectSetOperations>,\n cacheKey: ObjectSetCacheKey,\n opts: ObjectSetQueryOptions,\n ) {\n super(\n store,\n subject,\n opts,\n cacheKey,\n process.env.NODE_ENV !== \"production\"\n ? (\n store.client[additionalContext].logger?.child({}, {\n msgPrefix: `ObjectSetQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n\n this.#baseObjectSetWire = baseObjectSetWire;\n this.#operations = operations;\n this.#composedObjectSet = this.#composeObjectSet(opts);\n\n const baseWire: WireObjectSet = JSON.parse(baseObjectSetWire);\n this.#objectTypes = this.#extractObjectTypes(baseWire, opts);\n\n this.#requiresServerEvaluation = !!(\n operations.pivotTo\n || (operations.union && operations.union.length > 0)\n || (operations.intersect && operations.intersect.length > 0)\n || (operations.subtract && operations.subtract.length > 0)\n );\n\n this.#resultTypeApiName =\n ObjectSetQuery.#extractTypeFromWireObjectSet(baseWire) ?? \"\";\n\n if (opts.autoFetchMore === true) {\n this.minResultsToLoad = Number.MAX_SAFE_INTEGER;\n } else if (typeof opts.autoFetchMore === \"number\") {\n this.minResultsToLoad = Math.max(0, opts.autoFetchMore);\n } else {\n this.minResultsToLoad = opts.pageSize || 0;\n }\n }\n\n get objectTypes(): ReadonlySet<string> {\n return this.#objectTypes;\n }\n\n public override get rdpConfig(): Canonical<Rdp> | null {\n return this.#operations.withProperties ?? null;\n }\n\n public get selectFields(): Canonical<readonly string[]> | undefined {\n return this.#operations.select;\n }\n\n protected get rawSelect(): Canonical<readonly string[]> | undefined {\n return this.#operations.select;\n }\n\n #composeObjectSet(opts: ObjectSetQueryOptions): ObjectSet<any, any> {\n let result = opts.baseObjectSet;\n\n if (opts.withProperties) {\n result = result.withProperties(opts.withProperties);\n }\n if (opts.where) {\n result = result.where(opts.where);\n }\n if (opts.union && opts.union.length > 0) {\n result = result.union(...opts.union);\n }\n if (opts.intersect && opts.intersect.length > 0) {\n result = result.intersect(...opts.intersect);\n }\n if (opts.subtract && opts.subtract.length > 0) {\n result = result.subtract(...opts.subtract);\n }\n if (opts.pivotTo) {\n result = result.pivotTo(opts.pivotTo);\n }\n\n return result;\n }\n\n #extractObjectTypes(\n baseWire: WireObjectSet,\n opts: ObjectSetQueryOptions,\n ): Set<string> {\n const types = new Set<string>();\n const baseTypeName = ObjectSetQuery.#extractTypeFromWireObjectSet(\n baseWire,\n );\n if (baseTypeName) {\n types.add(baseTypeName);\n }\n ObjectSetQuery.#addTypesFromObjectSets(opts.union, types);\n ObjectSetQuery.#addTypesFromObjectSets(opts.intersect, types);\n ObjectSetQuery.#addTypesFromObjectSets(opts.subtract, types);\n return types;\n }\n\n static #addTypesFromObjectSets(\n sets: ReadonlyArray<ObjectSet<any, any>> | undefined,\n types: Set<string>,\n ): void {\n if (!sets) {\n return;\n }\n for (const os of sets) {\n const typeName = ObjectSetQuery.#extractTypeFromWireObjectSet(\n getWireObjectSet(os),\n );\n if (typeName) {\n types.add(typeName);\n }\n }\n }\n\n static #extractTypeFromWireObjectSet(\n wire: WireObjectSet,\n ): string | undefined {\n if (wire.type === \"base\") {\n return wire.objectType;\n }\n if (wire.type === \"interfaceBase\") {\n return wire.interfaceType;\n }\n return undefined;\n }\n\n /**\n * Register changes to the cache specific to ObjectSetQuery\n */\n protected registerCacheChanges(batch: BatchContext): void {\n batch.changes.registerObjectSet(this.cacheKey);\n }\n\n /**\n * Implements fetchPageData from BaseListQuery template method\n * Fetches a page of data from the composed ObjectSet\n */\n protected async fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>> {\n if (\n this.#operations.orderBy\n && Object.keys(this.#operations.orderBy).length > 0\n && !(this.sortingStrategy instanceof OrderBySortingStrategy)\n ) {\n const wireObjectSet = getWireObjectSet(this.#composedObjectSet);\n const { resultType } = await getObjectTypesThatInvalidate(\n this.store.client[additionalContext],\n wireObjectSet,\n );\n this.sortingStrategy = new OrderBySortingStrategy(\n resultType.apiName,\n this.#operations.orderBy,\n );\n }\n\n // Fetch the data with pagination\n const resp = await this.#composedObjectSet.fetchPage({\n $nextPageToken: this.nextPageToken,\n $pageSize: this.getEffectiveFetchPageSize(),\n $includeRid: true,\n ...(this.#operations.select && this.#operations.select.length > 0\n ? { $select: this.#operations.select }\n : {}),\n // OrderBy is already applied in the composed ObjectSet\n ...(this.#operations.orderBy\n && Object.keys(this.#operations.orderBy).length > 0\n ? { $orderBy: this.#operations.orderBy }\n : {}),\n ...(this.options.$loadPropertySecurityMetadata\n ? { $loadPropertySecurityMetadata: true }\n : {}),\n });\n\n if (signal?.aborted) {\n throw new Error(\"Aborted\");\n }\n\n this.nextPageToken = resp.nextPageToken;\n\n return resp;\n }\n\n protected handleFetchError(\n error: unknown,\n _status: Status,\n batch: BatchContext,\n ): Entry<ObjectSetCacheKey> {\n this.logger?.error(\"error\", error);\n this.store.subjects.get(this.cacheKey).error(error);\n\n const existingTotalCount = batch.read(this.cacheKey)?.value?.totalCount;\n return this.writeToStore(\n { data: [], totalCount: existingTotalCount },\n \"error\",\n batch,\n );\n }\n\n registerStreamUpdates(sub: Subscription): void {\n this.createWebsocketSubscription(\n this.#composedObjectSet,\n sub,\n \"observeObjectSet\",\n );\n }\n\n maybeUpdateAndRevalidate = (\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ): Promise<void> | undefined => {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"maybeUpdateAndRevalidate\" }).debug(\n DEBUG_ONLY__changesToString(changes),\n );\n this.logger?.child({ methodName: \"maybeUpdateAndRevalidate\" }).debug(\n `Already in changes? ${changes.modified.has(this.cacheKey)}`,\n );\n }\n\n if (changes.modified.has(this.cacheKey)) {\n return;\n }\n changes.modified.add(this.cacheKey);\n\n try {\n if (this.#requiresServerEvaluation) {\n return this.#handleServerRevalidation(changes);\n }\n return this.#handleLocalUpdate(changes, optimisticId);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"maybeUpdateAndRevalidate\" })\n .debug(\"in finally\");\n }\n }\n };\n\n #handleServerRevalidation(changes: Changes): Promise<void> | undefined {\n for (const objectType of this.#objectTypes) {\n const added = changes.addedObjects.get(objectType);\n const modified = changes.modifiedObjects.get(objectType);\n if ((added && added.length > 0) || (modified && modified.length > 0)) {\n return this.revalidate(true);\n }\n }\n\n for (const deletedKey of changes.deleted) {\n if (\n deletedKey.type === \"object\"\n && this.#objectTypes.has(deletedKey.otherKeys[OBJECT_API_NAME_IDX])\n ) {\n return this.revalidate(true);\n }\n }\n\n return undefined;\n }\n\n #getRelevantChanges(\n changes: Changes,\n ):\n | { addedObjects: ObjectHolder[]; modifiedObjects: ObjectHolder[] }\n | undefined\n {\n const resultApiName = this.#resultTypeApiName;\n const addedObjects = changes.addedObjects.get(resultApiName) ?? [];\n const modifiedObjects = changes.modifiedObjects.get(resultApiName) ?? [];\n\n let hasRelevantDeletions = false;\n for (const key of changes.deleted) {\n if (\n key.type === \"object\"\n && key.otherKeys[OBJECT_API_NAME_IDX] === resultApiName\n ) {\n hasRelevantDeletions = true;\n break;\n }\n }\n\n if (\n addedObjects.length === 0 && modifiedObjects.length === 0\n && !hasRelevantDeletions\n ) {\n return undefined;\n }\n\n return { addedObjects, modifiedObjects };\n }\n\n #handleLocalUpdate(\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ): Promise<void> | undefined {\n const whereClause = this.#operations.where as\n | Canonical<SimpleWhereClause>\n | undefined;\n const effectiveWhere = whereClause\n ?? this.store.whereCanonicalizer.canonicalize({ $and: [] });\n\n const relevant = this.#getRelevantChanges(changes);\n if (!relevant) {\n return undefined;\n }\n\n const addedMatches = this.#classifyByWhereMatch(\n relevant.addedObjects,\n effectiveWhere,\n );\n const modifiedMatches = this.#classifyByWhereMatch(\n relevant.modifiedObjects,\n effectiveWhere,\n );\n\n const status = optimisticId\n || addedMatches.uncertain.size > 0\n || modifiedMatches.uncertain.size > 0\n ? \"loading\"\n : \"loaded\";\n\n const { retVal: needsRevalidation } = this.store.batch(\n { optimisticId, changes },\n (batch) => {\n const existingKeys = new Set(\n batch.read(this.cacheKey)?.value?.data,\n );\n\n const { newList, needsRevalidation } = reconcileListChanges(\n existingKeys,\n addedMatches.definite,\n relevant.modifiedObjects,\n modifiedMatches,\n changes.deleted,\n batch.optimisticWrite,\n (obj) => this.#getObjectCacheKey(obj),\n );\n\n const existingTotalCount = batch.read(this.cacheKey)?.value?.totalCount;\n this._updateList(\n newList,\n status,\n batch,\n { type: \"clientOrdered\" },\n existingTotalCount,\n );\n\n return needsRevalidation;\n },\n );\n\n if (needsRevalidation) {\n return this.revalidate(true);\n }\n return undefined;\n }\n\n #classifyByWhereMatch(\n objects: ReadonlyArray<ObjectHolder | InterfaceHolder>,\n whereClause: Canonical<SimpleWhereClause>,\n ): {\n definite: ReadonlySet<ObjectHolder | InterfaceHolder>;\n uncertain: ReadonlySet<ObjectHolder | InterfaceHolder>;\n } {\n const definite = new Set<ObjectHolder | InterfaceHolder>();\n const uncertain = new Set<ObjectHolder | InterfaceHolder>();\n for (const obj of objects) {\n if (objectMatchesWhereClause(obj, whereClause, true)) {\n definite.add(obj);\n } else if (objectMatchesWhereClause(obj, whereClause, false)) {\n uncertain.add(obj);\n }\n }\n return { definite, uncertain };\n }\n\n #getObjectCacheKey(\n obj: { $objectType: string; $primaryKey: string | number },\n ): ObjectCacheKey {\n const pk = obj.$primaryKey;\n return this.cacheKeys.get<ObjectCacheKey>(\n \"object\",\n obj.$objectType,\n pk,\n this.rdpConfig ?? undefined,\n );\n }\n\n invalidateObjectType = async (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n if (this.#objectTypes.has(objectType)) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n }\n return Promise.resolve();\n };\n\n protected createPayload(\n params: {\n resolvedData: any[] | undefined;\n isOptimistic: boolean;\n status: Status;\n lastUpdated: number;\n totalCount?: string;\n },\n ): ObjectSetPayload {\n return {\n resolvedList: params.resolvedData,\n isOptimistic: params.isOptimistic,\n fetchMore: this.fetchMore,\n hasMore: this.nextPageToken != null,\n status: params.status,\n lastUpdated: params.lastUpdated,\n objectSet: this.#composedObjectSet,\n totalCount: params.totalCount,\n };\n }\n}\n\nfunction reconcileListChanges(\n existingKeys: ReadonlySet<ObjectCacheKey>,\n addedDefiniteMatches: ReadonlySet<ObjectHolder | InterfaceHolder>,\n modifiedObjects: ReadonlyArray<ObjectHolder>,\n modifiedMatches: {\n definite: ReadonlySet<ObjectHolder | InterfaceHolder>;\n uncertain: ReadonlySet<ObjectHolder | InterfaceHolder>;\n },\n deleted: ReadonlySet<CacheKey>,\n isOptimistic: boolean,\n getObjectCacheKey: (\n obj: ObjectHolder | InterfaceHolder,\n ) => ObjectCacheKey,\n): { newList: ObjectCacheKey[]; needsRevalidation: boolean } {\n const objectsToInsert = new Set<ObjectHolder | InterfaceHolder>(\n addedDefiniteMatches,\n );\n const keysToRemove = new Set<CacheKey>(deleted);\n\n let needsRevalidation = false;\n for (const obj of modifiedObjects) {\n if (modifiedMatches.definite.has(obj)) {\n if (!existingKeys.has(getObjectCacheKey(obj))) {\n objectsToInsert.add(obj);\n }\n } else if (!isOptimistic) {\n keysToRemove.add(getObjectCacheKey(obj));\n if (modifiedMatches.uncertain.has(obj)) {\n needsRevalidation = true;\n }\n }\n }\n\n const newList: ObjectCacheKey[] = [];\n for (const key of existingKeys) {\n if (!keysToRemove.has(key)) {\n newList.push(key);\n }\n }\n for (const obj of objectsToInsert) {\n newList.push(getObjectCacheKey(obj));\n }\n\n return { newList, needsRevalidation };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -14,6 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- export const USER_AGENT = `osdk-client/${"2.8.0-beta.26"}`;
18
- export const OBSERVABLE_USER_AGENT = `osdk-observable-client/${"2.8.0-beta.26"}`;
17
+ export const USER_AGENT = `osdk-client/${"2.8.0-beta.27"}`;
18
+ export const OBSERVABLE_USER_AGENT = `osdk-observable-client/${"2.8.0-beta.27"}`;
19
19
  //# sourceMappingURL=UserAgent.js.map
@@ -0,0 +1,8 @@
1
+ import type { Canonical } from "./Canonical.js";
2
+ import { CachingCanonicalizer } from "./Canonicalizer.js";
3
+ export declare class GenericCanonicalizer extends CachingCanonicalizer<object, object> {
4
+ #private;
5
+ canonicalize<T extends object>(input: T): Canonical<T>;
6
+ canonicalize<T extends object>(input: T | undefined): Canonical<T> | undefined;
7
+ protected lookupOrCreate(input: object): Canonical<object>;
8
+ }
@@ -0,0 +1 @@
1
+ {"mappings":"AAkBA,cAAc,iBAAiB,gBAAiB;AAChD,SAAS,4BAA4B,oBAAqB;AAO1D,OAAO,cAAM,6BAA6B,qCAAqC;;CAK7E,aAAa,kBAAkBA,OAAO,IAAI,UAAU;CACpD,aAAa,kBACXC,OAAO,gBACN,UAAU;CAOb,UAAU,eAAeC,gBAAgB;AA0C1C","names":["input: T","input: T | undefined","input: object"],"sources":["../../../../src/observable/internal/GenericCanonicalizer.ts"],"version":3,"file":"GenericCanonicalizer.d.ts"}
@@ -1 +1 @@
1
- {"mappings":"AAgBA,cACE,6BACA,mBACA,mBACK,WAAY;AACnB,cAAc,iBAAiB,gBAAiB;AAChD,SAAS,4BAA4B,oBAAqB;AAC1D,cAAc,yBAAyB,wBAAyB;AAChE,cAAc,gCAAgC,+BAAgC;KAEzE;CACH,UAAU,8BAA8B;CACxC,aAAa,eAAe,qBAAqB,eAE/C;IAEA,MAAM;CAAE,OAAO,YAAY,GAAG;AAAO;AAEzC,OAAO,cAAM,+BAA+B,qBAC1C,oBACA,MAAM,UAAU,qBAChB;CAMY;CALZ,QAAQ;CAKR,YAAoBA,oBAAoB;CAIxC,UAAU,eACRC,eAAe,qBACd,UAAU,MAAM,UAAU;AAoB9B","names":["whereCanonicalizer: WhereClauseCanonicalizer","intersectWith: IntersectWithInput"],"sources":["../../../../src/observable/internal/IntersectCanonicalizer.ts"],"version":3,"file":"IntersectCanonicalizer.d.ts"}
1
+ {"mappings":"AAgBA,cACE,6BACA,mBACA,mBACK,WAAY;AACnB,cAAc,iBAAiB,gBAAiB;AAChD,SAAS,4BAA4B,oBAAqB;AAC1D,cAAc,yBAAyB,wBAAyB;AAChE,cAAc,gCAAgC,+BAAgC;KAEzE;CACH,UAAU,8BAA8B;CACxC,aAAa,eAAe,qBAAqB,eAE/C;IAEA,MAAM;CAAE,OAAO,YAAY,GAAG;AAAO;AAEzC,OAAO,cAAM,+BAA+B,qBAC1C,oBACA,MAAM,UAAU,qBAChB;CAMY;CALZ,QAAQ;CAKR,YAAoBA,oBAAoB;CAIxC,UAAU,eACRC,eAAe,qBACd,UAAU,MAAM,UAAU;AAqB9B","names":["whereCanonicalizer: WhereClauseCanonicalizer","intersectWith: IntersectWithInput"],"sources":["../../../../src/observable/internal/IntersectCanonicalizer.ts"],"version":3,"file":"IntersectCanonicalizer.d.ts"}
@@ -0,0 +1,7 @@
1
+ import type { Canonical } from "./Canonical.js";
2
+ export declare class ObjectSetArrayCanonicalizer {
3
+ #private;
4
+ canonicalizeUnion(items: string[]): Canonical<string[]>;
5
+ canonicalizeIntersect(items: string[]): Canonical<string[]>;
6
+ canonicalizeSubtract(items: string[]): Canonical<string[]>;
7
+ }
@@ -0,0 +1 @@
1
+ {"mappings":"AAgBA,cAAc,iBAAiB,gBAAiB;AAGhD,OAAO,cAAM,4BAA4B;;CAKvC,kBAAkBA,kBAAkB;CAKpC,sBAAsBA,kBAAkB;CAKxC,qBAAqBA,kBAAkB;AAGxC","names":["items: string[]"],"sources":["../../../../src/observable/internal/ObjectSetArrayCanonicalizer.ts"],"version":3,"file":"ObjectSetArrayCanonicalizer.d.ts"}
@@ -7,6 +7,7 @@ import type { BatchContext } from "./BatchContext.js";
7
7
  import { CacheKeys } from "./CacheKeys.js";
8
8
  import { type Changes } from "./Changes.js";
9
9
  import { FunctionsHelper } from "./function/FunctionsHelper.js";
10
+ import { GenericCanonicalizer } from "./GenericCanonicalizer.js";
10
11
  import { IntersectCanonicalizer } from "./IntersectCanonicalizer.js";
11
12
  import type { KnownCacheKey } from "./KnownCacheKey.js";
12
13
  import type { Entry } from "./Layer.js";
@@ -16,6 +17,7 @@ import { ListsHelper } from "./list/ListsHelper.js";
16
17
  import { ObjectCacheKeyRegistry } from "./object/ObjectCacheKeyRegistry.js";
17
18
  import { ObjectsHelper } from "./object/ObjectsHelper.js";
18
19
  import { ObjectSetHelper } from "./objectset/ObjectSetHelper.js";
20
+ import { ObjectSetArrayCanonicalizer } from "./ObjectSetArrayCanonicalizer.js";
19
21
  import { type OptimisticId } from "./OptimisticId.js";
20
22
  import { OrderByCanonicalizer } from "./OrderByCanonicalizer.js";
21
23
  import { PivotCanonicalizer } from "./PivotCanonicalizer.js";
@@ -45,6 +47,8 @@ export declare class Store {
45
47
  readonly pivotCanonicalizer: PivotCanonicalizer;
46
48
  readonly ridListCanonicalizer: RidListCanonicalizer;
47
49
  readonly selectCanonicalizer: SelectCanonicalizer;
50
+ readonly objectSetArrayCanonicalizer: ObjectSetArrayCanonicalizer;
51
+ readonly genericCanonicalizer: GenericCanonicalizer;
48
52
  readonly client: Client;
49
53
  readonly cacheKeys: CacheKeys<KnownCacheKey>;
50
54
  readonly queries: Queries;