@osdk/widget.client 3.1.0-beta.3 → 3.1.0-beta.5

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 CHANGED
@@ -1,5 +1,23 @@
1
1
  # @osdk/widget.client
2
2
 
3
+ ## 3.1.0-beta.5
4
+
5
+ ### Minor Changes
6
+
7
+ - f173ee1: Improve widget client emitEvent types to more correctly extract event parameters
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [f173ee1]
12
+ - @osdk/widget.api@3.1.0-beta.5
13
+
14
+ ## 3.1.0-beta.4
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies [3744571]
19
+ - @osdk/widget.api@3.1.0-beta.4
20
+
3
21
  ## 3.1.0-beta.3
4
22
 
5
23
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["HostMessage","visitHostMessage","invariant","FoundryHostEventTarget","createFoundryWidgetClient","window","process","env","NODE_ENV","widgetApi","__PALANTIR_WIDGET_API__","hostEventTarget","listenForHostMessages","event","detail","payload","dispatchEventMessage","_unknown","sendMessageToHost","message","sendMessage","ready","type","apiVersion","Version","emitEvent","eventId","subscribe","addEventListener","unsubscribe","removeEventListener"],"sources":["client.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 {\n HostMessage,\n visitHostMessage,\n type WidgetConfig,\n type WidgetMessage,\n} from \"@osdk/widget.api\";\nimport invariant from \"tiny-invariant\";\nimport { FoundryHostEventTarget } from \"./host.js\";\n\nexport interface FoundryWidgetClient<C extends WidgetConfig<C[\"parameters\"]>> {\n /**\n * Notifies the host that this client is ready to receive the first parameter values\n */\n ready: () => void;\n\n /**\n * Emits an event with the given ID and payload\n */\n emitEvent: <M extends WidgetMessage.EmitEvent<C>>(\n eventId: M[\"payload\"][\"eventId\"],\n payload: Omit<M[\"payload\"], \"eventId\">,\n ) => void;\n\n /**\n * Sends a message to the parent frame.\n * It is recommended to use the convenience methods for individual messages (e.g. ready or emitEvent) instead\n */\n sendMessage: <M extends WidgetMessage<C>>(message: M) => void;\n\n /**\n * Subscribes to events from the host, invoking the listener when a message is received\n */\n subscribe: () => void;\n\n /**\n * Unsubscribes a previously subscribed listener from host events, if one exists\n */\n unsubscribe: () => void;\n\n /**\n * Event targets on which you can subscribe to specific host messages\n */\n hostEventTarget: FoundryHostEventTarget<C>;\n}\n\ninterface PalantirWidgetApiEvents<C extends WidgetConfig<C[\"parameters\"]>> {\n message: CustomEvent<HostMessage<C>>;\n}\n\ninterface PalantirWidgetApi<C extends WidgetConfig<C[\"parameters\"]>> {\n sendMessage: <M extends WidgetMessage<C>>(message: M) => void;\n addEventListener<K extends keyof PalantirWidgetApiEvents<C>>(\n type: K,\n listener: (ev: PalantirWidgetApiEvents<C>[K]) => any,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener<K extends keyof PalantirWidgetApiEvents<C>>(\n type: K,\n listener: (ev: PalantirWidgetApiEvents<C>[K]) => any,\n options?: boolean | EventListenerOptions,\n ): void;\n}\n\nexport function createFoundryWidgetClient<\n C extends WidgetConfig<C[\"parameters\"]>,\n>(): FoundryWidgetClient<C> {\n invariant(\n \"__PALANTIR_WIDGET_API__\" in window,\n \"[FoundryWidgetClient] Missing __PALANTIR_WIDGET_API__ in window\",\n );\n const widgetApi = window.__PALANTIR_WIDGET_API__ as PalantirWidgetApi<C>;\n const hostEventTarget = new FoundryHostEventTarget<C>();\n\n const listenForHostMessages = (event: CustomEvent<HostMessage<C>>) => {\n visitHostMessage(event.detail, {\n \"host.update-parameters\": (payload) => {\n hostEventTarget.dispatchEventMessage(\"host.update-parameters\", payload);\n },\n _unknown: () => {\n // Do nothing\n },\n });\n };\n const sendMessageToHost = <M extends WidgetMessage<C>>(message: M) => {\n widgetApi.sendMessage(message);\n };\n\n return {\n hostEventTarget,\n ready: () => {\n sendMessageToHost({\n type: \"widget.ready\",\n payload: {\n apiVersion: HostMessage.Version,\n },\n });\n },\n emitEvent: (eventId, payload) => {\n sendMessageToHost({\n type: \"widget.emit-event\",\n payload: {\n eventId,\n ...payload,\n },\n });\n },\n sendMessage: sendMessageToHost,\n subscribe: () => {\n widgetApi.addEventListener(\"message\", listenForHostMessages);\n },\n unsubscribe: () => {\n widgetApi.removeEventListener(\"message\", listenForHostMessages);\n },\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SACEA,WAAW,EACXC,gBAAgB,QAGX,kBAAkB;AACzB,OAAOC,SAAS,MAAM,gBAAgB;AACtC,SAASC,sBAAsB,QAAQ,WAAW;AAwDlD,OAAO,SAASC,yBAAyBA,CAAA,EAEb;EAC1B,EACE,yBAAyB,IAAIC,MAAM,IAAAC,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBADrCN,SAAS,QAEP,iEAAiE,IAFnEA,SAAS;EAIT,MAAMO,SAAS,GAAGJ,MAAM,CAACK,uBAA+C;EACxE,MAAMC,eAAe,GAAG,IAAIR,sBAAsB,CAAI,CAAC;EAEvD,MAAMS,qBAAqB,GAAIC,KAAkC,IAAK;IACpEZ,gBAAgB,CAACY,KAAK,CAACC,MAAM,EAAE;MAC7B,wBAAwB,EAAGC,OAAO,IAAK;QACrCJ,eAAe,CAACK,oBAAoB,CAAC,wBAAwB,EAAED,OAAO,CAAC;MACzE,CAAC;MACDE,QAAQ,EAAEA,CAAA,KAAM;QACd;MAAA;IAEJ,CAAC,CAAC;EACJ,CAAC;EACD,MAAMC,iBAAiB,GAAgCC,OAAU,IAAK;IACpEV,SAAS,CAACW,WAAW,CAACD,OAAO,CAAC;EAChC,CAAC;EAED,OAAO;IACLR,eAAe;IACfU,KAAK,EAAEA,CAAA,KAAM;MACXH,iBAAiB,CAAC;QAChBI,IAAI,EAAE,cAAc;QACpBP,OAAO,EAAE;UACPQ,UAAU,EAAEvB,WAAW,CAACwB;QAC1B;MACF,CAAC,CAAC;IACJ,CAAC;IACDC,SAAS,EAAEA,CAACC,OAAO,EAAEX,OAAO,KAAK;MAC/BG,iBAAiB,CAAC;QAChBI,IAAI,EAAE,mBAAmB;QACzBP,OAAO,EAAE;UACPW,OAAO;UACP,GAAGX;QACL;MACF,CAAC,CAAC;IACJ,CAAC;IACDK,WAAW,EAAEF,iBAAiB;IAC9BS,SAAS,EAAEA,CAAA,KAAM;MACflB,SAAS,CAACmB,gBAAgB,CAAC,SAAS,EAAEhB,qBAAqB,CAAC;IAC9D,CAAC;IACDiB,WAAW,EAAEA,CAAA,KAAM;MACjBpB,SAAS,CAACqB,mBAAmB,CAAC,SAAS,EAAElB,qBAAqB,CAAC;IACjE;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"client.js","names":["HostMessage","visitHostMessage","invariant","FoundryHostEventTarget","createFoundryWidgetClient","window","process","env","NODE_ENV","widgetApi","__PALANTIR_WIDGET_API__","hostEventTarget","listenForHostMessages","event","detail","payload","dispatchEventMessage","_unknown","sendMessageToHost","message","sendMessage","ready","type","apiVersion","Version","emitEvent","eventId","subscribe","addEventListener","unsubscribe","removeEventListener"],"sources":["client.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 {\n HostMessage,\n visitHostMessage,\n type WidgetConfig,\n type WidgetMessage,\n} from \"@osdk/widget.api\";\nimport invariant from \"tiny-invariant\";\nimport { FoundryHostEventTarget } from \"./host.js\";\n\nexport interface FoundryWidgetClient<C extends WidgetConfig<C[\"parameters\"]>> {\n /**\n * Notifies the host that this client is ready to receive the first parameter values\n */\n ready: () => void;\n\n /**\n * Emits an event with the given ID and payload\n */\n emitEvent: <\n M extends WidgetMessage.EmitEvent<C>,\n ID extends M[\"payload\"][\"eventId\"],\n >(\n eventId: ID,\n payload: Omit<\n ExtractEmitEventPayload<M, ID>,\n \"eventId\"\n >,\n ) => void;\n\n /**\n * Sends a message to the parent frame.\n * It is recommended to use the convenience methods for individual messages (e.g. ready or emitEvent) instead\n */\n sendMessage: <M extends WidgetMessage<C>>(message: M) => void;\n\n /**\n * Subscribes to events from the host, invoking the listener when a message is received\n */\n subscribe: () => void;\n\n /**\n * Unsubscribes a previously subscribed listener from host events, if one exists\n */\n unsubscribe: () => void;\n\n /**\n * Event targets on which you can subscribe to specific host messages\n */\n hostEventTarget: FoundryHostEventTarget<C>;\n}\n\ntype ExtractEmitEventPayload<\n M extends WidgetMessage.EmitEvent<any>,\n ID extends M[\"payload\"][\"eventId\"],\n> = Extract<\n M[\"payload\"],\n { eventId: ID }\n>;\n\ninterface PalantirWidgetApiEvents<C extends WidgetConfig<C[\"parameters\"]>> {\n message: CustomEvent<HostMessage<C>>;\n}\n\ninterface PalantirWidgetApi<C extends WidgetConfig<C[\"parameters\"]>> {\n sendMessage: <M extends WidgetMessage<C>>(message: M) => void;\n addEventListener<K extends keyof PalantirWidgetApiEvents<C>>(\n type: K,\n listener: (ev: PalantirWidgetApiEvents<C>[K]) => any,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener<K extends keyof PalantirWidgetApiEvents<C>>(\n type: K,\n listener: (ev: PalantirWidgetApiEvents<C>[K]) => any,\n options?: boolean | EventListenerOptions,\n ): void;\n}\n\nexport function createFoundryWidgetClient<\n C extends WidgetConfig<C[\"parameters\"]>,\n>(): FoundryWidgetClient<C> {\n invariant(\n \"__PALANTIR_WIDGET_API__\" in window,\n \"[FoundryWidgetClient] Missing __PALANTIR_WIDGET_API__ in window\",\n );\n const widgetApi = window.__PALANTIR_WIDGET_API__ as PalantirWidgetApi<C>;\n const hostEventTarget = new FoundryHostEventTarget<C>();\n\n const listenForHostMessages = (event: CustomEvent<HostMessage<C>>) => {\n visitHostMessage(event.detail, {\n \"host.update-parameters\": (payload) => {\n hostEventTarget.dispatchEventMessage(\"host.update-parameters\", payload);\n },\n _unknown: () => {\n // Do nothing\n },\n });\n };\n const sendMessageToHost = <M extends WidgetMessage<C>>(message: M) => {\n widgetApi.sendMessage(message);\n };\n\n return {\n hostEventTarget,\n ready: () => {\n sendMessageToHost({\n type: \"widget.ready\",\n payload: {\n apiVersion: HostMessage.Version,\n },\n });\n },\n emitEvent: (eventId, payload) => {\n sendMessageToHost({\n type: \"widget.emit-event\",\n payload: {\n eventId,\n ...payload,\n },\n });\n },\n sendMessage: sendMessageToHost,\n subscribe: () => {\n widgetApi.addEventListener(\"message\", listenForHostMessages);\n },\n unsubscribe: () => {\n widgetApi.removeEventListener(\"message\", listenForHostMessages);\n },\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SACEA,WAAW,EACXC,gBAAgB,QAGX,kBAAkB;AACzB,OAAOC,SAAS,MAAM,gBAAgB;AACtC,SAASC,sBAAsB,QAAQ,WAAW;AAsElD,OAAO,SAASC,yBAAyBA,CAAA,EAEb;EAC1B,EACE,yBAAyB,IAAIC,MAAM,IAAAC,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBADrCN,SAAS,QAEP,iEAAiE,IAFnEA,SAAS;EAIT,MAAMO,SAAS,GAAGJ,MAAM,CAACK,uBAA+C;EACxE,MAAMC,eAAe,GAAG,IAAIR,sBAAsB,CAAI,CAAC;EAEvD,MAAMS,qBAAqB,GAAIC,KAAkC,IAAK;IACpEZ,gBAAgB,CAACY,KAAK,CAACC,MAAM,EAAE;MAC7B,wBAAwB,EAAGC,OAAO,IAAK;QACrCJ,eAAe,CAACK,oBAAoB,CAAC,wBAAwB,EAAED,OAAO,CAAC;MACzE,CAAC;MACDE,QAAQ,EAAEA,CAAA,KAAM;QACd;MAAA;IAEJ,CAAC,CAAC;EACJ,CAAC;EACD,MAAMC,iBAAiB,GAAgCC,OAAU,IAAK;IACpEV,SAAS,CAACW,WAAW,CAACD,OAAO,CAAC;EAChC,CAAC;EAED,OAAO;IACLR,eAAe;IACfU,KAAK,EAAEA,CAAA,KAAM;MACXH,iBAAiB,CAAC;QAChBI,IAAI,EAAE,cAAc;QACpBP,OAAO,EAAE;UACPQ,UAAU,EAAEvB,WAAW,CAACwB;QAC1B;MACF,CAAC,CAAC;IACJ,CAAC;IACDC,SAAS,EAAEA,CAACC,OAAO,EAAEX,OAAO,KAAK;MAC/BG,iBAAiB,CAAC;QAChBI,IAAI,EAAE,mBAAmB;QACzBP,OAAO,EAAE;UACPW,OAAO;UACP,GAAGX;QACL;MACF,CAAC,CAAC;IACJ,CAAC;IACDK,WAAW,EAAEF,iBAAiB;IAC9BS,SAAS,EAAEA,CAAA,KAAM;MACflB,SAAS,CAACmB,gBAAgB,CAAC,SAAS,EAAEhB,qBAAqB,CAAC;IAC9D,CAAC;IACDiB,WAAW,EAAEA,CAAA,KAAM;MACjBpB,SAAS,CAACqB,mBAAmB,CAAC,SAAS,EAAElB,qBAAqB,CAAC;IACjE;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,139 @@
1
+ /*
2
+ * Copyright 2024 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 { defineConfig } from "@osdk/widget.api";
18
+ import { describe, it } from "vitest";
19
+ describe("FoundryWidgetClient", () => {
20
+ defineConfig({
21
+ id: "widgetId",
22
+ name: "Widget Name",
23
+ description: "Widget Description",
24
+ type: "workshop",
25
+ parameters: {
26
+ myString: {
27
+ displayName: "My string",
28
+ type: "string"
29
+ },
30
+ myNumber: {
31
+ displayName: "My number",
32
+ type: "number"
33
+ },
34
+ myBoolean: {
35
+ displayName: "My boolean",
36
+ type: "boolean"
37
+ }
38
+ },
39
+ events: {
40
+ noParameters: {
41
+ displayName: "No parameters",
42
+ parameterUpdateIds: []
43
+ },
44
+ oneParameter: {
45
+ displayName: "One parameter",
46
+ parameterUpdateIds: ["myString"]
47
+ },
48
+ twoParameters: {
49
+ displayName: "Two parameters",
50
+ parameterUpdateIds: ["myNumber", "myBoolean"]
51
+ }
52
+ }
53
+ });
54
+ const emitEvent = () => {};
55
+ it("should narrow the emit event type when no parameters", () => {
56
+ emitEvent("noParameters", {
57
+ // @ts-expect-error
58
+ parameterUpdates: []
59
+ });
60
+ emitEvent("noParameters", {
61
+ // @ts-expect-error
62
+ parameterUpdates: {
63
+ myString: "string"
64
+ }
65
+ });
66
+ emitEvent("noParameters", {
67
+ parameterUpdates: {}
68
+ });
69
+ });
70
+ it("should narrow the emit event type with one parameter", () => {
71
+ emitEvent("oneParameter", {
72
+ // @ts-expect-error
73
+ parameterUpdates: []
74
+ });
75
+ emitEvent("oneParameter", {
76
+ // @ts-expect-error
77
+ parameterUpdates: {}
78
+ });
79
+ emitEvent("oneParameter", {
80
+ // @ts-expect-error
81
+ parameterUpdates: {
82
+ myNumber: 123
83
+ }
84
+ });
85
+ emitEvent("twoParameters", {
86
+ // @ts-expect-error
87
+ parameterUpdates: {
88
+ myString: "string",
89
+ myNumber: 123
90
+ }
91
+ });
92
+ emitEvent("oneParameter", {
93
+ parameterUpdates: {
94
+ myString: "string"
95
+ }
96
+ });
97
+ });
98
+ it("should narrow the emit event type with two parameters", () => {
99
+ emitEvent("twoParameters", {
100
+ // @ts-expect-error
101
+ parameterUpdates: []
102
+ });
103
+ emitEvent("twoParameters", {
104
+ // @ts-expect-error
105
+ parameterUpdates: {}
106
+ });
107
+ emitEvent("twoParameters", {
108
+ // @ts-expect-error
109
+ parameterUpdates: {
110
+ myString: "string"
111
+ }
112
+ });
113
+ emitEvent("twoParameters", {
114
+ // @ts-expect-error
115
+ parameterUpdates: {
116
+ myNumber: 123
117
+ }
118
+ });
119
+ emitEvent("twoParameters", {
120
+ // @ts-expect-error
121
+ parameterUpdates: {
122
+ myNumber: 123,
123
+ myBoolean: true,
124
+ myString: "string"
125
+ }
126
+ });
127
+ emitEvent("twoParameters", {
128
+ parameterUpdates: {
129
+ myNumber: 123,
130
+ myBoolean: true
131
+ }
132
+ });
133
+ });
134
+ it("should not allow emit event type with an unknown event id", () => {
135
+ // @ts-expect-error
136
+ emitEvent("someOtherEventId", {});
137
+ });
138
+ });
139
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","names":["defineConfig","describe","it","id","name","description","type","parameters","myString","displayName","myNumber","myBoolean","events","noParameters","parameterUpdateIds","oneParameter","twoParameters","emitEvent","parameterUpdates"],"sources":["client.test.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 { defineConfig } from \"@osdk/widget.api\";\nimport { describe, it } from \"vitest\";\nimport type { FoundryWidgetClient } from \"./client.js\";\n\ndescribe(\"FoundryWidgetClient\", () => {\n const config = defineConfig({\n id: \"widgetId\",\n name: \"Widget Name\",\n description: \"Widget Description\",\n type: \"workshop\",\n parameters: {\n myString: {\n displayName: \"My string\",\n type: \"string\",\n },\n myNumber: {\n displayName: \"My number\",\n type: \"number\",\n },\n myBoolean: {\n displayName: \"My boolean\",\n type: \"boolean\",\n },\n },\n events: {\n noParameters: {\n displayName: \"No parameters\",\n parameterUpdateIds: [],\n },\n oneParameter: {\n displayName: \"One parameter\",\n parameterUpdateIds: [\"myString\"],\n },\n twoParameters: {\n displayName: \"Two parameters\",\n parameterUpdateIds: [\"myNumber\", \"myBoolean\"],\n },\n },\n });\n\n const emitEvent: FoundryWidgetClient<typeof config>[\"emitEvent\"] = (\n _eventId,\n _payload,\n ) => {};\n\n it(\"should narrow the emit event type when no parameters\", () => {\n emitEvent(\"noParameters\", {\n // @ts-expect-error\n parameterUpdates: [],\n });\n emitEvent(\"noParameters\", {\n // @ts-expect-error\n parameterUpdates: { myString: \"string\" },\n });\n\n emitEvent(\"noParameters\", {\n parameterUpdates: {},\n });\n });\n\n it(\"should narrow the emit event type with one parameter\", () => {\n emitEvent(\"oneParameter\", {\n // @ts-expect-error\n parameterUpdates: [],\n });\n emitEvent(\"oneParameter\", {\n // @ts-expect-error\n parameterUpdates: {},\n });\n emitEvent(\"oneParameter\", {\n // @ts-expect-error\n parameterUpdates: { myNumber: 123 },\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: { myString: \"string\", myNumber: 123 },\n });\n\n emitEvent(\"oneParameter\", {\n parameterUpdates: { myString: \"string\" },\n });\n });\n\n it(\"should narrow the emit event type with two parameters\", () => {\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: [],\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: {},\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: { myString: \"string\" },\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: { myNumber: 123 },\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: { myNumber: 123, myBoolean: true, myString: \"string\" },\n });\n\n emitEvent(\"twoParameters\", {\n parameterUpdates: { myNumber: 123, myBoolean: true },\n });\n });\n\n it(\"should not allow emit event type with an unknown event id\", () => {\n // @ts-expect-error\n emitEvent(\"someOtherEventId\", {});\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -31,7 +31,7 @@ interface FoundryWidgetClient<C extends WidgetConfig<C["parameters"]>> {
31
31
  /**
32
32
  * Emits an event with the given ID and payload
33
33
  */
34
- emitEvent: <M extends WidgetMessage.EmitEvent<C>>(eventId: M["payload"]["eventId"], payload: Omit<M["payload"], "eventId">) => void;
34
+ emitEvent: <M extends WidgetMessage.EmitEvent<C>, ID extends M["payload"]["eventId"]>(eventId: ID, payload: Omit<ExtractEmitEventPayload<M, ID>, "eventId">) => void;
35
35
  /**
36
36
  * Sends a message to the parent frame.
37
37
  * It is recommended to use the convenience methods for individual messages (e.g. ready or emitEvent) instead
@@ -50,6 +50,9 @@ interface FoundryWidgetClient<C extends WidgetConfig<C["parameters"]>> {
50
50
  */
51
51
  hostEventTarget: FoundryHostEventTarget<C>;
52
52
  }
