@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
|
@@ -135,7 +135,7 @@ export function useOsdkAction(actionDef) {
|
|
|
135
135
|
}
|
|
136
136
|
};
|
|
137
137
|
}, []);
|
|
138
|
-
return {
|
|
138
|
+
return React.useMemo(() => ({
|
|
139
139
|
applyAction,
|
|
140
140
|
validateAction,
|
|
141
141
|
error,
|
|
@@ -143,6 +143,6 @@ export function useOsdkAction(actionDef) {
|
|
|
143
143
|
isPending,
|
|
144
144
|
isValidating,
|
|
145
145
|
validationResult
|
|
146
|
-
};
|
|
146
|
+
}), [applyAction, validateAction, error, data, isPending, isValidating, validationResult]);
|
|
147
147
|
}
|
|
148
148
|
//# sourceMappingURL=useOsdkAction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOsdkAction.js","names":["ActionValidationError","React","OsdkContext2","useOsdkAction","actionDef","observableClient","useContext","error","setError","useState","data","setData","isPending","setPending","isValidating","setValidating","validationResult","setValidationResult","abortControllerRef","useRef","applyAction","useCallback","hookArgs","current","abort","undefined","Array","isArray","updates","args","map","a","$optimisticUpdate","push","r","optimisticUpdate","ctx","update","e","actionValidation","unknown","validateAction","abortController","AbortController","result","signal","aborted","Error","name","useEffect"],"sources":["useOsdkAction.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n ActionValidationResponse,\n} from \"@osdk/client\";\nimport { ActionValidationError } from \"@osdk/client\";\nimport type {\n ActionSignatureFromDef,\n ObservableClient,\n} from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\ntype ApplyActionParams<Q extends ActionDefinition<any>> =\n & Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n & {\n [K in keyof ObservableClient.ApplyActionOptions as `$${K}`]:\n ObservableClient.ApplyActionOptions[K];\n };\n\nexport interface UseOsdkActionResult<Q extends ActionDefinition<any>> {\n applyAction: (\n args: ApplyActionParams<Q> | Array<ApplyActionParams<Q>>,\n ) => Promise<ActionEditResponse | undefined>;\n\n error:\n | undefined\n | Partial<{\n actionValidation: ActionValidationError;\n unknown: unknown;\n }>;\n data: ActionEditResponse | undefined;\n\n isPending: boolean;\n isValidating: boolean;\n\n /**\n * Validates the action with the provided arguments without executing it.\n * Calling this function again before the previous validation finishes will cancel\n * the first validation and start a new one.\n * @param args The action arguments to validate\n * @returns A promise that resolves to the validation response, or undefined if aborted\n */\n validateAction: (\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse | undefined>;\n\n validationResult?: ActionValidationResponse;\n}\n\nexport function useOsdkAction<Q extends ActionDefinition<any>>(\n actionDef: Q,\n): UseOsdkActionResult<Q> {\n const { observableClient } = React.useContext(OsdkContext2);\n const [error, setError] = React.useState<UseOsdkActionResult<Q>[\"error\"]>();\n const [data, setData] = React.useState<ActionEditResponse | undefined>();\n const [isPending, setPending] = React.useState(false);\n const [isValidating, setValidating] = React.useState(false);\n const [validationResult, setValidationResult] = React.useState<\n ActionValidationResponse | undefined\n >();\n const abortControllerRef = React.useRef<AbortController | null>(null);\n\n const applyAction = React.useCallback(async function applyAction(\n hookArgs: ApplyActionParams<Q> | Array<ApplyActionParams<Q>>,\n ) {\n try {\n // If validation is in progress, abort it\n if (isValidating && abortControllerRef.current) {\n abortControllerRef.current.abort();\n setValidating(false);\n }\n\n setPending(true);\n setError(undefined);\n\n if (Array.isArray(hookArgs)) {\n const updates: Array<\n ObservableClient.ApplyActionOptions[\"optimisticUpdate\"]\n > = [];\n const args = hookArgs.map(a => {\n const { $optimisticUpdate, ...args } = a;\n if ($optimisticUpdate) {\n updates.push($optimisticUpdate);\n }\n return args;\n });\n\n const r = await observableClient.applyAction(actionDef, args, {\n optimisticUpdate: (ctx) => {\n for (const update of updates) {\n update?.(ctx);\n }\n },\n });\n setData(r);\n return r;\n } else {\n const { $optimisticUpdate, ...args } = hookArgs;\n\n const r = await observableClient.applyAction(actionDef, args, {\n optimisticUpdate: $optimisticUpdate,\n });\n setData(r);\n return r;\n }\n } catch (e) {\n if (e instanceof ActionValidationError) {\n setError({\n actionValidation: e,\n });\n } else {\n setError({ unknown: e });\n }\n } finally {\n setPending(false);\n }\n }, [observableClient, actionDef, isValidating]);\n\n const validateAction = React.useCallback(async function validateAction(\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ): Promise<ActionValidationResponse | undefined> {\n try {\n // Check if action is being applied\n if (isPending) {\n return undefined;\n }\n\n // Abort any existing validation\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setValidating(true);\n setError(undefined);\n\n const result = await observableClient.validateAction(actionDef, args);\n\n // Check if aborted\n if (abortController.signal.aborted) {\n return undefined;\n }\n\n setValidationResult(result);\n return result;\n } catch (e) {\n // Check if it was aborted\n if (e instanceof Error && e.name === \"AbortError\") {\n return undefined;\n }\n\n if (e instanceof ActionValidationError) {\n setError({\n actionValidation: e,\n });\n } else {\n setError({ unknown: e });\n }\n throw e;\n } finally {\n setValidating(false);\n }\n }, [observableClient, actionDef, isPending]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return {\n applyAction,\n validateAction,\n error,\n data,\n isPending,\n isValidating,\n validationResult,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useOsdkAction.js","names":["ActionValidationError","React","OsdkContext2","useOsdkAction","actionDef","observableClient","useContext","error","setError","useState","data","setData","isPending","setPending","isValidating","setValidating","validationResult","setValidationResult","abortControllerRef","useRef","applyAction","useCallback","hookArgs","current","abort","undefined","Array","isArray","updates","args","map","a","$optimisticUpdate","push","r","optimisticUpdate","ctx","update","e","actionValidation","unknown","validateAction","abortController","AbortController","result","signal","aborted","Error","name","useEffect","useMemo"],"sources":["useOsdkAction.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n ActionValidationResponse,\n} from \"@osdk/client\";\nimport { ActionValidationError } from \"@osdk/client\";\nimport type {\n ActionSignatureFromDef,\n ObservableClient,\n} from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\ntype ApplyActionParams<Q extends ActionDefinition<any>> =\n & Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n & {\n [K in keyof ObservableClient.ApplyActionOptions as `$${K}`]:\n ObservableClient.ApplyActionOptions[K];\n };\n\nexport interface UseOsdkActionResult<Q extends ActionDefinition<any>> {\n applyAction: (\n args: ApplyActionParams<Q> | Array<ApplyActionParams<Q>>,\n ) => Promise<ActionEditResponse | undefined>;\n\n error:\n | undefined\n | Partial<{\n actionValidation: ActionValidationError;\n unknown: unknown;\n }>;\n data: ActionEditResponse | undefined;\n\n isPending: boolean;\n isValidating: boolean;\n\n /**\n * Validates the action with the provided arguments without executing it.\n * Calling this function again before the previous validation finishes will cancel\n * the first validation and start a new one.\n * @param args The action arguments to validate\n * @returns A promise that resolves to the validation response, or undefined if aborted\n */\n validateAction: (\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse | undefined>;\n\n validationResult?: ActionValidationResponse;\n}\n\nexport function useOsdkAction<Q extends ActionDefinition<any>>(\n actionDef: Q,\n): UseOsdkActionResult<Q> {\n const { observableClient } = React.useContext(OsdkContext2);\n const [error, setError] = React.useState<UseOsdkActionResult<Q>[\"error\"]>();\n const [data, setData] = React.useState<ActionEditResponse | undefined>();\n const [isPending, setPending] = React.useState(false);\n const [isValidating, setValidating] = React.useState(false);\n const [validationResult, setValidationResult] = React.useState<\n ActionValidationResponse | undefined\n >();\n const abortControllerRef = React.useRef<AbortController | null>(null);\n\n const applyAction = React.useCallback(async function applyAction(\n hookArgs: ApplyActionParams<Q> | Array<ApplyActionParams<Q>>,\n ) {\n try {\n // If validation is in progress, abort it\n if (isValidating && abortControllerRef.current) {\n abortControllerRef.current.abort();\n setValidating(false);\n }\n\n setPending(true);\n setError(undefined);\n\n if (Array.isArray(hookArgs)) {\n const updates: Array<\n ObservableClient.ApplyActionOptions[\"optimisticUpdate\"]\n > = [];\n const args = hookArgs.map(a => {\n const { $optimisticUpdate, ...args } = a;\n if ($optimisticUpdate) {\n updates.push($optimisticUpdate);\n }\n return args;\n });\n\n const r = await observableClient.applyAction(actionDef, args, {\n optimisticUpdate: (ctx) => {\n for (const update of updates) {\n update?.(ctx);\n }\n },\n });\n setData(r);\n return r;\n } else {\n const { $optimisticUpdate, ...args } = hookArgs;\n\n const r = await observableClient.applyAction(actionDef, args, {\n optimisticUpdate: $optimisticUpdate,\n });\n setData(r);\n return r;\n }\n } catch (e) {\n if (e instanceof ActionValidationError) {\n setError({\n actionValidation: e,\n });\n } else {\n setError({ unknown: e });\n }\n } finally {\n setPending(false);\n }\n }, [observableClient, actionDef, isValidating]);\n\n const validateAction = React.useCallback(async function validateAction(\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ): Promise<ActionValidationResponse | undefined> {\n try {\n // Check if action is being applied\n if (isPending) {\n return undefined;\n }\n\n // Abort any existing validation\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setValidating(true);\n setError(undefined);\n\n const result = await observableClient.validateAction(actionDef, args);\n\n // Check if aborted\n if (abortController.signal.aborted) {\n return undefined;\n }\n\n setValidationResult(result);\n return result;\n } catch (e) {\n // Check if it was aborted\n if (e instanceof Error && e.name === \"AbortError\") {\n return undefined;\n }\n\n if (e instanceof ActionValidationError) {\n setError({\n actionValidation: e,\n });\n } else {\n setError({ unknown: e });\n }\n throw e;\n } finally {\n setValidating(false);\n }\n }, [observableClient, actionDef, isPending]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return React.useMemo(() => ({\n applyAction,\n validateAction,\n error,\n data,\n isPending,\n isValidating,\n validationResult,\n }), [\n applyAction,\n validateAction,\n error,\n data,\n isPending,\n isValidating,\n validationResult,\n ]);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,9 +14,12 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { computeObjectSetCacheKey } from "@osdk/client/unstable-do-not-use";
|
|
17
18
|
import React from "react";
|
|
18
|
-
import { makeExternalStore } from "./makeExternalStore.js";
|
|
19
|
+
import { makeExternalStore, makeExternalStoreAsync } from "./makeExternalStore.js";
|
|
19
20
|
import { OsdkContext2 } from "./OsdkContext2.js";
|
|
21
|
+
const EMPTY_WHERE = {};
|
|
22
|
+
|
|
20
23
|
/**
|
|
21
24
|
* React hook for performing aggregations on OSDK object sets.
|
|
22
25
|
*
|
|
@@ -29,6 +32,7 @@ import { OsdkContext2 } from "./OsdkContext2.js";
|
|
|
29
32
|
*
|
|
30
33
|
* @example
|
|
31
34
|
* ```tsx
|
|
35
|
+
* // Basic aggregation without ObjectSet
|
|
32
36
|
* const { data, isLoading, error } = useOsdkAggregation(Employee, {
|
|
33
37
|
* where: { department: "Engineering" },
|
|
34
38
|
* aggregate: {
|
|
@@ -39,45 +43,79 @@ import { OsdkContext2 } from "./OsdkContext2.js";
|
|
|
39
43
|
* }
|
|
40
44
|
* }
|
|
41
45
|
* });
|
|
46
|
+
*
|
|
47
|
+
* // With a pivoted ObjectSet
|
|
48
|
+
* const pivotedSet = useMemo(() => $(Employee).pivotTo("primaryOffice"), []);
|
|
49
|
+
* const { data } = useOsdkAggregation(Office, {
|
|
50
|
+
* objectSet: pivotedSet,
|
|
51
|
+
* aggregate: { $select: { $count: "unordered" } }
|
|
52
|
+
* });
|
|
42
53
|
* ```
|
|
43
54
|
*/
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
55
|
+
|
|
56
|
+
export function useOsdkAggregation(type, options) {
|
|
57
|
+
const {
|
|
58
|
+
where = EMPTY_WHERE,
|
|
59
|
+
withProperties,
|
|
60
|
+
intersectWith,
|
|
61
|
+
aggregate,
|
|
62
|
+
dedupeIntervalMs
|
|
63
|
+
} = options;
|
|
64
|
+
const objectSet = "objectSet" in options ? options.objectSet : undefined;
|
|
50
65
|
const {
|
|
51
66
|
observableClient
|
|
52
67
|
} = React.useContext(OsdkContext2);
|
|
53
|
-
const canonWhere = observableClient.canonicalizeWhereClause(where
|
|
68
|
+
const canonWhere = observableClient.canonicalizeWhereClause(where);
|
|
69
|
+
const stableCanonWhere = React.useMemo(() => canonWhere, [JSON.stringify(canonWhere)]);
|
|
70
|
+
const objectSetRef = React.useRef(objectSet);
|
|
71
|
+
objectSetRef.current = objectSet;
|
|
72
|
+
const objectSetKeyString = objectSet ? computeObjectSetCacheKey(objectSet) : undefined;
|
|
54
73
|
const stableWithProperties = React.useMemo(() => withProperties, [JSON.stringify(withProperties)]);
|
|
55
74
|
const stableAggregate = React.useMemo(() => aggregate, [JSON.stringify(aggregate)]);
|
|
75
|
+
const stableIntersectWith = React.useMemo(() => intersectWith, [JSON.stringify(intersectWith)]);
|
|
56
76
|
const {
|
|
57
77
|
subscribe,
|
|
58
78
|
getSnapShot
|
|
59
|
-
} = React.useMemo(() =>
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
79
|
+
} = React.useMemo(() => {
|
|
80
|
+
if (objectSetKeyString && objectSetRef.current) {
|
|
81
|
+
return makeExternalStoreAsync(observer => observableClient.observeAggregation({
|
|
82
|
+
type: type,
|
|
83
|
+
objectSet: objectSetRef.current,
|
|
84
|
+
where: stableCanonWhere,
|
|
85
|
+
withProperties: stableWithProperties,
|
|
86
|
+
intersectWith: stableIntersectWith,
|
|
87
|
+
aggregate: stableAggregate,
|
|
88
|
+
dedupeInterval: dedupeIntervalMs ?? 2_000
|
|
89
|
+
}, observer), process.env.NODE_ENV !== "production" ? `aggregation ${type.apiName} ${objectSetKeyString} ${JSON.stringify(stableCanonWhere)}` : void 0);
|
|
90
|
+
}
|
|
91
|
+
return makeExternalStore(observer =>
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
93
|
+
observableClient.observeAggregation({
|
|
94
|
+
type: type,
|
|
95
|
+
where: stableCanonWhere,
|
|
96
|
+
withProperties: stableWithProperties,
|
|
97
|
+
intersectWith: stableIntersectWith,
|
|
98
|
+
aggregate: stableAggregate,
|
|
99
|
+
dedupeInterval: dedupeIntervalMs ?? 2_000
|
|
100
|
+
}, observer), process.env.NODE_ENV !== "production" ? `aggregation ${type.apiName} ${JSON.stringify(stableCanonWhere)}` : void 0);
|
|
101
|
+
}, [observableClient, type.apiName, type.type, objectSetKeyString, stableCanonWhere, stableWithProperties, stableIntersectWith, stableAggregate, dedupeIntervalMs]);
|
|
66
102
|
const payload = React.useSyncExternalStore(subscribe, getSnapShot);
|
|
67
|
-
let error;
|
|
68
|
-
if (payload && "error" in payload && payload.error) {
|
|
69
|
-
error = payload.error;
|
|
70
|
-
} else if (payload?.status === "error") {
|
|
71
|
-
error = new Error("Failed to execute aggregation");
|
|
72
|
-
}
|
|
73
103
|
const refetch = React.useCallback(async () => {
|
|
74
104
|
await observableClient.invalidateObjectType(type.apiName);
|
|
75
105
|
}, [observableClient, type.apiName]);
|
|
76
|
-
return {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
106
|
+
return React.useMemo(() => {
|
|
107
|
+
let error;
|
|
108
|
+
if (payload && "error" in payload && payload.error) {
|
|
109
|
+
error = payload.error;
|
|
110
|
+
} else if (payload?.status === "error") {
|
|
111
|
+
error = new Error("Failed to execute aggregation");
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
data: payload?.result,
|
|
115
|
+
isLoading: payload?.status === "loading" || payload?.status === "init" || !payload,
|
|
116
|
+
error,
|
|
117
|
+
refetch
|
|
118
|
+
};
|
|
119
|
+
}, [payload, refetch]);
|
|
82
120
|
}
|
|
83
121
|
//# sourceMappingURL=useOsdkAggregation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOsdkAggregation.js","names":["React","makeExternalStore","OsdkContext2","useOsdkAggregation","type","where","withProperties","aggregate","dedupeIntervalMs","observableClient","useContext","canonWhere","canonicalizeWhereClause","stableWithProperties","useMemo","JSON","stringify","stableAggregate","subscribe","getSnapShot","observer","observeAggregation","dedupeInterval","process","env","NODE_ENV","apiName","payload","useSyncExternalStore","error","status","Error","refetch","useCallback","invalidateObjectType","data","result","isLoading"],"sources":["useOsdkAggregation.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 AggregateOpts,\n AggregationsResults,\n DerivedProperty,\n ObjectOrInterfaceDefinition,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type { ObserveAggregationArgs } from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseOsdkAggregationOptions<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> {\n /**\n * Standard OSDK Where clause to filter objects before aggregation\n */\n where?: WhereClause<T, RDPs>;\n\n /**\n * Define derived properties (RDPs) to be computed server-side.\n * The derived properties can be used in the where clause and aggregation groupBy/select.\n */\n withProperties?: { [K in keyof RDPs]: DerivedProperty.Creator<T, RDPs[K]> };\n\n /**\n * Aggregation options including groupBy and select\n */\n aggregate: A;\n\n /**\n * The number of milliseconds to wait after the last observed aggregation change.\n *\n * Two uses of `useOsdkAggregation` with the same parameters will only trigger one\n * network request if the second is within `dedupeIntervalMs`.\n */\n dedupeIntervalMs?: number;\n}\n\nexport interface UseOsdkAggregationResult<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n> {\n data: AggregationsResults<T, A> | undefined;\n isLoading: boolean;\n error: Error | undefined;\n refetch: () => void;\n}\n\ndeclare const process: {\n env: {\n NODE_ENV: \"development\" | \"production\";\n };\n};\n\n/**\n * React hook for performing aggregations on OSDK object sets.\n *\n * Executes server-side aggregations with groupBy and metric calculations on filtered object sets.\n * Supports runtime derived properties and where clauses.\n *\n * @param type - The object or interface type to aggregate\n * @param options - Aggregation configuration including where clause, aggregation spec, and optional derived properties\n * @returns Object containing aggregation results, loading state, error state, and refetch function\n *\n * @example\n * ```tsx\n * const { data, isLoading, error } = useOsdkAggregation(Employee, {\n * where: { department: \"Engineering\" },\n * aggregate: {\n * groupBy: { department: \"exact\" },\n * select: {\n * avgSalary: { $avg: \"salary\" },\n * count: { $count: {} }\n * }\n * }\n * });\n * ```\n */\nexport function useOsdkAggregation<\n Q extends ObjectOrInterfaceDefinition,\n const A extends AggregateOpts<Q>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n type: Q,\n {\n where = {},\n withProperties,\n aggregate,\n dedupeIntervalMs,\n }: UseOsdkAggregationOptions<Q, A, RDPs>,\n): UseOsdkAggregationResult<Q, A> {\n const { observableClient } = React.useContext(OsdkContext2);\n\n const canonWhere = observableClient.canonicalizeWhereClause<Q>(where ?? {});\n\n const stableWithProperties = React.useMemo(\n () => withProperties,\n [JSON.stringify(withProperties)],\n );\n\n const stableAggregate = React.useMemo(\n () => aggregate,\n [JSON.stringify(aggregate)],\n );\n\n const { subscribe, getSnapShot } = React.useMemo(\n () =>\n makeExternalStore<ObserveAggregationArgs<Q, A>>(\n (observer) =>\n observableClient.observeAggregation(\n {\n type: type,\n where: canonWhere,\n withProperties: stableWithProperties,\n aggregate: stableAggregate,\n dedupeInterval: dedupeIntervalMs ?? 2_000,\n },\n observer,\n ),\n process.env.NODE_ENV !== \"production\"\n ? `aggregation ${type.apiName} ${JSON.stringify(canonWhere)}`\n : void 0,\n ),\n [\n observableClient,\n type.apiName,\n type.type,\n canonWhere,\n stableWithProperties,\n stableAggregate,\n dedupeIntervalMs,\n ],\n );\n\n const payload = React.useSyncExternalStore(subscribe, getSnapShot);\n\n let error: Error | undefined;\n if (payload && \"error\" in payload && payload.error) {\n error = payload.error;\n } else if (payload?.status === \"error\") {\n error = new Error(\"Failed to execute aggregation\");\n }\n\n const refetch = React.useCallback(async () => {\n await observableClient.invalidateObjectType(type.apiName);\n }, [observableClient, type.apiName]);\n\n return {\n data: payload?.result as AggregationsResults<Q, A> | undefined,\n isLoading: payload?.status === \"loading\" || payload?.status === \"init\"\n || !payload,\n error,\n refetch,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,YAAY,QAAQ,mBAAmB;AAgDhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAKhCC,IAAO,EACP;EACEC,KAAK,GAAG,CAAC,CAAC;EACVC,cAAc;EACdC,SAAS;EACTC;AACqC,CAAC,EACR;EAChC,MAAM;IAAEC;EAAiB,CAAC,GAAGT,KAAK,CAACU,UAAU,CAACR,YAAY,CAAC;EAE3D,MAAMS,UAAU,GAAGF,gBAAgB,CAACG,uBAAuB,CAAIP,KAAK,IAAI,CAAC,CAAC,CAAC;EAE3E,MAAMQ,oBAAoB,GAAGb,KAAK,CAACc,OAAO,CACxC,MAAMR,cAAc,EACpB,CAACS,IAAI,CAACC,SAAS,CAACV,cAAc,CAAC,CACjC,CAAC;EAED,MAAMW,eAAe,GAAGjB,KAAK,CAACc,OAAO,CACnC,MAAMP,SAAS,EACf,CAACQ,IAAI,CAACC,SAAS,CAACT,SAAS,CAAC,CAC5B,CAAC;EAED,MAAM;IAAEW,SAAS;IAAEC;EAAY,CAAC,GAAGnB,KAAK,CAACc,OAAO,CAC9C,MACEb,iBAAiB,CACdmB,QAAQ,IACPX,gBAAgB,CAACY,kBAAkB,CACjC;IACEjB,IAAI,EAAEA,IAAI;IACVC,KAAK,EAAEM,UAAU;IACjBL,cAAc,EAAEO,oBAAoB;IACpCN,SAAS,EAAEU,eAAe;IAC1BK,cAAc,EAAEd,gBAAgB,IAAI;EACtC,CAAC,EACDY,QACF,CAAC,EACHG,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GACjC,eAAerB,IAAI,CAACsB,OAAO,IAAIX,IAAI,CAACC,SAAS,CAACL,UAAU,CAAC,EAAE,GAC3D,KAAK,CACX,CAAC,EACH,CACEF,gBAAgB,EAChBL,IAAI,CAACsB,OAAO,EACZtB,IAAI,CAACA,IAAI,EACTO,UAAU,EACVE,oBAAoB,EACpBI,eAAe,EACfT,gBAAgB,CAEpB,CAAC;EAED,MAAMmB,OAAO,GAAG3B,KAAK,CAAC4B,oBAAoB,CAACV,SAAS,EAAEC,WAAW,CAAC;EAElE,IAAIU,KAAwB;EAC5B,IAAIF,OAAO,IAAI,OAAO,IAAIA,OAAO,IAAIA,OAAO,CAACE,KAAK,EAAE;IAClDA,KAAK,GAAGF,OAAO,CAACE,KAAK;EACvB,CAAC,MAAM,IAAIF,OAAO,EAAEG,MAAM,KAAK,OAAO,EAAE;IACtCD,KAAK,GAAG,IAAIE,KAAK,CAAC,+BAA+B,CAAC;EACpD;EAEA,MAAMC,OAAO,GAAGhC,KAAK,CAACiC,WAAW,CAAC,YAAY;IAC5C,MAAMxB,gBAAgB,CAACyB,oBAAoB,CAAC9B,IAAI,CAACsB,OAAO,CAAC;EAC3D,CAAC,EAAE,CAACjB,gBAAgB,EAAEL,IAAI,CAACsB,OAAO,CAAC,CAAC;EAEpC,OAAO;IACLS,IAAI,EAAER,OAAO,EAAES,MAA+C;IAC9DC,SAAS,EAAEV,OAAO,EAAEG,MAAM,KAAK,SAAS,IAAIH,OAAO,EAAEG,MAAM,KAAK,MAAM,IACjE,CAACH,OAAO;IACbE,KAAK;IACLG;EACF,CAAC;AACH","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useOsdkAggregation.js","names":["computeObjectSetCacheKey","React","makeExternalStore","makeExternalStoreAsync","OsdkContext2","EMPTY_WHERE","useOsdkAggregation","type","options","where","withProperties","intersectWith","aggregate","dedupeIntervalMs","objectSet","undefined","observableClient","useContext","canonWhere","canonicalizeWhereClause","stableCanonWhere","useMemo","JSON","stringify","objectSetRef","useRef","current","objectSetKeyString","stableWithProperties","stableAggregate","stableIntersectWith","subscribe","getSnapShot","observer","observeAggregation","dedupeInterval","process","env","NODE_ENV","apiName","payload","useSyncExternalStore","refetch","useCallback","invalidateObjectType","error","status","Error","data","result","isLoading"],"sources":["useOsdkAggregation.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 AggregateOpts,\n AggregationsResults,\n DerivedProperty,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type { ObjectTypeDefinition } from \"@osdk/client\";\nimport type { ObserveAggregationArgs } from \"@osdk/client/unstable-do-not-use\";\nimport { computeObjectSetCacheKey } from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport {\n makeExternalStore,\n makeExternalStoreAsync,\n} from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\ninterface UseOsdkAggregationBaseOptions<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> {\n /**\n * Standard OSDK Where clause to filter objects before aggregation\n */\n where?: WhereClause<T, RDPs>;\n\n /**\n * Define derived properties (RDPs) to be computed server-side.\n * The derived properties can be used in the where clause and aggregation groupBy/select.\n */\n withProperties?: { [K in keyof RDPs]: DerivedProperty.Creator<T, RDPs[K]> };\n\n /**\n * Intersect the main query with additional filtered object sets.\n * Each entry creates a separate object set with its own where clause,\n * and the final result is the intersection of all sets.\n */\n intersectWith?: Array<{\n where: WhereClause<T, RDPs>;\n }>;\n\n /**\n * Aggregation options including groupBy and select\n */\n aggregate: A;\n\n /**\n * The number of milliseconds to wait after the last observed aggregation change.\n *\n * Two uses of `useOsdkAggregation` with the same parameters will only trigger one\n * network request if the second is within `dedupeIntervalMs`.\n */\n dedupeIntervalMs?: number;\n}\n\nexport interface UseOsdkAggregationOptions<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> extends UseOsdkAggregationBaseOptions<T, A, RDPs> {}\n\nexport interface UseOsdkAggregationOptionsWithObjectSet<\n T extends ObjectTypeDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> extends UseOsdkAggregationBaseOptions<T, A, RDPs> {\n /**\n * The ObjectSet to aggregate on. Enables aggregation on pivoted, filtered, or composed ObjectSets.\n */\n objectSet: ObjectSet<T>;\n}\n\nconst EMPTY_WHERE = {};\n\nexport interface UseOsdkAggregationResult<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n> {\n data: AggregationsResults<T, A> | undefined;\n isLoading: boolean;\n error: Error | undefined;\n refetch: () => void;\n}\n\ndeclare const process: {\n env: {\n NODE_ENV: \"development\" | \"production\";\n };\n};\n\n/**\n * React hook for performing aggregations on OSDK object sets.\n *\n * Executes server-side aggregations with groupBy and metric calculations on filtered object sets.\n * Supports runtime derived properties and where clauses.\n *\n * @param type - The object or interface type to aggregate\n * @param options - Aggregation configuration including where clause, aggregation spec, and optional derived properties\n * @returns Object containing aggregation results, loading state, error state, and refetch function\n *\n * @example\n * ```tsx\n * // Basic aggregation without ObjectSet\n * const { data, isLoading, error } = useOsdkAggregation(Employee, {\n * where: { department: \"Engineering\" },\n * aggregate: {\n * groupBy: { department: \"exact\" },\n * select: {\n * avgSalary: { $avg: \"salary\" },\n * count: { $count: {} }\n * }\n * }\n * });\n *\n * // With a pivoted ObjectSet\n * const pivotedSet = useMemo(() => $(Employee).pivotTo(\"primaryOffice\"), []);\n * const { data } = useOsdkAggregation(Office, {\n * objectSet: pivotedSet,\n * aggregate: { $select: { $count: \"unordered\" } }\n * });\n * ```\n */\nexport function useOsdkAggregation<\n Q extends ObjectOrInterfaceDefinition,\n const A extends AggregateOpts<Q>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n type: Q,\n options: UseOsdkAggregationOptions<Q, A, RDPs>,\n): UseOsdkAggregationResult<Q, A>;\nexport function useOsdkAggregation<\n Q extends ObjectTypeDefinition,\n const A extends AggregateOpts<Q>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n type: Q,\n options: UseOsdkAggregationOptionsWithObjectSet<Q, A, RDPs>,\n): UseOsdkAggregationResult<Q, A>;\nexport function useOsdkAggregation<\n Q extends ObjectTypeDefinition,\n const A extends AggregateOpts<Q>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n type: Q,\n options:\n | UseOsdkAggregationOptions<Q, A, RDPs>\n | UseOsdkAggregationOptionsWithObjectSet<Q, A, RDPs>,\n): UseOsdkAggregationResult<Q, A> {\n const {\n where = EMPTY_WHERE,\n withProperties,\n intersectWith,\n aggregate,\n dedupeIntervalMs,\n } = options;\n const objectSet = \"objectSet\" in options ? options.objectSet : undefined;\n\n const { observableClient } = React.useContext(OsdkContext2);\n\n const canonWhere = observableClient.canonicalizeWhereClause<Q>(where);\n\n const stableCanonWhere = React.useMemo(\n () => canonWhere,\n [JSON.stringify(canonWhere)],\n );\n\n const objectSetRef = React.useRef(objectSet);\n objectSetRef.current = objectSet;\n\n const objectSetKeyString = objectSet\n ? computeObjectSetCacheKey(objectSet)\n : undefined;\n\n const stableWithProperties = React.useMemo(\n () => withProperties,\n [JSON.stringify(withProperties)],\n );\n\n const stableAggregate = React.useMemo(\n () => aggregate,\n [JSON.stringify(aggregate)],\n );\n\n const stableIntersectWith = React.useMemo(\n () => intersectWith,\n [JSON.stringify(intersectWith)],\n );\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (objectSetKeyString && objectSetRef.current) {\n return makeExternalStoreAsync<ObserveAggregationArgs<Q, A>>(\n (observer) =>\n observableClient.observeAggregation(\n {\n type: type,\n objectSet: objectSetRef.current!,\n where: stableCanonWhere,\n withProperties: stableWithProperties,\n intersectWith: stableIntersectWith,\n aggregate: stableAggregate,\n dedupeInterval: dedupeIntervalMs ?? 2_000,\n },\n observer,\n ),\n process.env.NODE_ENV !== \"production\"\n ? `aggregation ${type.apiName} ${objectSetKeyString} ${\n JSON.stringify(stableCanonWhere)\n }`\n : void 0,\n );\n }\n return makeExternalStore<ObserveAggregationArgs<Q, A>>(\n (observer) =>\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n observableClient.observeAggregation(\n {\n type: type,\n where: stableCanonWhere,\n withProperties: stableWithProperties,\n intersectWith: stableIntersectWith,\n aggregate: stableAggregate,\n dedupeInterval: dedupeIntervalMs ?? 2_000,\n },\n observer,\n ),\n process.env.NODE_ENV !== \"production\"\n ? `aggregation ${type.apiName} ${JSON.stringify(stableCanonWhere)}`\n : void 0,\n );\n },\n [\n observableClient,\n type.apiName,\n type.type,\n objectSetKeyString,\n stableCanonWhere,\n stableWithProperties,\n stableIntersectWith,\n stableAggregate,\n dedupeIntervalMs,\n ],\n );\n\n const payload = React.useSyncExternalStore(subscribe, getSnapShot);\n\n const refetch = React.useCallback(async () => {\n await observableClient.invalidateObjectType(type.apiName);\n }, [observableClient, type.apiName]);\n\n return React.useMemo(() => {\n let error: Error | undefined;\n if (payload && \"error\" in payload && payload.error) {\n error = payload.error;\n } else if (payload?.status === \"error\") {\n error = new Error(\"Failed to execute aggregation\");\n }\n\n return {\n data: payload?.result as AggregationsResults<Q, A> | undefined,\n isLoading: payload?.status === \"loading\" || payload?.status === \"init\"\n || !payload,\n error,\n refetch,\n };\n }, [payload, refetch]);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { getWireObjectSet } from "@osdk/client/unstable-do-not-use";
|
|
17
18
|
import React from "react";
|
|
18
19
|
import { makeExternalStore } from "./makeExternalStore.js";
|
|
19
20
|
import { OsdkContext2 } from "./OsdkContext2.js";
|
|
@@ -63,10 +64,12 @@ export function useOsdkFunction(queryDef, options = {}) {
|
|
|
63
64
|
} = options;
|
|
64
65
|
const stableParams = React.useMemo(() => params, [JSON.stringify(params)]);
|
|
65
66
|
const stableDependsOn = React.useMemo(() => dependsOn, [JSON.stringify(dependsOn?.map(d => typeof d === "string" ? d : d.apiName))]);
|
|
66
|
-
const stableDependsOnObjects = React.useMemo(() => dependsOnObjects, [JSON.stringify(dependsOnObjects?.map(
|
|
67
|
-
$apiName:
|
|
68
|
-
$primaryKey:
|
|
69
|
-
}
|
|
67
|
+
const stableDependsOnObjects = React.useMemo(() => dependsOnObjects, [JSON.stringify(dependsOnObjects?.map(item => "$apiName" in item ? {
|
|
68
|
+
$apiName: item.$apiName,
|
|
69
|
+
$primaryKey: item.$primaryKey
|
|
70
|
+
} : {
|
|
71
|
+
__objectSet: getWireObjectSet(item)
|
|
72
|
+
}))]);
|
|
70
73
|
|
|
71
74
|
// Record<string, unknown> required as typing is figured out at runtime
|
|
72
75
|
const paramsForApi = stableParams;
|
|
@@ -86,16 +89,18 @@ export function useOsdkFunction(queryDef, options = {}) {
|
|
|
86
89
|
}, observer), process.env.NODE_ENV !== "production" ? `function ${queryDef.apiName} ${JSON.stringify(stableParams)}` : void 0);
|
|
87
90
|
}, [observableClient, queryDef.apiName, queryDef.version, paramsForApi, stableDependsOn, stableDependsOnObjects, dedupeIntervalMs, enabled]);
|
|
88
91
|
const payload = React.useSyncExternalStore(subscribe, getSnapShot);
|
|
89
|
-
const error = payload?.error ?? (payload?.status === "error" ? new Error("Failed to execute function") : undefined);
|
|
90
92
|
const refetch = React.useCallback(() => {
|
|
91
93
|
void observableClient.invalidateFunction(queryDef, paramsForApi);
|
|
92
94
|
}, [observableClient, queryDef, paramsForApi]);
|
|
93
|
-
return {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
95
|
+
return React.useMemo(() => {
|
|
96
|
+
const error = payload?.error ?? (payload?.status === "error" ? new Error("Failed to execute function") : undefined);
|
|
97
|
+
return {
|
|
98
|
+
data: payload?.result,
|
|
99
|
+
isLoading: payload?.status === "loading",
|
|
100
|
+
error,
|
|
101
|
+
lastUpdated: payload?.lastUpdated ?? 0,
|
|
102
|
+
refetch
|
|
103
|
+
};
|
|
104
|
+
}, [payload, refetch]);
|
|
100
105
|
}
|
|
101
106
|
//# sourceMappingURL=useOsdkFunction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOsdkFunction.js","names":["React","makeExternalStore","OsdkContext2","useOsdkFunction","queryDef","options","observableClient","useContext","params","dependsOn","dependsOnObjects","dedupeIntervalMs","enabled","stableParams","useMemo","JSON","stringify","stableDependsOn","map","d","apiName","stableDependsOnObjects","o","$apiName","$primaryKey","paramsForApi","subscribe","getSnapShot","unsubscribe","process","env","NODE_ENV","observer","observeFunction","dedupeInterval","version","payload","useSyncExternalStore","error","status","Error","undefined","refetch","useCallback","invalidateFunction","data","result","isLoading","lastUpdated"],"sources":["useOsdkFunction.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 CompileTimeMetadata,\n ObjectTypeDefinition,\n Osdk,\n QueryDefinition,\n} from \"@osdk/api\";\nimport type {\n ObserveFunctionCallbackArgs,\n QueryParameterType,\n QueryReturnType,\n} from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseOsdkFunctionOptions<Q extends QueryDefinition<unknown>> {\n /**\n * Parameters to pass to the function.\n * Must include all required parameters; optional parameters can be omitted.\n */\n params?: CompileTimeMetadata<Q>[\"parameters\"] extends Record<string, never>\n ? undefined\n : QueryParameterType<CompileTimeMetadata<Q>[\"parameters\"]>;\n\n /**\n * Object types this function depends on.\n * When actions modify objects of these types, the function will automatically refetch.\n *\n * @example\n * ```tsx\n * // Refetch when any Employee object changes\n * { dependsOn: [Employee] }\n * ```\n */\n dependsOn?: Array<ObjectTypeDefinition | string>;\n\n /**\n * Specific object instances this function depends on.\n * When any of these specific objects change, the function will refetch.\n * More fine-grained than dependsOn for precise invalidation control.\n *\n * @example\n * ```tsx\n * // Refetch when this specific employee changes\n * { dependsOnObjects: [employee] }\n * ```\n */\n dependsOnObjects?: Array<Osdk.Instance<ObjectTypeDefinition>>;\n\n /**\n * The number of milliseconds to dedupe identical function calls.\n * Two calls with the same function and params will share results\n * if the second call is within this interval of the first.\n * @default 2000\n */\n dedupeIntervalMs?: number;\n\n /**\n * Whether to enable the query. When false, the query will not execute.\n * Useful for:\n * - Dependent queries that need to wait for other data\n * - Conditional queries based on component state\n *\n * @default true\n * @example\n * // Dependent query - wait for required data\n * const { data: employee } = useOsdkObject(Employee, employeeId);\n * const { data: report } = useOsdkFunction(getEmployeeReport, {\n * params: { employeeId: employee?.$primaryKey },\n * enabled: !!employee\n * });\n */\n enabled?: boolean;\n}\n\nexport interface UseOsdkFunctionResult<Q extends QueryDefinition<unknown>> {\n /**\n * The function result, or undefined if not yet loaded or on error.\n */\n data: QueryReturnType<CompileTimeMetadata<Q>[\"output\"]> | undefined;\n\n /**\n * True while the function is executing.\n */\n isLoading: boolean;\n\n /**\n * Error if the function execution failed.\n */\n error: Error | undefined;\n\n /**\n * Timestamp (ms since epoch) of when the result was last fetched.\n */\n lastUpdated: number;\n\n /**\n * Manually refetch the function.\n * Useful for \"pull to refresh\" or retry patterns.\n */\n refetch: () => void;\n}\n\ndeclare const process: {\n env: {\n NODE_ENV: \"development\" | \"production\";\n };\n};\n\n/**\n * React hook for executing and observing OSDK functions.\n *\n * Provides automatic caching, deduplication, and reactive updates for function calls.\n * Functions are automatically re-fetched when dependencies change (configured via options).\n *\n * @param queryDef - The QueryDefinition to execute\n * @param options - Configuration options for the function call\n * @returns Object containing result, loading state, error, and refetch function\n *\n * @example Basic usage\n * ```tsx\n * const { data, isLoading, error } = useOsdkFunction(getEmployeeStats, {\n * params: { departmentId: \"engineering\" }\n * });\n * ```\n *\n * @example With dependency tracking\n * ```tsx\n * const { data, refetch } = useOsdkFunction(calculateMetrics, {\n * params: { startDate, endDate },\n * dependsOn: [Employee, Project],\n * });\n * ```\n *\n * @example With specific object dependencies\n * ```tsx\n * const { data } = useOsdkFunction(getEmployeeReport, {\n * params: { employeeId: employee.$primaryKey },\n * dependsOnObjects: [employee],\n * });\n * ```\n */\nexport function useOsdkFunction<Q extends QueryDefinition<unknown>>(\n queryDef: Q,\n options: UseOsdkFunctionOptions<Q> = {},\n): UseOsdkFunctionResult<Q> {\n const { observableClient } = React.useContext(OsdkContext2);\n const {\n params,\n dependsOn,\n dependsOnObjects,\n dedupeIntervalMs,\n enabled = true,\n } = options;\n\n const stableParams = React.useMemo(\n () => params,\n [JSON.stringify(params)],\n );\n const stableDependsOn = React.useMemo(\n () => dependsOn,\n [JSON.stringify(\n dependsOn?.map(d => typeof d === \"string\" ? d : d.apiName),\n )],\n );\n const stableDependsOnObjects = React.useMemo(\n () => dependsOnObjects,\n [JSON.stringify(\n dependsOnObjects?.map(o => ({\n $apiName: o.$apiName,\n $primaryKey: o.$primaryKey,\n })),\n )],\n );\n\n // Record<string, unknown> required as typing is figured out at runtime\n const paramsForApi = stableParams as Record<string, unknown> | undefined;\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (!enabled) {\n return makeExternalStore<ObserveFunctionCallbackArgs<Q>>(\n () => ({ unsubscribe: () => {} }),\n process.env.NODE_ENV !== \"production\"\n ? `function ${queryDef.apiName} ${\n JSON.stringify(stableParams)\n } [DISABLED]`\n : void 0,\n );\n }\n return makeExternalStore<ObserveFunctionCallbackArgs<Q>>(\n (observer) =>\n observableClient.observeFunction(\n queryDef,\n paramsForApi,\n {\n dependsOn: stableDependsOn,\n dependsOnObjects: stableDependsOnObjects,\n dedupeInterval: dedupeIntervalMs ?? 2_000,\n },\n observer,\n ),\n process.env.NODE_ENV !== \"production\"\n ? `function ${queryDef.apiName} ${JSON.stringify(stableParams)}`\n : void 0,\n );\n },\n [\n observableClient,\n queryDef.apiName,\n queryDef.version,\n paramsForApi,\n stableDependsOn,\n stableDependsOnObjects,\n dedupeIntervalMs,\n enabled,\n ],\n );\n\n const payload = React.useSyncExternalStore(subscribe, getSnapShot);\n\n const error = payload?.error\n ?? (payload?.status === \"error\"\n ? new Error(\"Failed to execute function\")\n : undefined);\n\n const refetch = React.useCallback(() => {\n void observableClient.invalidateFunction(queryDef, paramsForApi);\n }, [observableClient, queryDef, paramsForApi]);\n\n return {\n data: payload?.result as\n | QueryReturnType<CompileTimeMetadata<Q>[\"output\"]>\n | undefined,\n isLoading: payload?.status === \"loading\",\n error,\n lastUpdated: payload?.lastUpdated ?? 0,\n refetch,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useOsdkFunction.js","names":["getWireObjectSet","React","makeExternalStore","OsdkContext2","useOsdkFunction","queryDef","options","observableClient","useContext","params","dependsOn","dependsOnObjects","dedupeIntervalMs","enabled","stableParams","useMemo","JSON","stringify","stableDependsOn","map","d","apiName","stableDependsOnObjects","item","$apiName","$primaryKey","__objectSet","paramsForApi","subscribe","getSnapShot","unsubscribe","process","env","NODE_ENV","observer","observeFunction","dedupeInterval","version","payload","useSyncExternalStore","refetch","useCallback","invalidateFunction","error","status","Error","undefined","data","result","isLoading","lastUpdated"],"sources":["useOsdkFunction.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 CompileTimeMetadata,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n QueryDefinition,\n} from \"@osdk/api\";\nimport type {\n ObserveFunctionCallbackArgs,\n QueryParameterType,\n} from \"@osdk/client/unstable-do-not-use\";\nimport { getWireObjectSet } from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseOsdkFunctionOptions<Q extends QueryDefinition<unknown>> {\n /**\n * Parameters to pass to the function.\n * Must include all required parameters; optional parameters can be omitted.\n */\n params?: CompileTimeMetadata<Q>[\"parameters\"] extends Record<string, never>\n ? undefined\n : QueryParameterType<CompileTimeMetadata<Q>[\"parameters\"]>;\n\n /**\n * Object types this function depends on.\n * When actions modify objects of these types, the function will automatically refetch.\n *\n * @example\n * ```tsx\n * // Refetch when any Employee object changes\n * { dependsOn: [Employee] }\n * ```\n */\n dependsOn?: Array<ObjectTypeDefinition | string>;\n\n /**\n * Specific object instances or ObjectSets this function depends on.\n * When any of these specific objects change, the function will refetch.\n * More fine-grained than dependsOn for precise invalidation control.\n *\n * For ObjectSets, the object type is extracted asynchronously and changes\n * to any object of that type will trigger a refetch.\n *\n * @example\n * ```tsx\n * // Refetch when this specific employee changes\n * { dependsOnObjects: [employee] }\n *\n * // Refetch when any object in the ObjectSet's type changes\n * { dependsOnObjects: [employeeObjectSet] }\n * ```\n */\n dependsOnObjects?: Array<\n Osdk.Instance<ObjectTypeDefinition> | ObjectSet<ObjectTypeDefinition>\n >;\n\n /**\n * The number of milliseconds to dedupe identical function calls.\n * Two calls with the same function and params will share results\n * if the second call is within this interval of the first.\n * @default 2000\n */\n dedupeIntervalMs?: number;\n\n /**\n * Whether to enable the query. When false, the query will not execute.\n * Useful for:\n * - Dependent queries that need to wait for other data\n * - Conditional queries based on component state\n *\n * @default true\n * @example\n * // Dependent query - wait for required data\n * const { data: employee } = useOsdkObject(Employee, employeeId);\n * const { data: report } = useOsdkFunction(getEmployeeReport, {\n * params: { employeeId: employee?.$primaryKey },\n * enabled: !!employee\n * });\n */\n enabled?: boolean;\n}\n\nexport interface UseOsdkFunctionResult<Q extends QueryDefinition<unknown>> {\n /**\n * The function result, or undefined if not yet loaded or on error.\n */\n data:\n | (CompileTimeMetadata<Q>[\"signature\"] extends (...args: never[]) => infer R\n ? Awaited<R>\n : never)\n | undefined;\n\n /**\n * True while the function is executing.\n */\n isLoading: boolean;\n\n /**\n * Error if the function execution failed.\n */\n error: Error | undefined;\n\n /**\n * Timestamp (ms since epoch) of when the result was last fetched.\n */\n lastUpdated: number;\n\n /**\n * Manually refetch the function.\n * Useful for \"pull to refresh\" or retry patterns.\n */\n refetch: () => void;\n}\n\ndeclare const process: {\n env: {\n NODE_ENV: \"development\" | \"production\";\n };\n};\n\n/**\n * React hook for executing and observing OSDK functions.\n *\n * Provides automatic caching, deduplication, and reactive updates for function calls.\n * Functions are automatically re-fetched when dependencies change (configured via options).\n *\n * @param queryDef - The QueryDefinition to execute\n * @param options - Configuration options for the function call\n * @returns Object containing result, loading state, error, and refetch function\n *\n * @example Basic usage\n * ```tsx\n * const { data, isLoading, error } = useOsdkFunction(getEmployeeStats, {\n * params: { departmentId: \"engineering\" }\n * });\n * ```\n *\n * @example With dependency tracking\n * ```tsx\n * const { data, refetch } = useOsdkFunction(calculateMetrics, {\n * params: { startDate, endDate },\n * dependsOn: [Employee, Project],\n * });\n * ```\n *\n * @example With specific object dependencies\n * ```tsx\n * const { data } = useOsdkFunction(getEmployeeReport, {\n * params: { employeeId: employee.$primaryKey },\n * dependsOnObjects: [employee],\n * });\n * ```\n */\nexport function useOsdkFunction<Q extends QueryDefinition<unknown>>(\n queryDef: Q,\n options: UseOsdkFunctionOptions<Q> = {},\n): UseOsdkFunctionResult<Q> {\n const { observableClient } = React.useContext(OsdkContext2);\n const {\n params,\n dependsOn,\n dependsOnObjects,\n dedupeIntervalMs,\n enabled = true,\n } = options;\n\n const stableParams = React.useMemo(\n () => params,\n [JSON.stringify(params)],\n );\n const stableDependsOn = React.useMemo(\n () => dependsOn,\n [JSON.stringify(\n dependsOn?.map(d => typeof d === \"string\" ? d : d.apiName),\n )],\n );\n const stableDependsOnObjects = React.useMemo(\n () => dependsOnObjects,\n [JSON.stringify(\n dependsOnObjects?.map(item =>\n \"$apiName\" in item\n ? { $apiName: item.$apiName, $primaryKey: item.$primaryKey }\n : { __objectSet: getWireObjectSet(item) }\n ),\n )],\n );\n\n // Record<string, unknown> required as typing is figured out at runtime\n const paramsForApi = stableParams as Record<string, unknown> | undefined;\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (!enabled) {\n return makeExternalStore<ObserveFunctionCallbackArgs<Q>>(\n () => ({ unsubscribe: () => {} }),\n process.env.NODE_ENV !== \"production\"\n ? `function ${queryDef.apiName} ${\n JSON.stringify(stableParams)\n } [DISABLED]`\n : void 0,\n );\n }\n return makeExternalStore<ObserveFunctionCallbackArgs<Q>>(\n (observer) =>\n observableClient.observeFunction(\n queryDef,\n paramsForApi,\n {\n dependsOn: stableDependsOn,\n dependsOnObjects: stableDependsOnObjects,\n dedupeInterval: dedupeIntervalMs ?? 2_000,\n },\n observer,\n ),\n process.env.NODE_ENV !== \"production\"\n ? `function ${queryDef.apiName} ${JSON.stringify(stableParams)}`\n : void 0,\n );\n },\n [\n observableClient,\n queryDef.apiName,\n queryDef.version,\n paramsForApi,\n stableDependsOn,\n stableDependsOnObjects,\n dedupeIntervalMs,\n enabled,\n ],\n );\n\n const payload = React.useSyncExternalStore(subscribe, getSnapShot);\n\n const refetch = React.useCallback(() => {\n void observableClient.invalidateFunction(queryDef, paramsForApi);\n }, [observableClient, queryDef, paramsForApi]);\n\n return React.useMemo(() => {\n const error = payload?.error\n ?? (payload?.status === \"error\"\n ? new Error(\"Failed to execute function\")\n : undefined);\n\n return {\n data: payload?.result as UseOsdkFunctionResult<Q>[\"data\"],\n isLoading: payload?.status === \"loading\",\n error,\n lastUpdated: payload?.lastUpdated ?? 0,\n refetch,\n };\n }, [payload, refetch]);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAaA,SAASA,gBAAgB,QAAQ,kCAAkC;AACnE,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,YAAY,QAAQ,mBAAmB;AA4GhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAC7BC,QAAW,EACXC,OAAkC,GAAG,CAAC,CAAC,EACb;EAC1B,MAAM;IAAEC;EAAiB,CAAC,GAAGN,KAAK,CAACO,UAAU,CAACL,YAAY,CAAC;EAC3D,MAAM;IACJM,MAAM;IACNC,SAAS;IACTC,gBAAgB;IAChBC,gBAAgB;IAChBC,OAAO,GAAG;EACZ,CAAC,GAAGP,OAAO;EAEX,MAAMQ,YAAY,GAAGb,KAAK,CAACc,OAAO,CAChC,MAAMN,MAAM,EACZ,CAACO,IAAI,CAACC,SAAS,CAACR,MAAM,CAAC,CACzB,CAAC;EACD,MAAMS,eAAe,GAAGjB,KAAK,CAACc,OAAO,CACnC,MAAML,SAAS,EACf,CAACM,IAAI,CAACC,SAAS,CACbP,SAAS,EAAES,GAAG,CAACC,CAAC,IAAI,OAAOA,CAAC,KAAK,QAAQ,GAAGA,CAAC,GAAGA,CAAC,CAACC,OAAO,CAC3D,CAAC,CACH,CAAC;EACD,MAAMC,sBAAsB,GAAGrB,KAAK,CAACc,OAAO,CAC1C,MAAMJ,gBAAgB,EACtB,CAACK,IAAI,CAACC,SAAS,CACbN,gBAAgB,EAAEQ,GAAG,CAACI,IAAI,IACxB,UAAU,IAAIA,IAAI,GACd;IAAEC,QAAQ,EAAED,IAAI,CAACC,QAAQ;IAAEC,WAAW,EAAEF,IAAI,CAACE;EAAY,CAAC,GAC1D;IAAEC,WAAW,EAAE1B,gBAAgB,CAACuB,IAAI;EAAE,CAC5C,CACF,CAAC,CACH,CAAC;;EAED;EACA,MAAMI,YAAY,GAAGb,YAAmD;EAExE,MAAM;IAAEc,SAAS;IAAEC;EAAY,CAAC,GAAG5B,KAAK,CAACc,OAAO,CAC9C,MAAM;IACJ,IAAI,CAACF,OAAO,EAAE;MACZ,OAAOX,iBAAiB,CACtB,OAAO;QAAE4B,WAAW,EAAEA,CAAA,KAAM,CAAC;MAAE,CAAC,CAAC,EACjCC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GACjC,YAAY5B,QAAQ,CAACgB,OAAO,IAC5BL,IAAI,CAACC,SAAS,CAACH,YAAY,CAAC,aACjB,GACX,KAAK,CACX,CAAC;IACH;IACA,OAAOZ,iBAAiB,CACrBgC,QAAQ,IACP3B,gBAAgB,CAAC4B,eAAe,CAC9B9B,QAAQ,EACRsB,YAAY,EACZ;MACEjB,SAAS,EAAEQ,eAAe;MAC1BP,gBAAgB,EAAEW,sBAAsB;MACxCc,cAAc,EAAExB,gBAAgB,IAAI;IACtC,CAAC,EACDsB,QACF,CAAC,EACHH,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GACjC,YAAY5B,QAAQ,CAACgB,OAAO,IAAIL,IAAI,CAACC,SAAS,CAACH,YAAY,CAAC,EAAE,GAC9D,KAAK,CACX,CAAC;EACH,CAAC,EACD,CACEP,gBAAgB,EAChBF,QAAQ,CAACgB,OAAO,EAChBhB,QAAQ,CAACgC,OAAO,EAChBV,YAAY,EACZT,eAAe,EACfI,sBAAsB,EACtBV,gBAAgB,EAChBC,OAAO,CAEX,CAAC;EAED,MAAMyB,OAAO,GAAGrC,KAAK,CAACsC,oBAAoB,CAACX,SAAS,EAAEC,WAAW,CAAC;EAElE,MAAMW,OAAO,GAAGvC,KAAK,CAACwC,WAAW,CAAC,MAAM;IACtC,KAAKlC,gBAAgB,CAACmC,kBAAkB,CAACrC,QAAQ,EAAEsB,YAAY,CAAC;EAClE,CAAC,EAAE,CAACpB,gBAAgB,EAAEF,QAAQ,EAAEsB,YAAY,CAAC,CAAC;EAE9C,OAAO1B,KAAK,CAACc,OAAO,CAAC,MAAM;IACzB,MAAM4B,KAAK,GAAGL,OAAO,EAAEK,KAAK,KACtBL,OAAO,EAAEM,MAAM,KAAK,OAAO,GAC3B,IAAIC,KAAK,CAAC,4BAA4B,CAAC,GACvCC,SAAS,CAAC;IAEhB,OAAO;MACLC,IAAI,EAAET,OAAO,EAAEU,MAA0C;MACzDC,SAAS,EAAEX,OAAO,EAAEM,MAAM,KAAK,SAAS;MACxCD,KAAK;MACLO,WAAW,EAAEZ,OAAO,EAAEY,WAAW,IAAI,CAAC;MACtCV;IACF,CAAC;EACH,CAAC,EAAE,CAACF,OAAO,EAAEE,OAAO,CAAC,CAAC;AACxB","ignoreList":[]}
|
|
@@ -31,6 +31,14 @@ import { OsdkContext2 } from "./OsdkContext2.js";
|
|
|
31
31
|
* @param enabled Enable or disable the query (defaults to true)
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* Loads an object or interface instance by type and primary key with options.
|
|
36
|
+
*
|
|
37
|
+
* @param type The object type or interface definition
|
|
38
|
+
* @param primaryKey The primary key of the object
|
|
39
|
+
* @param options Options including $select and enabled
|
|
40
|
+
*/
|
|
41
|
+
|
|
34
42
|
/*
|
|
35
43
|
Implementation of useOsdkObject
|
|
36
44
|
*/
|
|
@@ -44,12 +52,17 @@ export function useOsdkObject(...args) {
|
|
|
44
52
|
// so we must use type assertions after runtime discrimination
|
|
45
53
|
const isInstanceSignature = "$objectType" in args[0];
|
|
46
54
|
|
|
55
|
+
// Extract options object if provided (3rd arg is an object with $select or enabled)
|
|
56
|
+
const optionsArg = !isInstanceSignature && args[2] != null && typeof args[2] === "object" ? args[2] : undefined;
|
|
57
|
+
|
|
47
58
|
// Extract enabled flag - 2nd param for instance signature, 3rd for type signature
|
|
48
|
-
const enabled = isInstanceSignature ? typeof args[1] === "boolean" ? args[1] : true : typeof args[2] === "boolean" ? args[2] : true;
|
|
59
|
+
const enabled = isInstanceSignature ? typeof args[1] === "boolean" ? args[1] : true : optionsArg ? optionsArg.enabled ?? true : typeof args[2] === "boolean" ? args[2] : true;
|
|
60
|
+
const selectArg = optionsArg?.$select;
|
|
49
61
|
const mode = isInstanceSignature ? "offline" : undefined;
|
|
50
62
|
const typeOrApiName = isInstanceSignature ? args[0].$objectType : args[0];
|
|
51
63
|
const primaryKey = isInstanceSignature ? args[0].$primaryKey : args[1];
|
|
52
64
|
const apiNameString = typeof typeOrApiName === "string" ? typeOrApiName : typeOrApiName.apiName;
|
|
65
|
+
const stableSelect = React.useMemo(() => selectArg, [JSON.stringify(selectArg)]);
|
|
53
66
|
const {
|
|
54
67
|
subscribe,
|
|
55
68
|
getSnapShot
|
|
@@ -60,24 +73,30 @@ export function useOsdkObject(...args) {
|
|
|
60
73
|
}), `object ${apiNameString} ${primaryKey} [DISABLED]`);
|
|
61
74
|
}
|
|
62
75
|
return makeExternalStore(observer => observableClient.observeObject(typeOrApiName, primaryKey, {
|
|
63
|
-
mode
|
|
76
|
+
mode,
|
|
77
|
+
...(stableSelect ? {
|
|
78
|
+
select: stableSelect
|
|
79
|
+
} : {})
|
|
64
80
|
}, observer), `object ${apiNameString} ${primaryKey}`);
|
|
65
|
-
}, [enabled, observableClient, typeOrApiName, apiNameString, primaryKey, mode]);
|
|
81
|
+
}, [enabled, observableClient, typeOrApiName, apiNameString, primaryKey, mode, stableSelect]);
|
|
66
82
|
const payload = React.useSyncExternalStore(subscribe, getSnapShot);
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
error
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
isOptimistic: !!payload?.isOptimistic,
|
|
77
|
-
error,
|
|
78
|
-
forceUpdate: () => {
|
|
79
|
-
throw new Error("not implemented");
|
|
83
|
+
const forceUpdate = React.useCallback(() => {
|
|
84
|
+
throw new Error("not implemented");
|
|
85
|
+
}, []);
|
|
86
|
+
return React.useMemo(() => {
|
|
87
|
+
let error;
|
|
88
|
+
if (payload && "error" in payload && payload.error) {
|
|
89
|
+
error = payload.error;
|
|
90
|
+
} else if (payload?.status === "error") {
|
|
91
|
+
error = new Error("Failed to load object");
|
|
80
92
|
}
|
|
81
|
-
|
|
93
|
+
return {
|
|
94
|
+
object: payload?.object,
|
|
95
|
+
isLoading: enabled ? payload?.status === "loading" || payload?.status === "init" || !payload : false,
|
|
96
|
+
isOptimistic: !!payload?.isOptimistic,
|
|
97
|
+
error,
|
|
98
|
+
forceUpdate
|
|
99
|
+
};
|
|
100
|
+
}, [payload, enabled, forceUpdate]);
|
|
82
101
|
}
|
|
83
102
|
//# sourceMappingURL=useOsdkObject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOsdkObject.js","names":["React","makeExternalStore","OsdkContext2","useOsdkObject","args","observableClient","useContext","isInstanceSignature","enabled","
|
|
1
|
+
{"version":3,"file":"useOsdkObject.js","names":["React","makeExternalStore","OsdkContext2","useOsdkObject","args","observableClient","useContext","isInstanceSignature","optionsArg","undefined","enabled","selectArg","$select","mode","typeOrApiName","$objectType","primaryKey","$primaryKey","apiNameString","apiName","stableSelect","useMemo","JSON","stringify","subscribe","getSnapShot","unsubscribe","observer","observeObject","select","payload","useSyncExternalStore","forceUpdate","useCallback","Error","error","status","object","isLoading","isOptimistic"],"sources":["useOsdkObject.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectOrInterfaceDefinition,\n Osdk,\n PrimaryKeyType,\n PropertyKeys,\n} from \"@osdk/api\";\nimport type { ObserveObjectCallbackArgs } from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseOsdkObjectResult<\n Q extends ObjectOrInterfaceDefinition,\n> {\n object: Osdk.Instance<Q> | undefined;\n isLoading: boolean;\n\n error: Error | undefined;\n\n /**\n * Refers to whether the object is optimistic or not.\n */\n isOptimistic: boolean;\n forceUpdate: () => void;\n}\n\n/**\n * @param obj an existing `Osdk.Instance` object to get metadata for.\n * @param enabled Enable or disable the query (defaults to true)\n */\nexport function useOsdkObject<\n Q extends ObjectOrInterfaceDefinition,\n>(\n obj: Osdk.Instance<Q>,\n enabled?: boolean,\n): UseOsdkObjectResult<Q>;\n/**\n * Loads an object or interface instance by type and primary key.\n *\n * @param type The object type or interface definition\n * @param primaryKey The primary key of the object\n * @param enabled Enable or disable the query (defaults to true)\n */\nexport function useOsdkObject<\n Q extends ObjectOrInterfaceDefinition,\n>(\n type: Q,\n primaryKey: PrimaryKeyType<Q>,\n enabled?: boolean,\n): UseOsdkObjectResult<Q>;\n/**\n * Loads an object or interface instance by type and primary key with options.\n *\n * @param type The object type or interface definition\n * @param primaryKey The primary key of the object\n * @param options Options including $select and enabled\n */\nexport function useOsdkObject<\n Q extends ObjectOrInterfaceDefinition,\n>(\n type: Q,\n primaryKey: PrimaryKeyType<Q>,\n options?: { $select?: readonly PropertyKeys<Q>[]; enabled?: boolean },\n): UseOsdkObjectResult<Q>;\n/*\n Implementation of useOsdkObject\n */\nexport function useOsdkObject<\n Q extends ObjectOrInterfaceDefinition,\n>(\n ...args:\n | [obj: Osdk.Instance<Q>, enabled?: boolean]\n | [type: Q, primaryKey: PrimaryKeyType<Q>, enabled?: boolean]\n | [\n type: Q,\n primaryKey: PrimaryKeyType<Q>,\n options?: { $select?: readonly PropertyKeys<Q>[]; enabled?: boolean },\n ]\n): UseOsdkObjectResult<Q> {\n const { observableClient } = React.useContext(OsdkContext2);\n\n // Check if first arg is an instance to discriminate signatures\n // TypeScript cannot narrow rest parameter unions with optional parameters,\n // so we must use type assertions after runtime discrimination\n const isInstanceSignature = \"$objectType\" in args[0];\n\n // Extract options object if provided (3rd arg is an object with $select or enabled)\n const optionsArg = !isInstanceSignature\n && args[2] != null\n && typeof args[2] === \"object\"\n ? args[2] as { $select?: readonly string[]; enabled?: boolean }\n : undefined;\n\n // Extract enabled flag - 2nd param for instance signature, 3rd for type signature\n const enabled = isInstanceSignature\n ? (typeof args[1] === \"boolean\" ? args[1] : true)\n : optionsArg\n ? (optionsArg.enabled ?? true)\n : (typeof args[2] === \"boolean\" ? args[2] : true);\n\n const selectArg = optionsArg?.$select;\n\n const mode = isInstanceSignature ? \"offline\" : undefined;\n\n const typeOrApiName = isInstanceSignature\n ? (args[0] as Osdk.Instance<Q>).$objectType\n : (args[0] as Q);\n\n const primaryKey = isInstanceSignature\n ? (args[0] as Osdk.Instance<Q>).$primaryKey\n : (args[1] as PrimaryKeyType<Q>);\n\n const apiNameString = typeof typeOrApiName === \"string\"\n ? typeOrApiName\n : typeOrApiName.apiName;\n\n const stableSelect = React.useMemo(\n () => selectArg,\n [JSON.stringify(selectArg)],\n );\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (!enabled) {\n return makeExternalStore<ObserveObjectCallbackArgs<Q>>(\n () => ({ unsubscribe: () => {} }),\n `object ${apiNameString} ${primaryKey} [DISABLED]`,\n );\n }\n return makeExternalStore<ObserveObjectCallbackArgs<Q>>(\n (observer) =>\n observableClient.observeObject(\n typeOrApiName,\n primaryKey,\n {\n mode,\n ...(stableSelect ? { select: stableSelect } : {}),\n },\n observer,\n ),\n `object ${apiNameString} ${primaryKey}`,\n );\n },\n [\n enabled,\n observableClient,\n typeOrApiName,\n apiNameString,\n primaryKey,\n mode,\n stableSelect,\n ],\n );\n\n const payload = React.useSyncExternalStore(subscribe, getSnapShot);\n\n const forceUpdate = React.useCallback(() => {\n throw new Error(\"not implemented\");\n }, []);\n\n return React.useMemo(() => {\n let error: Error | undefined;\n if (payload && \"error\" in payload && payload.error) {\n error = payload.error;\n } else if (payload?.status === \"error\") {\n error = new Error(\"Failed to load object\");\n }\n\n return {\n object: payload?.object as Osdk.Instance<Q> | undefined,\n isLoading: enabled\n ? (payload?.status === \"loading\" || payload?.status === \"init\"\n || !payload)\n : false,\n isOptimistic: !!payload?.isOptimistic,\n error,\n forceUpdate,\n };\n }, [payload, enabled, forceUpdate]);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import React from "react";
|
|
18
18
|
import { makeExternalStore } from "./makeExternalStore.js";
|
|
19
19
|
import { OsdkContext2 } from "./OsdkContext2.js";
|
|
20
|
+
const EMPTY_WHERE = {};
|
|
20
21
|
export function useOsdkObjects(type, options) {
|
|
21
22
|
const {
|
|
22
23
|
observableClient
|
|
@@ -32,13 +33,16 @@ export function useOsdkObjects(type, options) {
|
|
|
32
33
|
streamUpdates,
|
|
33
34
|
autoFetchMore,
|
|
34
35
|
intersectWith,
|
|
35
|
-
pivotTo
|
|
36
|
+
pivotTo,
|
|
37
|
+
$select
|
|
36
38
|
} = options ?? {};
|
|
37
|
-
const canonWhere = observableClient.canonicalizeWhereClause(where ??
|
|
39
|
+
const canonWhere = observableClient.canonicalizeWhereClause(where ?? EMPTY_WHERE);
|
|
40
|
+
const stableCanonWhere = React.useMemo(() => canonWhere, [JSON.stringify(canonWhere)]);
|
|
38
41
|
const stableRids = React.useMemo(() => rids, [JSON.stringify(rids)]);
|
|
39
42
|
const stableWithProperties = React.useMemo(() => withProperties, [JSON.stringify(withProperties)]);
|
|
40
43
|
const stableIntersectWith = React.useMemo(() => intersectWith, [JSON.stringify(intersectWith)]);
|
|
41
44
|
const stableOrderBy = React.useMemo(() => orderBy, [JSON.stringify(orderBy)]);
|
|
45
|
+
const stableSelect = React.useMemo(() => $select, [JSON.stringify($select)]);
|
|
42
46
|
const {
|
|
43
47
|
subscribe,
|
|
44
48
|
getSnapShot
|
|
@@ -51,7 +55,7 @@ export function useOsdkObjects(type, options) {
|
|
|
51
55
|
return makeExternalStore(observer => observableClient.observeList({
|
|
52
56
|
type,
|
|
53
57
|
rids: stableRids,
|
|
54
|
-
where:
|
|
58
|
+
where: stableCanonWhere,
|
|
55
59
|
dedupeInterval: dedupeIntervalMs ?? 2_000,
|
|
56
60
|
pageSize,
|
|
57
61
|
orderBy: stableOrderBy,
|
|
@@ -63,23 +67,28 @@ export function useOsdkObjects(type, options) {
|
|
|
63
67
|
} : {}),
|
|
64
68
|
...(pivotTo ? {
|
|
65
69
|
pivotTo
|
|
70
|
+
} : {}),
|
|
71
|
+
...(stableSelect ? {
|
|
72
|
+
select: stableSelect
|
|
66
73
|
} : {})
|
|
67
|
-
}, observer), process.env.NODE_ENV !== "production" ? `list ${type.apiName} ${stableRids ? `[${stableRids.length} rids]` : ""} ${JSON.stringify(
|
|
68
|
-
}, [enabled, observableClient, type, stableRids,
|
|
74
|
+
}, observer), process.env.NODE_ENV !== "production" ? `list ${type.apiName} ${stableRids ? `[${stableRids.length} rids]` : ""} ${JSON.stringify(stableCanonWhere)}` : void 0);
|
|
75
|
+
}, [enabled, observableClient, type.apiName, type.type, stableRids, stableCanonWhere, dedupeIntervalMs, pageSize, stableOrderBy, streamUpdates, stableWithProperties, autoFetchMore, stableIntersectWith, pivotTo, stableSelect]);
|
|
69
76
|
const listPayload = React.useSyncExternalStore(subscribe, getSnapShot);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
error
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
77
|
+
return React.useMemo(() => {
|
|
78
|
+
let error;
|
|
79
|
+
if (listPayload && "error" in listPayload && listPayload.error) {
|
|
80
|
+
error = listPayload.error;
|
|
81
|
+
} else if (listPayload?.status === "error") {
|
|
82
|
+
error = new Error("Failed to load objects");
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
fetchMore: listPayload?.hasMore ? listPayload.fetchMore : undefined,
|
|
86
|
+
error,
|
|
87
|
+
data: listPayload?.resolvedList,
|
|
88
|
+
isLoading: enabled ? listPayload?.status === "loading" || listPayload?.status === "init" || !listPayload : false,
|
|
89
|
+
isOptimistic: listPayload?.isOptimistic ?? false,
|
|
90
|
+
totalCount: listPayload?.totalCount
|
|
91
|
+
};
|
|
92
|
+
}, [listPayload, enabled]);
|
|
84
93
|
}
|
|
85
94
|
//# sourceMappingURL=useOsdkObjects.js.map
|