@osdk/widget.client-react 3.3.0-beta.1 → 3.3.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/build/browser/ErrorBoundary.js +63 -0
  3. package/build/browser/ErrorBoundary.js.map +1 -0
  4. package/build/browser/client.js +11 -6
  5. package/build/browser/client.js.map +1 -1
  6. package/build/browser/context.js.map +1 -1
  7. package/build/browser/utils/extendParametersWithObjectSets.js +62 -0
  8. package/build/browser/utils/extendParametersWithObjectSets.js.map +1 -0
  9. package/build/browser/utils/extendParametersWithObjectSets.test.js +372 -0
  10. package/build/browser/utils/extendParametersWithObjectSets.test.js.map +1 -0
  11. package/build/browser/utils/initializeParameters.js.map +1 -1
  12. package/build/cjs/index.cjs +111 -11
  13. package/build/cjs/index.cjs.map +1 -1
  14. package/build/cjs/index.d.cts +52 -21
  15. package/build/esm/ErrorBoundary.js +63 -0
  16. package/build/esm/ErrorBoundary.js.map +1 -0
  17. package/build/esm/client.js +11 -6
  18. package/build/esm/client.js.map +1 -1
  19. package/build/esm/context.js.map +1 -1
  20. package/build/esm/utils/extendParametersWithObjectSets.js +62 -0
  21. package/build/esm/utils/extendParametersWithObjectSets.js.map +1 -0
  22. package/build/esm/utils/extendParametersWithObjectSets.test.js +372 -0
  23. package/build/esm/utils/extendParametersWithObjectSets.test.js.map +1 -0
  24. package/build/esm/utils/initializeParameters.js.map +1 -1
  25. package/build/types/ErrorBoundary.d.ts +13 -0
  26. package/build/types/ErrorBoundary.d.ts.map +1 -0
  27. package/build/types/client.d.ts +21 -7
  28. package/build/types/client.d.ts.map +1 -1
  29. package/build/types/context.d.ts +18 -2
  30. package/build/types/context.d.ts.map +1 -1
  31. package/build/types/utils/extendParametersWithObjectSets.d.ts +13 -0
  32. package/build/types/utils/extendParametersWithObjectSets.d.ts.map +1 -0
  33. package/build/types/utils/extendParametersWithObjectSets.test.d.ts +1 -0
  34. package/build/types/utils/extendParametersWithObjectSets.test.d.ts.map +1 -0
  35. package/build/types/utils/initializeParameters.d.ts +3 -2
  36. package/build/types/utils/initializeParameters.d.ts.map +1 -1
  37. package/package.json +6 -5
