@thoughtspot/ts-chart-sdk 0.0.1-alpha.9 → 0.0.2-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/dist/ts-chart-sdk.d.ts +449 -31
  2. package/lib/index.d.ts +3 -0
  3. package/lib/index.d.ts.map +1 -1
  4. package/lib/index.js +3 -0
  5. package/lib/index.js.map +1 -1
  6. package/lib/main/custom-chart-context.d.ts +17 -5
  7. package/lib/main/custom-chart-context.d.ts.map +1 -1
  8. package/lib/main/custom-chart-context.js +74 -34
  9. package/lib/main/custom-chart-context.js.map +1 -1
  10. package/lib/main/custom-chart-context.spec.js +256 -257
  11. package/lib/main/custom-chart-context.spec.js.map +1 -1
  12. package/lib/main/post-message-event-bridge.d.ts +3 -3
  13. package/lib/main/post-message-event-bridge.d.ts.map +1 -1
  14. package/lib/main/post-message-event-bridge.js +24 -36
  15. package/lib/main/post-message-event-bridge.js.map +1 -1
  16. package/lib/main/post-message-event-bridge.spec.js +0 -2
  17. package/lib/main/post-message-event-bridge.spec.js.map +1 -1
  18. package/lib/main/util.d.ts +2 -0
  19. package/lib/main/util.d.ts.map +1 -0
  20. package/lib/main/util.js +9 -0
  21. package/lib/main/util.js.map +1 -0
  22. package/lib/react/use-custom-chart-context.spec.js +128 -121
  23. package/lib/react/use-custom-chart-context.spec.js.map +1 -1
  24. package/lib/test/test-conditional-formatting-utils.d.ts +5 -0
  25. package/lib/test/test-conditional-formatting-utils.d.ts.map +1 -0
  26. package/lib/test/test-conditional-formatting-utils.js +43 -0
  27. package/lib/test/test-conditional-formatting-utils.js.map +1 -0
  28. package/lib/types/answer-column.types.d.ts +54 -1
  29. package/lib/types/answer-column.types.d.ts.map +1 -1
  30. package/lib/types/answer-column.types.js +47 -0
  31. package/lib/types/answer-column.types.js.map +1 -1
  32. package/lib/types/common.types.d.ts +51 -4
  33. package/lib/types/common.types.d.ts.map +1 -1
  34. package/lib/types/common.types.js +15 -1
  35. package/lib/types/common.types.js.map +1 -1
  36. package/lib/types/conditional-formatting.types.d.ts +155 -0
  37. package/lib/types/conditional-formatting.types.d.ts.map +1 -0
  38. package/lib/types/conditional-formatting.types.js +60 -0
  39. package/lib/types/conditional-formatting.types.js.map +1 -0
  40. package/lib/types/configurator.types.d.ts +5 -0
  41. package/lib/types/configurator.types.d.ts.map +1 -1
  42. package/lib/types/ts-to-chart-event.types.d.ts +3 -0
  43. package/lib/types/ts-to-chart-event.types.d.ts.map +1 -1
  44. package/lib/types/ts-to-chart-event.types.js.map +1 -1
  45. package/lib/types/visual-prop.types.d.ts +3 -0
  46. package/lib/types/visual-prop.types.d.ts.map +1 -1
  47. package/lib/utils/conditional-formatting/conditional-formatting.d.ts +10 -0
  48. package/lib/utils/conditional-formatting/conditional-formatting.d.ts.map +1 -0
  49. package/lib/utils/conditional-formatting/conditional-formatting.js +103 -0
  50. package/lib/utils/conditional-formatting/conditional-formatting.js.map +1 -0
  51. package/lib/utils/conditional-formatting/conditional-formatting.spec.d.ts +2 -0
  52. package/lib/utils/conditional-formatting/conditional-formatting.spec.d.ts.map +1 -0
  53. package/lib/utils/conditional-formatting/conditional-formatting.spec.js +142 -0
  54. package/lib/utils/conditional-formatting/conditional-formatting.spec.js.map +1 -0
  55. package/lib/utils/date-formatting.d.ts +19 -0
  56. package/lib/utils/date-formatting.d.ts.map +1 -0
  57. package/lib/utils/date-formatting.js +56 -0
  58. package/lib/utils/date-formatting.js.map +1 -0
  59. package/lib/utils/date-formatting.spec.d.ts +2 -0
  60. package/lib/utils/date-formatting.spec.d.ts.map +1 -0
  61. package/lib/utils/date-formatting.spec.js +124 -0
  62. package/lib/utils/date-formatting.spec.js.map +1 -0
  63. package/package.json +10 -7
  64. package/src/index.ts +3 -0
  65. package/src/main/custom-chart-context.spec.ts +291 -266
  66. package/src/main/custom-chart-context.ts +164 -46
  67. package/src/main/post-message-event-bridge.spec.ts +0 -3
  68. package/src/main/post-message-event-bridge.ts +36 -62
  69. package/src/main/util.ts +11 -0
  70. package/src/react/use-custom-chart-context.spec.tsx +149 -122
  71. package/src/test/test-conditional-formatting-utils.ts +95 -0
  72. package/src/types/answer-column.types.ts +98 -0
  73. package/src/types/common.types.ts +82 -10
  74. package/src/types/conditional-formatting.types.ts +172 -0
  75. package/src/types/configurator.types.ts +21 -0
  76. package/src/types/ts-to-chart-event.types.ts +15 -0
  77. package/src/types/visual-prop.types.ts +7 -0
  78. package/src/utils/conditional-formatting/conditional-formatting.spec.ts +469 -0
  79. package/src/utils/conditional-formatting/conditional-formatting.ts +229 -0
  80. package/src/utils/date-formatting.spec.ts +168 -0
  81. package/src/utils/date-formatting.ts +109 -0
  82. package/cjs/index.d.ts +0 -9
  83. package/cjs/index.d.ts.map +0 -1
  84. package/cjs/index.js +0 -25
  85. package/cjs/index.js.map +0 -1
  86. package/cjs/main/custom-chart-context.d.ts +0 -47
  87. package/cjs/main/custom-chart-context.d.ts.map +0 -1
  88. package/cjs/main/custom-chart-context.js +0 -326
  89. package/cjs/main/custom-chart-context.js.map +0 -1
  90. package/cjs/main/custom-chart-context.spec.d.ts +0 -2
  91. package/cjs/main/custom-chart-context.spec.d.ts.map +0 -1
  92. package/cjs/main/custom-chart-context.spec.js +0 -699
  93. package/cjs/main/custom-chart-context.spec.js.map +0 -1
  94. package/cjs/main/post-message-event-bridge.d.ts +0 -6
  95. package/cjs/main/post-message-event-bridge.d.ts.map +0 -1
  96. package/cjs/main/post-message-event-bridge.js +0 -46
  97. package/cjs/main/post-message-event-bridge.js.map +0 -1
  98. package/cjs/main/post-message-event-bridge.spec.d.ts +0 -2
  99. package/cjs/main/post-message-event-bridge.spec.d.ts.map +0 -1
  100. package/cjs/main/post-message-event-bridge.spec.js +0 -124
  101. package/cjs/main/post-message-event-bridge.spec.js.map +0 -1
  102. package/cjs/react/custom-chart-context-service.d.ts +0 -33
  103. package/cjs/react/custom-chart-context-service.d.ts.map +0 -1
  104. package/cjs/react/custom-chart-context-service.js +0 -118
  105. package/cjs/react/custom-chart-context-service.js.map +0 -1
  106. package/cjs/react/custom-chart.context.d.ts +0 -26
  107. package/cjs/react/custom-chart.context.d.ts.map +0 -1
  108. package/cjs/react/custom-chart.context.js +0 -105
  109. package/cjs/react/custom-chart.context.js.map +0 -1
  110. package/cjs/react/custom-chart.spec.d.ts +0 -2
  111. package/cjs/react/custom-chart.spec.d.ts.map +0 -1
  112. package/cjs/react/custom-chart.spec.js +0 -72
  113. package/cjs/react/custom-chart.spec.js.map +0 -1
  114. package/cjs/react/mocks/custom-chart-context-mock.d.ts +0 -3
  115. package/cjs/react/mocks/custom-chart-context-mock.d.ts.map +0 -1
  116. package/cjs/react/mocks/custom-chart-context-mock.js +0 -100
  117. package/cjs/react/mocks/custom-chart-context-mock.js.map +0 -1
  118. package/cjs/react/use-custom-chart-context.d.ts +0 -4
  119. package/cjs/react/use-custom-chart-context.d.ts.map +0 -1
  120. package/cjs/react/use-custom-chart-context.js +0 -95
  121. package/cjs/react/use-custom-chart-context.js.map +0 -1
  122. package/cjs/react/use-custom-chart-context.spec.d.ts +0 -2
  123. package/cjs/react/use-custom-chart-context.spec.d.ts.map +0 -1
  124. package/cjs/react/use-custom-chart-context.spec.js +0 -391
  125. package/cjs/react/use-custom-chart-context.spec.js.map +0 -1
  126. package/cjs/react/use-custom-chart-context.util.d.ts +0 -6
  127. package/cjs/react/use-custom-chart-context.util.d.ts.map +0 -1
  128. package/cjs/react/use-custom-chart-context.util.js +0 -60
  129. package/cjs/react/use-custom-chart-context.util.js.map +0 -1
  130. package/cjs/react/use-custom-chart-types.d.ts +0 -23
  131. package/cjs/react/use-custom-chart-types.d.ts.map +0 -1
  132. package/cjs/react/use-custom-chart-types.js +0 -3
  133. package/cjs/react/use-custom-chart-types.js.map +0 -1
  134. package/cjs/test/test-utils.d.ts +0 -7
  135. package/cjs/test/test-utils.d.ts.map +0 -1
  136. package/cjs/test/test-utils.js +0 -14
  137. package/cjs/test/test-utils.js.map +0 -1
  138. package/cjs/types/answer-column.types.d.ts +0 -69
  139. package/cjs/types/answer-column.types.d.ts.map +0 -1
  140. package/cjs/types/answer-column.types.js +0 -59
  141. package/cjs/types/answer-column.types.js.map +0 -1
  142. package/cjs/types/chart-to-ts-event.types.d.ts +0 -98
  143. package/cjs/types/chart-to-ts-event.types.d.ts.map +0 -1
  144. package/cjs/types/chart-to-ts-event.types.js +0 -32
  145. package/cjs/types/chart-to-ts-event.types.js.map +0 -1
  146. package/cjs/types/common.types.d.ts +0 -51
  147. package/cjs/types/common.types.d.ts.map +0 -1
  148. package/cjs/types/common.types.js +0 -3
  149. package/cjs/types/common.types.js.map +0 -1
  150. package/cjs/types/configurator.types.d.ts +0 -15
  151. package/cjs/types/configurator.types.d.ts.map +0 -1
  152. package/cjs/types/configurator.types.js +0 -3
  153. package/cjs/types/configurator.types.js.map +0 -1
  154. package/cjs/types/ts-to-chart-event.types.d.ts +0 -91
  155. package/cjs/types/ts-to-chart-event.types.d.ts.map +0 -1
  156. package/cjs/types/ts-to-chart-event.types.js +0 -18
  157. package/cjs/types/ts-to-chart-event.types.js.map +0 -1
  158. package/cjs/types/visual-prop.types.d.ts +0 -73
  159. package/cjs/types/visual-prop.types.d.ts.map +0 -1
  160. package/cjs/types/visual-prop.types.js +0 -3
  161. package/cjs/types/visual-prop.types.js.map +0 -1
  162. package/lib/dist/ts-chart-sdk.d.ts +0 -312
  163. package/lib/react/custom-chart-context-service.d.ts +0 -33
  164. package/lib/react/custom-chart-context-service.d.ts.map +0 -1
  165. package/lib/react/custom-chart-context-service.js +0 -91
  166. package/lib/react/custom-chart-context-service.js.map +0 -1
  167. package/lib/react/custom-chart.context.d.ts +0 -26
  168. package/lib/react/custom-chart.context.d.ts.map +0 -1
  169. package/lib/react/custom-chart.context.js +0 -78
  170. package/lib/react/custom-chart.context.js.map +0 -1
  171. package/lib/react/custom-chart.spec.d.ts +0 -2
  172. package/lib/react/custom-chart.spec.d.ts.map +0 -1
  173. package/lib/react/custom-chart.spec.js +0 -67
  174. package/lib/react/custom-chart.spec.js.map +0 -1