53
+ type ExtractEmitEventPayload<M extends WidgetMessage.EmitEvent<any>, ID extends M["payload"]["eventId"]> = Extract<M["payload"], {
54
+ eventId: ID;
55
+ }>;
53
56
  declare function createFoundryWidgetClient<C extends WidgetConfig<C["parameters"]>>(): FoundryWidgetClient<C>;
54
57
 
55
58
  export { FoundryHostEventTarget, type FoundryWidgetClient, createFoundryWidgetClient };
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["HostMessage","visitHostMessage","invariant","FoundryHostEventTarget","createFoundryWidgetClient","window","process","env","NODE_ENV","widgetApi","__PALANTIR_WIDGET_API__","hostEventTarget","listenForHostMessages","event","detail","payload","dispatchEventMessage","_unknown","sendMessageToHost","message","sendMessage","ready","type","apiVersion","Version","emitEvent","eventId","subscribe","addEventListener","unsubscribe","removeEventListener"],"sources":["client.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 {\n HostMessage,\n visitHostMessage,\n type WidgetConfig,\n type WidgetMessage,\n} from \"@osdk/widget.api\";\nimport invariant from \"tiny-invariant\";\nimport { FoundryHostEventTarget } from \"./host.js\";\n\nexport interface FoundryWidgetClient<C extends WidgetConfig<C[\"parameters\"]>> {\n /**\n * Notifies the host that this client is ready to receive the first parameter values\n */\n ready: () => void;\n\n /**\n * Emits an event with the given ID and payload\n */\n emitEvent: <M extends WidgetMessage.EmitEvent<C>>(\n eventId: M[\"payload\"][\"eventId\"],\n payload: Omit<M[\"payload\"], \"eventId\">,\n ) => void;\n\n /**\n * Sends a message to the parent frame.\n * It is recommended to use the convenience methods for individual messages (e.g. ready or emitEvent) instead\n */\n sendMessage: <M extends WidgetMessage<C>>(message: M) => void;\n\n /**\n * Subscribes to events from the host, invoking the listener when a message is received\n */\n subscribe: () => void;\n\n /**\n * Unsubscribes a previously subscribed listener from host events, if one exists\n */\n unsubscribe: () => void;\n\n /**\n * Event targets on which you can subscribe to specific host messages\n */\n hostEventTarget: FoundryHostEventTarget<C>;\n}\n\ninterface PalantirWidgetApiEvents<C extends WidgetConfig<C[\"parameters\"]>> {\n message: CustomEvent<HostMessage<C>>;\n}\n\ninterface PalantirWidgetApi<C extends WidgetConfig<C[\"parameters\"]>> {\n sendMessage: <M extends WidgetMessage<C>>(message: M) => void;\n addEventListener<K extends keyof PalantirWidgetApiEvents<C>>(\n type: K,\n listener: (ev: PalantirWidgetApiEvents<C>[K]) => any,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener<K extends keyof PalantirWidgetApiEvents<C>>(\n type: K,\n listener: (ev: PalantirWidgetApiEvents<C>[K]) => any,\n options?: boolean | EventListenerOptions,\n ): void;\n}\n\nexport function createFoundryWidgetClient<\n C extends WidgetConfig<C[\"parameters\"]>,\n>(): FoundryWidgetClient<C> {\n invariant(\n \"__PALANTIR_WIDGET_API__\" in window,\n \"[FoundryWidgetClient] Missing __PALANTIR_WIDGET_API__ in window\",\n );\n const widgetApi = window.__PALANTIR_WIDGET_API__ as PalantirWidgetApi<C>;\n const hostEventTarget = new FoundryHostEventTarget<C>();\n\n const listenForHostMessages = (event: CustomEvent<HostMessage<C>>) => {\n visitHostMessage(event.detail, {\n \"host.update-parameters\": (payload) => {\n hostEventTarget.dispatchEventMessage(\"host.update-parameters\", payload);\n },\n _unknown: () => {\n // Do nothing\n },\n });\n };\n const sendMessageToHost = <M extends WidgetMessage<C>>(message: M) => {\n widgetApi.sendMessage(message);\n };\n\n return {\n hostEventTarget,\n ready: () => {\n sendMessageToHost({\n type: \"widget.ready\",\n payload: {\n apiVersion: HostMessage.Version,\n },\n });\n },\n emitEvent: (eventId, payload) => {\n sendMessageToHost({\n type: \"widget.emit-event\",\n payload: {\n eventId,\n ...payload,\n },\n });\n },\n sendMessage: sendMessageToHost,\n subscribe: () => {\n widgetApi.addEventListener(\"message\", listenForHostMessages);\n },\n unsubscribe: () => {\n widgetApi.removeEventListener(\"message\", listenForHostMessages);\n },\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SACEA,WAAW,EACXC,gBAAgB,QAGX,kBAAkB;AACzB,OAAOC,SAAS,MAAM,gBAAgB;AACtC,SAASC,sBAAsB,QAAQ,WAAW;AAwDlD,OAAO,SAASC,yBAAyBA,CAAA,EAEb;EAC1B,EACE,yBAAyB,IAAIC,MAAM,IAAAC,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBADrCN,SAAS,QAEP,iEAAiE,IAFnEA,SAAS;EAIT,MAAMO,SAAS,GAAGJ,MAAM,CAACK,uBAA+C;EACxE,MAAMC,eAAe,GAAG,IAAIR,sBAAsB,CAAI,CAAC;EAEvD,MAAMS,qBAAqB,GAAIC,KAAkC,IAAK;IACpEZ,gBAAgB,CAACY,KAAK,CAACC,MAAM,EAAE;MAC7B,wBAAwB,EAAGC,OAAO,IAAK;QACrCJ,eAAe,CAACK,oBAAoB,CAAC,wBAAwB,EAAED,OAAO,CAAC;MACzE,CAAC;MACDE,QAAQ,EAAEA,CAAA,KAAM;QACd;MAAA;IAEJ,CAAC,CAAC;EACJ,CAAC;EACD,MAAMC,iBAAiB,GAAgCC,OAAU,IAAK;IACpEV,SAAS,CAACW,WAAW,CAACD,OAAO,CAAC;EAChC,CAAC;EAED,OAAO;IACLR,eAAe;IACfU,KAAK,EAAEA,CAAA,KAAM;MACXH,iBAAiB,CAAC;QAChBI,IAAI,EAAE,cAAc;QACpBP,OAAO,EAAE;UACPQ,UAAU,EAAEvB,WAAW,CAACwB;QAC1B;MACF,CAAC,CAAC;IACJ,CAAC;IACDC,SAAS,EAAEA,CAACC,OAAO,EAAEX,OAAO,KAAK;MAC/BG,iBAAiB,CAAC;QAChBI,IAAI,EAAE,mBAAmB;QACzBP,OAAO,EAAE;UACPW,OAAO;UACP,GAAGX;QACL;MACF,CAAC,CAAC;IACJ,CAAC;IACDK,WAAW,EAAEF,iBAAiB;IAC9BS,SAAS,EAAEA,CAAA,KAAM;MACflB,SAAS,CAACmB,gBAAgB,CAAC,SAAS,EAAEhB,qBAAqB,CAAC;IAC9D,CAAC;IACDiB,WAAW,EAAEA,CAAA,KAAM;MACjBpB,SAAS,CAACqB,mBAAmB,CAAC,SAAS,EAAElB,qBAAqB,CAAC;IACjE;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"client.js","names":["HostMessage","visitHostMessage","invariant","FoundryHostEventTarget","createFoundryWidgetClient","window","process","env","NODE_ENV","widgetApi","__PALANTIR_WIDGET_API__","hostEventTarget","listenForHostMessages","event","detail","payload","dispatchEventMessage","_unknown","sendMessageToHost","message","sendMessage","ready","type","apiVersion","Version","emitEvent","eventId","subscribe","addEventListener","unsubscribe","removeEventListener"],"sources":["client.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 {\n HostMessage,\n visitHostMessage,\n type WidgetConfig,\n type WidgetMessage,\n} from \"@osdk/widget.api\";\nimport invariant from \"tiny-invariant\";\nimport { FoundryHostEventTarget } from \"./host.js\";\n\nexport interface FoundryWidgetClient<C extends WidgetConfig<C[\"parameters\"]>> {\n /**\n * Notifies the host that this client is ready to receive the first parameter values\n */\n ready: () => void;\n\n /**\n * Emits an event with the given ID and payload\n */\n emitEvent: <\n M extends WidgetMessage.EmitEvent<C>,\n ID extends M[\"payload\"][\"eventId\"],\n >(\n eventId: ID,\n payload: Omit<\n ExtractEmitEventPayload<M, ID>,\n \"eventId\"\n >,\n ) => void;\n\n /**\n * Sends a message to the parent frame.\n * It is recommended to use the convenience methods for individual messages (e.g. ready or emitEvent) instead\n */\n sendMessage: <M extends WidgetMessage<C>>(message: M) => void;\n\n /**\n * Subscribes to events from the host, invoking the listener when a message is received\n */\n subscribe: () => void;\n\n /**\n * Unsubscribes a previously subscribed listener from host events, if one exists\n */\n unsubscribe: () => void;\n\n /**\n * Event targets on which you can subscribe to specific host messages\n */\n hostEventTarget: FoundryHostEventTarget<C>;\n}\n\ntype ExtractEmitEventPayload<\n M extends WidgetMessage.EmitEvent<any>,\n ID extends M[\"payload\"][\"eventId\"],\n> = Extract<\n M[\"payload\"],\n { eventId: ID }\n>;\n\ninterface PalantirWidgetApiEvents<C extends WidgetConfig<C[\"parameters\"]>> {\n message: CustomEvent<HostMessage<C>>;\n}\n\ninterface PalantirWidgetApi<C extends WidgetConfig<C[\"parameters\"]>> {\n sendMessage: <M extends WidgetMessage<C>>(message: M) => void;\n addEventListener<K extends keyof PalantirWidgetApiEvents<C>>(\n type: K,\n listener: (ev: PalantirWidgetApiEvents<C>[K]) => any,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener<K extends keyof PalantirWidgetApiEvents<C>>(\n type: K,\n listener: (ev: PalantirWidgetApiEvents<C>[K]) => any,\n options?: boolean | EventListenerOptions,\n ): void;\n}\n\nexport function createFoundryWidgetClient<\n C extends WidgetConfig<C[\"parameters\"]>,\n>(): FoundryWidgetClient<C> {\n invariant(\n \"__PALANTIR_WIDGET_API__\" in window,\n \"[FoundryWidgetClient] Missing __PALANTIR_WIDGET_API__ in window\",\n );\n const widgetApi = window.__PALANTIR_WIDGET_API__ as PalantirWidgetApi<C>;\n const hostEventTarget = new FoundryHostEventTarget<C>();\n\n const listenForHostMessages = (event: CustomEvent<HostMessage<C>>) => {\n visitHostMessage(event.detail, {\n \"host.update-parameters\": (payload) => {\n hostEventTarget.dispatchEventMessage(\"host.update-parameters\", payload);\n },\n _unknown: () => {\n // Do nothing\n },\n });\n };\n const sendMessageToHost = <M extends WidgetMessage<C>>(message: M) => {\n widgetApi.sendMessage(message);\n };\n\n return {\n hostEventTarget,\n ready: () => {\n sendMessageToHost({\n type: \"widget.ready\",\n payload: {\n apiVersion: HostMessage.Version,\n },\n });\n },\n emitEvent: (eventId, payload) => {\n sendMessageToHost({\n type: \"widget.emit-event\",\n payload: {\n eventId,\n ...payload,\n },\n });\n },\n sendMessage: sendMessageToHost,\n subscribe: () => {\n widgetApi.addEventListener(\"message\", listenForHostMessages);\n },\n unsubscribe: () => {\n widgetApi.removeEventListener(\"message\", listenForHostMessages);\n },\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SACEA,WAAW,EACXC,gBAAgB,QAGX,kBAAkB;AACzB,OAAOC,SAAS,MAAM,gBAAgB;AACtC,SAASC,sBAAsB,QAAQ,WAAW;AAsElD,OAAO,SAASC,yBAAyBA,CAAA,EAEb;EAC1B,EACE,yBAAyB,IAAIC,MAAM,IAAAC,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBADrCN,SAAS,QAEP,iEAAiE,IAFnEA,SAAS;EAIT,MAAMO,SAAS,GAAGJ,MAAM,CAACK,uBAA+C;EACxE,MAAMC,eAAe,GAAG,IAAIR,sBAAsB,CAAI,CAAC;EAEvD,MAAMS,qBAAqB,GAAIC,KAAkC,IAAK;IACpEZ,gBAAgB,CAACY,KAAK,CAACC,MAAM,EAAE;MAC7B,wBAAwB,EAAGC,OAAO,IAAK;QACrCJ,eAAe,CAACK,oBAAoB,CAAC,wBAAwB,EAAED,OAAO,CAAC;MACzE,CAAC;MACDE,QAAQ,EAAEA,CAAA,KAAM;QACd;MAAA;IAEJ,CAAC,CAAC;EACJ,CAAC;EACD,MAAMC,iBAAiB,GAAgCC,OAAU,IAAK;IACpEV,SAAS,CAACW,WAAW,CAACD,OAAO,CAAC;EAChC,CAAC;EAED,OAAO;IACLR,eAAe;IACfU,KAAK,EAAEA,CAAA,KAAM;MACXH,iBAAiB,CAAC;QAChBI,IAAI,EAAE,cAAc;QACpBP,OAAO,EAAE;UACPQ,UAAU,EAAEvB,WAAW,CAACwB;QAC1B;MACF,CAAC,CAAC;IACJ,CAAC;IACDC,SAAS,EAAEA,CAACC,OAAO,EAAEX,OAAO,KAAK;MAC/BG,iBAAiB,CAAC;QAChBI,IAAI,EAAE,mBAAmB;QACzBP,OAAO,EAAE;UACPW,OAAO;UACP,GAAGX;QACL;MACF,CAAC,CAAC;IACJ,CAAC;IACDK,WAAW,EAAEF,iBAAiB;IAC9BS,SAAS,EAAEA,CAAA,KAAM;MACflB,SAAS,CAACmB,gBAAgB,CAAC,SAAS,EAAEhB,qBAAqB,CAAC;IAC9D,CAAC;IACDiB,WAAW,EAAEA,CAAA,KAAM;MACjBpB,SAAS,CAACqB,mBAAmB,CAAC,SAAS,EAAElB,qBAAqB,CAAC;IACjE;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,139 @@
1
+ /*
2
+ * Copyright 2024 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 { defineConfig } from "@osdk/widget.api";
18
+ import { describe, it } from "vitest";
19
+ describe("FoundryWidgetClient", () => {
20
+ defineConfig({
21
+ id: "widgetId",
22
+ name: "Widget Name",
23
+ description: "Widget Description",
24
+ type: "workshop",
25
+ parameters: {
26
+ myString: {
27
+ displayName: "My string",
28
+ type: "string"
29
+ },
30
+ myNumber: {
31
+ displayName: "My number",
32
+ type: "number"
33
+ },
34
+ myBoolean: {
35
+ displayName: "My boolean",
36
+ type: "boolean"
37
+ }
38
+ },
39
+ events: {
40
+ noParameters: {
41
+ displayName: "No parameters",
42
+ parameterUpdateIds: []
43
+ },
44
+ oneParameter: {
45
+ displayName: "One parameter",
46
+ parameterUpdateIds: ["myString"]
47
+ },
48
+ twoParameters: {
49
+ displayName: "Two parameters",
50
+ parameterUpdateIds: ["myNumber", "myBoolean"]
51
+ }
52
+ }
53
+ });
54
+ const emitEvent = () => {};
55
+ it("should narrow the emit event type when no parameters", () => {
56
+ emitEvent("noParameters", {
57
+ // @ts-expect-error
58
+ parameterUpdates: []
59
+ });
60
+ emitEvent("noParameters", {
61
+ // @ts-expect-error
62
+ parameterUpdates: {
63
+ myString: "string"
64
+ }
65
+ });
66
+ emitEvent("noParameters", {
67
+ parameterUpdates: {}
68
+ });
69
+ });
70
+ it("should narrow the emit event type with one parameter", () => {
71
+ emitEvent("oneParameter", {
72
+ // @ts-expect-error
73
+ parameterUpdates: []
74
+ });
75
+ emitEvent("oneParameter", {
76
+ // @ts-expect-error
77
+ parameterUpdates: {}
78
+ });
79
+ emitEvent("oneParameter", {
80
+ // @ts-expect-error
81
+ parameterUpdates: {
82
+ myNumber: 123
83
+ }
84
+ });
85
+ emitEvent("twoParameters", {
86
+ // @ts-expect-error
87
+ parameterUpdates: {
88
+ myString: "string",
89
+ myNumber: 123
90
+ }
91
+ });
92
+ emitEvent("oneParameter", {
93
+ parameterUpdates: {
94
+ myString: "string"
95
+ }
96
+ });
97
+ });
98
+ it("should narrow the emit event type with two parameters", () => {
99
+ emitEvent("twoParameters", {
100
+ // @ts-expect-error
101
+ parameterUpdates: []
102
+ });
103
+ emitEvent("twoParameters", {
104
+ // @ts-expect-error
105
+ parameterUpdates: {}
106
+ });
107
+ emitEvent("twoParameters", {
108
+ // @ts-expect-error
109
+ parameterUpdates: {
110
+ myString: "string"
111
+ }
112
+ });
113
+ emitEvent("twoParameters", {
114
+ // @ts-expect-error
115
+ parameterUpdates: {
116
+ myNumber: 123
117
+ }
118
+ });
119
+ emitEvent("twoParameters", {
120
+ // @ts-expect-error
121
+ parameterUpdates: {
122
+ myNumber: 123,
123
+ myBoolean: true,
124
+ myString: "string"
125
+ }
126
+ });
127
+ emitEvent("twoParameters", {
128
+ parameterUpdates: {
129
+ myNumber: 123,
130
+ myBoolean: true
131
+ }
132
+ });
133
+ });
134
+ it("should not allow emit event type with an unknown event id", () => {
135
+ // @ts-expect-error
136
+ emitEvent("someOtherEventId", {});
137
+ });
138
+ });
139
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","names":["defineConfig","describe","it","id","name","description","type","parameters","myString","displayName","myNumber","myBoolean","events","noParameters","parameterUpdateIds","oneParameter","twoParameters","emitEvent","parameterUpdates"],"sources":["client.test.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 { defineConfig } from \"@osdk/widget.api\";\nimport { describe, it } from \"vitest\";\nimport type { FoundryWidgetClient } from \"./client.js\";\n\ndescribe(\"FoundryWidgetClient\", () => {\n const config = defineConfig({\n id: \"widgetId\",\n name: \"Widget Name\",\n description: \"Widget Description\",\n type: \"workshop\",\n parameters: {\n myString: {\n displayName: \"My string\",\n type: \"string\",\n },\n myNumber: {\n displayName: \"My number\",\n type: \"number\",\n },\n myBoolean: {\n displayName: \"My boolean\",\n type: \"boolean\",\n },\n },\n events: {\n noParameters: {\n displayName: \"No parameters\",\n parameterUpdateIds: [],\n },\n oneParameter: {\n displayName: \"One parameter\",\n parameterUpdateIds: [\"myString\"],\n },\n twoParameters: {\n displayName: \"Two parameters\",\n parameterUpdateIds: [\"myNumber\", \"myBoolean\"],\n },\n },\n });\n\n const emitEvent: FoundryWidgetClient<typeof config>[\"emitEvent\"] = (\n _eventId,\n _payload,\n ) => {};\n\n it(\"should narrow the emit event type when no parameters\", () => {\n emitEvent(\"noParameters\", {\n // @ts-expect-error\n parameterUpdates: [],\n });\n emitEvent(\"noParameters\", {\n // @ts-expect-error\n parameterUpdates: { myString: \"string\" },\n });\n\n emitEvent(\"noParameters\", {\n parameterUpdates: {},\n });\n });\n\n it(\"should narrow the emit event type with one parameter\", () => {\n emitEvent(\"oneParameter\", {\n // @ts-expect-error\n parameterUpdates: [],\n });\n emitEvent(\"oneParameter\", {\n // @ts-expect-error\n parameterUpdates: {},\n });\n emitEvent(\"oneParameter\", {\n // @ts-expect-error\n parameterUpdates: { myNumber: 123 },\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: { myString: \"string\", myNumber: 123 },\n });\n\n emitEvent(\"oneParameter\", {\n parameterUpdates: { myString: \"string\" },\n });\n });\n\n it(\"should narrow the emit event type with two parameters\", () => {\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: [],\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: {},\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: { myString: \"string\" },\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: { myNumber: 123 },\n });\n emitEvent(\"twoParameters\", {\n // @ts-expect-error\n parameterUpdates: { myNumber: 123, myBoolean: true, myString: \"string\" },\n });\n\n emitEvent(\"twoParameters\", {\n parameterUpdates: { myNumber: 123, myBoolean: true },\n });\n });\n\n it(\"should not allow emit event type with an unknown event id\", () => {\n // @ts-expect-error\n emitEvent(\"someOtherEventId\", {});\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,10 @@ export interface FoundryWidgetClient<C extends WidgetConfig<C["parameters"]>> {
8
8
  /**
9
9
  * Emits an event with the given ID and payload
10
10
  */
11
- emitEvent: <M extends WidgetMessage.EmitEvent<C>>(eventId: M["payload"]["eventId"], payload: Omit<M["payload"], "eventId">) => void;
11
+ emitEvent: <
12
+ M extends WidgetMessage.EmitEvent<C>,
13
+ ID extends M["payload"]["eventId"]
14
+ >(eventId: ID, payload: Omit<ExtractEmitEventPayload<M, ID>, "eventId">) => void;
12
15
  /**
13
16
  * Sends a message to the parent frame.
14
17
  * It is recommended to use the convenience methods for individual messages (e.g. ready or emitEvent) instead
@@ -27,4 +30,11 @@ export interface FoundryWidgetClient<C extends WidgetConfig<C["parameters"]>> {
27
30
  */
28
31
  hostEventTarget: FoundryHostEventTarget<C>;
29
32
  }