@@ -0,0 +1,372 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { hydrateObjectSetFromRid } from "@osdk/client/internal";
18
+ import { defineConfig } from "@osdk/widget.client";
19
+ import { beforeEach, describe, expect, it, vi } from "vitest";
20
+ import { extendParametersWithObjectSets } from "./extendParametersWithObjectSets.js";
21
+ vi.mock("@osdk/client/internal", () => ({
22
+ hydrateObjectSetFromRid: vi.fn()
23
+ }));
24
+ describe("extendParametersWithObjectSets", () => {
25
+ const client = vi.fn();
26
+ const cache = new Map();
27
+
28
+ // Test helpers
29
+ const createMockObjectType = (rid = "ri.object-type.123") => ({
30
+ apiName: "MyObjectType",
31
+ type: "object",
32
+ internalDoNotUseMetadata: {
33
+ rid
34
+ }
35
+ });
36
+ const createLoadedValue = value => ({
37
+ type: "loaded",
38
+ value
39
+ });
40
+ const createObjectSetParam = rid => ({
41
+ type: "objectSet",
42
+ value: createLoadedValue({
43
+ objectSetRid: rid
44
+ })
45
+ });
46
+ const createStringParam = value => ({
47
+ type: "string",
48
+ value: createLoadedValue(value)
49
+ });
50
+ const createNumberParam = value => ({
51
+ type: "number",
52
+ value: createLoadedValue(value)
53
+ });
54
+ const createMockObjectSet = (name = "MockObjectSet") => Symbol(name);
55
+ beforeEach(() => {
56
+ vi.clearAllMocks();
57
+ cache.clear();
58
+ });
59
+ it("should hydrate an object set for a valid objectSetRid", () => {
60
+ const config = defineConfig({
61
+ id: "testWidget",
62
+ name: "Test Widget",
63
+ type: "workshop",
64
+ parameters: {
65
+ myObjectSet: {
66
+ displayName: "My Object Set",
67
+ type: "objectSet",
68
+ objectType: createMockObjectType()
69
+ },
70
+ myString: {
71
+ displayName: "My String",
72
+ type: "string"
73
+ }
74
+ },
75
+ events: {}
76
+ });
77
+ const parameters = {
78
+ myString: createStringParam("test string"),
79
+ myObjectSet: createObjectSetParam("ri.object-set.123")
80
+ };
81
+ const mockObjectSet = createMockObjectSet();
82
+ vi.mocked(hydrateObjectSetFromRid).mockReturnValue(mockObjectSet);
83
+ const result = extendParametersWithObjectSets(client, config, parameters, cache);
84
+ expect(result).toEqual({
85
+ myString: parameters.myString,
86
+ myObjectSet: {
87
+ ...parameters.myObjectSet,
88
+ value: {
89
+ ...parameters.myObjectSet.value,
90
+ value: {
91
+ objectSetRid: "ri.object-set.123",
92
+ objectSet: mockObjectSet
93
+ }
94
+ }
95
+ }
96
+ });
97
+ });
98
+ it("should pass-through a config with no object set parameters", () => {
99
+ const config = defineConfig({
100
+ id: "testWidget",
101
+ name: "Test Widget",
102
+ type: "workshop",
103
+ parameters: {
104
+ myNumber: {
105
+ displayName: "My Number",
106
+ type: "number"
107
+ },
108
+ myString: {
109
+ displayName: "My String",
110
+ type: "string"
111
+ }
112
+ },
113
+ events: {}
114
+ });
115
+ const parameters = {
116
+ myString: createStringParam("test string"),
117
+ myNumber: createNumberParam(123)
118
+ };
119
+ const result = extendParametersWithObjectSets(undefined, config, parameters, cache);
120
+ expect(result).toEqual(parameters);
121
+ expect(hydrateObjectSetFromRid).not.toHaveBeenCalled();
122
+ });
123
+ it("should handle multiple object set parameters independently", () => {
124
+ const mockObjectType = createMockObjectType();
125
+ const config = defineConfig({
126
+ id: "testWidget",
127
+ name: "Test Widget",
128
+ type: "workshop",
129
+ parameters: {
130
+ objectsA: {
131
+ displayName: "Object Set A",
132
+ type: "objectSet",
133
+ objectType: mockObjectType
134
+ },
135
+ objectsB: {
136
+ displayName: "Object Set B",
137
+ type: "objectSet",
138
+ objectType: mockObjectType
139
+ }
140
+ },
141
+ events: {}
142
+ });
143
+
144
+ // Setup initial parameters
145
+ const mockObjectSetA = createMockObjectSet("MockObjectSetA");
146
+ const mockObjectSetB = createMockObjectSet("MockObjectSetB");
147
+ vi.mocked(hydrateObjectSetFromRid).mockReturnValueOnce(mockObjectSetA).mockReturnValueOnce(mockObjectSetB);
148
+ let parameters = {
149
+ objectsA: createObjectSetParam("ri.object-set.123"),
150
+ objectsB: createObjectSetParam("ri.object-set.456")
151
+ };
152
+ const result = extendParametersWithObjectSets(client, config, parameters, cache);
153
+
154
+ // Helper to create expected result with hydrated object set
155
+ const expectHydratedParam = (rid, objectSet) => ({
156
+ type: "objectSet",
157
+ value: createLoadedValue({
158
+ objectSetRid: rid,
159
+ objectSet
160
+ })
161
+ });
162
+ expect(result).toEqual({
163
+ objectsA: expectHydratedParam("ri.object-set.123", mockObjectSetA),
164
+ objectsB: expectHydratedParam("ri.object-set.456", mockObjectSetB)
165
+ });
166
+
167
+ // Test parameter update
168
+ const mockObjectSetB2 = createMockObjectSet("MockObjectSetB2");
169
+ vi.mocked(hydrateObjectSetFromRid).mockReturnValueOnce(mockObjectSetB2);
170
+ parameters = {
171
+ ...parameters,
172
+ objectsB: createObjectSetParam("ri.object-set.789")
173
+ };
174
+ const result2 = extendParametersWithObjectSets(client, config, parameters, cache);
175
+ expect(result2).toEqual({
176
+ objectsA: expectHydratedParam("ri.object-set.123", mockObjectSetA),
177
+ objectsB: expectHydratedParam("ri.object-set.789", mockObjectSetB2)
178
+ });
179
+
180
+ // Verify cache updated correctly
181
+ expect(cache.get("objectsB")).toMatchObject({
182
+ objectSetRid: "ri.object-set.789",
183
+ objectSet: mockObjectSetB2
184
+ });
185
+ });
186
+ it("should clear cache and provide no object set when parameter transitions to failed state", () => {
187
+ const config = defineConfig({
188
+ id: "testWidget",
189
+ name: "Test Widget",
190
+ type: "workshop",
191
+ parameters: {
192
+ myObjectSet: {
193
+ displayName: "My Object Set",
194
+ type: "objectSet",
195
+ objectType: createMockObjectType()
196
+ },
197
+ myString: {
198
+ displayName: "My String",
199
+ type: "string"
200
+ }
201
+ },
202
+ events: {}
203
+ });
204
+
205
+ // Initially load an object set successfully
206
+ const mockObjectSet = createMockObjectSet();
207
+ vi.mocked(hydrateObjectSetFromRid).mockReturnValue(mockObjectSet);
208
+ const initialParameters = {
209
+ myString: createStringParam("test string"),
210
+ myObjectSet: createObjectSetParam("ri.object-set.123")
211
+ };
212
+ const initialResult = extendParametersWithObjectSets(client, config, initialParameters, cache);
213
+
214
+ // Verify initial state - object set is loaded and cached
215
+ expect(initialResult.myObjectSet.value.value).toMatchObject({
216
+ objectSetRid: "ri.object-set.123",
217
+ objectSet: mockObjectSet
218
+ });
219
+ expect(cache.get("myObjectSet")).toMatchObject({
220
+ objectSetRid: "ri.object-set.123",
221
+ objectSet: mockObjectSet
222
+ });
223
+
224
+ // Transition to failed state and omit value
225
+ const failedParameters = {
226
+ myString: createStringParam("test string"),
227
+ myObjectSet: {
228
+ type: "objectSet",
229
+ value: {
230
+ type: "failed",
231
+ error: new Error("Failed to load object set"),
232
+ value: undefined
233
+ }
234
+ }
235
+ };
236
+ const failedResult = extendParametersWithObjectSets(client, config, failedParameters, cache);
237
+
238
+ // Verify failed state - no object set in result and cache is cleared
239
+ expect(failedResult).toEqual(failedParameters);
240
+ expect(cache.has("myObjectSet")).toBe(false);
241
+
242
+ // Verify hydrateObjectSetFromRid was not called again for the failed state
243
+ expect(hydrateObjectSetFromRid).toHaveBeenCalledTimes(1);
244
+ });
245
+ it("should throw an error when osdkClient is undefined but object set parameters used", () => {
246
+ const config = defineConfig({
247
+ id: "testWidget",
248
+ name: "Test Widget",
249
+ type: "workshop",
250
+ parameters: {
251
+ myObjectSet: {
252
+ displayName: "My Object Set",
253
+ type: "objectSet",
254
+ objectType: createMockObjectType()
255
+ }
256
+ },
257
+ events: {}
258
+ });
259
+ const parameters = {
260
+ myObjectSet: createObjectSetParam("ri.object-set.123")
261
+ };
262
+ expect(() => extendParametersWithObjectSets(undefined, config, parameters, cache)).toThrow("Not provided an OSDK client");
263
+ });
264
+ it("should pass through loading state without hydration", () => {
265
+ const config = defineConfig({
266
+ id: "testWidget",
267
+ name: "Test Widget",
268
+ type: "workshop",
269
+ parameters: {
270
+ myObjectSet: {
271
+ displayName: "My Object Set",
272
+ type: "objectSet",
273
+ objectType: createMockObjectType()
274
+ }
275
+ },
276
+ events: {}
277
+ });
278
+ const parameters = {
279
+ myObjectSet: {
280
+ type: "objectSet",
281
+ value: {
282
+ type: "loading",
283
+ value: undefined
284
+ }
285
+ }
286
+ };
287
+ const result = extendParametersWithObjectSets(client, config, parameters, cache);
288
+ expect(result).toEqual(parameters);
289
+ expect(hydrateObjectSetFromRid).not.toHaveBeenCalled();
290
+ });
291
+ it("should handle transition from loaded to reloading to loaded with new rid", () => {
292
+ const config = defineConfig({
293
+ id: "testWidget",
294
+ name: "Test Widget",
295
+ type: "workshop",
296
+ parameters: {
297
+ myObjectSet: {
298
+ displayName: "My Object Set",
299
+ type: "objectSet",
300
+ objectType: createMockObjectType()
301
+ }
302
+ },
303
+ events: {}
304
+ });
305
+
306
+ // Step 1: Initial loaded state
307
+ const mockObjectSet1 = createMockObjectSet("InitialObjectSet");
308
+ vi.mocked(hydrateObjectSetFromRid).mockReturnValue(mockObjectSet1);
309
+ const initialParameters = {
310
+ myObjectSet: createObjectSetParam("ri.object-set.123")
311
+ };
312
+ const initialResult = extendParametersWithObjectSets(client, config, initialParameters, cache);
313
+
314
+ // Verify initial state
315
+ expect(initialResult.myObjectSet.value.value).toMatchObject({
316
+ objectSetRid: "ri.object-set.123",
317
+ objectSet: mockObjectSet1
318
+ });
319
+ expect(cache.get("myObjectSet")).toMatchObject({
320
+ objectSetRid: "ri.object-set.123",
321
+ objectSet: mockObjectSet1
322
+ });
323
+ expect(hydrateObjectSetFromRid).toHaveBeenCalledTimes(1);
324
+ expect(hydrateObjectSetFromRid).toHaveBeenCalledWith(client, expect.anything(), "ri.object-set.123");
325
+
326
+ // Step 2: Transition to reloading state (value persists during reload)
327
+
328
+ const reloadingResult = extendParametersWithObjectSets(client, config, {
329
+ myObjectSet: {
330
+ type: "objectSet",
331
+ value: {
332
+ type: "reloading",
333
+ value: {
334
+ objectSetRid: "ri.object-set.123"
335
+ }
336
+ }
337
+ }
338
+ }, cache);
339
+
340
+ // During reloading, the cached objectSet should be reused (no new hydration)
341
+ expect(reloadingResult.myObjectSet.value.value).toMatchObject({
342
+ objectSetRid: "ri.object-set.123",
343
+ objectSet: mockObjectSet1 // Same object set from cache
344
+ });
345
+ expect(cache.get("myObjectSet")).toMatchObject({
346
+ objectSetRid: "ri.object-set.123",
347
+ objectSet: mockObjectSet1
348
+ });
349
+ expect(hydrateObjectSetFromRid).toHaveBeenCalledTimes(1); // Still only 1 call
350
+
351
+ // Step 3: Transition back to loaded with new rid
352
+ const mockObjectSet2 = createMockObjectSet("UpdatedObjectSet");
353
+ vi.mocked(hydrateObjectSetFromRid).mockReturnValue(mockObjectSet2);
354
+ const newLoadedParameters = {
355
+ myObjectSet: createObjectSetParam("ri.object-set.456")
356
+ };
357
+ const newLoadedResult = extendParametersWithObjectSets(client, config, newLoadedParameters, cache);
358
+
359
+ // Verify new state - new object set hydrated and cache updated
360
+ expect(newLoadedResult.myObjectSet.value.value).toMatchObject({
361
+ objectSetRid: "ri.object-set.456",
362
+ objectSet: mockObjectSet2
363
+ });
364
+ expect(cache.get("myObjectSet")).toMatchObject({
365
+ objectSetRid: "ri.object-set.456",
366
+ objectSet: mockObjectSet2
367
+ });
368
+ expect(hydrateObjectSetFromRid).toHaveBeenCalledTimes(2);
369
+ expect(hydrateObjectSetFromRid).toHaveBeenLastCalledWith(client, expect.anything(), "ri.object-set.456");
370
+ });
371
+ });
372
+ //# sourceMappingURL=extendParametersWithObjectSets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extendParametersWithObjectSets.test.js","names":["hydrateObjectSetFromRid","defineConfig","beforeEach","describe","expect","it","vi","extendParametersWithObjectSets","mock","fn","client","cache","Map","createMockObjectType","rid","apiName","type","internalDoNotUseMetadata","createLoadedValue","value","createObjectSetParam","objectSetRid","createStringParam","createNumberParam","createMockObjectSet","name","Symbol","clearAllMocks","clear","config","id","parameters","myObjectSet","displayName","objectType","myString","events","mockObjectSet","mocked","mockReturnValue","result","toEqual","objectSet","myNumber","undefined","not","toHaveBeenCalled","mockObjectType","objectsA","objectsB","mockObjectSetA","mockObjectSetB","mockReturnValueOnce","expectHydratedParam","mockObjectSetB2","result2","get","toMatchObject","initialParameters","initialResult","failedParameters","error","Error","failedResult","has","toBe","toHaveBeenCalledTimes","toThrow","mockObjectSet1","toHaveBeenCalledWith","anything","reloadingResult","mockObjectSet2","newLoadedParameters","newLoadedResult","toHaveBeenLastCalledWith"],"sources":["extendParametersWithObjectSets.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 { Client, ObjectSet } from \"@osdk/client\";\nimport { hydrateObjectSetFromRid } from \"@osdk/client/internal\";\nimport type { AsyncParameterValueMap, ObjectType } from \"@osdk/widget.api\";\nimport { defineConfig } from \"@osdk/widget.client\";\nimport type { Mock } from \"vitest\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { extendParametersWithObjectSets } from \"./extendParametersWithObjectSets.js\";\n\nvi.mock(\"@osdk/client/internal\", () => ({\n hydrateObjectSetFromRid: vi.fn(),\n}));\n\ndescribe(\"extendParametersWithObjectSets\", () => {\n const client = vi.fn() as Mock<Client> & Client;\n const cache = new Map<\n string,\n { objectSetRid: string; objectSet: ObjectSet }\n >();\n\n // Test helpers\n const createMockObjectType = (rid = \"ri.object-type.123\"): ObjectType => ({\n apiName: \"MyObjectType\",\n type: \"object\",\n internalDoNotUseMetadata: { rid },\n });\n\n const createLoadedValue = <T>(value: T) => ({\n type: \"loaded\" as const,\n value,\n });\n\n const createObjectSetParam = (rid: string) => ({\n type: \"objectSet\" as const,\n value: createLoadedValue({ objectSetRid: rid }),\n });\n\n const createStringParam = (value: string) => ({\n type: \"string\" as const,\n value: createLoadedValue(value),\n });\n\n const createNumberParam = (value: number) => ({\n type: \"number\" as const,\n value: createLoadedValue(value),\n });\n\n const createMockObjectSet = (name = \"MockObjectSet\") =>\n Symbol(name) as unknown as ObjectSet;\n\n beforeEach(() => {\n vi.clearAllMocks();\n cache.clear();\n });\n\n it(\"should hydrate an object set for a valid objectSetRid\", () => {\n const config = defineConfig({\n id: \"testWidget\",\n name: \"Test Widget\",\n type: \"workshop\",\n parameters: {\n myObjectSet: {\n displayName: \"My Object Set\",\n type: \"objectSet\",\n objectType: createMockObjectType(),\n },\n myString: {\n displayName: \"My String\",\n type: \"string\",\n },\n },\n events: {},\n });\n\n const parameters: AsyncParameterValueMap<typeof config> = {\n myString: createStringParam(\"test string\"),\n myObjectSet: createObjectSetParam(\"ri.object-set.123\"),\n };\n\n const mockObjectSet = createMockObjectSet();\n vi.mocked(hydrateObjectSetFromRid).mockReturnValue(mockObjectSet);\n\n const result = extendParametersWithObjectSets(\n client,\n config,\n parameters,\n cache,\n );\n\n expect(result).toEqual({\n myString: parameters.myString,\n myObjectSet: {\n ...parameters.myObjectSet,\n value: {\n ...parameters.myObjectSet.value,\n value: {\n objectSetRid: \"ri.object-set.123\",\n objectSet: mockObjectSet,\n },\n },\n },\n });\n });\n\n it(\"should pass-through a config with no object set parameters\", () => {\n const config = defineConfig({\n id: \"testWidget\",\n name: \"Test Widget\",\n type: \"workshop\",\n parameters: {\n myNumber: {\n displayName: \"My Number\",\n type: \"number\",\n },\n myString: {\n displayName: \"My String\",\n type: \"string\",\n },\n },\n events: {},\n });\n\n const parameters: AsyncParameterValueMap<typeof config> = {\n myString: createStringParam(\"test string\"),\n myNumber: createNumberParam(123),\n };\n\n const result = extendParametersWithObjectSets(\n undefined,\n config,\n parameters,\n cache,\n );\n\n expect(result).toEqual(parameters);\n expect(hydrateObjectSetFromRid).not.toHaveBeenCalled();\n });\n\n it(\"should handle multiple object set parameters independently\", () => {\n const mockObjectType = createMockObjectType();\n const config = defineConfig({\n id: \"testWidget\",\n name: \"Test Widget\",\n type: \"workshop\",\n parameters: {\n objectsA: {\n displayName: \"Object Set A\",\n type: \"objectSet\",\n objectType: mockObjectType,\n },\n objectsB: {\n displayName: \"Object Set B\",\n type: \"objectSet\",\n objectType: mockObjectType,\n },\n },\n events: {},\n });\n\n // Setup initial parameters\n const mockObjectSetA = createMockObjectSet(\"MockObjectSetA\");\n const mockObjectSetB = createMockObjectSet(\"MockObjectSetB\");\n\n vi.mocked(hydrateObjectSetFromRid)\n .mockReturnValueOnce(mockObjectSetA)\n .mockReturnValueOnce(mockObjectSetB);\n\n let parameters: AsyncParameterValueMap<typeof config> = {\n objectsA: createObjectSetParam(\"ri.object-set.123\"),\n objectsB: createObjectSetParam(\"ri.object-set.456\"),\n };\n\n const result = extendParametersWithObjectSets(\n client,\n config,\n parameters,\n cache,\n );\n\n // Helper to create expected result with hydrated object set\n const expectHydratedParam = (rid: string, objectSet: ObjectSet) => ({\n type: \"objectSet\",\n value: createLoadedValue({\n objectSetRid: rid,\n objectSet,\n }),\n });\n\n expect(result).toEqual({\n objectsA: expectHydratedParam(\"ri.object-set.123\", mockObjectSetA),\n objectsB: expectHydratedParam(\"ri.object-set.456\", mockObjectSetB),\n });\n\n // Test parameter update\n const mockObjectSetB2 = createMockObjectSet(\"MockObjectSetB2\");\n vi.mocked(hydrateObjectSetFromRid).mockReturnValueOnce(mockObjectSetB2);\n\n parameters = {\n ...parameters,\n objectsB: createObjectSetParam(\"ri.object-set.789\"),\n };\n\n const result2 = extendParametersWithObjectSets(\n client,\n config,\n parameters,\n cache,\n );\n\n expect(result2).toEqual({\n objectsA: expectHydratedParam(\"ri.object-set.123\", mockObjectSetA),\n objectsB: expectHydratedParam(\"ri.object-set.789\", mockObjectSetB2),\n });\n\n // Verify cache updated correctly\n expect(cache.get(\"objectsB\")).toMatchObject({\n objectSetRid: \"ri.object-set.789\",\n objectSet: mockObjectSetB2,\n });\n });\n\n it(\"should clear cache and provide no object set when parameter transitions to failed state\", () => {\n const config = defineConfig({\n id: \"testWidget\",\n name: \"Test Widget\",\n type: \"workshop\",\n parameters: {\n myObjectSet: {\n displayName: \"My Object Set\",\n type: \"objectSet\",\n objectType: createMockObjectType(),\n },\n myString: {\n displayName: \"My String\",\n type: \"string\",\n },\n },\n events: {},\n });\n\n // Initially load an object set successfully\n const mockObjectSet = createMockObjectSet();\n vi.mocked(hydrateObjectSetFromRid).mockReturnValue(mockObjectSet);\n\n const initialParameters: AsyncParameterValueMap<typeof config> = {\n myString: createStringParam(\"test string\"),\n myObjectSet: createObjectSetParam(\"ri.object-set.123\"),\n };\n\n const initialResult = extendParametersWithObjectSets(\n client,\n config,\n initialParameters,\n cache,\n );\n\n // Verify initial state - object set is loaded and cached\n expect(initialResult.myObjectSet.value.value).toMatchObject({\n objectSetRid: \"ri.object-set.123\",\n objectSet: mockObjectSet,\n });\n expect(cache.get(\"myObjectSet\")).toMatchObject({\n objectSetRid: \"ri.object-set.123\",\n objectSet: mockObjectSet,\n });\n\n // Transition to failed state and omit value\n const failedParameters: AsyncParameterValueMap<typeof config> = {\n myString: createStringParam(\"test string\"),\n myObjectSet: {\n type: \"objectSet\",\n value: {\n type: \"failed\",\n error: new Error(\"Failed to load object set\"),\n value: undefined,\n },\n },\n };\n\n const failedResult = extendParametersWithObjectSets(\n client,\n config,\n failedParameters,\n cache,\n );\n\n // Verify failed state - no object set in result and cache is cleared\n expect(failedResult).toEqual(failedParameters);\n expect(cache.has(\"myObjectSet\")).toBe(false);\n\n // Verify hydrateObjectSetFromRid was not called again for the failed state\n expect(hydrateObjectSetFromRid).toHaveBeenCalledTimes(1);\n });\n\n it(\"should throw an error when osdkClient is undefined but object set parameters used\", () => {\n const config = defineConfig({\n id: \"testWidget\",\n name: \"Test Widget\",\n type: \"workshop\",\n parameters: {\n myObjectSet: {\n displayName: \"My Object Set\",\n type: \"objectSet\",\n objectType: createMockObjectType(),\n },\n },\n events: {},\n });\n\n const parameters: AsyncParameterValueMap<typeof config> = {\n myObjectSet: createObjectSetParam(\"ri.object-set.123\"),\n };\n\n expect(() =>\n extendParametersWithObjectSets(\n undefined,\n config,\n parameters,\n cache,\n )\n ).toThrow(\"Not provided an OSDK client\");\n });\n\n it(\"should pass through loading state without hydration\", () => {\n const config = defineConfig({\n id: \"testWidget\",\n name: \"Test Widget\",\n type: \"workshop\",\n parameters: {\n myObjectSet: {\n displayName: \"My Object Set\",\n type: \"objectSet\",\n objectType: createMockObjectType(),\n },\n },\n events: {},\n });\n\n const parameters: AsyncParameterValueMap<typeof config> = {\n myObjectSet: {\n type: \"objectSet\",\n value: {\n type: \"loading\",\n value: undefined,\n },\n },\n };\n\n const result = extendParametersWithObjectSets(\n client,\n config,\n parameters,\n cache,\n );\n\n expect(result).toEqual(parameters);\n expect(hydrateObjectSetFromRid).not.toHaveBeenCalled();\n });\n\n it(\"should handle transition from loaded to reloading to loaded with new rid\", () => {\n const config = defineConfig({\n id: \"testWidget\",\n name: \"Test Widget\",\n type: \"workshop\",\n parameters: {\n myObjectSet: {\n displayName: \"My Object Set\",\n type: \"objectSet\",\n objectType: createMockObjectType(),\n },\n },\n events: {},\n });\n\n // Step 1: Initial loaded state\n const mockObjectSet1 = createMockObjectSet(\"InitialObjectSet\");\n vi.mocked(hydrateObjectSetFromRid).mockReturnValue(mockObjectSet1);\n\n const initialParameters: AsyncParameterValueMap<typeof config> = {\n myObjectSet: createObjectSetParam(\"ri.object-set.123\"),\n };\n\n const initialResult = extendParametersWithObjectSets(\n client,\n config,\n initialParameters,\n cache,\n );\n\n // Verify initial state\n expect(initialResult.myObjectSet.value.value).toMatchObject({\n objectSetRid: \"ri.object-set.123\",\n objectSet: mockObjectSet1,\n });\n expect(cache.get(\"myObjectSet\")).toMatchObject({\n objectSetRid: \"ri.object-set.123\",\n objectSet: mockObjectSet1,\n });\n expect(hydrateObjectSetFromRid).toHaveBeenCalledTimes(1);\n expect(hydrateObjectSetFromRid).toHaveBeenCalledWith(\n client,\n expect.anything(),\n \"ri.object-set.123\",\n );\n\n // Step 2: Transition to reloading state (value persists during reload)\n const reloadingParameters: AsyncParameterValueMap<typeof config> = {\n myObjectSet: {\n type: \"objectSet\",\n value: {\n type: \"reloading\",\n value: {\n objectSetRid: \"ri.object-set.123\",\n },\n },\n },\n };\n\n const reloadingResult = extendParametersWithObjectSets(\n client,\n config,\n reloadingParameters,\n cache,\n );\n\n // During reloading, the cached objectSet should be reused (no new hydration)\n expect(reloadingResult.myObjectSet.value.value).toMatchObject({\n objectSetRid: \"ri.object-set.123\",\n objectSet: mockObjectSet1, // Same object set from cache\n });\n expect(cache.get(\"myObjectSet\")).toMatchObject({\n objectSetRid: \"ri.object-set.123\",\n objectSet: mockObjectSet1,\n });\n expect(hydrateObjectSetFromRid).toHaveBeenCalledTimes(1); // Still only 1 call\n\n // Step 3: Transition back to loaded with new rid\n const mockObjectSet2 = createMockObjectSet(\"UpdatedObjectSet\");\n vi.mocked(hydrateObjectSetFromRid).mockReturnValue(mockObjectSet2);\n\n const newLoadedParameters: AsyncParameterValueMap<typeof config> = {\n myObjectSet: createObjectSetParam(\"ri.object-set.456\"),\n };\n\n const newLoadedResult = extendParametersWithObjectSets(\n client,\n config,\n newLoadedParameters,\n cache,\n );\n\n // Verify new state - new object set hydrated and cache updated\n expect(newLoadedResult.myObjectSet.value.value).toMatchObject({\n objectSetRid: \"ri.object-set.456\",\n objectSet: mockObjectSet2,\n });\n expect(cache.get(\"myObjectSet\")).toMatchObject({\n objectSetRid: \"ri.object-set.456\",\n objectSet: mockObjectSet2,\n });\n expect(hydrateObjectSetFromRid).toHaveBeenCalledTimes(2);\n expect(hydrateObjectSetFromRid).toHaveBeenLastCalledWith(\n client,\n expect.anything(),\n \"ri.object-set.456\",\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"initializeParameters.js","names":["initializeParameters","config","initialLoadingState","Object","fromEntries","entries","parameters","map","key","parameterConfig","type","value"],"sources":["initializeParameters.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { AsyncParameterValueMap, WidgetConfig } from \"@osdk/widget.client\";\n\n/**\n * Utility function to initialize a map of parameter values to either a loading or not-started loading state\n */\nexport function initializeParameters<C extends WidgetConfig<C[\"parameters\"]>>(\n config: C,\n initialLoadingState: \"loading\" | \"not-started\",\n): AsyncParameterValueMap<C> {\n return Object.fromEntries(\n Object.entries(config.parameters).map(([key, parameterConfig]) => [\n key,\n { type: parameterConfig.type, value: { type: initialLoadingState } },\n ]),\n ) as AsyncParameterValueMap<C>;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA,OAAO,SAASA,oBAAoBA,CAClCC,MAAS,EACTC,mBAA8C,EACnB;EAC3B,OAAOC,MAAM,CAACC,WAAW,CACvBD,MAAM,CAACE,OAAO,CAACJ,MAAM,CAACK,UAAU,CAAC,CAACC,GAAG,CAAC,CAAC,CAACC,GAAG,EAAEC,eAAe,CAAC,KAAK,CAChED,GAAG,EACH;IAAEE,IAAI,EAAED,eAAe,CAACC,IAAI;IAAEC,KAAK,EAAE;MAAED,IAAI,EAAER;IAAoB;EAAE,CAAC,CACrE,CACH,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"initializeParameters.js","names":["initializeParameters","config","initialLoadingState","Object","fromEntries","entries","parameters","map","key","parameterConfig","type","value"],"sources":["initializeParameters.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { WidgetConfig } from \"@osdk/widget.client\";\nimport type { ExtendedAsyncParameterValueMap } from \"../context.js\";\n\n/**\n * Utility function to initialize a map of parameter values to either a loading or not-started loading state\n */\nexport function initializeParameters<C extends WidgetConfig<C[\"parameters\"]>>(\n config: C,\n initialLoadingState: \"loading\" | \"not-started\",\n): ExtendedAsyncParameterValueMap<C> {\n return Object.fromEntries(\n Object.entries(config.parameters).map(([key, parameterConfig]) => [\n key,\n { type: parameterConfig.type, value: { type: initialLoadingState } },\n ]),\n ) as ExtendedAsyncParameterValueMap<C>;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA,OAAO,SAASA,oBAAoBA,CAClCC,MAAS,EACTC,mBAA8C,EACX;EACnC,OAAOC,MAAM,CAACC,WAAW,CACvBD,MAAM,CAACE,OAAO,CAACJ,MAAM,CAACK,UAAU,CAAC,CAACC,GAAG,CAAC,CAAC,CAACC,GAAG,EAAEC,eAAe,CAAC,KAAK,CAChED,GAAG,EACH;IAAEE,IAAI,EAAED,eAAe,CAACC,IAAI;IAAEC,KAAK,EAAE;MAAED,IAAI,EAAER;IAAoB;EAAE,CAAC,CACrE,CACH,CAAC;AACH","ignoreList":[]}
@@ -2,13 +2,30 @@
2
2
 
