@osdk/react 0.10.0-beta.5 → 0.10.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/build/browser/intellisense.test.helpers/useOsdkObjectsWithRids.js +37 -0
- package/build/browser/intellisense.test.helpers/useOsdkObjectsWithRids.js.map +1 -0
- package/build/browser/intellisense.test.js +24 -0
- package/build/browser/intellisense.test.js.map +1 -1
- package/build/browser/new/useObjectSet.js +38 -16
- package/build/browser/new/useObjectSet.js.map +1 -1
- package/build/browser/new/useOsdkObjects.js.map +1 -1
- package/build/cjs/public/experimental.cjs +38 -16
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.d.cts +18 -11
- package/build/esm/intellisense.test.helpers/useOsdkObjectsWithRids.js +37 -0
- package/build/esm/intellisense.test.helpers/useOsdkObjectsWithRids.js.map +1 -0
- package/build/esm/intellisense.test.js +24 -0
- package/build/esm/intellisense.test.js.map +1 -1
- package/build/esm/new/useObjectSet.js +38 -16
- package/build/esm/new/useObjectSet.js.map +1 -1
- package/build/esm/new/useOsdkObjects.js.map +1 -1
- package/build/types/intellisense.test.helpers/useOsdkObjectsWithRids.d.ts +1 -0
- package/build/types/intellisense.test.helpers/useOsdkObjectsWithRids.d.ts.map +1 -0
- package/build/types/new/useObjectSet.d.ts +4 -4
- package/build/types/new/useObjectSet.d.ts.map +1 -1
- package/build/types/new/useOsdkObjects.d.ts +16 -2
- package/build/types/new/useOsdkObjects.d.ts.map +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# @osdkkit/react
|
|
2
2
|
|
|
3
|
+
## 0.10.0-beta.7
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 9156827: Preserve object set data between loads
|
|
8
|
+
- 35f2f1a: Add Media inputs/outputs for Queries
|
|
9
|
+
- 71e28ef: Allow interface object sets in useObjectSet
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [e64bf0b]
|
|
14
|
+
- Updated dependencies [baba327]
|
|
15
|
+
- Updated dependencies [d1ad4d1]
|
|
16
|
+
- Updated dependencies [35f2f1a]
|
|
17
|
+
- Updated dependencies [71e28ef]
|
|
18
|
+
- @osdk/client@2.8.0-beta.14
|
|
19
|
+
- @osdk/api@2.8.0-beta.14
|
|
20
|
+
|
|
21
|
+
## 0.10.0-beta.6
|
|
22
|
+
|
|
23
|
+
### Minor Changes
|
|
24
|
+
|
|
25
|
+
- 993c023: ObjectTable supports objectSet input
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- Updated dependencies [8825f8c]
|
|
30
|
+
- @osdk/client@2.8.0-beta.12
|
|
31
|
+
- @osdk/api@2.8.0-beta.12
|
|
32
|
+
|
|
3
33
|
## 0.10.0-beta.5
|
|
4
34
|
|
|
5
35
|
### Minor Changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
// WARNING!
|
|
18
|
+
// WARNING!
|
|
19
|
+
// This file is used for tests that check intellisense. Editing this file by hand will likely
|
|
20
|
+
// break tests that have hard coded line numbers and line offsets.
|
|
21
|
+
|
|
22
|
+
import { Employee } from "@osdk/client.test.ontology";
|
|
23
|
+
import { useOsdkObjects } from "@osdk/react/experimental";
|
|
24
|
+
function TestComponent() {
|
|
25
|
+
const {
|
|
26
|
+
data: ridsData
|
|
27
|
+
} = useOsdkObjects(Employee, {
|
|
28
|
+
rids: ["ri.foo.123"]
|
|
29
|
+
});
|
|
30
|
+
ridsData?.[0];
|
|
31
|
+
const {
|
|
32
|
+
data: noRidsData
|
|
33
|
+
} = useOsdkObjects(Employee);
|
|
34
|
+
noRidsData?.[0];
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=useOsdkObjectsWithRids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOsdkObjectsWithRids.js","names":["Employee","useOsdkObjects","TestComponent","data","ridsData","rids","noRidsData"],"sources":["useOsdkObjectsWithRids.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// WARNING!\n// WARNING!\n// This file is used for tests that check intellisense. Editing this file by hand will likely\n// break tests that have hard coded line numbers and line offsets.\n\nimport { Employee } from \"@osdk/client.test.ontology\";\nimport { useOsdkObjects } from \"@osdk/react/experimental\";\n\nfunction TestComponent() {\n const { data: ridsData } = useOsdkObjects(Employee, {\n rids: [\"ri.foo.123\"],\n });\n\n const ridsItem = ridsData?.[0];\n\n const { data: noRidsData } = useOsdkObjects(Employee);\n\n const noRidsItem = noRidsData?.[0];\n\n return null;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,QAAQ,4BAA4B;AACrD,SAASC,cAAc,QAAQ,0BAA0B;AAEzD,SAASC,aAAaA,CAAA,EAAG;EACvB,MAAM;IAAEC,IAAI,EAAEC;EAAS,CAAC,GAAGH,cAAc,CAACD,QAAQ,EAAE;IAClDK,IAAI,EAAE,CAAC,YAAY;EACrB,CAAC,CAAC;EAEeD,QAAQ,GAAG,CAAC,CAAC;EAE9B,MAAM;IAAED,IAAI,EAAEG;EAAW,CAAC,GAAGL,cAAc,CAACD,QAAQ,CAAC;EAElCM,UAAU,GAAG,CAAC,CAAC;EAElC,OAAO,IAAI;AACb","ignoreList":[]}
|
|
@@ -121,6 +121,30 @@ describe("intellisense", () => {
|
|
|
121
121
|
expect(typeResp.body?.displayString).toBeDefined();
|
|
122
122
|
expect(typeResp.body?.displayString).toContain("Employee");
|
|
123
123
|
});
|
|
124
|
+
it("useOsdkObjectsWithRids", {
|
|
125
|
+
timeout: 40_000
|
|
126
|
+
}, async () => {
|
|
127
|
+
expect(ts.sys.fileExists(intellisenseFilePath)).toBeTruthy();
|
|
128
|
+
!tsServer ? process.env.NODE_ENV !== "production" ? invariant(false) : invariant(false) : void 0;
|
|
129
|
+
const {
|
|
130
|
+
resp: ridsResp
|
|
131
|
+
} = await tsServer.sendQuickInfoRequest({
|
|
132
|
+
file: intellisenseFilePath,
|
|
133
|
+
line: 30,
|
|
134
|
+
offset: 9
|
|
135
|
+
});
|
|
136
|
+
expect(ridsResp.body?.displayString).toBeDefined();
|
|
137
|
+
expect(ridsResp.body?.displayString).toContain("$rid");
|
|
138
|
+
const {
|
|
139
|
+
resp: noRidsResp
|
|
140
|
+
} = await tsServer.sendQuickInfoRequest({
|
|
141
|
+
file: intellisenseFilePath,
|
|
142
|
+
line: 34,
|
|
143
|
+
offset: 9
|
|
144
|
+
});
|
|
145
|
+
expect(noRidsResp.body?.displayString).toBeDefined();
|
|
146
|
+
expect(noRidsResp.body?.displayString).not.toContain("$rid");
|
|
147
|
+
});
|
|
124
148
|
it("useOsdkObjectsWithProperties", {
|
|
125
149
|
timeout: 40_000
|
|
126
150
|
}, async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intellisense.test.js","names":["startTsServer","findUpSync","path","invariant","ts","afterEach","beforeAll","beforeEach","describe","expect","it","vi","rootLogger","hoisted","pino","pinoPretty","EventEmitter","Promise","resolve","level","build","sync","timestampKey","undefined","errorLikeObjectKeys","errorProps","ignore","destination","write","a","at","slice","console","log","packagesDir","reactPackagePath","reactPackageJson","cwd","import","meta","dirname","process","env","NODE_ENV","join","tsServer","intellisenseFilePath","task","name","sys","fileExists","toBeTruthy","sendOpenRequest","file","error","stop","timeout","resp","sendCompletionsRequest","line","offset","triggerKind","CompletionTriggerKind","Invoked","completions","body","entries","map","e","toContain","typeResp","sendQuickInfoRequest","displayString","toBeDefined","dataResp"],"sources":["intellisense.test.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 { Logger } from \"@osdk/api\";\nimport type { TsServer } from \"@osdk/client/internal-node\";\nimport { startTsServer } from \"@osdk/client/internal-node\";\nimport { findUpSync } from \"find-up\";\nimport * as path from \"node:path\";\nimport invariant from \"tiny-invariant\";\nimport * as ts from \"typescript\";\nimport {\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\n\n// it needs to be hoisted because its referenced from our mocked WebSocket\n// which must be hoisted to work\nconst rootLogger = await vi.hoisted(async (): Promise<Logger> => {\n const pino = (await import(\"pino\")).pino;\n const pinoPretty = await import(\"pino-pretty\");\n const { EventEmitter } = await import(\"node:events\");\n class PinoConsoleLogDestination extends EventEmitter {\n write(a: string) {\n // remove trailing newline since console.log adds one\n if (a.at(-1) === \"\\n\") a = a.slice(0, -1);\n\n // This lets the test framework aggregate the logs per test, whereas direct to stdout does not\n console.log(a);\n }\n }\n return Promise.resolve(pino(\n { level: \"info\" },\n (pinoPretty.build)({\n sync: true,\n timestampKey: undefined,\n errorLikeObjectKeys: [\"error\", \"err\", \"exception\"],\n errorProps: \"stack,cause,properties\",\n ignore: \"time,hostname,pid\",\n destination: new PinoConsoleLogDestination(),\n }),\n ));\n});\n\n/**\n * @vitest-environment node\n * @vitest-pool forks\n */\ndescribe(\"intellisense\", () => {\n let packagesDir: string;\n let reactPackagePath: string;\n\n beforeAll(() => {\n const reactPackageJson = findUpSync(\"package.json\", {\n cwd: import.meta.dirname,\n });\n console.log({ reactPackageJson });\n invariant(reactPackageJson != null);\n packagesDir = path.join(\n path.dirname(reactPackageJson),\n \"..\",\n );\n\n reactPackagePath = path.join(packagesDir, \"react\");\n });\n\n let tsServer: TsServer | undefined;\n let intellisenseFilePath: string;\n\n beforeEach(async (a) => {\n intellisenseFilePath = path.join(\n reactPackagePath,\n \"src\",\n \"intellisense.test.helpers\",\n `${a.task.name}.ts`,\n );\n\n console.log(intellisenseFilePath);\n\n expect(ts.sys.fileExists(intellisenseFilePath)).toBeTruthy();\n\n try {\n tsServer = await startTsServer(rootLogger);\n await tsServer.sendOpenRequest({ file: intellisenseFilePath });\n } catch (error) {\n if (tsServer) {\n try {\n tsServer.stop();\n } catch {\n // Ignore cleanup errors\n }\n tsServer = undefined;\n }\n throw error;\n }\n });\n\n afterEach(() => {\n if (tsServer) {\n tsServer.stop();\n tsServer = undefined;\n }\n });\n\n it(\"useOsdkObjectsWithPivot\", { timeout: 40_000 }, async () => {\n expect(ts.sys.fileExists(intellisenseFilePath)).toBeTruthy();\n invariant(tsServer);\n\n const { resp } = await tsServer.sendCompletionsRequest({\n file: intellisenseFilePath,\n line: 29,\n offset: 15,\n triggerKind: ts.CompletionTriggerKind.Invoked,\n });\n\n const completions = resp.body?.entries.map(e => e.name) ?? [];\n expect(completions).toContain(\"lead\");\n\n const { resp: typeResp } = await tsServer.sendQuickInfoRequest({\n file: intellisenseFilePath,\n line: 33,\n offset: 10,\n });\n\n expect(typeResp.body?.displayString).toBeDefined();\n expect(typeResp.body?.displayString).toContain(\"Employee\");\n });\n\n it(\"useOsdkObjectsWithProperties\", { timeout: 40_000 }, async () => {\n expect(ts.sys.fileExists(intellisenseFilePath)).toBeTruthy();\n invariant(tsServer);\n\n const { resp } = await tsServer.sendQuickInfoRequest({\n file: intellisenseFilePath,\n line: 27,\n offset: 10,\n });\n\n expect(resp.body?.displayString).toContain(\"DerivedProperty.Clause\");\n\n const { resp: dataResp } = await tsServer.sendQuickInfoRequest({\n file: intellisenseFilePath,\n line: 31,\n offset: 11,\n });\n\n expect(dataResp.body?.displayString).toBeDefined();\n expect(dataResp.body?.displayString).toContain(\"Osdk.Instance<Employee\");\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAASA,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,UAAU,QAAQ,SAAS;AACpC,OAAO,KAAKC,IAAI,MAAM,WAAW;AACjC,OAAOC,SAAS,MAAM,gBAAgB;AACtC,OAAO,KAAKC,EAAE,MAAM,YAAY;AAChC,SACEC,SAAS,EACTC,SAAS,EACTC,UAAU,EACVC,QAAQ,EACRC,MAAM,EACNC,EAAE,EACFC,EAAE,QACG,QAAQ;;AAEf;AACA;AACA,MAAMC,UAAU,GAAG,MAAMD,EAAE,CAACE,OAAO,CAAC,YAA6B;EAC/D,MAAMC,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAEA,IAAI;EACxC,MAAMC,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;EAC9C,MAAM;IAAEC;EAAa,CAAC,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;EAUpD,OAAOC,OAAO,CAACC,OAAO,CAACJ,IAAI,CACzB;IAAEK,KAAK,EAAE;EAAO,CAAC,EAChBJ,UAAU,CAACK,KAAK,CAAE;IACjBC,IAAI,EAAE,IAAI;IACVC,YAAY,EAAEC,SAAS;IACvBC,mBAAmB,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;IAClDC,UAAU,EAAE,wBAAwB;IACpCC,MAAM,EAAE,mBAAmB;IAC3BC,WAAW,EAAE,IAjBjB,cAAwCX,YAAY,CAAC;MACnDY,KAAKA,CAACC,CAAS,EAAE;QACf;QACA,IAAIA,CAAC,CAACC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAED,CAAC,GAAGA,CAAC,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;QAEzC;QACAC,OAAO,CAACC,GAAG,CAACJ,CAAC,CAAC;MAChB;IACF,CAAC,CAS8C;EAC7C,CAAC,CACH,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACArB,QAAQ,CAAC,cAAc,EAAE,MAAM;EAC7B,IAAI0B,WAAmB;EACvB,IAAIC,gBAAwB;EAE5B7B,SAAS,CAAC,MAAM;IACd,MAAM8B,gBAAgB,GAAGnC,UAAU,CAAC,cAAc,EAAE;MAClDoC,GAAG,EAAEC,MAAM,CAACC,IAAI,CAACC;IACnB,CAAC,CAAC;IACFR,OAAO,CAACC,GAAG,CAAC;MAAEG;IAAiB,CAAC,CAAC;IACjC,EAAUA,gBAAgB,IAAI,IAAI,IAAAK,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAlCxC,SAAS,UAATA,SAAS;IACT+B,WAAW,GAAGhC,IAAI,CAAC0C,IAAI,CACrB1C,IAAI,CAACsC,OAAO,CAACJ,gBAAgB,CAAC,EAC9B,IACF,CAAC;IAEDD,gBAAgB,GAAGjC,IAAI,CAAC0C,IAAI,CAACV,WAAW,EAAE,OAAO,CAAC;EACpD,CAAC,CAAC;EAEF,IAAIW,QAA8B;EAClC,IAAIC,oBAA4B;EAEhCvC,UAAU,CAAC,MAAOsB,CAAC,IAAK;IACtBiB,oBAAoB,GAAG5C,IAAI,CAAC0C,IAAI,CAC9BT,gBAAgB,EAChB,KAAK,EACL,2BAA2B,EAC3B,GAAGN,CAAC,CAACkB,IAAI,CAACC,IAAI,KAChB,CAAC;IAEDhB,OAAO,CAACC,GAAG,CAACa,oBAAoB,CAAC;IAEjCrC,MAAM,CAACL,EAAE,CAAC6C,GAAG,CAACC,UAAU,CAACJ,oBAAoB,CAAC,CAAC,CAACK,UAAU,CAAC,CAAC;IAE5D,IAAI;MACFN,QAAQ,GAAG,MAAM7C,aAAa,CAACY,UAAU,CAAC;MAC1C,MAAMiC,QAAQ,CAACO,eAAe,CAAC;QAAEC,IAAI,EAAEP;MAAqB,CAAC,CAAC;IAChE,CAAC,CAAC,OAAOQ,KAAK,EAAE;MACd,IAAIT,QAAQ,EAAE;QACZ,IAAI;UACFA,QAAQ,CAACU,IAAI,CAAC,CAAC;QACjB,CAAC,CAAC,MAAM;UACN;QAAA;QAEFV,QAAQ,GAAGtB,SAAS;MACtB;MACA,MAAM+B,KAAK;IACb;EACF,CAAC,CAAC;EAEFjD,SAAS,CAAC,MAAM;IACd,IAAIwC,QAAQ,EAAE;MACZA,QAAQ,CAACU,IAAI,CAAC,CAAC;MACfV,QAAQ,GAAGtB,SAAS;IACtB;EACF,CAAC,CAAC;EAEFb,EAAE,CAAC,yBAAyB,EAAE;IAAE8C,OAAO,EAAE;EAAO,CAAC,EAAE,YAAY;IAC7D/C,MAAM,CAACL,EAAE,CAAC6C,GAAG,CAACC,UAAU,CAACJ,oBAAoB,CAAC,CAAC,CAACK,UAAU,CAAC,CAAC;IAC5D,CAAUN,QAAQ,GAAAJ,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAlBxC,SAAS,UAATA,SAAS;IAET,MAAM;MAAEsD;IAAK,CAAC,GAAG,MAAMZ,QAAQ,CAACa,sBAAsB,CAAC;MACrDL,IAAI,EAAEP,oBAAoB;MAC1Ba,IAAI,EAAE,EAAE;MACRC,MAAM,EAAE,EAAE;MACVC,WAAW,EAAEzD,EAAE,CAAC0D,qBAAqB,CAACC;IACxC,CAAC,CAAC;IAEF,MAAMC,WAAW,GAAGP,IAAI,CAACQ,IAAI,EAAEC,OAAO,CAACC,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACpB,IAAI,CAAC,IAAI,EAAE;IAC7DvC,MAAM,CAACuD,WAAW,CAAC,CAACK,SAAS,CAAC,MAAM,CAAC;IAErC,MAAM;MAAEZ,IAAI,EAAEa;IAAS,CAAC,GAAG,MAAMzB,QAAQ,CAAC0B,oBAAoB,CAAC;MAC7DlB,IAAI,EAAEP,oBAAoB;MAC1Ba,IAAI,EAAE,EAAE;MACRC,MAAM,EAAE;IACV,CAAC,CAAC;IAEFnD,MAAM,CAAC6D,QAAQ,CAACL,IAAI,EAAEO,aAAa,CAAC,CAACC,WAAW,CAAC,CAAC;IAClDhE,MAAM,CAAC6D,QAAQ,CAACL,IAAI,EAAEO,aAAa,CAAC,CAACH,SAAS,CAAC,UAAU,CAAC;EAC5D,CAAC,CAAC;EAEF3D,EAAE,CAAC,8BAA8B,EAAE;IAAE8C,OAAO,EAAE;EAAO,CAAC,EAAE,YAAY;IAClE/C,MAAM,CAACL,EAAE,CAAC6C,GAAG,CAACC,UAAU,CAACJ,oBAAoB,CAAC,CAAC,CAACK,UAAU,CAAC,CAAC;IAC5D,CAAUN,QAAQ,GAAAJ,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAlBxC,SAAS,UAATA,SAAS;IAET,MAAM;MAAEsD;IAAK,CAAC,GAAG,MAAMZ,QAAQ,CAAC0B,oBAAoB,CAAC;MACnDlB,IAAI,EAAEP,oBAAoB;MAC1Ba,IAAI,EAAE,EAAE;MACRC,MAAM,EAAE;IACV,CAAC,CAAC;IAEFnD,MAAM,CAACgD,IAAI,CAACQ,IAAI,EAAEO,aAAa,CAAC,CAACH,SAAS,CAAC,wBAAwB,CAAC;IAEpE,MAAM;MAAEZ,IAAI,EAAEiB;IAAS,CAAC,GAAG,MAAM7B,QAAQ,CAAC0B,oBAAoB,CAAC;MAC7DlB,IAAI,EAAEP,oBAAoB;MAC1Ba,IAAI,EAAE,EAAE;MACRC,MAAM,EAAE;IACV,CAAC,CAAC;IAEFnD,MAAM,CAACiE,QAAQ,CAACT,IAAI,EAAEO,aAAa,CAAC,CAACC,WAAW,CAAC,CAAC;IAClDhE,MAAM,CAACiE,QAAQ,CAACT,IAAI,EAAEO,aAAa,CAAC,CAACH,SAAS,CAAC,wBAAwB,CAAC;EAC1E,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"intellisense.test.js","names":["startTsServer","findUpSync","path","invariant","ts","afterEach","beforeAll","beforeEach","describe","expect","it","vi","rootLogger","hoisted","pino","pinoPretty","EventEmitter","Promise","resolve","level","build","sync","timestampKey","undefined","errorLikeObjectKeys","errorProps","ignore","destination","write","a","at","slice","console","log","packagesDir","reactPackagePath","reactPackageJson","cwd","import","meta","dirname","process","env","NODE_ENV","join","tsServer","intellisenseFilePath","task","name","sys","fileExists","toBeTruthy","sendOpenRequest","file","error","stop","timeout","resp","sendCompletionsRequest","line","offset","triggerKind","CompletionTriggerKind","Invoked","completions","body","entries","map","e","toContain","typeResp","sendQuickInfoRequest","displayString","toBeDefined","ridsResp","noRidsResp","not","dataResp"],"sources":["intellisense.test.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 { Logger } from \"@osdk/api\";\nimport type { TsServer } from \"@osdk/client/internal-node\";\nimport { startTsServer } from \"@osdk/client/internal-node\";\nimport { findUpSync } from \"find-up\";\nimport * as path from \"node:path\";\nimport invariant from \"tiny-invariant\";\nimport * as ts from \"typescript\";\nimport {\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\n\n// it needs to be hoisted because its referenced from our mocked WebSocket\n// which must be hoisted to work\nconst rootLogger = await vi.hoisted(async (): Promise<Logger> => {\n const pino = (await import(\"pino\")).pino;\n const pinoPretty = await import(\"pino-pretty\");\n const { EventEmitter } = await import(\"node:events\");\n class PinoConsoleLogDestination extends EventEmitter {\n write(a: string) {\n // remove trailing newline since console.log adds one\n if (a.at(-1) === \"\\n\") a = a.slice(0, -1);\n\n // This lets the test framework aggregate the logs per test, whereas direct to stdout does not\n console.log(a);\n }\n }\n return Promise.resolve(pino(\n { level: \"info\" },\n (pinoPretty.build)({\n sync: true,\n timestampKey: undefined,\n errorLikeObjectKeys: [\"error\", \"err\", \"exception\"],\n errorProps: \"stack,cause,properties\",\n ignore: \"time,hostname,pid\",\n destination: new PinoConsoleLogDestination(),\n }),\n ));\n});\n\n/**\n * @vitest-environment node\n * @vitest-pool forks\n */\ndescribe(\"intellisense\", () => {\n let packagesDir: string;\n let reactPackagePath: string;\n\n beforeAll(() => {\n const reactPackageJson = findUpSync(\"package.json\", {\n cwd: import.meta.dirname,\n });\n console.log({ reactPackageJson });\n invariant(reactPackageJson != null);\n packagesDir = path.join(\n path.dirname(reactPackageJson),\n \"..\",\n );\n\n reactPackagePath = path.join(packagesDir, \"react\");\n });\n\n let tsServer: TsServer | undefined;\n let intellisenseFilePath: string;\n\n beforeEach(async (a) => {\n intellisenseFilePath = path.join(\n reactPackagePath,\n \"src\",\n \"intellisense.test.helpers\",\n `${a.task.name}.ts`,\n );\n\n console.log(intellisenseFilePath);\n\n expect(ts.sys.fileExists(intellisenseFilePath)).toBeTruthy();\n\n try {\n tsServer = await startTsServer(rootLogger);\n await tsServer.sendOpenRequest({ file: intellisenseFilePath });\n } catch (error) {\n if (tsServer) {\n try {\n tsServer.stop();\n } catch {\n // Ignore cleanup errors\n }\n tsServer = undefined;\n }\n throw error;\n }\n });\n\n afterEach(() => {\n if (tsServer) {\n tsServer.stop();\n tsServer = undefined;\n }\n });\n\n it(\"useOsdkObjectsWithPivot\", { timeout: 40_000 }, async () => {\n expect(ts.sys.fileExists(intellisenseFilePath)).toBeTruthy();\n invariant(tsServer);\n\n const { resp } = await tsServer.sendCompletionsRequest({\n file: intellisenseFilePath,\n line: 29,\n offset: 15,\n triggerKind: ts.CompletionTriggerKind.Invoked,\n });\n\n const completions = resp.body?.entries.map(e => e.name) ?? [];\n expect(completions).toContain(\"lead\");\n\n const { resp: typeResp } = await tsServer.sendQuickInfoRequest({\n file: intellisenseFilePath,\n line: 33,\n offset: 10,\n });\n\n expect(typeResp.body?.displayString).toBeDefined();\n expect(typeResp.body?.displayString).toContain(\"Employee\");\n });\n\n it(\"useOsdkObjectsWithRids\", { timeout: 40_000 }, async () => {\n expect(ts.sys.fileExists(intellisenseFilePath)).toBeTruthy();\n invariant(tsServer);\n\n const { resp: ridsResp } = await tsServer.sendQuickInfoRequest({\n file: intellisenseFilePath,\n line: 30,\n offset: 9,\n });\n\n expect(ridsResp.body?.displayString).toBeDefined();\n expect(ridsResp.body?.displayString).toContain(\"$rid\");\n\n const { resp: noRidsResp } = await tsServer.sendQuickInfoRequest({\n file: intellisenseFilePath,\n line: 34,\n offset: 9,\n });\n\n expect(noRidsResp.body?.displayString).toBeDefined();\n expect(noRidsResp.body?.displayString).not.toContain(\"$rid\");\n });\n\n it(\"useOsdkObjectsWithProperties\", { timeout: 40_000 }, async () => {\n expect(ts.sys.fileExists(intellisenseFilePath)).toBeTruthy();\n invariant(tsServer);\n\n const { resp } = await tsServer.sendQuickInfoRequest({\n file: intellisenseFilePath,\n line: 27,\n offset: 10,\n });\n\n expect(resp.body?.displayString).toContain(\"DerivedProperty.Clause\");\n\n const { resp: dataResp } = await tsServer.sendQuickInfoRequest({\n file: intellisenseFilePath,\n line: 31,\n offset: 11,\n });\n\n expect(dataResp.body?.displayString).toBeDefined();\n expect(dataResp.body?.displayString).toContain(\"Osdk.Instance<Employee\");\n });\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,12 +41,13 @@ 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
|
-
const
|
|
46
|
+
const previousCompletedPayloadRef = React.useRef();
|
|
46
47
|
const objectTypeChanged = previousObjectTypeRef.current !== objectTypeKey;
|
|
47
48
|
if (objectTypeChanged) {
|
|
48
49
|
previousObjectTypeRef.current = objectTypeKey;
|
|
50
|
+
previousCompletedPayloadRef.current = undefined;
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
// Compute a stable cache key for the ObjectSet and options
|
|
@@ -69,7 +71,7 @@ export function useObjectSet(baseObjectSet, options = {}) {
|
|
|
69
71
|
unsubscribe: () => {}
|
|
70
72
|
}), process.env.NODE_ENV !== "production" ? `objectSet ${stableKey} [DISABLED]` : void 0);
|
|
71
73
|
}
|
|
72
|
-
const initialValue = objectTypeChanged ? undefined :
|
|
74
|
+
const initialValue = objectTypeChanged ? undefined : previousCompletedPayloadRef.current;
|
|
73
75
|
return makeExternalStore(observer => {
|
|
74
76
|
const subscription = observableClient.observeObjectSet(baseObjectSet, {
|
|
75
77
|
where: otherOptions.where,
|
|
@@ -88,18 +90,38 @@ export function useObjectSet(baseObjectSet, options = {}) {
|
|
|
88
90
|
}, process.env.NODE_ENV !== "production" ? `objectSet ${stableKey}` : void 0, initialValue);
|
|
89
91
|
}, [enabled, observableClient, stableKey, streamUpdates, objectTypeChanged]);
|
|
90
92
|
const payload = React.useSyncExternalStore(subscribe, getSnapShot);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
93
|
+
if (payload && isPayloadCompleted(payload)) {
|
|
94
|
+
previousCompletedPayloadRef.current = payload;
|
|
95
|
+
}
|
|
96
|
+
return React.useMemo(() => {
|
|
97
|
+
const lastLoaded = isPayloadCompleted(payload) ? payload : previousCompletedPayloadRef.current;
|
|
98
|
+
return {
|
|
99
|
+
data: lastLoaded?.resolvedList,
|
|
100
|
+
isLoading: !isPayloadCompleted(payload),
|
|
101
|
+
error: lastLoaded && "error" in lastLoaded ? lastLoaded.error : undefined,
|
|
102
|
+
fetchMore: payload?.hasMore ? payload.fetchMore : undefined,
|
|
103
|
+
objectSet: payload?.objectSet || baseObjectSet,
|
|
104
|
+
totalCount: lastLoaded?.totalCount
|
|
105
|
+
};
|
|
106
|
+
}, [payload, baseObjectSet]);
|
|
107
|
+
}
|
|
108
|
+
function isPayloadCompleted(payload) {
|
|
109
|
+
if (payload != null && "error" in payload) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
if (payload?.status == null) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
switch (payload.status) {
|
|
116
|
+
case "loaded":
|
|
117
|
+
case "error":
|
|
118
|
+
return true;
|
|
119
|
+
case "loading":
|
|
120
|
+
case "init":
|
|
121
|
+
return false;
|
|
122
|
+
default:
|
|
123
|
+
payload.status;
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
104
126
|
}
|
|
105
127
|
//# sourceMappingURL=useObjectSet.js.map
|
|
@@ -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","previousPayloadRef","objectTypeChanged","current","stableKey","where","withProperties","union","intersect","subtract","pivotTo","pageSize","orderBy","subscribe","getSnapShot","useMemo","unsubscribe","process","env","NODE_ENV","initialValue","undefined","observer","subscription","observeObjectSet","dedupeInterval","dedupeIntervalMs","autoFetchMore","payload","useSyncExternalStore","useEffect","data","resolvedList","isLoading","status","error","fetchMore","hasMore","objectSet","totalCount"],"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 ObjectSet,\n ObjectTypeDefinition,\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 ObjectTypeDefinition,\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 ObjectTypeDefinition,\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 ObjectTypeDefinition,\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 previousPayloadRef = React.useRef<\n Snapshot<ObserveObjectSetArgs<Q, RDPs>> | undefined\n >();\n\n const objectTypeChanged = previousObjectTypeRef.current !== objectTypeKey;\n if (objectTypeChanged) {\n previousObjectTypeRef.current = objectTypeKey;\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 : previousPayloadRef.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 React.useEffect(() => {\n if (payload) {\n previousPayloadRef.current = payload;\n }\n }, [payload]);\n\n return React.useMemo(() => ({\n data: payload?.resolvedList as Osdk.Instance<\n Q,\n \"$allBaseProperties\",\n PropertyKeys<Q>,\n RDPs\n >[],\n isLoading: payload?.status === \"loading\" || (!payload && true) || false,\n error: payload && \"error\" in payload\n ? payload.error\n : undefined,\n fetchMore: payload?.hasMore ? payload.fetchMore : undefined,\n objectSet: payload?.objectSet as ObjectSet<Q, RDPs> || baseObjectSet,\n totalCount: payload?.totalCount,\n }), [payload, baseObjectSet]);\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","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\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 });\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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAaA,SACEA,wBAAwB,QAEnB,kCAAkC;AACzC,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,iBAAiB,QAAuB,wBAAwB;AACzE,SAASC,YAAY,QAAQ,mBAAmB;AAwIhD,MAAMC,uBAAuB,GAAG,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAK1BC,aAAqC,EACrCC,OAAqC,GAAG,CAAC,CAAC,EACb;EAC7B,MAAM;IAAEC;EAAiB,CAAC,GAAGP,KAAK,CAACQ,UAAU,CAACN,YAAY,CAAC;EAE3D,MAAM;IAAEO,OAAO,GAAG,IAAI;IAAEC,aAAa;IAAE,GAAGC;EAAa,CAAC,GAAGL,OAAO;;EAElE;EACA,MAAMM,aAAa,GAAGH,OAAO,GACzBJ,aAAa,CAACQ,mBAAmB,CAACC,GAAG,CAACC,OAAO,GAC7CZ,uBAAuB;EAE3B,MAAMa,qBAAqB,GAAGhB,KAAK,CAACiB,MAAM,CAASL,aAAa,CAAC;EACjE,MAAMM,2BAA2B,GAAGlB,KAAK,CAACiB,MAAM,CAE9C,CAAC;EAEH,MAAME,iBAAiB,GAAGH,qBAAqB,CAACI,OAAO,KAAKR,aAAa;EACzE,IAAIO,iBAAiB,EAAE;IACrBH,qBAAqB,CAACI,OAAO,GAAGR,aAAa;IAC7CM,2BAA2B,CAACE,OAAO,GAAGC,SAAS;EACjD;;EAEA;EACA;EACA,MAAMC,SAAS,GAAGvB,wBAAwB,CAACM,aAAa,EAAE;IACxDkB,KAAK,EAAEZ,YAAY,CAACY,KAAK;IACzBC,cAAc,EAAEb,YAAY,CAACa,cAAc;IAC3CC,KAAK,EAAEd,YAAY,CAACc,KAAK;IACzBC,SAAS,EAAEf,YAAY,CAACe,SAAS;IACjCC,QAAQ,EAAEhB,YAAY,CAACgB,QAAQ;IAC/BC,OAAO,EAAEjB,YAAY,CAACiB,OAAO;IAC7BC,QAAQ,EAAElB,YAAY,CAACkB,QAAQ;IAC/BC,OAAO,EAAEnB,YAAY,CAACmB;EACxB,CAAC,CAAC;EAEF,MAAM;IAAEC,SAAS;IAAEC;EAAY,CAAC,GAAGhC,KAAK,CAACiC,OAAO,CAC9C,MAAM;IACJ,IAAI,CAACxB,OAAO,EAAE;MACZ,OAAOR,iBAAiB,CACtB,OAAO;QAAEiC,WAAW,EAAEA,CAAA,KAAM,CAAC;MAAE,CAAC,CAAC,EACjCC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GACjC,aAAaf,SAAS,aAAa,GACnC,KAAK,CACX,CAAC;IACH;IAEA,MAAMgB,YAAY,GAAGnB,iBAAiB,GAClCE,SAAS,GACTH,2BAA2B,CAACE,OAAO;IAEvC,OAAOnB,iBAAiB,CACrBsC,QAAQ,IAAK;MACZ,MAAMC,YAAY,GAAGjC,gBAAgB,CAACkC,gBAAgB,CACpDpC,aAAa,EACb;QACEkB,KAAK,EAAEZ,YAAY,CAACY,KAAK;QACzBC,cAAc,EAAEb,YAAY,CAACa,cAAc;QAC3CC,KAAK,EAAEd,YAAY,CAACc,KAAK;QACzBC,SAAS,EAAEf,YAAY,CAACe,SAAS;QACjCC,QAAQ,EAAEhB,YAAY,CAACgB,QAAQ;QAC/BC,OAAO,EAAEjB,YAAY,CAACiB,OAAO;QAC7BC,QAAQ,EAAElB,YAAY,CAACkB,QAAQ;QAC/BC,OAAO,EAAEnB,YAAY,CAACmB,OAAO;QAC7BY,cAAc,EAAE/B,YAAY,CAACgC,gBAAgB,IAAI,KAAK;QACtDC,aAAa,EAAEjC,YAAY,CAACiC,aAAa;QACzClC;MACF,CAAC,EACD6B,QACF,CAAC;MACD,OAAOC,YAAY;IACrB,CAAC,EACDL,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GACjC,aAAaf,SAAS,EAAE,GACxB,KAAK,CAAC,EACVgB,YACF,CAAC;EACH,CAAC,EACD,CAAC7B,OAAO,EAAEF,gBAAgB,EAAEe,SAAS,EAAEZ,aAAa,EAAES,iBAAiB,CACzE,CAAC;EAED,MAAM0B,OAAO,GAAG7C,KAAK,CAAC8C,oBAAoB,CAACf,SAAS,EAAEC,WAAW,CAAC;EAClE,IAAIa,OAAO,IAAIE,kBAAkB,CAACF,OAAO,CAAC,EAAE;IAC1C3B,2BAA2B,CAACE,OAAO,GAAGyB,OAAO;EAC/C;EAEA,OAAO7C,KAAK,CAACiC,OAAO,CAAC,MAAM;IACzB,MAAMe,UAAU,GAAGD,kBAAkB,CAACF,OAAO,CAAC,GAC1CA,OAAO,GACP3B,2BAA2B,CAACE,OAAO;IACvC,OAAO;MACL6B,IAAI,EAAED,UAAU,EAAEE,YAKf;MACHC,SAAS,EAAE,CAACJ,kBAAkB,CAACF,OAAO,CAAC;MACvCO,KAAK,EAAEJ,UAAU,IAAI,OAAO,IAAIA,UAAU,GAAGA,UAAU,CAACI,KAAK,GAAG/B,SAAS;MACzEgC,SAAS,EAAER,OAAO,EAAES,OAAO,GAAGT,OAAO,CAACQ,SAAS,GAAGhC,SAAS;MAC3DkC,SAAS,EAAEV,OAAO,EAAEU,SAAS,IAA0BlD,aAAa;MACpEmD,UAAU,EAAER,UAAU,EAAEQ;IAC1B,CAAC;EACH,CAAC,EAAE,CAACX,OAAO,EAAExC,aAAa,CAAC,CAAC;AAC9B;AAEA,SAAS0C,kBAAkBA,CAIzBF,OAAgD,EACvC;EACT,IAAIA,OAAO,IAAI,IAAI,IAAI,OAAO,IAAIA,OAAO,EAAE;IACzC,OAAO,IAAI;EACb;EAEA,IAAIA,OAAO,EAAEY,MAAM,IAAI,IAAI,EAAE;IAC3B,OAAO,KAAK;EACd;EAEA,QAAQZ,OAAO,CAACY,MAAM;IACpB,KAAK,QAAQ;IACb,KAAK,OAAO;MACV,OAAO,IAAI;IACb,KAAK,SAAS;IACd,KAAK,MAAM;MACT,OAAO,KAAK;IACd;MACEZ,OAAO,CAACY,MAAM;MACd,OAAO,KAAK;EAChB;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOsdkObjects.js","names":["React","makeExternalStore","OsdkContext2","EMPTY_WHERE","useOsdkObjects","type","options","observableClient","useContext","pageSize","dedupeIntervalMs","withProperties","enabled","rids","where","orderBy","streamUpdates","autoFetchMore","intersectWith","pivotTo","canonWhere","canonicalizeWhereClause","stableCanonWhere","useMemo","JSON","stringify","stableRids","stableWithProperties","stableIntersectWith","stableOrderBy","subscribe","getSnapShot","unsubscribe","process","env","NODE_ENV","apiName","observer","observeList","dedupeInterval","length","listPayload","useSyncExternalStore","error","status","Error","fetchMore","hasMore","undefined","data","resolvedList","isLoading","isOptimistic","totalCount"],"sources":["useOsdkObjects.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 DerivedProperty,\n LinkedType,\n LinkNames,\n ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type { ObserveObjectsCallbackArgs } from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseOsdkObjectsOptions<\n T extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> {\n /**\n * Fetch objects by their RIDs (Resource Identifiers).\n * When provided, starts with a static objectset containing these RIDs.\n * Can be combined with `where` to filter the RID set, and with `orderBy` to sort results.\n *\n * @example\n * // Fetch specific objects by RID\n * useOsdkObjects(Employee, { rids: ['ri.foo.123', 'ri.foo.456'] })\n *\n * @example\n * // Fetch specific objects by RID, filtered by status\n * useOsdkObjects(Employee, {\n * rids: ['ri.foo.123', 'ri.foo.456', 'ri.foo.789'],\n * where: { status: 'active' }\n * })\n */\n rids?: readonly string[];\n\n /**\n * Standard OSDK Where clause with RDP support.\n * When used with `rids`, filters the RID set.\n * When used alone, filters all objects of the type.\n */\n where?: WhereClause<T, RDPs>;\n\n /**\n * Sort results by one or more properties.\n */\n orderBy?: {\n [K in PropertyKeys<T>]?: \"asc\" | \"desc\";\n };\n\n /**\n * The preferred page size for the list.\n */\n pageSize?: number;\n\n /**\n * Define derived properties (RDPs) to be computed server-side and attached to each object.\n * These properties will be available on the returned objects alongside their regular properties.\n */\n withProperties?: { [K in keyof RDPs]: DerivedProperty.Creator<T, RDPs[K]> };\n\n /**\n * The number of milliseconds to wait after the last observed list change.\n *\n * Two uses of `useOsdkObjects` 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 * @default true\n */\n enabled?: boolean;\n\n /**\n * Intersect the results with additional object sets.\n * Each element defines a where clause for an object set to intersect with.\n * The final result will only include objects that match ALL conditions.\n */\n intersectWith?: Array<{\n where: WhereClause<T, RDPs>;\n }>;\n\n /**\n * Pivot to related objects through a link.\n * This changes the return type from T to the linked object type.\n */\n pivotTo?: LinkNames<T>;\n\n /**\n * Causes the list to automatically fetch more as soon as the previous page\n * has been loaded. If a number is provided, it will continue to automatically\n * fetch more until the list is at least that long.\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 streamUpdates?: boolean;\n}\n\nexport interface UseOsdkListResult<\n T extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> {\n /**\n * Function to fetch more pages (undefined if no more pages)\n */\n fetchMore: (() => Promise<void>) | undefined;\n\n /**\n * The fetched data with derived properties\n */\n data:\n | Osdk.Instance<T, \"$allBaseProperties\", PropertyKeys<T>, 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 * Refers to whether the ordered list of objects (only considering the $primaryKey)\n * is optimistic or not.\n *\n * If you need to know if the contents of the list are optimistic you can\n * do that on a per object basis with useOsdkObject\n */\n isOptimistic: boolean;\n\n /**\n * The total count of objects matching the query (if available from the API)\n */\n totalCount?: string;\n}\n\nconst EMPTY_WHERE = {};\n\ndeclare const process: {\n env: {\n NODE_ENV: \"development\" | \"production\";\n };\n};\n\nexport function useOsdkObjects<\n Q extends ObjectOrInterfaceDefinition,\n L extends LinkNames<Q>,\n>(\n type: Q,\n options: UseOsdkObjectsOptions<Q> & { pivotTo: L },\n): UseOsdkListResult<LinkedType<Q, L>>;\n\nexport function useOsdkObjects<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n type: Q,\n options?: UseOsdkObjectsOptions<Q, RDPs>,\n): UseOsdkListResult<Q, RDPs>;\n\nexport function useOsdkObjects<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n type: Q,\n options?: UseOsdkObjectsOptions<Q, RDPs>,\n):\n | UseOsdkListResult<Q, RDPs>\n | UseOsdkListResult<LinkedType<Q, LinkNames<Q>>>\n{\n const { observableClient } = React.useContext(OsdkContext2);\n\n const {\n pageSize,\n dedupeIntervalMs,\n withProperties,\n enabled = true,\n rids,\n where,\n orderBy,\n streamUpdates,\n autoFetchMore,\n intersectWith,\n pivotTo,\n } = options ?? {};\n\n const canonWhere = observableClient.canonicalizeWhereClause<\n Q,\n RDPs\n >(where ?? EMPTY_WHERE);\n\n const stableCanonWhere = React.useMemo(\n () => canonWhere,\n [JSON.stringify(canonWhere)],\n );\n\n const stableRids = React.useMemo(\n () => rids,\n [JSON.stringify(rids)],\n );\n\n const stableWithProperties = React.useMemo(\n () => withProperties,\n [JSON.stringify(withProperties)],\n );\n\n const stableIntersectWith = React.useMemo(\n () => intersectWith,\n [JSON.stringify(intersectWith)],\n );\n\n const stableOrderBy = React.useMemo(\n () => orderBy,\n [JSON.stringify(orderBy)],\n );\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (!enabled) {\n return makeExternalStore<\n ObserveObjectsCallbackArgs<Q, RDPs>\n >(\n () => ({ unsubscribe: () => {} }),\n process.env.NODE_ENV !== \"production\"\n ? `list ${type.apiName} [DISABLED]`\n : void 0,\n );\n }\n\n return makeExternalStore<\n ObserveObjectsCallbackArgs<Q, RDPs>\n >(\n (observer) =>\n observableClient.observeList({\n type,\n rids: stableRids,\n where: stableCanonWhere,\n dedupeInterval: dedupeIntervalMs ?? 2_000,\n pageSize,\n orderBy: stableOrderBy,\n streamUpdates,\n withProperties: stableWithProperties,\n autoFetchMore,\n ...(stableIntersectWith\n ? { intersectWith: stableIntersectWith }\n : {}),\n ...(pivotTo ? { pivotTo } : {}),\n }, observer),\n process.env.NODE_ENV !== \"production\"\n ? `list ${type.apiName} ${\n stableRids ? `[${stableRids.length} rids]` : \"\"\n } ${JSON.stringify(stableCanonWhere)}`\n : void 0,\n );\n },\n [\n enabled,\n observableClient,\n type.apiName,\n type.type,\n stableRids,\n stableCanonWhere,\n dedupeIntervalMs,\n pageSize,\n stableOrderBy,\n streamUpdates,\n stableWithProperties,\n autoFetchMore,\n stableIntersectWith,\n pivotTo,\n ],\n );\n\n const listPayload = React.useSyncExternalStore(subscribe, getSnapShot);\n\n return React.useMemo(() => {\n let error: Error | undefined;\n if (listPayload && \"error\" in listPayload && listPayload.error) {\n error = listPayload.error;\n } else if (listPayload?.status === \"error\") {\n error = new Error(\"Failed to load objects\");\n }\n\n return {\n fetchMore: listPayload?.hasMore ? listPayload.fetchMore : undefined,\n error,\n data: listPayload?.resolvedList,\n isLoading: enabled\n ? (listPayload?.status === \"loading\" || listPayload?.status === \"init\"\n || !listPayload)\n : false,\n isOptimistic: listPayload?.isOptimistic ?? false,\n totalCount: listPayload?.totalCount,\n };\n }, [listPayload, enabled]);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useOsdkObjects.js","names":["React","makeExternalStore","OsdkContext2","EMPTY_WHERE","useOsdkObjects","type","options","observableClient","useContext","pageSize","dedupeIntervalMs","withProperties","enabled","rids","where","orderBy","streamUpdates","autoFetchMore","intersectWith","pivotTo","canonWhere","canonicalizeWhereClause","stableCanonWhere","useMemo","JSON","stringify","stableRids","stableWithProperties","stableIntersectWith","stableOrderBy","subscribe","getSnapShot","unsubscribe","process","env","NODE_ENV","apiName","observer","observeList","dedupeInterval","length","listPayload","useSyncExternalStore","error","status","Error","fetchMore","hasMore","undefined","data","resolvedList","isLoading","isOptimistic","totalCount"],"sources":["useOsdkObjects.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 DerivedProperty,\n LinkedType,\n LinkNames,\n ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type { ObserveObjectsCallbackArgs } from \"@osdk/client/unstable-do-not-use\";\nimport React from \"react\";\nimport { makeExternalStore } from \"./makeExternalStore.js\";\nimport { OsdkContext2 } from \"./OsdkContext2.js\";\n\nexport interface UseOsdkObjectsOptions<\n T extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> {\n /**\n * Fetch objects by their RIDs (Resource Identifiers).\n * When provided, starts with a static objectset containing these RIDs.\n * Can be combined with `where` to filter the RID set, and with `orderBy` to sort results.\n *\n * @example\n * // Fetch specific objects by RID\n * useOsdkObjects(Employee, { rids: ['ri.foo.123', 'ri.foo.456'] })\n *\n * @example\n * // Fetch specific objects by RID, filtered by status\n * useOsdkObjects(Employee, {\n * rids: ['ri.foo.123', 'ri.foo.456', 'ri.foo.789'],\n * where: { status: 'active' }\n * })\n */\n rids?: readonly string[];\n\n /**\n * Standard OSDK Where clause with RDP support.\n * When used with `rids`, filters the RID set.\n * When used alone, filters all objects of the type.\n */\n where?: WhereClause<T, RDPs>;\n\n /**\n * Sort results by one or more properties.\n */\n orderBy?: {\n [K in PropertyKeys<T>]?: \"asc\" | \"desc\";\n };\n\n /**\n * The preferred page size for the list.\n */\n pageSize?: number;\n\n /**\n * Define derived properties (RDPs) to be computed server-side and attached to each object.\n * These properties will be available on the returned objects alongside their regular properties.\n */\n withProperties?: { [K in keyof RDPs]: DerivedProperty.Creator<T, RDPs[K]> };\n\n /**\n * The number of milliseconds to wait after the last observed list change.\n *\n * Two uses of `useOsdkObjects` 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 * @default true\n */\n enabled?: boolean;\n\n /**\n * Intersect the results with additional object sets.\n * Each element defines a where clause for an object set to intersect with.\n * The final result will only include objects that match ALL conditions.\n */\n intersectWith?: Array<{\n where: WhereClause<T, RDPs>;\n }>;\n\n /**\n * Pivot to related objects through a link.\n * This changes the return type from T to the linked object type.\n */\n pivotTo?: LinkNames<T>;\n\n /**\n * Causes the list to automatically fetch more as soon as the previous page\n * has been loaded. If a number is provided, it will continue to automatically\n * fetch more until the list is at least that long.\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 streamUpdates?: boolean;\n}\n\nexport interface UseOsdkListResult<\n T extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n EXTRA_OPTIONS extends never | \"$rid\" = never,\n> {\n /**\n * Function to fetch more pages (undefined if no more pages)\n */\n fetchMore: (() => Promise<void>) | undefined;\n\n /**\n * The fetched data with derived properties\n */\n data:\n | Osdk.Instance<\n T,\n \"$allBaseProperties\" | EXTRA_OPTIONS,\n PropertyKeys<T>,\n RDPs\n >[]\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 * Refers to whether the ordered list of objects (only considering the $primaryKey)\n * is optimistic or not.\n *\n * If you need to know if the contents of the list are optimistic you can\n * do that on a per object basis with useOsdkObject\n */\n isOptimistic: boolean;\n\n /**\n * The total count of objects matching the query (if available from the API)\n */\n totalCount?: string;\n}\n\nconst EMPTY_WHERE = {};\n\ndeclare const process: {\n env: {\n NODE_ENV: \"development\" | \"production\";\n };\n};\n\nexport function useOsdkObjects<\n Q extends ObjectOrInterfaceDefinition,\n L extends LinkNames<Q>,\n>(\n type: Q,\n options: UseOsdkObjectsOptions<Q> & { pivotTo: L; rids: readonly string[] },\n): UseOsdkListResult<LinkedType<Q, L>, {}, \"$rid\">;\n\nexport function useOsdkObjects<\n Q extends ObjectOrInterfaceDefinition,\n L extends LinkNames<Q>,\n>(\n type: Q,\n options: UseOsdkObjectsOptions<Q> & { pivotTo: L },\n): UseOsdkListResult<LinkedType<Q, L>>;\n\nexport function useOsdkObjects<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n type: Q,\n options: UseOsdkObjectsOptions<Q, RDPs> & { rids: readonly string[] },\n): UseOsdkListResult<Q, RDPs, \"$rid\">;\n\nexport function useOsdkObjects<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n type: Q,\n options?: UseOsdkObjectsOptions<Q, RDPs>,\n): UseOsdkListResult<Q, RDPs>;\n\nexport function useOsdkObjects<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n>(\n type: Q,\n options?: UseOsdkObjectsOptions<Q, RDPs>,\n):\n | UseOsdkListResult<Q, RDPs>\n | UseOsdkListResult<Q, RDPs, \"$rid\">\n | UseOsdkListResult<LinkedType<Q, LinkNames<Q>>>\n | UseOsdkListResult<LinkedType<Q, LinkNames<Q>>, {}, \"$rid\">\n{\n const { observableClient } = React.useContext(OsdkContext2);\n\n const {\n pageSize,\n dedupeIntervalMs,\n withProperties,\n enabled = true,\n rids,\n where,\n orderBy,\n streamUpdates,\n autoFetchMore,\n intersectWith,\n pivotTo,\n } = options ?? {};\n\n const canonWhere = observableClient.canonicalizeWhereClause<\n Q,\n RDPs\n >(where ?? EMPTY_WHERE);\n\n const stableCanonWhere = React.useMemo(\n () => canonWhere,\n [JSON.stringify(canonWhere)],\n );\n\n const stableRids = React.useMemo(\n () => rids,\n [JSON.stringify(rids)],\n );\n\n const stableWithProperties = React.useMemo(\n () => withProperties,\n [JSON.stringify(withProperties)],\n );\n\n const stableIntersectWith = React.useMemo(\n () => intersectWith,\n [JSON.stringify(intersectWith)],\n );\n\n const stableOrderBy = React.useMemo(\n () => orderBy,\n [JSON.stringify(orderBy)],\n );\n\n const { subscribe, getSnapShot } = React.useMemo(\n () => {\n if (!enabled) {\n return makeExternalStore<\n ObserveObjectsCallbackArgs<Q, RDPs>\n >(\n () => ({ unsubscribe: () => {} }),\n process.env.NODE_ENV !== \"production\"\n ? `list ${type.apiName} [DISABLED]`\n : void 0,\n );\n }\n\n return makeExternalStore<\n ObserveObjectsCallbackArgs<Q, RDPs>\n >(\n (observer) =>\n observableClient.observeList({\n type,\n rids: stableRids,\n where: stableCanonWhere,\n dedupeInterval: dedupeIntervalMs ?? 2_000,\n pageSize,\n orderBy: stableOrderBy,\n streamUpdates,\n withProperties: stableWithProperties,\n autoFetchMore,\n ...(stableIntersectWith\n ? { intersectWith: stableIntersectWith }\n : {}),\n ...(pivotTo ? { pivotTo } : {}),\n }, observer),\n process.env.NODE_ENV !== \"production\"\n ? `list ${type.apiName} ${\n stableRids ? `[${stableRids.length} rids]` : \"\"\n } ${JSON.stringify(stableCanonWhere)}`\n : void 0,\n );\n },\n [\n enabled,\n observableClient,\n type.apiName,\n type.type,\n stableRids,\n stableCanonWhere,\n dedupeIntervalMs,\n pageSize,\n stableOrderBy,\n streamUpdates,\n stableWithProperties,\n autoFetchMore,\n stableIntersectWith,\n pivotTo,\n ],\n );\n\n const listPayload = React.useSyncExternalStore(subscribe, getSnapShot);\n\n return React.useMemo(() => {\n let error: Error | undefined;\n if (listPayload && \"error\" in listPayload && listPayload.error) {\n error = listPayload.error;\n } else if (listPayload?.status === \"error\") {\n error = new Error(\"Failed to load objects\");\n }\n\n return {\n fetchMore: listPayload?.hasMore ? listPayload.fetchMore : undefined,\n error,\n data: listPayload?.resolvedList,\n isLoading: enabled\n ? (listPayload?.status === \"loading\" || listPayload?.status === \"init\"\n || !listPayload)\n : false,\n isOptimistic: listPayload?.isOptimistic ?? false,\n totalCount: listPayload?.totalCount,\n };\n }, [listPayload, enabled]);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -305,6 +305,7 @@ function useLinks(objects, linkName, options = {}) {
|
|
|
305
305
|
hasMore: payload?.hasMore ?? false
|
|
306
306
|
}), [payload, enabled]);
|
|
307
307
|
}
|
|
308
|
+
var OBJECT_TYPE_PLACEHOLDER = "$__OBJECT__TYPE__PLACEHOLDER";
|
|
308
309
|
function useObjectSet(baseObjectSet, options = {}) {
|
|
309
310
|
const {
|
|
310
311
|
observableClient
|
|
@@ -314,12 +315,13 @@ function useObjectSet(baseObjectSet, options = {}) {
|
|
|
314
315
|
streamUpdates,
|
|
315
316
|
...otherOptions
|
|
316
317
|
} = options;
|
|
317
|
-
const objectTypeKey = baseObjectSet.$objectSetInternals.def.apiName;
|
|
318
|
+
const objectTypeKey = enabled ? baseObjectSet.$objectSetInternals.def.apiName : OBJECT_TYPE_PLACEHOLDER;
|
|
318
319
|
const previousObjectTypeRef = React9__default.default.useRef(objectTypeKey);
|
|
319
|
-
const
|
|
320
|
+
const previousCompletedPayloadRef = React9__default.default.useRef();
|
|
320
321
|
const objectTypeChanged = previousObjectTypeRef.current !== objectTypeKey;
|
|
321
322
|
if (objectTypeChanged) {
|
|
322
323
|
previousObjectTypeRef.current = objectTypeKey;
|
|
324
|
+
previousCompletedPayloadRef.current = void 0;
|
|
323
325
|
}
|
|
324
326
|
const stableKey = unstableDoNotUse.computeObjectSetCacheKey(baseObjectSet, {
|
|
325
327
|
where: otherOptions.where,
|
|
@@ -341,7 +343,7 @@ function useObjectSet(baseObjectSet, options = {}) {
|
|
|
341
343
|
}
|
|
342
344
|
}), process.env.NODE_ENV !== "production" ? `objectSet ${stableKey} [DISABLED]` : void 0);
|
|
343
345
|
}
|
|
344
|
-
const initialValue = objectTypeChanged ? void 0 :
|
|
346
|
+
const initialValue = objectTypeChanged ? void 0 : previousCompletedPayloadRef.current;
|
|
345
347
|
return makeExternalStore((observer) => {
|
|
346
348
|
const subscription = observableClient.observeObjectSet(baseObjectSet, {
|
|
347
349
|
where: otherOptions.where,
|
|
@@ -360,19 +362,39 @@ function useObjectSet(baseObjectSet, options = {}) {
|
|
|
360
362
|
}, process.env.NODE_ENV !== "production" ? `objectSet ${stableKey}` : void 0, initialValue);
|
|
361
363
|
}, [enabled, observableClient, stableKey, streamUpdates, objectTypeChanged]);
|
|
362
364
|
const payload = React9__default.default.useSyncExternalStore(subscribe, getSnapShot);
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
365
|
+
if (payload && isPayloadCompleted(payload)) {
|
|
366
|
+
previousCompletedPayloadRef.current = payload;
|
|
367
|
+
}
|
|
368
|
+
return React9__default.default.useMemo(() => {
|
|
369
|
+
const lastLoaded = isPayloadCompleted(payload) ? payload : previousCompletedPayloadRef.current;
|
|
370
|
+
return {
|
|
371
|
+
data: lastLoaded?.resolvedList,
|
|
372
|
+
isLoading: !isPayloadCompleted(payload),
|
|
373
|
+
error: lastLoaded && "error" in lastLoaded ? lastLoaded.error : void 0,
|
|
374
|
+
fetchMore: payload?.hasMore ? payload.fetchMore : void 0,
|
|
375
|
+
objectSet: payload?.objectSet || baseObjectSet,
|
|
376
|
+
totalCount: lastLoaded?.totalCount
|
|
377
|
+
};
|
|
378
|
+
}, [payload, baseObjectSet]);
|
|
379
|
+
}
|
|
380
|
+
function isPayloadCompleted(payload) {
|
|
381
|
+
if (payload != null && "error" in payload) {
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
if (payload?.status == null) {
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
switch (payload.status) {
|
|
388
|
+
case "loaded":
|
|
389
|
+
case "error":
|
|
390
|
+
return true;
|
|
391
|
+
case "loading":
|
|
392
|
+
case "init":
|
|
393
|
+
return false;
|
|
394
|
+
default:
|
|
395
|
+
payload.status;
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
376
398
|
}
|
|
377
399
|
function useOsdkAction(actionDef) {
|
|
378
400
|
const {
|