33
+ type ExtractEmitEventPayload<
34
+ M extends WidgetMessage.EmitEvent<any>,
35
+ ID extends M["payload"]["eventId"]
36
+ > = Extract<M["payload"], {
37
+ eventId: ID
38
+ }>;
30
39
  export declare function createFoundryWidgetClient<C extends WidgetConfig<C["parameters"]>>(): FoundryWidgetClient<C>;
40
+ export {};
@@ -1 +1 @@
1
- {"mappings":"AAgBA,cAGO,mBACA,qBACA,kBAAmB;AAE1B,SAAS,8BAA8B,WAAY;AAEnD,iBAAiB,oBAAoB,UAAU,aAAa,EAAE,gBAAgB;;;;CAI5E;;;;CAKA,YAAY,UAAU,cAAc,UAAU,IAC5CA,SAAS,EAAE,WAAW,YACtBC,SAAS,KAAK,EAAE,YAAY;;;;;CAO9B,cAAc,UAAU,cAAc,IAAIC,SAAS;;;;CAKnD;;;;CAKA;;;;CAKA,iBAAiB,uBAAuB;AACzC;AAoBD,OAAO,iBAAS,0BACd,UAAU,aAAa,EAAE,mBACtB,oBAAoB","names":["eventId: M[\"payload\"][\"eventId\"]","payload: Omit<M[\"payload\"], \"eventId\">","message: M"],"sources":["../../src/client.ts"],"version":3,"file":"client.d.ts"}
1
+ {"mappings":"AAgBA,cAGO,mBACA,qBACA,kBAAmB;AAE1B,SAAS,8BAA8B,WAAY;AAEnD,iBAAiB,oBAAoB,UAAU,aAAa,EAAE,gBAAgB;;;;CAI5E;;;;CAKA;EACE,UAAU,cAAc,UAAU;EAClC,WAAW,EAAE,WAAW;GAExBA,SAAS,IACTC,SAAS,KACP,wBAAwB,GAAG,KAC3B;;;;;CAQJ,cAAc,UAAU,cAAc,IAAIC,SAAS;;;;CAKnD;;;;CAKA;;;;CAKA,iBAAiB,uBAAuB;AACzC;KAEI;CACH,UAAU,cAAc;CACxB,WAAW,EAAE,WAAW;IACtB,QACF,EAAE,YACF;CAAE,SAAS;AAAI;AAqBjB,OAAO,iBAAS,0BACd,UAAU,aAAa,EAAE,mBACtB,oBAAoB","names":["eventId: ID","payload: Omit<\n ExtractEmitEventPayload<M, ID>,\n \"eventId\"\n >","message: M"],"sources":["../../src/client.ts"],"version":3,"file":"client.d.ts"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"mappings":"","names":[],"sources":["../../src/client.test.ts"],"version":3,"file":"client.test.d.ts"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@osdk/widget.client",
3
- "version": "3.1.0-beta.3",
3
+ "version": "3.1.0-beta.5",
4
4
  "description": "Client that sets up listeners for the custom widgets embedded into Foundry, adhering to the contract laid out in @osdk/widget.api",
5
5
  "access": "public",
6
6
  "license": "Apache-2.0",
@@ -30,13 +30,13 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "tiny-invariant": "^1.3.1",
33
- "@osdk/widget.api": "~3.1.0-beta.3"
33
+ "@osdk/widget.api": "~3.1.0-beta.5"
34
34
  },
35
35
  "devDependencies": {
36
36
  "ts-expect": "^1.3.0",
37
37
  "typescript": "~5.5.4",
38
- "@osdk/monorepo.api-extractor": "~0.3.0-beta.1",
39
- "@osdk/monorepo.tsconfig": "~0.3.0-beta.1"
38
+ "@osdk/monorepo.tsconfig": "~0.3.0-beta.1",
39
+ "@osdk/monorepo.api-extractor": "~0.3.0-beta.1"
40
40
  },
41
41
  "publishConfig": {
42
42
  "access": "public"