@osdk/react 0.9.3 → 0.10.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +46 -221
- package/CHANGELOG.md +109 -51
- package/build/browser/new/makeExternalStore.js +61 -0
- package/build/browser/new/makeExternalStore.js.map +1 -1
- package/build/browser/new/useLinks.js +11 -4
- package/build/browser/new/useLinks.js.map +1 -1
- package/build/browser/new/useObjectSet.js +6 -3
- package/build/browser/new/useObjectSet.js.map +1 -1
- package/build/browser/new/useOsdkAction.js +2 -2
- package/build/browser/new/useOsdkAction.js.map +1 -1
- package/build/browser/new/useOsdkAggregation.js +65 -27
- package/build/browser/new/useOsdkAggregation.js.map +1 -1
- package/build/browser/new/useOsdkFunction.js +17 -12
- package/build/browser/new/useOsdkFunction.js.map +1 -1
- package/build/browser/new/useOsdkObject.js +36 -17
- package/build/browser/new/useOsdkObject.js.map +1 -1
- package/build/browser/new/useOsdkObjects.js +28 -19
- package/build/browser/new/useOsdkObjects.js.map +1 -1
- package/build/browser/{intellisense.test.helpers/useOsdkObjectsWithPivot.js → public/experimental/admin.js} +4 -19
- package/build/browser/public/experimental/admin.js.map +1 -0
- package/build/browser/public/experimental.js +0 -3
- package/build/browser/public/experimental.js.map +1 -1
- package/build/browser/useOsdkMetadata.js.map +1 -1
- package/build/cjs/{chunk-V32JHU3O.cjs → chunk-OVBG5VXE.cjs} +3 -8
- package/build/cjs/chunk-OVBG5VXE.cjs.map +1 -0
- package/build/cjs/chunk-SVVMLSKN.cjs +111 -0
- package/build/cjs/chunk-SVVMLSKN.cjs.map +1 -0
- package/build/cjs/index.cjs +4 -4
- package/build/cjs/index.d.cts +1 -1
- package/build/cjs/public/experimental/admin.cjs +146 -0
- package/build/cjs/public/experimental/admin.cjs.map +1 -0
- package/build/cjs/public/experimental/admin.d.cts +118 -0
- package/build/cjs/public/experimental.cjs +217 -478
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.d.cts +88 -127
- package/build/cjs/useOsdkMetadata-BElt3F5s.d.cts +15 -0
- package/build/esm/new/makeExternalStore.js +61 -0
- package/build/esm/new/makeExternalStore.js.map +1 -1
- package/build/esm/new/useLinks.js +11 -4
- package/build/esm/new/useLinks.js.map +1 -1
- package/build/esm/new/useObjectSet.js +6 -3
- package/build/esm/new/useObjectSet.js.map +1 -1
- package/build/esm/new/useOsdkAction.js +2 -2
- package/build/esm/new/useOsdkAction.js.map +1 -1
- package/build/esm/new/useOsdkAggregation.js +65 -27
- package/build/esm/new/useOsdkAggregation.js.map +1 -1
- package/build/esm/new/useOsdkFunction.js +17 -12
- package/build/esm/new/useOsdkFunction.js.map +1 -1
- package/build/esm/new/useOsdkObject.js +36 -17
- package/build/esm/new/useOsdkObject.js.map +1 -1
- package/build/esm/new/useOsdkObjects.js +28 -19
- package/build/esm/new/useOsdkObjects.js.map +1 -1
- package/build/esm/{intellisense.test.helpers/useOsdkObjectsWithPivot.js → public/experimental/admin.js} +4 -19
- package/build/esm/public/experimental/admin.js.map +1 -0
- package/build/esm/public/experimental.js +0 -3
- package/build/esm/public/experimental.js.map +1 -1
- package/build/esm/useOsdkMetadata.js.map +1 -1
- package/build/types/new/makeExternalStore.d.ts +11 -0
- package/build/types/new/makeExternalStore.d.ts.map +1 -1
- package/build/types/new/useLinks.d.ts +19 -0
- package/build/types/new/useLinks.d.ts.map +1 -1
- package/build/types/new/useObjectSet.d.ts +6 -0
- package/build/types/new/useObjectSet.d.ts.map +1 -1
- package/build/types/new/useOsdkAggregation.d.ts +41 -3
- package/build/types/new/useOsdkAggregation.d.ts.map +1 -1
- package/build/types/new/useOsdkFunction.d.ts +11 -5
- package/build/types/new/useOsdkFunction.d.ts.map +1 -1
- package/build/types/new/useOsdkObject.d.ts +12 -1
- package/build/types/new/useOsdkObject.d.ts.map +1 -1
- package/build/types/new/useOsdkObjects.d.ts +10 -0
- package/build/types/new/useOsdkObjects.d.ts.map +1 -1
- package/build/types/public/experimental/admin.d.ts +3 -0
- package/build/types/public/experimental/admin.d.ts.map +1 -0
- package/build/types/public/experimental.d.ts +0 -3
- package/build/types/public/experimental.d.ts.map +1 -1
- package/build/types/useOsdkMetadata.d.ts +5 -4
- package/build/types/useOsdkMetadata.d.ts.map +1 -1
- package/docs/querying-data.md +19 -0
- package/{build/esm/intellisense.test.helpers/useOsdkObjectsWithProperties.js → experimental/admin.d.ts} +1 -18
- package/package.json +29 -8
- package/build/browser/intellisense.test.helpers/useOsdkObjectsWithPivot.js.map +0 -1
- package/build/browser/intellisense.test.helpers/useOsdkObjectsWithProperties.js +0 -34
- package/build/browser/intellisense.test.helpers/useOsdkObjectsWithProperties.js.map +0 -1
- package/build/browser/intellisense.test.helpers/useOsdkObjectsWithRids.js +0 -37
- package/build/browser/intellisense.test.helpers/useOsdkObjectsWithRids.js.map +0 -1
- package/build/browser/intellisense.test.js +0 -172
- package/build/browser/intellisense.test.js.map +0 -1
- package/build/cjs/chunk-V32JHU3O.cjs.map +0 -1
- package/build/cjs/useOsdkMetadata-DFZhnhGZ.d.cts +0 -14
- package/build/esm/intellisense.test.helpers/useOsdkObjectsWithPivot.js.map +0 -1
- package/build/esm/intellisense.test.helpers/useOsdkObjectsWithProperties.js.map +0 -1
- package/build/esm/intellisense.test.helpers/useOsdkObjectsWithRids.js +0 -37
- package/build/esm/intellisense.test.helpers/useOsdkObjectsWithRids.js.map +0 -1
- package/build/esm/intellisense.test.js +0 -172
- package/build/esm/intellisense.test.js.map +0 -1
- package/build/types/intellisense.test.d.ts +0 -1
- package/build/types/intellisense.test.d.ts.map +0 -1
- package/build/types/intellisense.test.helpers/useOsdkObjectsWithPivot.d.ts +0 -1
- package/build/types/intellisense.test.helpers/useOsdkObjectsWithPivot.d.ts.map +0 -1
- package/build/types/intellisense.test.helpers/useOsdkObjectsWithProperties.d.ts +0 -1
- package/build/types/intellisense.test.helpers/useOsdkObjectsWithProperties.d.ts.map +0 -1
- package/build/types/intellisense.test.helpers/useOsdkObjectsWithRids.d.ts +0 -1
- package/build/types/intellisense.test.helpers/useOsdkObjectsWithRids.d.ts.map +0 -1
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { Client, Osdk, WhereClause, PropertyKeys, ActionDefinition, ActionEditResponse, ActionValidationError, ActionValidationResponse } from '@osdk/client';
|
|
2
|
-
import { ObservableClient, ActionSignatureFromDef, QueryParameterType
|
|
1
|
+
import { Client, Osdk, WhereClause, PropertyKeys, ActionDefinition, ActionEditResponse, ActionValidationError, ActionValidationResponse, ObjectTypeDefinition } from '@osdk/client';
|
|
2
|
+
import { ObservableClient, ActionSignatureFromDef, QueryParameterType } from '@osdk/client/unstable-do-not-use';
|
|
3
3
|
import React from 'react';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
import { ObjectOrInterfaceDefinition, LinkNames, LinkedType, SimplePropertyDef, ObjectSet, WhereClause as WhereClause$1, DerivedProperty, PropertyKeys as PropertyKeys$1, Osdk as Osdk$1, AggregateOpts, AggregationsResults, QueryDefinition, CompileTimeMetadata, ObjectTypeDefinition, PrimaryKeyType } from '@osdk/api';
|
|
7
|
-
export { U as UseOsdkMetadataResult, u as useOsdkClient, a as useOsdkMetadata } from '../useOsdkMetadata-DFZhnhGZ.cjs';
|
|
4
|
+
import { ObjectOrInterfaceDefinition, LinkNames, LinkedType, SimplePropertyDef, ObjectSet, WhereClause as WhereClause$1, DerivedProperty, PropertyKeys as PropertyKeys$1, Osdk as Osdk$1, AggregateOpts, AggregationsResults, QueryDefinition, CompileTimeMetadata, ObjectTypeDefinition as ObjectTypeDefinition$1, PrimaryKeyType } from '@osdk/api';
|
|
5
|
+
export { U as UseOsdkMetadataResult, u as useOsdkClient, a as useOsdkMetadata } from '../useOsdkMetadata-BElt3F5s.cjs';
|
|
8
6
|
|
|
9
7
|
interface OsdkProviderOptions {
|
|
10
8
|
children: React.ReactNode;
|
|
@@ -13,120 +11,6 @@ interface OsdkProviderOptions {
|
|
|
13
11
|
}
|
|
14
12
|
declare function OsdkProvider2({ children, client, observableClient, }: OsdkProviderOptions): React.JSX.Element;
|
|
15
13
|
|
|
16
|
-
interface UseCurrentFoundryUserOptions {
|
|
17
|
-
/**
|
|
18
|
-
* Enable or disable the query.
|
|
19
|
-
*
|
|
20
|
-
* When `false`, the query will not automatically execute.
|
|
21
|
-
*
|
|
22
|
-
* This is useful for:
|
|
23
|
-
* - Lazy/on-demand queries that should wait for user interaction
|
|
24
|
-
* - Dependent queries that need data from another query first
|
|
25
|
-
* - Conditional queries based on component state
|
|
26
|
-
*
|
|
27
|
-
* @default true
|
|
28
|
-
* });
|
|
29
|
-
*/
|
|
30
|
-
enabled?: boolean;
|
|
31
|
-
}
|
|
32
|
-
interface UseCurrentFoundryUserResult {
|
|
33
|
-
currentUser: User | undefined;
|
|
34
|
-
isLoading: boolean;
|
|
35
|
-
error: Error | undefined;
|
|
36
|
-
refetch: () => void;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Get the currently signed in User.
|
|
40
|
-
* @param options Options to control the query.
|
|
41
|
-
*/
|
|
42
|
-
declare function useCurrentFoundryUser({ enabled }?: UseCurrentFoundryUserOptions): UseCurrentFoundryUserResult;
|
|
43
|
-
|
|
44
|
-
interface UseFoundryUserOptions {
|
|
45
|
-
/**
|
|
46
|
-
* Enable or disable the query.
|
|
47
|
-
*
|
|
48
|
-
* When `false`, the query will not automatically execute.
|
|
49
|
-
*
|
|
50
|
-
* This is useful for:
|
|
51
|
-
* - Lazy/on-demand queries that should wait for user interaction
|
|
52
|
-
* - Dependent queries that need data from another query first
|
|
53
|
-
* - Conditional queries based on component state
|
|
54
|
-
*
|
|
55
|
-
* @default true
|
|
56
|
-
* });
|
|
57
|
-
*/
|
|
58
|
-
enabled?: boolean;
|
|
59
|
-
/**
|
|
60
|
-
* The default status of the users returned in the list.
|
|
61
|
-
*
|
|
62
|
-
* @default "ACTIVE"
|
|
63
|
-
*/
|
|
64
|
-
status?: UserStatus;
|
|
65
|
-
}
|
|
66
|
-
interface UseFoundryUserResult {
|
|
67
|
-
user: User | undefined;
|
|
68
|
-
isLoading: boolean;
|
|
69
|
-
error: Error | undefined;
|
|
70
|
-
refetch: () => void;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Get the User with the specified id.
|
|
74
|
-
* @param userId A Foundry User ID.
|
|
75
|
-
* @param options Options to control the query.
|
|
76
|
-
*/
|
|
77
|
-
declare function useFoundryUser(userId: string, { enabled, status }?: UseFoundryUserOptions): UseFoundryUserResult;
|
|
78
|
-
|
|
79
|
-
interface UseFoundryUsersListOptions {
|
|
80
|
-
/**
|
|
81
|
-
* Enable or disable the query.
|
|
82
|
-
*
|
|
83
|
-
* When `false`, the query will not automatically execute.
|
|
84
|
-
*
|
|
85
|
-
* This is useful for:
|
|
86
|
-
* - Lazy/on-demand queries that should wait for user interaction
|
|
87
|
-
* - Dependent queries that need data from another query first
|
|
88
|
-
* - Conditional queries based on component state
|
|
89
|
-
*
|
|
90
|
-
* @default true
|
|
91
|
-
* });
|
|
92
|
-
*/
|
|
93
|
-
enabled?: boolean;
|
|
94
|
-
/**
|
|
95
|
-
* The default status of the users returned in the list.
|
|
96
|
-
*
|
|
97
|
-
* @default "ACTIVE"
|
|
98
|
-
*/
|
|
99
|
-
include?: UserStatus;
|
|
100
|
-
/**
|
|
101
|
-
* The preferred page size for the list.
|
|
102
|
-
*
|
|
103
|
-
* @default 1000
|
|
104
|
-
*/
|
|
105
|
-
pageSize?: number;
|
|
106
|
-
/**
|
|
107
|
-
* The page token indicates where to start paging. This should be omitted from the first page's request.
|
|
108
|
-
* To fetch the next page, clients should take the value from the nextPageToken field of the previous
|
|
109
|
-
* response and use it to populate the pageToken field of the next request.
|
|
110
|
-
*/
|
|
111
|
-
pageToken?: string;
|
|
112
|
-
}
|
|
113
|
-
interface UseFoundryUsersListResult {
|
|
114
|
-
users: ListUsersResponse["data"] | undefined;
|
|
115
|
-
/**
|
|
116
|
-
* The page token to be used for the next page of users. If this is undefined, there are no more
|
|
117
|
-
* pages of users to load.
|
|
118
|
-
*/
|
|
119
|
-
nextPageToken: string | undefined;
|
|
120
|
-
isLoading: boolean;
|
|
121
|
-
error: Error | undefined;
|
|
122
|
-
refetch: () => void;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Lists all Users. This is a paged endpoint. Each page may be smaller or larger than the requested page size.
|
|
126
|
-
* @param options Options to control the query.
|
|
127
|
-
*/
|
|
128
|
-
declare function useFoundryUsersList({ enabled, include, pageSize, pageToken }?: UseFoundryUsersListOptions): UseFoundryUsersListResult;
|
|
129
|
-
|
|
130
14
|
interface UseLinksOptions<T extends ObjectOrInterfaceDefinition> {
|
|
131
15
|
/**
|
|
132
16
|
* Standard OSDK Where clause for filtering linked objects
|
|
@@ -140,6 +24,12 @@ interface UseLinksOptions<T extends ObjectOrInterfaceDefinition> {
|
|
|
140
24
|
orderBy?: {
|
|
141
25
|
[K in PropertyKeys<T>]?: "asc" | "desc";
|
|
142
26
|
};
|
|
27
|
+
/**
|
|
28
|
+
* Restrict which properties are returned for each linked object.
|
|
29
|
+
* When provided, only the specified properties will be fetched,
|
|
30
|
+
* reducing payload sizes for list views.
|
|
31
|
+
*/
|
|
32
|
+
$select?: readonly PropertyKeys<T>[];
|
|
143
33
|
/**
|
|
144
34
|
* The mode to use for fetching data.
|
|
145
35
|
* - undefined: Fetch data if not already in cache
|
|
@@ -147,6 +37,13 @@ interface UseLinksOptions<T extends ObjectOrInterfaceDefinition> {
|
|
|
147
37
|
* - "offline": Only use cached data, don't make network requests
|
|
148
38
|
*/
|
|
149
39
|
mode?: "force" | "offline";
|
|
40
|
+
/**
|
|
41
|
+
* The number of milliseconds to wait after the last observed link change.
|
|
42
|
+
*
|
|
43
|
+
* Two uses of `useLinks` with the same parameters will only trigger one
|
|
44
|
+
* network request if the second is within `dedupeIntervalMs`.
|
|
45
|
+
*/
|
|
46
|
+
dedupeIntervalMs?: number;
|
|
150
47
|
/**
|
|
151
48
|
* Enable or disable the query.
|
|
152
49
|
*
|
|
@@ -170,6 +67,12 @@ interface UseLinksOptions<T extends ObjectOrInterfaceDefinition> {
|
|
|
170
67
|
}
|
|
171
68
|
interface UseLinksResult<Q extends ObjectOrInterfaceDefinition> {
|
|
172
69
|
links: Osdk.Instance<Q>[] | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Maps each source object's primary key to its linked object instances.
|
|
72
|
+
* Useful when observing links from multiple source objects to determine
|
|
73
|
+
* which source links to which targets.
|
|
74
|
+
*/
|
|
75
|
+
linkedObjectsBySourcePrimaryKey: ReadonlyMap<string | number, ReadonlyArray<Osdk.Instance<Q>>>;
|
|
173
76
|
isLoading: boolean;
|
|
174
77
|
error: Error | undefined;
|
|
175
78
|
/**
|
|
@@ -252,6 +155,12 @@ interface UseObjectSetOptions<Q extends ObjectOrInterfaceDefinition, RDPs extend
|
|
|
252
155
|
* @default false
|
|
253
156
|
*/
|
|
254
157
|
streamUpdates?: boolean;
|
|
158
|
+
/**
|
|
159
|
+
* Restrict which properties are returned for each object.
|
|
160
|
+
* When provided, only the specified properties will be fetched,
|
|
161
|
+
* reducing payload sizes for list views.
|
|
162
|
+
*/
|
|
163
|
+
$select?: readonly PropertyKeys$1<Q>[];
|
|
255
164
|
/**
|
|
256
165
|
* Enable or disable the query.
|
|
257
166
|
*
|
|
@@ -336,7 +245,7 @@ interface UseOsdkActionResult<Q extends ActionDefinition<any>> {
|
|
|
336
245
|
}
|
|
337
246
|
declare function useOsdkAction<Q extends ActionDefinition<any>>(actionDef: Q): UseOsdkActionResult<Q>;
|
|
338
247
|
|
|
339
|
-
interface
|
|
248
|
+
interface UseOsdkAggregationBaseOptions<T extends ObjectOrInterfaceDefinition, A extends AggregateOpts<T>, RDPs extends Record<string, SimplePropertyDef> = {}> {
|
|
340
249
|
/**
|
|
341
250
|
* Standard OSDK Where clause to filter objects before aggregation
|
|
342
251
|
*/
|
|
@@ -348,6 +257,14 @@ interface UseOsdkAggregationOptions<T extends ObjectOrInterfaceDefinition, A ext
|
|
|
348
257
|
withProperties?: {
|
|
349
258
|
[K in keyof RDPs]: DerivedProperty.Creator<T, RDPs[K]>;
|
|
350
259
|
};
|
|
260
|
+
/**
|
|
261
|
+
* Intersect the main query with additional filtered object sets.
|
|
262
|
+
* Each entry creates a separate object set with its own where clause,
|
|
263
|
+
* and the final result is the intersection of all sets.
|
|
264
|
+
*/
|
|
265
|
+
intersectWith?: Array<{
|
|
266
|
+
where: WhereClause$1<T, RDPs>;
|
|
267
|
+
}>;
|
|
351
268
|
/**
|
|
352
269
|
* Aggregation options including groupBy and select
|
|
353
270
|
*/
|
|
@@ -360,6 +277,14 @@ interface UseOsdkAggregationOptions<T extends ObjectOrInterfaceDefinition, A ext
|
|
|
360
277
|
*/
|
|
361
278
|
dedupeIntervalMs?: number;
|
|
362
279
|
}
|
|
280
|
+
interface UseOsdkAggregationOptions<T extends ObjectOrInterfaceDefinition, A extends AggregateOpts<T>, RDPs extends Record<string, SimplePropertyDef> = {}> extends UseOsdkAggregationBaseOptions<T, A, RDPs> {
|
|
281
|
+
}
|
|
282
|
+
interface UseOsdkAggregationOptionsWithObjectSet<T extends ObjectTypeDefinition, A extends AggregateOpts<T>, RDPs extends Record<string, SimplePropertyDef> = {}> extends UseOsdkAggregationBaseOptions<T, A, RDPs> {
|
|
283
|
+
/**
|
|
284
|
+
* The ObjectSet to aggregate on. Enables aggregation on pivoted, filtered, or composed ObjectSets.
|
|
285
|
+
*/
|
|
286
|
+
objectSet: ObjectSet<T>;
|
|
287
|
+
}
|
|
363
288
|
interface UseOsdkAggregationResult<T extends ObjectOrInterfaceDefinition, A extends AggregateOpts<T>> {
|
|
364
289
|
data: AggregationsResults<T, A> | undefined;
|
|
365
290
|
isLoading: boolean;
|
|
@@ -378,6 +303,7 @@ interface UseOsdkAggregationResult<T extends ObjectOrInterfaceDefinition, A exte
|
|
|
378
303
|
*
|
|
379
304
|
* @example
|
|
380
305
|
* ```tsx
|
|
306
|
+
* // Basic aggregation without ObjectSet
|
|
381
307
|
* const { data, isLoading, error } = useOsdkAggregation(Employee, {
|
|
382
308
|
* where: { department: "Engineering" },
|
|
383
309
|
* aggregate: {
|
|
@@ -388,9 +314,17 @@ interface UseOsdkAggregationResult<T extends ObjectOrInterfaceDefinition, A exte
|
|
|
388
314
|
* }
|
|
389
315
|
* }
|
|
390
316
|
* });
|
|
317
|
+
*
|
|
318
|
+
* // With a pivoted ObjectSet
|
|
319
|
+
* const pivotedSet = useMemo(() => $(Employee).pivotTo("primaryOffice"), []);
|
|
320
|
+
* const { data } = useOsdkAggregation(Office, {
|
|
321
|
+
* objectSet: pivotedSet,
|
|
322
|
+
* aggregate: { $select: { $count: "unordered" } }
|
|
323
|
+
* });
|
|
391
324
|
* ```
|
|
392
325
|
*/
|
|
393
|
-
declare function useOsdkAggregation<Q extends ObjectOrInterfaceDefinition, const A extends AggregateOpts<Q>, RDPs extends Record<string, SimplePropertyDef> = {}>(type: Q,
|
|
326
|
+
declare function useOsdkAggregation<Q extends ObjectOrInterfaceDefinition, const A extends AggregateOpts<Q>, RDPs extends Record<string, SimplePropertyDef> = {}>(type: Q, options: UseOsdkAggregationOptions<Q, A, RDPs>): UseOsdkAggregationResult<Q, A>;
|
|
327
|
+
declare function useOsdkAggregation<Q extends ObjectTypeDefinition, const A extends AggregateOpts<Q>, RDPs extends Record<string, SimplePropertyDef> = {}>(type: Q, options: UseOsdkAggregationOptionsWithObjectSet<Q, A, RDPs>): UseOsdkAggregationResult<Q, A>;
|
|
394
328
|
|
|
395
329
|
interface UseOsdkFunctionOptions<Q extends QueryDefinition<unknown>> {
|
|
396
330
|
/**
|
|
@@ -408,19 +342,25 @@ interface UseOsdkFunctionOptions<Q extends QueryDefinition<unknown>> {
|
|
|
408
342
|
* { dependsOn: [Employee] }
|
|
409
343
|
* ```
|
|
410
344
|
*/
|
|
411
|
-
dependsOn?: Array<ObjectTypeDefinition | string>;
|
|
345
|
+
dependsOn?: Array<ObjectTypeDefinition$1 | string>;
|
|
412
346
|
/**
|
|
413
|
-
* Specific object instances this function depends on.
|
|
347
|
+
* Specific object instances or ObjectSets this function depends on.
|
|
414
348
|
* When any of these specific objects change, the function will refetch.
|
|
415
349
|
* More fine-grained than dependsOn for precise invalidation control.
|
|
416
350
|
*
|
|
351
|
+
* For ObjectSets, the object type is extracted asynchronously and changes
|
|
352
|
+
* to any object of that type will trigger a refetch.
|
|
353
|
+
*
|
|
417
354
|
* @example
|
|
418
355
|
* ```tsx
|
|
419
356
|
* // Refetch when this specific employee changes
|
|
420
357
|
* { dependsOnObjects: [employee] }
|
|
358
|
+
*
|
|
359
|
+
* // Refetch when any object in the ObjectSet's type changes
|
|
360
|
+
* { dependsOnObjects: [employeeObjectSet] }
|
|
421
361
|
* ```
|
|
422
362
|
*/
|
|
423
|
-
dependsOnObjects?: Array<Osdk$1.Instance<ObjectTypeDefinition>>;
|
|
363
|
+
dependsOnObjects?: Array<Osdk$1.Instance<ObjectTypeDefinition$1> | ObjectSet<ObjectTypeDefinition$1>>;
|
|
424
364
|
/**
|
|
425
365
|
* The number of milliseconds to dedupe identical function calls.
|
|
426
366
|
* Two calls with the same function and params will share results
|
|
@@ -449,7 +389,7 @@ interface UseOsdkFunctionResult<Q extends QueryDefinition<unknown>> {
|
|
|
449
389
|
/**
|
|
450
390
|
* The function result, or undefined if not yet loaded or on error.
|
|
451
391
|
*/
|
|
452
|
-
data:
|
|
392
|
+
data: (CompileTimeMetadata<Q>["signature"] extends (...args: never[]) => infer R ? Awaited<R> : never) | undefined;
|
|
453
393
|
/**
|
|
454
394
|
* True while the function is executing.
|
|
455
395
|
*/
|
|
@@ -526,6 +466,17 @@ declare function useOsdkObject<Q extends ObjectOrInterfaceDefinition>(obj: Osdk$
|
|
|
526
466
|
* @param enabled Enable or disable the query (defaults to true)
|
|
527
467
|
*/
|
|
528
468
|
declare function useOsdkObject<Q extends ObjectOrInterfaceDefinition>(type: Q, primaryKey: PrimaryKeyType<Q>, enabled?: boolean): UseOsdkObjectResult<Q>;
|
|
469
|
+
/**
|
|
470
|
+
* Loads an object or interface instance by type and primary key with options.
|
|
471
|
+
*
|
|
472
|
+
* @param type The object type or interface definition
|
|
473
|
+
* @param primaryKey The primary key of the object
|
|
474
|
+
* @param options Options including $select and enabled
|
|
475
|
+
*/
|
|
476
|
+
declare function useOsdkObject<Q extends ObjectOrInterfaceDefinition>(type: Q, primaryKey: PrimaryKeyType<Q>, options?: {
|
|
477
|
+
$select?: readonly PropertyKeys$1<Q>[];
|
|
478
|
+
enabled?: boolean;
|
|
479
|
+
}): UseOsdkObjectResult<Q>;
|
|
529
480
|
|
|
530
481
|
interface UseOsdkObjectsOptions<T extends ObjectOrInterfaceDefinition, RDPs extends Record<string, SimplePropertyDef> = {}> {
|
|
531
482
|
/**
|
|
@@ -608,6 +559,16 @@ interface UseOsdkObjectsOptions<T extends ObjectOrInterfaceDefinition, RDPs exte
|
|
|
608
559
|
*/
|
|
609
560
|
autoFetchMore?: boolean | number;
|
|
610
561
|
streamUpdates?: boolean;
|
|
562
|
+
/**
|
|
563
|
+
* Restrict which properties are returned for each object.
|
|
564
|
+
* When provided, only the specified properties will be fetched,
|
|
565
|
+
* reducing payload sizes for list views.
|
|
566
|
+
*
|
|
567
|
+
* @example
|
|
568
|
+
* // Only fetch name and status properties
|
|
569
|
+
* useOsdkObjects(Employee, { $select: ["name", "status"] })
|
|
570
|
+
*/
|
|
571
|
+
$select?: readonly PropertyKeys$1<T>[];
|
|
611
572
|
}
|
|
612
573
|
interface UseOsdkListResult<T extends ObjectOrInterfaceDefinition, RDPs extends Record<string, SimplePropertyDef> = {}, EXTRA_OPTIONS extends never | "$rid" = never> {
|
|
613
574
|
/**
|
|
@@ -686,4 +647,4 @@ interface DebouncedCallback<TArgs extends readonly unknown[]> {
|
|
|
686
647
|
*/
|
|
687
648
|
declare function useDebouncedCallback<TArgs extends readonly unknown[]>(callback: (...args: TArgs) => void | Promise<void>, delay: number): DebouncedCallback<TArgs>;
|
|
688
649
|
|
|
689
|
-
export { OsdkProvider2, type UseOsdkAggregationResult, type UseOsdkFunctionOptions, type UseOsdkFunctionResult, type UseOsdkListResult, type UseOsdkObjectsOptions,
|
|
650
|
+
export { OsdkProvider2, type UseOsdkAggregationResult, type UseOsdkFunctionOptions, type UseOsdkFunctionResult, type UseOsdkListResult, type UseOsdkObjectsOptions, useDebouncedCallback, useLinks, useObjectSet, useOsdkAction, useOsdkAggregation, useOsdkFunction, useOsdkObject, useOsdkObjects };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Client } from '@osdk/client';
|
|
2
|
+
import { ObjectOrInterfaceDefinition, ActionDefinition, ObjectTypeDefinition, ObjectMetadata, InterfaceDefinition, InterfaceMetadata, ActionMetadata } from '@osdk/api';
|
|
3
|
+
|
|
4
|
+
declare function useOsdkClient(): Client;
|
|
5
|
+
|
|
6
|
+
type MetadataFetchableDefinition = ObjectOrInterfaceDefinition | ActionDefinition<any>;
|
|
7
|
+
type MetadataFor<T extends MetadataFetchableDefinition> = T extends ObjectTypeDefinition ? ObjectMetadata : T extends InterfaceDefinition ? InterfaceMetadata : T extends ActionDefinition<any> ? ActionMetadata : never;
|
|
8
|
+
interface UseOsdkMetadataResult<T extends MetadataFetchableDefinition> {
|
|
9
|
+
loading: boolean;
|
|
10
|
+
metadata?: MetadataFor<T>;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
declare function useOsdkMetadata<T extends MetadataFetchableDefinition>(type: T): UseOsdkMetadataResult<T>;
|
|
14
|
+
|
|
15
|
+
export { type UseOsdkMetadataResult as U, useOsdkMetadata as a, useOsdkClient as u };
|
|
@@ -42,4 +42,65 @@ export function makeExternalStore(createObservation, _name, initialValue) {
|
|
|
42
42
|
getSnapShot
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Like makeExternalStore but for async subscription creation.
|
|
48
|
+
*
|
|
49
|
+
* Uses an isActive flag to handle race conditions:
|
|
50
|
+
* If cleanup runs before promise resolves, the stale subscription is
|
|
51
|
+
* immediately unsubscribed when it eventually resolves
|
|
52
|
+
*/
|
|
53
|
+
export function makeExternalStoreAsync(createObservation, _name, initialValue) {
|
|
54
|
+
let lastResult = initialValue;
|
|
55
|
+
function getSnapShot() {
|
|
56
|
+
return lastResult;
|
|
57
|
+
}
|
|
58
|
+
function subscribe(notifyUpdate) {
|
|
59
|
+
let isActive = true;
|
|
60
|
+
let currentSubscription;
|
|
61
|
+
const subscriptionPromise = createObservation({
|
|
62
|
+
next: payload => {
|
|
63
|
+
if (isActive) {
|
|
64
|
+
lastResult = payload;
|
|
65
|
+
notifyUpdate();
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
error: error => {
|
|
69
|
+
if (isActive) {
|
|
70
|
+
lastResult = {
|
|
71
|
+
...(lastResult ?? {}),
|
|
72
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
73
|
+
};
|
|
74
|
+
notifyUpdate();
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
complete: () => {}
|
|
78
|
+
});
|
|
79
|
+
subscriptionPromise.then(sub => {
|
|
80
|
+
if (isActive) {
|
|
81
|
+
currentSubscription = sub;
|
|
82
|
+
} else {
|
|
83
|
+
sub.unsubscribe();
|
|
84
|
+
}
|
|
85
|
+
}).catch(error => {
|
|
86
|
+
if (isActive) {
|
|
87
|
+
lastResult = {
|
|
88
|
+
...(lastResult ?? {}),
|
|
89
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
90
|
+
};
|
|
91
|
+
notifyUpdate();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return () => {
|
|
95
|
+
isActive = false;
|
|
96
|
+
if (currentSubscription) {
|
|
97
|
+
currentSubscription.unsubscribe();
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
subscribe,
|
|
103
|
+
getSnapShot
|
|
104
|
+
};
|
|
105
|
+
}
|
|
45
106
|
//# sourceMappingURL=makeExternalStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeExternalStore.js","names":["makeExternalStore","createObservation","_name","initialValue","lastResult","getSnapShot","subscribe","notifyUpdate","obs","next","payload","error","Error","String","complete","unsubscribe"],"sources":["makeExternalStore.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 Observer,\n Unsubscribable,\n} from \"@osdk/client/unstable-do-not-use\";\n\nexport type Snapshot<X> =\n | X & { error?: Error }\n | (Partial<X> & { error?: Error })\n | undefined;\n\nexport function makeExternalStore<X>(\n createObservation: (callback: Observer<X | undefined>) => Unsubscribable,\n _name?: string,\n initialValue?: Snapshot<X>,\n): {\n subscribe: (notifyUpdate: () => void) => () => void;\n getSnapShot: () => Snapshot<X>;\n} {\n let lastResult: Snapshot<X> = initialValue;\n\n function getSnapShot(): Snapshot<X> {\n return lastResult;\n }\n\n function subscribe(notifyUpdate: () => void) {\n const obs = createObservation({\n next: (payload) => {\n lastResult = payload as Snapshot<X>;\n notifyUpdate();\n },\n error: (error: unknown) => {\n lastResult = {\n ...(lastResult ?? {}),\n error: error instanceof Error ? error : new Error(String(error)),\n } as Snapshot<X>;\n notifyUpdate();\n },\n complete: () => {},\n });\n\n return (): void => {\n obs.unsubscribe();\n };\n }\n\n return {\n subscribe,\n getSnapShot,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,OAAO,SAASA,iBAAiBA,CAC/BC,iBAAwE,EACxEC,KAAc,EACdC,YAA0B,EAI1B;EACA,IAAIC,UAAuB,GAAGD,YAAY;EAE1C,SAASE,WAAWA,CAAA,EAAgB;IAClC,OAAOD,UAAU;EACnB;EAuBA,OAAO;IACLE,SAAS,EAtBX,SAASA,SAASA,CAACC,YAAwB,EAAE;MAC3C,MAAMC,GAAG,GAAGP,iBAAiB,CAAC;QAC5BQ,IAAI,EAAGC,OAAO,IAAK;UACjBN,UAAU,GAAGM,OAAsB;UACnCH,YAAY,CAAC,CAAC;QAChB,CAAC;QACDI,KAAK,EAAGA,KAAc,IAAK;UACzBP,UAAU,GAAG;YACX,IAAIA,UAAU,IAAI,CAAC,CAAC,CAAC;YACrBO,KAAK,EAAEA,KAAK,YAAYC,KAAK,GAAGD,KAAK,GAAG,IAAIC,KAAK,CAACC,MAAM,CAACF,KAAK,CAAC;UACjE,CAAgB;UAChBJ,YAAY,CAAC,CAAC;QAChB,CAAC;QACDO,QAAQ,EAAEA,CAAA,KAAM,CAAC;MACnB,CAAC,CAAC;MAEF,OAAO,MAAY;QACjBN,GAAG,CAACO,WAAW,CAAC,CAAC;MACnB,CAAC;IACH,CAGW;IACTV;EACF,CAAC;AACH","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"makeExternalStore.js","names":["makeExternalStore","createObservation","_name","initialValue","lastResult","getSnapShot","subscribe","notifyUpdate","obs","next","payload","error","Error","String","complete","unsubscribe","makeExternalStoreAsync","isActive","currentSubscription","subscriptionPromise","then","sub","catch"],"sources":["makeExternalStore.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 Observer,\n Unsubscribable,\n} from \"@osdk/client/unstable-do-not-use\";\n\nexport type Snapshot<X> =\n | X & { error?: Error }\n | (Partial<X> & { error?: Error })\n | undefined;\n\nexport function makeExternalStore<X>(\n createObservation: (callback: Observer<X | undefined>) => Unsubscribable,\n _name?: string,\n initialValue?: Snapshot<X>,\n): {\n subscribe: (notifyUpdate: () => void) => () => void;\n getSnapShot: () => Snapshot<X>;\n} {\n let lastResult: Snapshot<X> = initialValue;\n\n function getSnapShot(): Snapshot<X> {\n return lastResult;\n }\n\n function subscribe(notifyUpdate: () => void) {\n const obs = createObservation({\n next: (payload) => {\n lastResult = payload as Snapshot<X>;\n notifyUpdate();\n },\n error: (error: unknown) => {\n lastResult = {\n ...(lastResult ?? {}),\n error: error instanceof Error ? error : new Error(String(error)),\n } as Snapshot<X>;\n notifyUpdate();\n },\n complete: () => {},\n });\n\n return (): void => {\n obs.unsubscribe();\n };\n }\n\n return {\n subscribe,\n getSnapShot,\n };\n}\n\n/**\n * Like makeExternalStore but for async subscription creation.\n *\n * Uses an isActive flag to handle race conditions:\n * If cleanup runs before promise resolves, the stale subscription is\n * immediately unsubscribed when it eventually resolves\n */\nexport function makeExternalStoreAsync<X>(\n createObservation: (\n callback: Observer<X | undefined>,\n ) => Promise<Unsubscribable>,\n _name?: string,\n initialValue?: Snapshot<X>,\n): {\n subscribe: (notifyUpdate: () => void) => () => void;\n getSnapShot: () => Snapshot<X>;\n} {\n let lastResult: Snapshot<X> = initialValue;\n\n function getSnapShot(): Snapshot<X> {\n return lastResult;\n }\n\n function subscribe(notifyUpdate: () => void) {\n let isActive = true;\n let currentSubscription: Unsubscribable | undefined;\n\n const subscriptionPromise = createObservation({\n next: (payload) => {\n if (isActive) {\n lastResult = payload as Snapshot<X>;\n notifyUpdate();\n }\n },\n error: (error: unknown) => {\n if (isActive) {\n lastResult = {\n ...(lastResult ?? {}),\n error: error instanceof Error ? error : new Error(String(error)),\n } as Snapshot<X>;\n notifyUpdate();\n }\n },\n complete: () => {},\n });\n\n subscriptionPromise.then((sub) => {\n if (isActive) {\n currentSubscription = sub;\n } else {\n sub.unsubscribe();\n }\n }).catch((error: unknown) => {\n if (isActive) {\n lastResult = {\n ...(lastResult ?? {}),\n error: error instanceof Error ? error : new Error(String(error)),\n } as Snapshot<X>;\n notifyUpdate();\n }\n });\n\n return (): void => {\n isActive = false;\n if (currentSubscription) {\n currentSubscription.unsubscribe();\n }\n };\n }\n\n return {\n subscribe,\n getSnapShot,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -18,6 +18,7 @@ import React from "react";
|
|
|
18
18
|
import { makeExternalStore } from "./makeExternalStore.js";
|
|
19
19
|
import { OsdkContext2 } from "./OsdkContext2.js";
|
|
20
20
|
const emptyArray = Object.freeze([]);
|
|
21
|
+
const emptyMap = new Map();
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* Hook to observe links from an object or array of objects.
|
|
@@ -37,6 +38,7 @@ export function useLinks(objects, linkName, options = {}) {
|
|
|
37
38
|
} = options;
|
|
38
39
|
const stableWhere = React.useMemo(() => otherOptions.where, [JSON.stringify(otherOptions.where)]);
|
|
39
40
|
const stableOrderBy = React.useMemo(() => otherOptions.orderBy, [JSON.stringify(otherOptions.orderBy)]);
|
|
41
|
+
const stableSelect = React.useMemo(() => otherOptions.$select, [JSON.stringify(otherOptions.$select)]);
|
|
40
42
|
const objectsKey = React.useMemo(() => {
|
|
41
43
|
if (objects === undefined) return "";
|
|
42
44
|
const arr = Array.isArray(objects) ? objects : [objects];
|
|
@@ -61,17 +63,22 @@ export function useLinks(objects, linkName, options = {}) {
|
|
|
61
63
|
where: stableWhere,
|
|
62
64
|
pageSize: otherOptions.pageSize,
|
|
63
65
|
orderBy: stableOrderBy,
|
|
64
|
-
mode: otherOptions.mode
|
|
66
|
+
mode: otherOptions.mode,
|
|
67
|
+
dedupeInterval: otherOptions.dedupeIntervalMs ?? 2_000,
|
|
68
|
+
...(stableSelect ? {
|
|
69
|
+
select: stableSelect
|
|
70
|
+
} : {})
|
|
65
71
|
}, observer), `links ${linkName} for ${objectsKey}`);
|
|
66
|
-
}, [enabled, observableClient, objectsArray, objectsKey, linkName, stableWhere, otherOptions.pageSize, stableOrderBy, otherOptions.mode]);
|
|
72
|
+
}, [enabled, observableClient, objectsArray, objectsKey, linkName, stableWhere, otherOptions.pageSize, stableOrderBy, otherOptions.mode, otherOptions.dedupeIntervalMs, stableSelect]);
|
|
67
73
|
const payload = React.useSyncExternalStore(subscribe, getSnapShot);
|
|
68
|
-
return {
|
|
74
|
+
return React.useMemo(() => ({
|
|
69
75
|
links: payload?.resolvedList,
|
|
76
|
+
linkedObjectsBySourcePrimaryKey: payload?.linkedObjectsBySourcePrimaryKey ?? emptyMap,
|
|
70
77
|
isLoading: enabled ? payload?.status === "loading" || payload?.status === "init" || !payload : false,
|
|
71
78
|
isOptimistic: payload?.isOptimistic ?? false,
|
|
72
79
|
error: payload?.error,
|
|
73
80
|
fetchMore: payload?.hasMore ? payload?.fetchMore : undefined,
|
|
74
81
|
hasMore: payload?.hasMore ?? false
|
|
75
|
-
};
|
|
82
|
+
}), [payload, enabled]);
|
|
76
83
|
}
|
|
77
84
|
//# sourceMappingURL=useLinks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLinks.js","names":["React","makeExternalStore","OsdkContext2","emptyArray","Object","freeze","useLinks","objects","linkName","options","observableClient","useContext","enabled","otherOptions","stableWhere","useMemo","where","JSON","stringify","stableOrderBy","orderBy","objectsKey","undefined","arr","Array","isArray","map","obj","$apiName","$primaryKey","join","objectsArray","subscribe","getSnapShot","unsubscribe","observer","observeLinks","pageSize","mode","payload","useSyncExternalStore","links","resolvedList","isLoading","status","isOptimistic","error","fetchMore","hasMore"],"sources":["useLinks.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 LinkedType,\n LinkNames,\n ObjectOrInterfaceDefinition,\n} from \"@osdk/api\";\nimport type { Osdk, PropertyKeys, WhereClause } from \"@osdk/client\";\nimport type { ObserveLinks } from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseLinksOptions<\n T extends ObjectOrInterfaceDefinition,\n> {\n /**\n * Standard OSDK Where clause for filtering linked objects\n */\n where?: WhereClause<T>;\n\n /**\n * The preferred page size for the links list.\n */\n pageSize?: number;\n\n /** Sorting options for the linked objects */\n orderBy?: {\n [K in PropertyKeys<T>]?: \"asc\" | \"desc\";\n };\n\n /**\n * The mode to use for fetching data.\n * - undefined: Fetch data if not already in cache\n * - \"force\": Always fetch fresh data\n * - \"offline\": Only use cached data, don't make network requests\n */\n mode?: \"force\" | \"offline\";\n\n /**\n * Enable or disable the query.\n *\n * When `false`, the query will not automatically execute. It will still\n * return any cached data, but will not fetch from the server.\n *\n * This is useful for:\n * - Lazy/on-demand queries that should wait for user interaction\n * - Dependent queries that need data from another query first\n * - Conditional queries based on component state\n *\n * @default true\n * @example\n * // Dependent query - wait for employee data\n * const { object: employee } = useOsdkObject(Employee, employeeId);\n * const { links: reports } = useLinks(employee, \"reports\", {\n * enabled: !!employee\n * });\n */\n enabled?: boolean;\n}\n\nexport interface UseLinksResult<\n Q extends ObjectOrInterfaceDefinition,\n> {\n links: Osdk.Instance<Q>[] | undefined;\n isLoading: boolean;\n error: Error | undefined;\n\n /**\n * Refers to whether the links are optimistic or not.\n */\n isOptimistic: boolean;\n\n /**\n * Fetch more linked objects if pagination is supported\n */\n fetchMore: (() => Promise<unknown>) | undefined;\n\n /**\n * Indicates if there are more linked objects available to fetch\n */\n hasMore: boolean;\n}\n\nconst emptyArray = Object.freeze([]);\n\n/**\n * Hook to observe links from an object or array of objects.\n *\n * @param objects The source object(s) to observe links from\n * @param linkName The name of the link to observe\n * @param options Optional configuration for the link query\n * @returns UseLinksResult with links data and metadata\n */\nexport function useLinks<\n T extends ObjectOrInterfaceDefinition,\n L extends LinkNames<T>,\n>(\n objects: Osdk.Instance<T> | Array<Osdk.Instance<T>> | undefined,\n linkName: L,\n options: UseLinksOptions<LinkedType<T, L>> = {},\n): UseLinksResult<LinkedType<T, L>> {\n const { observableClient } = React.useContext(OsdkContext2);\n\n const { enabled = true, ...otherOptions } = options;\n\n const stableWhere = React.useMemo(\n () => otherOptions.where,\n [JSON.stringify(otherOptions.where)],\n );\n\n const stableOrderBy = React.useMemo(\n () => otherOptions.orderBy,\n [JSON.stringify(otherOptions.orderBy)],\n );\n\n const objectsKey = React.useMemo(() => {\n if (objects === undefined) return \"\";\n const arr = Array.isArray(objects) ? objects : [objects];\n return arr.map(obj => `${obj.$apiName}:${obj.$primaryKey}`).join(\",\");\n }, [objects]);\n\n // Convert single object to array for consistent handling\n const objectsArray: ReadonlyArray<Osdk.Instance<T>> = React.useMemo(() => {\n return objects === undefined\n ? emptyArray\n : Array.isArray(objects)\n ? objects\n : [objects];\n }, [objectsKey, objects]);\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (!enabled) {\n return makeExternalStore<ObserveLinks.CallbackArgs<T>>(\n () => ({ unsubscribe: () => {} }),\n `links ${linkName} for ${objectsKey} [DISABLED]`,\n );\n }\n return makeExternalStore<ObserveLinks.CallbackArgs<T>>(\n (observer) =>\n observableClient.observeLinks(\n objectsArray,\n linkName,\n {\n linkName,\n where: stableWhere,\n pageSize: otherOptions.pageSize,\n orderBy: stableOrderBy,\n mode: otherOptions.mode,\n },\n observer,\n ),\n `links ${linkName} for ${objectsKey}`,\n );\n },\n [\n enabled,\n observableClient,\n objectsArray,\n objectsKey,\n linkName,\n stableWhere,\n otherOptions.pageSize,\n stableOrderBy,\n otherOptions.mode,\n ],\n );\n\n const payload = React.useSyncExternalStore(\n subscribe,\n getSnapShot,\n );\n\n return {\n links: payload?.resolvedList,\n isLoading: enabled\n ? (payload?.status === \"loading\" || payload?.status === \"init\"\n || !payload)\n : false,\n isOptimistic: payload?.isOptimistic ?? false,\n error: payload?.error,\n fetchMore: payload?.hasMore ? payload?.fetchMore : undefined,\n hasMore: payload?.hasMore ?? false,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useLinks.js","names":["React","makeExternalStore","OsdkContext2","emptyArray","Object","freeze","emptyMap","Map","useLinks","objects","linkName","options","observableClient","useContext","enabled","otherOptions","stableWhere","useMemo","where","JSON","stringify","stableOrderBy","orderBy","stableSelect","$select","objectsKey","undefined","arr","Array","isArray","map","obj","$apiName","$primaryKey","join","objectsArray","subscribe","getSnapShot","unsubscribe","observer","observeLinks","pageSize","mode","dedupeInterval","dedupeIntervalMs","select","payload","useSyncExternalStore","links","resolvedList","linkedObjectsBySourcePrimaryKey","isLoading","status","isOptimistic","error","fetchMore","hasMore"],"sources":["useLinks.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 LinkedType,\n LinkNames,\n ObjectOrInterfaceDefinition,\n} from \"@osdk/api\";\nimport type { Osdk, PropertyKeys, WhereClause } from \"@osdk/client\";\nimport type { ObserveLinks } from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseLinksOptions<\n T extends ObjectOrInterfaceDefinition,\n> {\n /**\n * Standard OSDK Where clause for filtering linked objects\n */\n where?: WhereClause<T>;\n\n /**\n * The preferred page size for the links list.\n */\n pageSize?: number;\n\n /** Sorting options for the linked objects */\n orderBy?: {\n [K in PropertyKeys<T>]?: \"asc\" | \"desc\";\n };\n\n /**\n * Restrict which properties are returned for each linked object.\n * When provided, only the specified properties will be fetched,\n * reducing payload sizes for list views.\n */\n $select?: readonly PropertyKeys<T>[];\n\n /**\n * The mode to use for fetching data.\n * - undefined: Fetch data if not already in cache\n * - \"force\": Always fetch fresh data\n * - \"offline\": Only use cached data, don't make network requests\n */\n mode?: \"force\" | \"offline\";\n\n /**\n * The number of milliseconds to wait after the last observed link change.\n *\n * Two uses of `useLinks` with the same parameters will only trigger one\n * network request if the second is within `dedupeIntervalMs`.\n */\n dedupeIntervalMs?: number;\n\n /**\n * Enable or disable the query.\n *\n * When `false`, the query will not automatically execute. It will still\n * return any cached data, but will not fetch from the server.\n *\n * This is useful for:\n * - Lazy/on-demand queries that should wait for user interaction\n * - Dependent queries that need data from another query first\n * - Conditional queries based on component state\n *\n * @default true\n * @example\n * // Dependent query - wait for employee data\n * const { object: employee } = useOsdkObject(Employee, employeeId);\n * const { links: reports } = useLinks(employee, \"reports\", {\n * enabled: !!employee\n * });\n */\n enabled?: boolean;\n}\n\nexport interface UseLinksResult<\n Q extends ObjectOrInterfaceDefinition,\n> {\n links: Osdk.Instance<Q>[] | undefined;\n\n /**\n * Maps each source object's primary key to its linked object instances.\n * Useful when observing links from multiple source objects to determine\n * which source links to which targets.\n */\n linkedObjectsBySourcePrimaryKey: ReadonlyMap<\n string | number,\n ReadonlyArray<Osdk.Instance<Q>>\n >;\n\n isLoading: boolean;\n error: Error | undefined;\n\n /**\n * Refers to whether the links are optimistic or not.\n */\n isOptimistic: boolean;\n\n /**\n * Fetch more linked objects if pagination is supported\n */\n fetchMore: (() => Promise<unknown>) | undefined;\n\n /**\n * Indicates if there are more linked objects available to fetch\n */\n hasMore: boolean;\n}\n\nconst emptyArray = Object.freeze([]);\nconst emptyMap: ReadonlyMap<string | number, ReadonlyArray<never>> = new Map();\n\n/**\n * Hook to observe links from an object or array of objects.\n *\n * @param objects The source object(s) to observe links from\n * @param linkName The name of the link to observe\n * @param options Optional configuration for the link query\n * @returns UseLinksResult with links data and metadata\n */\nexport function useLinks<\n T extends ObjectOrInterfaceDefinition,\n L extends LinkNames<T>,\n>(\n objects: Osdk.Instance<T> | Array<Osdk.Instance<T>> | undefined,\n linkName: L,\n options: UseLinksOptions<LinkedType<T, L>> = {},\n): UseLinksResult<LinkedType<T, L>> {\n const { observableClient } = React.useContext(OsdkContext2);\n\n const { enabled = true, ...otherOptions } = options;\n\n const stableWhere = React.useMemo(\n () => otherOptions.where,\n [JSON.stringify(otherOptions.where)],\n );\n\n const stableOrderBy = React.useMemo(\n () => otherOptions.orderBy,\n [JSON.stringify(otherOptions.orderBy)],\n );\n\n const stableSelect = React.useMemo(\n () => otherOptions.$select,\n [JSON.stringify(otherOptions.$select)],\n );\n\n const objectsKey = React.useMemo(() => {\n if (objects === undefined) return \"\";\n const arr = Array.isArray(objects) ? objects : [objects];\n return arr.map(obj => `${obj.$apiName}:${obj.$primaryKey}`).join(\",\");\n }, [objects]);\n\n // Convert single object to array for consistent handling\n const objectsArray: ReadonlyArray<Osdk.Instance<T>> = React.useMemo(() => {\n return objects === undefined\n ? emptyArray\n : Array.isArray(objects)\n ? objects\n : [objects];\n }, [objectsKey, objects]);\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (!enabled) {\n return makeExternalStore<ObserveLinks.CallbackArgs<T>>(\n () => ({ unsubscribe: () => {} }),\n `links ${linkName} for ${objectsKey} [DISABLED]`,\n );\n }\n return makeExternalStore<ObserveLinks.CallbackArgs<T>>(\n (observer) =>\n observableClient.observeLinks(\n objectsArray,\n linkName,\n {\n linkName,\n where: stableWhere,\n pageSize: otherOptions.pageSize,\n orderBy: stableOrderBy,\n mode: otherOptions.mode,\n dedupeInterval: otherOptions.dedupeIntervalMs ?? 2_000,\n ...(stableSelect ? { select: stableSelect } : {}),\n },\n observer,\n ),\n `links ${linkName} for ${objectsKey}`,\n );\n },\n [\n enabled,\n observableClient,\n objectsArray,\n objectsKey,\n linkName,\n stableWhere,\n otherOptions.pageSize,\n stableOrderBy,\n otherOptions.mode,\n otherOptions.dedupeIntervalMs,\n stableSelect,\n ],\n );\n\n const payload = React.useSyncExternalStore(\n subscribe,\n getSnapShot,\n );\n\n return React.useMemo(() => ({\n links: payload?.resolvedList,\n linkedObjectsBySourcePrimaryKey: payload?.linkedObjectsBySourcePrimaryKey\n ?? emptyMap,\n isLoading: enabled\n ? (payload?.status === \"loading\" || payload?.status === \"init\"\n || !payload)\n : false,\n isOptimistic: payload?.isOptimistic ?? false,\n error: payload?.error,\n fetchMore: payload?.hasMore ? payload?.fetchMore : undefined,\n hasMore: payload?.hasMore ?? false,\n }), [payload, enabled]);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -18,6 +18,7 @@ import { computeObjectSetCacheKey } from "@osdk/client/unstable-do-not-use";
|
|
|
18
18
|
import React from "react";
|
|
19
19
|
import { makeExternalStore } from "./makeExternalStore.js";
|
|
20
20
|
import { OsdkContext2 } from "./OsdkContext2.js";
|
|
21
|
+
const OBJECT_TYPE_PLACEHOLDER = "$__OBJECT__TYPE__PLACEHOLDER";
|
|
21
22
|
/**
|
|
22
23
|
* React hook for observing and interacting with OSDK object sets.
|
|
23
24
|
*
|
|
@@ -40,7 +41,7 @@ export function useObjectSet(baseObjectSet, options = {}) {
|
|
|
40
41
|
} = options;
|
|
41
42
|
|
|
42
43
|
// Track object type to detect when we switch to a different object type
|
|
43
|
-
const objectTypeKey = baseObjectSet.$objectSetInternals.def.apiName;
|
|
44
|
+
const objectTypeKey = enabled ? baseObjectSet.$objectSetInternals.def.apiName : OBJECT_TYPE_PLACEHOLDER;
|
|
44
45
|
const previousObjectTypeRef = React.useRef(objectTypeKey);
|
|
45
46
|
const previousCompletedPayloadRef = React.useRef();
|
|
46
47
|
const objectTypeChanged = previousObjectTypeRef.current !== objectTypeKey;
|
|
@@ -59,7 +60,8 @@ export function useObjectSet(baseObjectSet, options = {}) {
|
|
|
59
60
|
subtract: otherOptions.subtract,
|
|
60
61
|
pivotTo: otherOptions.pivotTo,
|
|
61
62
|
pageSize: otherOptions.pageSize,
|
|
62
|
-
orderBy: otherOptions.orderBy
|
|
63
|
+
orderBy: otherOptions.orderBy,
|
|
64
|
+
select: otherOptions.$select
|
|
63
65
|
});
|
|
64
66
|
const {
|
|
65
67
|
subscribe,
|
|
@@ -83,7 +85,8 @@ export function useObjectSet(baseObjectSet, options = {}) {
|
|
|
83
85
|
orderBy: otherOptions.orderBy,
|
|
84
86
|
dedupeInterval: otherOptions.dedupeIntervalMs ?? 2_000,
|
|
85
87
|
autoFetchMore: otherOptions.autoFetchMore,
|
|
86
|
-
streamUpdates
|
|
88
|
+
streamUpdates,
|
|
89
|
+
select: otherOptions.$select
|
|
87
90
|
}, observer);
|
|
88
91
|
return subscription;
|
|
89
92
|
}, process.env.NODE_ENV !== "production" ? `objectSet ${stableKey}` : void 0, initialValue);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useObjectSet.js","names":["computeObjectSetCacheKey","React","makeExternalStore","OsdkContext2","useObjectSet","baseObjectSet","options","observableClient","useContext","enabled","streamUpdates","otherOptions","objectTypeKey","$objectSetInternals","def","apiName","previousObjectTypeRef","useRef","previousCompletedPayloadRef","objectTypeChanged","current","undefined","stableKey","where","withProperties","union","intersect","subtract","pivotTo","pageSize","orderBy","subscribe","getSnapShot","useMemo","unsubscribe","process","env","NODE_ENV","initialValue","observer","subscription","observeObjectSet","dedupeInterval","dedupeIntervalMs","autoFetchMore","payload","useSyncExternalStore","isPayloadCompleted","lastLoaded","data","resolvedList","isLoading","error","fetchMore","hasMore","objectSet","totalCount","status"],"sources":["useObjectSet.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n DerivedProperty,\n LinkNames,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n Osdk,\n PropertyKeys,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\n\nimport {\n computeObjectSetCacheKey,\n type ObserveObjectSetArgs,\n} from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore, type Snapshot } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseObjectSetOptions<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> {\n /**\n * Where clause for filtering\n */\n where?: WhereClause<Q, RDPs>;\n\n /**\n * Derived properties to add to the object set\n */\n withProperties?: { [K in keyof RDPs]: DerivedProperty.Creator<Q, RDPs[K]> };\n\n /**\n * Object sets to union with\n */\n union?: ObjectSet<Q>[];\n\n /**\n * Object sets to intersect with\n */\n intersect?: ObjectSet<Q>[];\n\n /**\n * Object sets to subtract from\n */\n subtract?: ObjectSet<Q>[];\n\n /**\n * Link to pivot to (changes the type)\n */\n pivotTo?: LinkNames<Q>;\n\n /**\n * The preferred page size for the list\n */\n pageSize?: number;\n\n /**\n * Sort order for the results\n */\n orderBy?: {\n [K in PropertyKeys<Q>]?: \"asc\" | \"desc\";\n };\n\n /**\n * Minimum time between fetch requests in milliseconds (defaults to 2000ms)\n */\n dedupeIntervalMs?: number;\n\n /**\n * Automatically fetch additional pages on initial load.\n *\n * - `true`: Fetch all available pages automatically\n * - `number`: Fetch pages until at least this many items are loaded\n * - `undefined` (default): Only fetch the first page, user must call fetchMore()\n */\n autoFetchMore?: boolean | number;\n\n /**\n * Enable streaming updates via websocket subscription.\n * When true, the object set will automatically update when matching objects are\n * added, updated, or removed.\n *\n * @default false\n */\n streamUpdates?: boolean;\n\n /**\n * Enable or disable the query.\n *\n * When `false`, the query will not automatically execute. It will still\n * return any cached data, but will not fetch from the server.\n *\n * This is useful for:\n * - Lazy/on-demand queries that should wait for user interaction\n * - Dependent queries that need data from another query first\n * - Conditional queries based on component state\n *\n * @default true\n * @example\n * // Dependent query - wait for filter selection\n * const { data: filteredObjects } = useObjectSet(MyObject.all(), {\n * where: { status: selectedStatus },\n * enabled: !!selectedStatus\n * });\n */\n enabled?: boolean;\n}\n\nexport interface UseObjectSetResult<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> {\n /**\n * The fetched data with derived properties\n */\n data:\n | Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[]\n | undefined;\n\n /**\n * Whether data is currently being loaded\n */\n isLoading: boolean;\n\n /**\n * Any error that occurred during fetching\n */\n error: Error | undefined;\n\n /**\n * Function to fetch more pages (undefined if no more pages)\n */\n fetchMore: (() => Promise<void>) | undefined;\n\n /**\n * The final ObjectSet after all transformations\n */\n objectSet: ObjectSet<Q, RDPs>;\n\n /**\n * The total count of objects matching the query (if available from the API)\n */\n totalCount?: string;\n}\n\ndeclare const process: {\n env: {\n NODE_ENV: \"development\" | \"production\";\n };\n};\n\n/**\n * React hook for observing and interacting with OSDK object sets.\n *\n * @typeParam Q - The object type definition\n * @typeParam BaseRDPs - Derived properties that already exist on the input ObjectSet\n * @typeParam RDPs - New derived properties to be added via options.withProperties\n *\n * @param baseObjectSet - The ObjectSet to observe (may already have derived properties)\n * @param options - Options for filtering, sorting, and adding new derived properties\n * @returns Object set data with both existing and new derived properties\n */\nexport function useObjectSet<\n Q extends ObjectOrInterfaceDefinition,\n BaseRDPs extends Record<string, SimplePropertyDef> = never,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n baseObjectSet: ObjectSet<Q, BaseRDPs>,\n options: UseObjectSetOptions<Q, RDPs> = {},\n): UseObjectSetResult<Q, RDPs> {\n const { observableClient } = React.useContext(OsdkContext2);\n\n const { enabled = true, streamUpdates, ...otherOptions } = options;\n\n // Track object type to detect when we switch to a different object type\n const objectTypeKey = baseObjectSet.$objectSetInternals.def.apiName;\n const previousObjectTypeRef = React.useRef<string>(objectTypeKey);\n const previousCompletedPayloadRef = React.useRef<\n Snapshot<ObserveObjectSetArgs<Q, RDPs>> | undefined\n >();\n\n const objectTypeChanged = previousObjectTypeRef.current !== objectTypeKey;\n if (objectTypeChanged) {\n previousObjectTypeRef.current = objectTypeKey;\n previousCompletedPayloadRef.current = undefined;\n }\n\n // Compute a stable cache key for the ObjectSet and options\n // dedupeIntervalMs and enabled are excluded as they don't affect the data\n const stableKey = computeObjectSetCacheKey(baseObjectSet, {\n where: otherOptions.where,\n withProperties: otherOptions.withProperties,\n union: otherOptions.union,\n intersect: otherOptions.intersect,\n subtract: otherOptions.subtract,\n pivotTo: otherOptions.pivotTo,\n pageSize: otherOptions.pageSize,\n orderBy: otherOptions.orderBy,\n });\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (!enabled) {\n return makeExternalStore<ObserveObjectSetArgs<Q, RDPs>>(\n () => ({ unsubscribe: () => {} }),\n process.env.NODE_ENV !== \"production\"\n ? `objectSet ${stableKey} [DISABLED]`\n : void 0,\n );\n }\n\n const initialValue = objectTypeChanged\n ? undefined\n : previousCompletedPayloadRef.current;\n\n return makeExternalStore<ObserveObjectSetArgs<Q, RDPs>>(\n (observer) => {\n const subscription = observableClient.observeObjectSet(\n baseObjectSet as ObjectSet<Q>,\n {\n where: otherOptions.where,\n withProperties: otherOptions.withProperties,\n union: otherOptions.union,\n intersect: otherOptions.intersect,\n subtract: otherOptions.subtract,\n pivotTo: otherOptions.pivotTo,\n pageSize: otherOptions.pageSize,\n orderBy: otherOptions.orderBy,\n dedupeInterval: otherOptions.dedupeIntervalMs ?? 2_000,\n autoFetchMore: otherOptions.autoFetchMore,\n streamUpdates,\n },\n observer,\n );\n return subscription;\n },\n process.env.NODE_ENV !== \"production\"\n ? `objectSet ${stableKey}`\n : void 0,\n initialValue,\n );\n },\n [enabled, observableClient, stableKey, streamUpdates, objectTypeChanged],\n );\n\n const payload = React.useSyncExternalStore(subscribe, getSnapShot);\n if (payload && isPayloadCompleted(payload)) {\n previousCompletedPayloadRef.current = payload;\n }\n\n return React.useMemo(() => {\n const lastLoaded = isPayloadCompleted(payload)\n ? payload\n : previousCompletedPayloadRef.current;\n return {\n data: lastLoaded?.resolvedList as Osdk.Instance<\n Q,\n \"$allBaseProperties\",\n PropertyKeys<Q>,\n RDPs\n >[],\n isLoading: !isPayloadCompleted(payload),\n error: lastLoaded && \"error\" in lastLoaded ? lastLoaded.error : undefined,\n fetchMore: payload?.hasMore ? payload.fetchMore : undefined,\n objectSet: payload?.objectSet as ObjectSet<Q, RDPs> || baseObjectSet,\n totalCount: lastLoaded?.totalCount,\n };\n }, [payload, baseObjectSet]);\n}\n\nfunction isPayloadCompleted<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef>,\n>(\n payload: Snapshot<ObserveObjectSetArgs<Q, RDPs>>,\n): boolean {\n if (payload != null && \"error\" in payload) {\n return true;\n }\n\n if (payload?.status == null) {\n return false;\n }\n\n switch (payload.status) {\n case \"loaded\":\n case \"error\":\n return true;\n case \"loading\":\n case \"init\":\n return false;\n default:\n payload.status satisfies never;\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useObjectSet.js","names":["computeObjectSetCacheKey","React","makeExternalStore","OsdkContext2","OBJECT_TYPE_PLACEHOLDER","useObjectSet","baseObjectSet","options","observableClient","useContext","enabled","streamUpdates","otherOptions","objectTypeKey","$objectSetInternals","def","apiName","previousObjectTypeRef","useRef","previousCompletedPayloadRef","objectTypeChanged","current","undefined","stableKey","where","withProperties","union","intersect","subtract","pivotTo","pageSize","orderBy","select","$select","subscribe","getSnapShot","useMemo","unsubscribe","process","env","NODE_ENV","initialValue","observer","subscription","observeObjectSet","dedupeInterval","dedupeIntervalMs","autoFetchMore","payload","useSyncExternalStore","isPayloadCompleted","lastLoaded","data","resolvedList","isLoading","error","fetchMore","hasMore","objectSet","totalCount","status"],"sources":["useObjectSet.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n DerivedProperty,\n LinkNames,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n Osdk,\n PropertyKeys,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\n\nimport {\n computeObjectSetCacheKey,\n type ObserveObjectSetArgs,\n} from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore, type Snapshot } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseObjectSetOptions<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> {\n /**\n * Where clause for filtering\n */\n where?: WhereClause<Q, RDPs>;\n\n /**\n * Derived properties to add to the object set\n */\n withProperties?: { [K in keyof RDPs]: DerivedProperty.Creator<Q, RDPs[K]> };\n\n /**\n * Object sets to union with\n */\n union?: ObjectSet<Q>[];\n\n /**\n * Object sets to intersect with\n */\n intersect?: ObjectSet<Q>[];\n\n /**\n * Object sets to subtract from\n */\n subtract?: ObjectSet<Q>[];\n\n /**\n * Link to pivot to (changes the type)\n */\n pivotTo?: LinkNames<Q>;\n\n /**\n * The preferred page size for the list\n */\n pageSize?: number;\n\n /**\n * Sort order for the results\n */\n orderBy?: {\n [K in PropertyKeys<Q>]?: \"asc\" | \"desc\";\n };\n\n /**\n * Minimum time between fetch requests in milliseconds (defaults to 2000ms)\n */\n dedupeIntervalMs?: number;\n\n /**\n * Automatically fetch additional pages on initial load.\n *\n * - `true`: Fetch all available pages automatically\n * - `number`: Fetch pages until at least this many items are loaded\n * - `undefined` (default): Only fetch the first page, user must call fetchMore()\n */\n autoFetchMore?: boolean | number;\n\n /**\n * Enable streaming updates via websocket subscription.\n * When true, the object set will automatically update when matching objects are\n * added, updated, or removed.\n *\n * @default false\n */\n streamUpdates?: boolean;\n\n /**\n * Restrict which properties are returned for each object.\n * When provided, only the specified properties will be fetched,\n * reducing payload sizes for list views.\n */\n $select?: readonly PropertyKeys<Q>[];\n\n /**\n * Enable or disable the query.\n *\n * When `false`, the query will not automatically execute. It will still\n * return any cached data, but will not fetch from the server.\n *\n * This is useful for:\n * - Lazy/on-demand queries that should wait for user interaction\n * - Dependent queries that need data from another query first\n * - Conditional queries based on component state\n *\n * @default true\n * @example\n * // Dependent query - wait for filter selection\n * const { data: filteredObjects } = useObjectSet(MyObject.all(), {\n * where: { status: selectedStatus },\n * enabled: !!selectedStatus\n * });\n */\n enabled?: boolean;\n}\n\nexport interface UseObjectSetResult<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> {\n /**\n * The fetched data with derived properties\n */\n data:\n | Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>[]\n | undefined;\n\n /**\n * Whether data is currently being loaded\n */\n isLoading: boolean;\n\n /**\n * Any error that occurred during fetching\n */\n error: Error | undefined;\n\n /**\n * Function to fetch more pages (undefined if no more pages)\n */\n fetchMore: (() => Promise<void>) | undefined;\n\n /**\n * The final ObjectSet after all transformations\n */\n objectSet: ObjectSet<Q, RDPs>;\n\n /**\n * The total count of objects matching the query (if available from the API)\n */\n totalCount?: string;\n}\n\ndeclare const process: {\n env: {\n NODE_ENV: \"development\" | \"production\";\n };\n};\n\nconst OBJECT_TYPE_PLACEHOLDER = \"$__OBJECT__TYPE__PLACEHOLDER\";\n/**\n * React hook for observing and interacting with OSDK object sets.\n *\n * @typeParam Q - The object type definition\n * @typeParam BaseRDPs - Derived properties that already exist on the input ObjectSet\n * @typeParam RDPs - New derived properties to be added via options.withProperties\n *\n * @param baseObjectSet - The ObjectSet to observe (may already have derived properties)\n * @param options - Options for filtering, sorting, and adding new derived properties\n * @returns Object set data with both existing and new derived properties\n */\nexport function useObjectSet<\n Q extends ObjectOrInterfaceDefinition,\n BaseRDPs extends Record<string, SimplePropertyDef> = never,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n baseObjectSet: ObjectSet<Q, BaseRDPs>,\n options: UseObjectSetOptions<Q, RDPs> = {},\n): UseObjectSetResult<Q, RDPs> {\n const { observableClient } = React.useContext(OsdkContext2);\n\n const { enabled = true, streamUpdates, ...otherOptions } = options;\n\n // Track object type to detect when we switch to a different object type\n const objectTypeKey = enabled\n ? baseObjectSet.$objectSetInternals.def.apiName\n : OBJECT_TYPE_PLACEHOLDER;\n\n const previousObjectTypeRef = React.useRef<string>(objectTypeKey);\n const previousCompletedPayloadRef = React.useRef<\n Snapshot<ObserveObjectSetArgs<Q, RDPs>> | undefined\n >();\n\n const objectTypeChanged = previousObjectTypeRef.current !== objectTypeKey;\n if (objectTypeChanged) {\n previousObjectTypeRef.current = objectTypeKey;\n previousCompletedPayloadRef.current = undefined;\n }\n\n // Compute a stable cache key for the ObjectSet and options\n // dedupeIntervalMs and enabled are excluded as they don't affect the data\n const stableKey = computeObjectSetCacheKey(baseObjectSet, {\n where: otherOptions.where,\n withProperties: otherOptions.withProperties,\n union: otherOptions.union,\n intersect: otherOptions.intersect,\n subtract: otherOptions.subtract,\n pivotTo: otherOptions.pivotTo,\n pageSize: otherOptions.pageSize,\n orderBy: otherOptions.orderBy,\n select: otherOptions.$select,\n });\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (!enabled) {\n return makeExternalStore<ObserveObjectSetArgs<Q, RDPs>>(\n () => ({ unsubscribe: () => {} }),\n process.env.NODE_ENV !== \"production\"\n ? `objectSet ${stableKey} [DISABLED]`\n : void 0,\n );\n }\n\n const initialValue = objectTypeChanged\n ? undefined\n : previousCompletedPayloadRef.current;\n\n return makeExternalStore<ObserveObjectSetArgs<Q, RDPs>>(\n (observer) => {\n const subscription = observableClient.observeObjectSet(\n baseObjectSet as ObjectSet<Q>,\n {\n where: otherOptions.where,\n withProperties: otherOptions.withProperties,\n union: otherOptions.union,\n intersect: otherOptions.intersect,\n subtract: otherOptions.subtract,\n pivotTo: otherOptions.pivotTo,\n pageSize: otherOptions.pageSize,\n orderBy: otherOptions.orderBy,\n dedupeInterval: otherOptions.dedupeIntervalMs ?? 2_000,\n autoFetchMore: otherOptions.autoFetchMore,\n streamUpdates,\n select: otherOptions.$select,\n },\n observer,\n );\n return subscription;\n },\n process.env.NODE_ENV !== \"production\"\n ? `objectSet ${stableKey}`\n : void 0,\n initialValue,\n );\n },\n [enabled, observableClient, stableKey, streamUpdates, objectTypeChanged],\n );\n\n const payload = React.useSyncExternalStore(subscribe, getSnapShot);\n if (payload && isPayloadCompleted(payload)) {\n previousCompletedPayloadRef.current = payload;\n }\n\n return React.useMemo(() => {\n const lastLoaded = isPayloadCompleted(payload)\n ? payload\n : previousCompletedPayloadRef.current;\n return {\n data: lastLoaded?.resolvedList as Osdk.Instance<\n Q,\n \"$allBaseProperties\",\n PropertyKeys<Q>,\n RDPs\n >[],\n isLoading: !isPayloadCompleted(payload),\n error: lastLoaded && \"error\" in lastLoaded ? lastLoaded.error : undefined,\n fetchMore: payload?.hasMore ? payload.fetchMore : undefined,\n objectSet: payload?.objectSet as ObjectSet<Q, RDPs> || baseObjectSet,\n totalCount: lastLoaded?.totalCount,\n };\n }, [payload, baseObjectSet]);\n}\n\nfunction isPayloadCompleted<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef>,\n>(\n payload: Snapshot<ObserveObjectSetArgs<Q, RDPs>>,\n): boolean {\n if (payload != null && \"error\" in payload) {\n return true;\n }\n\n if (payload?.status == null) {\n return false;\n }\n\n switch (payload.status) {\n case \"loaded\":\n case \"error\":\n return true;\n case \"loading\":\n case \"init\":\n return false;\n default:\n payload.status satisfies never;\n return false;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|