3
3
  var widget_client = require('@osdk/widget.client');
4
4
  var React2 = require('react');
5
+ var internal = require('@osdk/client/internal');
5
6
 
6
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
7
24
 
8
- var React2__default = /*#__PURE__*/_interopDefault(React2);
25
+ var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
9
26
 
10
27
  // src/client.tsx
11
- var FoundryWidgetContext = /* @__PURE__ */ React2__default.default.createContext({
28
+ var FoundryWidgetContext = /* @__PURE__ */ React2__namespace.default.createContext({
12
29
  emitEvent: () => {
13
30
  },
14
31
  hostEventTarget: new widget_client.FoundryHostEventTarget(),
@@ -29,6 +46,86 @@ function useFoundryWidgetContext() {
29
46
  }
30
47
  _useFoundryWidgetContext.withTypes = withTypes;
31
48
  })(useFoundryWidgetContext || (useFoundryWidgetContext = {}));
49
+ var ErrorBoundary = class extends React2__namespace.Component {
50
+ state = {
51
+ error: null
52
+ };
53
+ static getDerivedStateFromError(error) {
54
+ return {
55
+ error
56
+ };
57
+ }
58
+ render() {
59
+ if (this.state.error) {
60
+ const errorDetails = this.state.error instanceof Error ? this.state.error.stack : "See browser console for more details.";
61
+ return /* @__PURE__ */ React2__namespace.createElement("section", {
62
+ style: {
63
+ padding: "16px"
64
+ }
65
+ }, /* @__PURE__ */ React2__namespace.createElement("h3", {
66
+ style: {
67
+ margin: "0 0 12px 0",
68
+ color: "#c00"
69
+ }
70
+ }, "An uncaught error occurred"), process.env.NODE_ENV !== "production" && /* @__PURE__ */ React2__namespace.createElement(React2__namespace.Fragment, null, /* @__PURE__ */ React2__namespace.createElement("p", {
71
+ style: {
72
+ margin: "0 0 8px 0"
73
+ }
74
+ }, "This error was caught by the widget framework's fallback error boundary."), /* @__PURE__ */ React2__namespace.createElement("ul", {
75
+ style: {
76
+ margin: "0 0 16px 0"
77
+ }
78
+ }, /* @__PURE__ */ React2__namespace.createElement("li", null, "Ensure errors are properly handled in your code with try-catch blocks and promise rejection handling."), /* @__PURE__ */ React2__namespace.createElement("li", null, "Add your own error boundary to replace this fallback with a custom error message or recovery options for your users."), /* @__PURE__ */ React2__namespace.createElement("li", null, "See:", " ", /* @__PURE__ */ React2__namespace.createElement("code", null, "https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary")))), /* @__PURE__ */ React2__namespace.createElement("pre", {
79
+ style: {
80
+ backgroundColor: "#f5f5f5",
81
+ padding: "12px",
82
+ overflow: "auto",
83
+ fontSize: "12px",
84
+ margin: 0
85
+ }
86
+ }, errorDetails));
87
+ }
88
+ return this.props.children;
89
+ }
90
+ };
91
+ function extendParametersWithObjectSets(osdkClient, config, parameters, cache) {
92
+ const extendedParameters = {
93
+ ...parameters
94
+ };
95
+ for (const parameterId of Object.keys(extendedParameters)) {
96
+ const param = config.parameters[parameterId];
97
+ if (param.type === "objectSet" && extendedParameters[parameterId].type === "objectSet") {
98
+ const parameterValue = extendedParameters[parameterId].value.value;
99
+ if (parameterValue != null) {
100
+ if (typeof parameterValue === "object" && "objectSetRid" in parameterValue && typeof parameterValue.objectSetRid === "string") {
101
+ const objectSetRid = parameterValue.objectSetRid;
102
+ const objectSet = getOrHydrateObjectSet(osdkClient, cache, parameterId, objectSetRid, param.objectType);
103
+ parameterValue.objectSet = objectSet;
104
+ } else {
105
+ throw new Error(`Invalid object set parameter value for parameter "${parameterId}"`);
106
+ }
107
+ } else {
108
+ cache.delete(parameterId);
109
+ }
110
+ }
111
+ }
112
+ return extendedParameters;
113
+ }
114
+ function getOrHydrateObjectSet(osdkClient, cache, paramKey, objectSetRid, definition) {
115
+ if (osdkClient == null) {
116
+ throw new Error("Not provided an OSDK client");
117
+ }
118
+ const cached = cache.get(paramKey);
119
+ if (cached?.objectSetRid === objectSetRid) {
120
+ return cached.objectSet;
121
+ }
122
+ const objectSet = internal.hydrateObjectSetFromRid(osdkClient, definition, objectSetRid);
123
+ cache.set(paramKey, {
124
+ objectSetRid,
125
+ objectSet
126
+ });
127
+ return objectSet;
128
+ }
32
129
 
33
130
  // src/utils/initializeParameters.ts
34
131
  function initializeParameters(config, initialLoadingState) {
@@ -44,26 +141,29 @@ function initializeParameters(config, initialLoadingState) {
44
141
  var FoundryWidget = ({
45
142
  children,
46
143
  config,
47
- initialValues
144
+ initialValues,
145
+ client: osdkClient
48
146
  }) => {
49
147
  const client = React2.useMemo(() => widget_client.createFoundryWidgetClient(), []);
50
- const [asyncParameterValues, setAsyncParameterValues] = React2__default.default.useState(initialValues ?? initializeParameters(config, "not-started"));
51
- const [allParameterValues, setAllParameterValues] = React2__default.default.useState({
148
+ const [asyncParameterValues, setAsyncParameterValues] = React2__namespace.default.useState(initialValues ?? initializeParameters(config, "not-started"));
149
+ const [allParameterValues, setAllParameterValues] = React2__namespace.default.useState({
52
150
  type: "not-started"
53
151
  });
152
+ const objectSetCache = React2.useRef(/* @__PURE__ */ new Map());
54
153
  React2.useEffect(() => {
55
154
  client.subscribe();
56
155
  client.hostEventTarget.addEventListener("host.update-parameters", (payload) => {
156
+ const processedParameters = extendParametersWithObjectSets(osdkClient, config, payload.detail.parameters, objectSetCache.current);
57
157
  setAsyncParameterValues((currentParameters) => ({
58
158
  ...currentParameters,
59
- ...payload.detail.parameters
159
+ ...processedParameters
60
160
  }));
61
161
  setAllParameterValues((currentParameters) => {
62
162
  let aggregatedLoadedState = "loaded";
63
163
  let firstError;
64
164
  const newParameterValues = {};
65
- for (const key in payload.detail.parameters) {
66
- const value = payload.detail.parameters[key].value;
165
+ for (const key in processedParameters) {
166
+ const value = processedParameters[key].value;
67
167
  if (value.type === "failed") {
68
168
  aggregatedLoadedState = "failed";
69
169
  firstError = firstError ?? value.error;
@@ -112,7 +212,7 @@ var FoundryWidget = ({
112
212
  client.unsubscribe();
113
213
  };
114
214
  }, []);
115
- return /* @__PURE__ */ React2__default.default.createElement(FoundryWidgetContext.Provider, {
215
+ return /* @__PURE__ */ React2__namespace.default.createElement(FoundryWidgetContext.Provider, {
116
216
  value: {
117
217
  emitEvent: client.emitEvent,
118
218
  hostEventTarget: client.hostEventTarget,
@@ -123,7 +223,7 @@ var FoundryWidget = ({
123
223
  }
124
224
  // Unfortunately the context is statically defined so we can't use the generic type, hence the cast
125
225
  }
126
- }, children);
226
+ }, /* @__PURE__ */ React2__namespace.default.createElement(ErrorBoundary, null, children));
127
227
  };
128
228
 
129
229
  exports.FoundryWidget = FoundryWidget;