@@ -11,7 +11,7 @@ import { TSToChartEvent } from '../types/ts-to-chart-event.types';
11
11
  import { CustomChartContext, getChartContext } from './custom-chart-context';
12
12
  import * as PostMessageEventBridge from './post-message-event-bridge';
13
13
 
14
- jest.mock('./post-message-event-bridge');
14
+ // jest.mock('./post-message-event-bridge');
15
15
 
16
16
  jest.spyOn(console, 'log').mockImplementation(() => {
17
17
  // do nothing.
@@ -39,6 +39,7 @@ describe('CustomChartContext', () => {
39
39
 
40
40
  mockInitMessage.mockImplementation((fn: any) => {
41
41
  eventProcessor = fn;
42
+ return () => null;
42
43
  });
43
44
 
44
45
  mockPostMessageToHost.mockImplementation(() => {
@@ -85,64 +86,110 @@ describe('CustomChartContext', () => {
85
86
  const promise = customChartContext.initialize();
86
87
 
87
88
  // Check that the hasInitializedPromise has resolved
88
- const mockPostMessage = jest.fn();
89
- eventProcessor({
90
- data: {
91
- payload: mockInitializeContextPayload,
92
- eventType: TSToChartEvent.Initialize,
93
- source: 'ts-host-app',
94
- },
95
- ports: [{ postMessage: mockPostMessage }],
89
+
90
+ const initResp = await eventProcessor({
91
+ payload: mockInitializeContextPayload,
92
+ eventType: TSToChartEvent.Initialize,
96
93
  });
97
94
 
98
95
  eventProcessor({
99
- data: {
100
- payload: {},
101
- eventType: TSToChartEvent.InitializeComplete,
102
- source: 'ts-host-app',
103
- },
104
- ports: [{ postMessage: mockPostMessage }],
96
+ payload: {},
97
+ eventType: TSToChartEvent.InitializeComplete,
105
98
  });
106
99
 
107
100
  await expect(promise).resolves.toBeUndefined();
108
- expect(mockPostMessage).toHaveBeenCalledTimes(2);
109
101
 
110
- expect(mockPostMessage.mock.calls[0][0]).toEqual({
102
+ expect(initResp).toEqual({
111
103
  isConfigValid: false,
112
104
  defaultChartConfig: undefined,
113
105
  chartConfigEditorDefinition: undefined,
114
106
  visualPropEditorDefinition: undefined,
107
+ allowedConfigurations: {
108
+ allowColumnNumberFormatting: false,
109
+ allowColumnConditionalFormatting: false,
110
+ allowMeasureNamesAndValues: false,
111
+ },
115
112
  });
116
- expect(mockPostMessage).toHaveBeenCalled();
117
113
  expect(mockPostMessageToHost).not.toHaveBeenCalled();
118
114
  });
119
115
 
120
- test('multiple intializations should throw an error', async () => {
116
+ test('type check string for visualProps on initialize payload should not throw an error.', async () => {
117
+ expect(mockInitMessage).toHaveBeenCalled();
118
+
121
119
  // Call the initialize function and wait for it to resolve
122
120
  const promise = customChartContext.initialize();
123
121
 
124
122
  // Check that the hasInitializedPromise has resolved
125
- const mockPostMessage = jest.fn();
126
- eventProcessor({
127
- data: {
128
- payload: mockInitializeContextPayload,
129
- eventType: TSToChartEvent.Initialize,
130
- source: 'ts-host-app',
123
+
124
+ const mockInitializeContextPayloadWithVisualProps = {
125
+ ...mockInitializeContextPayload,
126
+ chartModel: {
127
+ ...mockInitializeContextPayload.chartModel,
128
+ visualProps: 'visualPropStringPayload',
131
129
  },
132
- ports: [{ postMessage: mockPostMessage }],
133
- });
130
+ };
134
131
 
132
+ await eventProcessor({
133
+ payload: mockInitializeContextPayloadWithVisualProps,
134
+ eventType: TSToChartEvent.Initialize,
135
+ });
135
136
  eventProcessor({
136
- data: {
137
- payload: {},
138
- eventType: TSToChartEvent.InitializeComplete,
139
- source: 'ts-host-app',
140
- },
141
- ports: [{ postMessage: mockPostMessage }],
137
+ payload: {},
138
+ eventType: TSToChartEvent.InitializeComplete,
142
139
  });
140
+ await expect(promise).resolves.toBeUndefined();
141
+ const chartModel = customChartContext.getChartModel();
142
+ expect(typeof chartModel.visualProps).toEqual('string');
143
+ expect(chartModel.visualProps).toEqual('visualPropStringPayload');
144
+ expect(mockPostMessageToHost).not.toHaveBeenCalled();
145
+ });
146
+
147
+ test('type check object for visualProps on initialize payload should not throw an error.', async () => {
148
+ expect(mockInitMessage).toHaveBeenCalled();
143
149
 
150
+ // Call the initialize function and wait for it to resolve
151
+ const promise = customChartContext.initialize();
152
+
153
+ // Check that the hasInitializedPromise has resolved
154
+
155
+ const mockInitializeContextPayloadWithVisualProps = {
156
+ ...mockInitializeContextPayload,
157
+ chartModel: {
158
+ ...mockInitializeContextPayload.chartModel,
159
+ visualProps: {
160
+ data: 'sample data',
161
+ },
162
+ },
163
+ };
164
+
165
+ await eventProcessor({
166
+ payload: mockInitializeContextPayloadWithVisualProps,
167
+ eventType: TSToChartEvent.Initialize,
168
+ });
169
+ eventProcessor({
170
+ payload: {},
171
+ eventType: TSToChartEvent.InitializeComplete,
172
+ });
144
173
  await expect(promise).resolves.toBeUndefined();
174
+ const chartModel = customChartContext.getChartModel();
175
+ expect(typeof chartModel.visualProps).toEqual('object');
176
+ expect(chartModel.visualProps).toEqual({
177
+ data: 'sample data',
178
+ });
179
+ expect(mockPostMessageToHost).not.toHaveBeenCalled();
180
+ });
145
181
 
182
+ test('multiple intializations should throw an error', async () => {
183
+ // Call the initialize function and wait for it to resolve
184
+ getChartContext({
185
+ getDefaultChartConfig,
186
+ getQueriesFromChartConfig,
187
+ renderChart,
188
+ });
189
+ eventProcessor({
190
+ payload: {},
191
+ eventType: TSToChartEvent.InitializeComplete,
192
+ });
146
193
  let error;
147
194
  try {
148
195
  customChartContext = new CustomChartContext({
@@ -184,126 +231,192 @@ describe('CustomChartContext', () => {
184
231
  eventProcessor = null;
185
232
  });
186
233
 
187
- test('should not trigger post message if host is not accurate', () => {
188
- expect(mockInitMessage).toHaveBeenCalled();
234
+ test('TSToChartEvent.ChartConfigValidate validation response testing', async () => {
235
+ // Define initial context with object definitions
236
+ customChartContext = new CustomChartContext({
237
+ getDefaultChartConfig,
238
+ getQueriesFromChartConfig,
239
+ renderChart,
240
+ visualPropEditorDefinition: { elements: [] },
241
+ chartConfigEditorDefinition: [],
242
+ });
189
243
 
190
- // mock the event trigger for ChartConfigValidate
191
- const mockPostMessage = jest.fn();
192
- eventProcessor({
193
- data: {
194
- payload: mockInitializeContextPayload,
195
- eventType: TSToChartEvent.ChartConfigValidate,
196
- source: 'incorrect-source',
244
+ // Trigger event processor with initial context
245
+ const responseWithInitialContext = await eventProcessor({
246
+ payload: mockInitializeContextPayload,
247
+ eventType: TSToChartEvent.ChartConfigValidate,
248
+ source: 'ts-host-app',
249
+ });
250
+ // Verify response with object definitions
251
+ expect(responseWithInitialContext).toStrictEqual({
252
+ isValid: true,
253
+ visualPropEditorDefinition: { elements: [] },
254
+ chartConfigEditorDefinition: [],
255
+ });
256
+
257
+ // Redefine context with function-returned definitions
258
+ customChartContext = new CustomChartContext({
259
+ getDefaultChartConfig,
260
+ getQueriesFromChartConfig,
261
+ renderChart,
262
+ visualPropEditorDefinition: () => {
263
+ return { elements: [] };
264
+ },
265
+ chartConfigEditorDefinition: () => {
266
+ return [
267
+ {
268
+ key: 'x',
269
+ columnSections: [{ label: 'x-axis', key: 'x' }],
270
+ },
271
+ ];
197
272
  },
198
- ports: [{ postMessage: mockPostMessage }],
199
273
  });
200
- // Check that the event listener was added to the eventListeners
201
- // object
202
- expect(mockPostMessage).not.toHaveBeenCalled();
274
+ // Trigger event processor with updated context
275
+ const responseWithUpdatedContext = await eventProcessor({
276
+ payload: mockInitializeContextPayload,
277
+ eventType: TSToChartEvent.ChartConfigValidate,
278
+ source: 'ts-host-app',
279
+ });
280
+ // Verify response with function-returned definitions
281
+ expect(responseWithUpdatedContext).toStrictEqual({
282
+ isValid: true,
283
+ visualPropEditorDefinition: { elements: [] },
284
+ chartConfigEditorDefinition: [
285
+ {
286
+ key: 'x',
287
+ columnSections: [{ label: 'x-axis', key: 'x' }],
288
+ },
289
+ ],
290
+ });
203
291
  });
204
292
 
205
- test('default internal function testing', () => {
293
+ test('TSToChartEvent.validateVisualProps validation response testing', () => {
294
+ // Define initial context with object definitions
295
+ customChartContext = new CustomChartContext({
296
+ getDefaultChartConfig,
297
+ getQueriesFromChartConfig,
298
+ renderChart,
299
+ visualPropEditorDefinition: { elements: [] },
300
+ chartConfigEditorDefinition: [],
301
+ });
302
+
303
+ // Trigger event processor with initial context
304
+ const responseWithInitialContext = eventProcessor({
305
+ payload: mockInitializeContextPayload,
306
+ eventType: TSToChartEvent.VisualPropsValidate,
307
+ source: 'ts-host-app',
308
+ });
309
+ // Verify response with object definitions
310
+ expect(responseWithInitialContext).toStrictEqual({
311
+ isValid: true,
312
+ visualPropEditorDefinition: { elements: [] },
313
+ chartConfigEditorDefinition: [],
314
+ });
315
+ // Redefine context with function-returned definitions
316
+ customChartContext = new CustomChartContext({
317
+ getDefaultChartConfig,
318
+ getQueriesFromChartConfig,
319
+ renderChart,
320
+ visualPropEditorDefinition: () => {
321
+ return { elements: [] };
322
+ },
323
+ chartConfigEditorDefinition: () => {
324
+ return [
325
+ {
326
+ key: 'x',
327
+ columnSections: [{ label: 'x-axis', key: 'x' }],
328
+ },
329
+ ];
330
+ },
331
+ });
332
+ // Trigger event processor with updated context
333
+ const responseWithFunctionReturnedValues = eventProcessor({
334
+ payload: mockInitializeContextPayload,
335
+ eventType: TSToChartEvent.VisualPropsValidate,
336
+ source: 'ts-host-app',
337
+ });
338
+ // Verify response with function-returned definitions
339
+ expect(responseWithFunctionReturnedValues).toStrictEqual({
340
+ isValid: true,
341
+ visualPropEditorDefinition: { elements: [] },
342
+ chartConfigEditorDefinition: [
343
+ {
344
+ key: 'x',
345
+ columnSections: [{ label: 'x-axis', key: 'x' }],
346
+ },
347
+ ],
348
+ });
349
+ });
350
+
351
+ test('should not trigger post message if host is not accurate', async () => {
206
352
  expect(mockInitMessage).toHaveBeenCalled();
207
353
 
208
354
  // mock the event trigger for ChartConfigValidate
209
- const mockPostMessage = jest.fn();
210
- eventProcessor({
211
- data: {
212
- payload: mockInitializeContextPayload,
213
- eventType: TSToChartEvent.ChartConfigValidate,
214
- source: 'ts-host-app',
215
- },
216
- ports: [{ postMessage: mockPostMessage }],
355
+ const validateChartConfigResp = await eventProcessor({
356
+ payload: mockInitializeContextPayload,
357
+ eventType: TSToChartEvent.ChartConfigValidate,
217
358
  });
218
359
  // Check that the response was received
219
- expect(mockPostMessage).toHaveBeenCalledWith({
360
+ expect(validateChartConfigResp).toEqual({
220
361
  isValid: true,
221
362
  });
222
- mockPostMessage.mockReset();
223
363
 
224
364
  // mock the event trigger for VisualPropsValidate
225
- eventProcessor({
226
- data: {
227
- payload: mockInitializeContextPayload,
228
- eventType: TSToChartEvent.VisualPropsValidate,
229
- source: 'ts-host-app',
230
- },
231
- ports: [{ postMessage: mockPostMessage }],
365
+ const validateVisualPropsResp = await eventProcessor({
366
+ payload: mockInitializeContextPayload,
367
+ eventType: TSToChartEvent.VisualPropsValidate,
232
368
  });
233
369
  // Check that the response was received
234
- expect(mockPostMessage).toHaveBeenCalledWith({
370
+ expect(validateVisualPropsResp).toEqual({
235
371
  isValid: true,
236
372
  });
237
373
 
238
- mockPostMessage.mockReset();
239
-
240
374
  // mock the event trigger for TriggerRenderChart
241
- eventProcessor({
242
- data: {
243
- payload: mockInitializeContextPayload,
244
- eventType: TSToChartEvent.TriggerRenderChart,
245
- source: 'ts-host-app',
246
- },
247
- ports: [{ postMessage: mockPostMessage }],
375
+ const renderResp = await eventProcessor({
376
+ payload: mockInitializeContextPayload,
377
+ eventType: TSToChartEvent.TriggerRenderChart,
248
378
  });
249
379
  // Check that the response was received
250
- expect(mockPostMessage).toHaveBeenCalledWith({});
251
380
  expect(renderChart).toHaveBeenCalled();
252
381
 
253
- mockPostMessage.mockReset();
254
-
255
382
  // mock the event trigger for getQueriesFromChartConfig
256
383
  eventProcessor({
257
- data: {
258
- payload: mockInitializeContextPayload,
259
- eventType: TSToChartEvent.GetDataQuery,
260
- source: 'ts-host-app',
261
- },
262
- ports: [{ postMessage: mockPostMessage }],
384
+ payload: mockInitializeContextPayload,
385
+ eventType: TSToChartEvent.GetDataQuery,
263
386
  });
264
- // Check that the response was received
265
- expect(mockPostMessage).toHaveBeenCalledWith({});
387
+
266
388
  expect(getQueriesFromChartConfig).toHaveBeenCalled();
267
389
  });
268
390
 
269
- test('default external function testing', () => {
391
+ test('default external function testing', async () => {
270
392
  expect(mockInitMessage).toHaveBeenCalled();
271
393
 
272
394
  // mock the event trigger for DataUpdate
273
- const mockPostMessage = jest.fn();
274
- eventProcessor({
275
- data: {
276
- payload: {
277
- data: 'random data',
278
- },
279
- eventType: TSToChartEvent.DataUpdate,
280
- source: 'ts-host-app',
395
+
396
+ const dataUpdateResp = await eventProcessor({
397
+ payload: {
398
+ data: 'random data',
281
399
  },
282
- ports: [{ postMessage: mockPostMessage }],
400
+ eventType: TSToChartEvent.DataUpdate,
283
401
  });
284
402
  // Check that the response was received
285
- expect(mockPostMessage).toHaveBeenCalledWith({
403
+ expect(dataUpdateResp).toEqual({
286
404
  triggerRenderChart: true,
287
405
  });
288
406
  expect(customChartContext.getChartModel().data).toBe('random data');
289
- mockPostMessage.mockReset();
290
407
 
291
408
  // mock the event trigger for VisualPropsValidate
292
- eventProcessor({
293
- data: {
294
- payload: {
295
- chartModel: {
296
- data: 'random data2',
297
- visualProps: null,
298
- },
409
+ const modelUpdateResp = await eventProcessor({
410
+ payload: {
411
+ chartModel: {
412
+ data: 'random data2',
413
+ visualProps: null,
299
414
  },
300
- eventType: TSToChartEvent.ChartModelUpdate,
301
- source: 'ts-host-app',
302
415
  },
303
- ports: [{ postMessage: mockPostMessage }],
416
+ eventType: TSToChartEvent.ChartModelUpdate,
304
417
  });
305
418
  // Check that the response was received
306
- expect(mockPostMessage).toHaveBeenCalledWith({
419
+ expect(modelUpdateResp).toEqual({
307
420
  triggerRenderChart: true,
308
421
  });
309
422
  expect(customChartContext.getChartModel().data).toBe(
@@ -311,27 +424,20 @@ describe('CustomChartContext', () => {
311
424
  );
312
425
  expect(customChartContext.getChartModel().visualProps).toBe(null);
313
426
 
314
- mockPostMessage.mockReset();
315
-
316
427
  // mock the event trigger for VisualPropsUpdate
317
- eventProcessor({
318
- data: {
319
- payload: {
320
- visualProps: 'random data',
321
- },
322
- eventType: TSToChartEvent.VisualPropsUpdate,
323
- source: 'ts-host-app',
428
+ const visualPropsUpdateResp = await eventProcessor({
429
+ payload: {
430
+ visualProps: 'random data',
324
431
  },
325
- ports: [{ postMessage: mockPostMessage }],
432
+ eventType: TSToChartEvent.VisualPropsUpdate,
326
433
  });
327
434
  // Check that the response was received
328
- expect(mockPostMessage).toHaveBeenCalledWith({
435
+ expect(visualPropsUpdateResp).toEqual({
329
436
  triggerRenderChart: true,
330
437
  });
331
438
  expect(customChartContext.getChartModel().visualProps).toBe(
332
439
  'random data',
333
440
  );
334
- mockPostMessage.mockReset();
335
441
 
336
442
  // mock the event trigger for AxisMenuActionClick
337
443
  customChartContext.axisMenuCustomActionPreProcessor([
@@ -346,22 +452,18 @@ describe('CustomChartContext', () => {
346
452
  ],
347
453
  },
348
454
  ] as any);
349
- eventProcessor({
350
- data: {
351
- payload: {
352
- customAction: {
353
- id: 'custom-action-1',
354
- columnIds: ['9f96b5b0-f7e4-4a5e-aa11-4c77fdf42125'],
355
- },
455
+ const axisMenuClickResp = await eventProcessor({
456
+ payload: {
457
+ customAction: {
458
+ id: 'custom-action-1',
459
+ columnIds: ['9f96b5b0-f7e4-4a5e-aa11-4c77fdf42125'],
356
460
  },
357
- eventType: TSToChartEvent.AxisMenuActionClick,
358
- source: 'ts-host-app',
359
461
  },
360
- ports: [{ postMessage: mockPostMessage }],
462
+ eventType: TSToChartEvent.AxisMenuActionClick,
361
463
  });
362
464
  // Check that the response was valid which means action gets
363
465
  // executed successfully
364
- expect(mockPostMessage).toHaveBeenCalledWith({
466
+ expect(axisMenuClickResp).toEqual({
365
467
  isValid: true,
366
468
  });
367
469
 
@@ -378,22 +480,18 @@ describe('CustomChartContext', () => {
378
480
  ],
379
481
  },
380
482
  ] as any);
381
- eventProcessor({
382
- data: {
383
- payload: {
384
- customAction: {
385
- id: 'custom-action-1',
386
- columnIds: ['9f96b5b0-f7e4-4a5e-aa11-4c77fdf42125'],
387
- },
483
+ const ctxMenuResp = await eventProcessor({
484
+ payload: {
485
+ customAction: {
486
+ id: 'custom-action-1',
487
+ columnIds: ['9f96b5b0-f7e4-4a5e-aa11-4c77fdf42125'],
388
488
  },
389
- eventType: TSToChartEvent.ContextMenuActionClick,
390
- source: 'ts-host-app',
391
489
  },
392
- ports: [{ postMessage: mockPostMessage }],
490
+ eventType: TSToChartEvent.ContextMenuActionClick,
393
491
  });
394
492
  // Check that the response was valid which means action gets
395
493
  // executed successfully
396
- expect(mockPostMessage).toHaveBeenCalledWith({
494
+ expect(ctxMenuResp).toEqual({
397
495
  isValid: true,
398
496
  });
399
497
  });
@@ -408,38 +506,30 @@ describe('CustomChartContext', () => {
408
506
  customChartContext.on(TEST_EVENT_TYPE, testCallbackFn);
409
507
 
410
508
  // mock the event trigger
411
- const mockPostMessage = jest.fn();
509
+
412
510
  eventProcessor({
413
- data: {
414
- payload: mockInitializeContextPayload,
415
- eventType: TEST_EVENT_TYPE,
416
- source: 'ts-host-app',
417
- },
418
- ports: [{ postMessage: mockPostMessage }],
511
+ payload: mockInitializeContextPayload,
512
+ eventType: TEST_EVENT_TYPE,
419
513
  });
420
514
  // Check that the event listener was added to the eventListeners
421
515
  // object
422
516
  expect(testCallbackFn).toHaveBeenCalled();
423
517
  });
424
518
 
425
- test('should respond with an error to an unspecified event type', () => {
519
+ test('should respond with an error to an unspecified event type', async () => {
426
520
  expect(mockInitMessage).toHaveBeenCalled();
427
521
  // Define a test event type and callback function
428
522
  const TEST_EVENT_TYPE = 'testEventType' as any;
429
523
 
430
524
  // mock the event trigger
431
- const mockPostMessage = jest.fn();
432
- eventProcessor({
433
- data: {
434
- payload: mockInitializeContextPayload,
435
- eventType: TEST_EVENT_TYPE,
436
- source: 'ts-host-app',
437
- },
438
- ports: [{ postMessage: mockPostMessage }],
525
+
526
+ const resp = await eventProcessor({
527
+ payload: mockInitializeContextPayload,
528
+ eventType: TEST_EVENT_TYPE,
439
529
  });
440
530
  // Check that the event listener was added to the eventListeners
441
531
  // object
442
- expect(mockPostMessage).toHaveBeenCalledWith({
532
+ expect(resp).toEqual({
443
533
  hasError: true,
444
534
  error: `Event type not recognised or processed: ${TEST_EVENT_TYPE}`,
445
535
  });
@@ -473,14 +563,10 @@ describe('CustomChartContext', () => {
473
563
  customChartContext.on(TEST_EVENT_TYPE, testCallbackFn);
474
564
 
475
565
  // mock the event trigger for the test event type
476
- const mockPostMessage = jest.fn();
566
+
477
567
  eventProcessor({
478
- data: {
479
- payload: mockInitializeContextPayload,
480
- eventType: TEST_EVENT_TYPE,
481
- source: 'ts-host-app',
482
- },
483
- ports: [{ postMessage: mockPostMessage }],
568
+ payload: mockInitializeContextPayload,
569
+ eventType: TEST_EVENT_TYPE,
484
570
  });
485
571
 
486
572
  // Call the off function to remove the event listener
@@ -514,22 +600,14 @@ describe('CustomChartContext', () => {
514
600
  ).toHaveLength(1);
515
601
 
516
602
  // Emit events for both event types
517
- const mockPostMessage = jest.fn();
603
+
518
604
  eventProcessor({
519
- data: {
520
- payload: {},
521
- eventType: TEST_EVENT_TYPE_1,
522
- source: 'ts-host-app',
523
- },
524
- ports: [{ postMessage: mockPostMessage }],
605
+ payload: {},
606
+ eventType: TEST_EVENT_TYPE_1,
525
607
  });
526
608
  eventProcessor({
527
- data: {
528
- payload: {},
529
- eventType: TEST_EVENT_TYPE_2,
530
- source: 'ts-host-app',
531
- },
532
- ports: [{ postMessage: mockPostMessage }],
609
+ payload: {},
610
+ eventType: TEST_EVENT_TYPE_2,
533
611
  });
534
612
 
535
613
  // Check that both callback functions were called
@@ -596,28 +674,19 @@ describe('CustomChartContext', () => {
596
674
 
597
675
  test('should resolve the promise if the chart context is initialized', async () => {
598
676
  // Check that the hasInitializedPromise has resolved
599
- const mockPostMessage = jest.fn();
677
+
600
678
  eventProcessor({
601
- data: {
602
- payload: mockInitializeContextPayload,
603
- eventType: TSToChartEvent.Initialize,
604
- source: 'ts-host-app',
605
- },
606
- ports: [{ postMessage: mockPostMessage }],
679
+ payload: mockInitializeContextPayload,
680
+ eventType: TSToChartEvent.Initialize,
607
681
  });
608
682
 
609
683
  eventProcessor({
610
- data: {
611
- payload: {},
612
- eventType: TSToChartEvent.InitializeComplete,
613
- source: 'ts-host-app',
614
- },
615
- ports: [{ postMessage: mockPostMessage }],
684
+ payload: {},
685
+ eventType: TSToChartEvent.InitializeComplete,
616
686
  });
617
687
 
618
688
  const promise = customChartContext.initialize();
619
689
  await expect(promise).resolves.toBeUndefined();
620
- expect(mockPostMessage).toHaveBeenCalledTimes(2);
621
690
 
622
691
  // define mock response for the postMessage response promise
623
692
  let resolve: any;
@@ -672,24 +741,15 @@ describe('CustomChartContext', () => {
672
741
  );
673
742
  });
674
743
  test('should process the event payload for context menu custom actions', async () => {
675
- const mockPostMessage = jest.fn();
676
744
  const mockCustomAction = jest.fn();
677
745
  let resolve: any;
678
746
  eventProcessor({
679
- data: {
680
- payload: mockInitializeContextPayload,
681
- eventType: TSToChartEvent.Initialize,
682
- source: 'ts-host-app',
683
- },
684
- ports: [{ postMessage: mockPostMessage }],
747
+ payload: mockInitializeContextPayload,
748
+ eventType: TSToChartEvent.Initialize,
685
749
  });
686
750
  eventProcessor({
687
- data: {
688
- payload: {},
689
- eventType: TSToChartEvent.InitializeComplete,
690
- source: 'ts-host-app',
691
- },
692
- ports: [{ postMessage: mockPostMessage }],
751
+ payload: {},
752
+ eventType: TSToChartEvent.InitializeComplete,
693
753
  });
694
754
  customChartContext.initialize();
695
755
  mockPostMessageToHost.mockImplementation(
@@ -731,19 +791,15 @@ describe('CustomChartContext', () => {
731
791
  TEST_EVENT_TYPE,
732
792
  );
733
793
  eventProcessor({
734
- data: {
735
- payload: {
736
- customAction: {
737
- id: 'custom-action-1',
738
- clickedPoint: {},
739
- event: {},
740
- selectedPoints: [{}],
741
- },
794
+ payload: {
795
+ customAction: {
796
+ id: 'custom-action-1',
797
+ clickedPoint: {},
798
+ event: {},
799
+ selectedPoints: [{}],
742
800
  },
743
- eventType: TSToChartEvent.ContextMenuActionClick,
744
- source: 'ts-host-app',
745
801
  },
746
- ports: [{ postMessage: mockPostMessage }],
802
+ eventType: TSToChartEvent.ContextMenuActionClick,
747
803
  });
748
804
  expect(mockCustomAction).toHaveBeenCalled();
749
805
  expect(mockCustomAction).toHaveBeenCalledWith({
@@ -754,24 +810,15 @@ describe('CustomChartContext', () => {
754
810
  });
755
811
  });
756
812
  test('should process the event payload for axis menu custom actions', async () => {
757
- const mockPostMessage = jest.fn();
758
813
  const mockCustomAction = jest.fn();
759
814
  let resolve: any;
760
815
  eventProcessor({
761
- data: {
762
- payload: mockInitializeContextPayload,
763
- eventType: TSToChartEvent.Initialize,
764
- source: 'ts-host-app',
765
- },
766
- ports: [{ postMessage: mockPostMessage }],
816
+ payload: mockInitializeContextPayload,
817
+ eventType: TSToChartEvent.Initialize,
767
818
  });
768
819
  eventProcessor({
769
- data: {
770
- payload: {},
771
- eventType: TSToChartEvent.InitializeComplete,
772
- source: 'ts-host-app',
773
- },
774
- ports: [{ postMessage: mockPostMessage }],
820
+ payload: {},
821
+ eventType: TSToChartEvent.InitializeComplete,
775
822
  });
776
823
  customChartContext.initialize();
777
824
  mockPostMessageToHost.mockImplementation(
@@ -813,18 +860,14 @@ describe('CustomChartContext', () => {
813
860
  );
814
861
 
815
862
  eventProcessor({
816
- data: {
817
- payload: {
818
- customAction: {
819
- id: 'custom-action-1',
820
- columnIds: ['123'],
821
- event: {},
822
- },
863
+ payload: {
864
+ customAction: {
865
+ id: 'custom-action-1',
866
+ columnIds: ['123'],
867
+ event: {},
823
868
  },
824
- eventType: TSToChartEvent.AxisMenuActionClick,
825
- source: 'ts-host-app',
826
869
  },
827
- ports: [{ postMessage: mockPostMessage }],
870
+ eventType: TSToChartEvent.AxisMenuActionClick,
828
871
  });
829
872
  expect(mockCustomAction).toHaveBeenCalled();
830
873
  expect(mockCustomAction).toHaveBeenCalledWith({
@@ -835,23 +878,14 @@ describe('CustomChartContext', () => {
835
878
  });
836
879
 
837
880
  test('should process the event payload for axis menu when custom actions are not defined', async () => {
838
- const mockPostMessage = jest.fn();
839
881
  let resolve: any;
840
882
  eventProcessor({
841
- data: {
842
- payload: mockInitializeContextPayload,
843
- eventType: TSToChartEvent.Initialize,
844
- source: 'ts-host-app',
845
- },
846
- ports: [{ postMessage: mockPostMessage }],
883
+ payload: mockInitializeContextPayload,
884
+ eventType: TSToChartEvent.Initialize,
847
885
  });
848
886
  eventProcessor({
849
- data: {
850
- payload: {},
851
- eventType: TSToChartEvent.InitializeComplete,
852
- source: 'ts-host-app',
853
- },
854
- ports: [{ postMessage: mockPostMessage }],
887
+ payload: {},
888
+ eventType: TSToChartEvent.InitializeComplete,
855
889
  });
856
890
  customChartContext.initialize();
857
891
  mockPostMessageToHost.mockImplementation(
@@ -876,23 +910,14 @@ describe('CustomChartContext', () => {
876
910
  });
877
911
 
878
912
  test('should process the event payload for context menu when custom actions are not defined', async () => {
879
- const mockPostMessage = jest.fn();
880
913
  let resolve: any;
881
914
  eventProcessor({
882
- data: {
883
- payload: mockInitializeContextPayload,
884
- eventType: TSToChartEvent.Initialize,
885
- source: 'ts-host-app',
886
- },
887
- ports: [{ postMessage: mockPostMessage }],
915
+ payload: mockInitializeContextPayload,
916
+ eventType: TSToChartEvent.Initialize,
888
917
  });
889
918
  eventProcessor({
890
- data: {
891
- payload: {},
892
- eventType: TSToChartEvent.InitializeComplete,
893
- source: 'ts-host-app',
894
- },
895
- ports: [{ postMessage: mockPostMessage }],
919
+ payload: {},
920
+ eventType: TSToChartEvent.InitializeComplete,
896
921
  });
897
922
  customChartContext.initialize();
898
923
  mockPostMessageToHost.mockImplementation(