@genesislcap/pbc-reporting-ui 14.353.4-alpha-f6000a0.0 → 14.353.4

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transformers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformers.test.d.ts","sourceRoot":"","sources":["../../../../src/new/utils/transformers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,419 @@
1
+ import { __awaiter } from "tslib";
2
+ import { assert, sinon, suite } from '@genesislcap/foundation-testing';
3
+ import { buildDatasourceName, transformFromServerPayload } from './transformers';
4
+ const TransformFromServerPayload = suite('transformFromServerPayload');
5
+ TransformFromServerPayload.before.each(() => {
6
+ sinon.restore();
7
+ });
8
+ TransformFromServerPayload('cleans up orphaned fields from INCLUDE_COLUMNS', () => __awaiter(void 0, void 0, void 0, function* () {
9
+ var _a, _b, _c, _d;
10
+ const mockGetSchema = sinon.stub();
11
+ const validSchema = {
12
+ properties: {
13
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
14
+ AMOUNT: { genesisType: 'DOUBLE' },
15
+ },
16
+ };
17
+ mockGetSchema.resolves(validSchema);
18
+ const payload = {
19
+ ID: 'test-id',
20
+ NAME: 'Test Report',
21
+ SCHEDULES: [],
22
+ DATA_SOURCES: [
23
+ {
24
+ KEY: 'COUNTERPARTY',
25
+ INPUT_TYPE: 'REQ_REP',
26
+ NAME: 'COUNTERPARTY',
27
+ OUTPUT_TYPE: 'TABLE',
28
+ TRANSFORMER_CONFIGURATION: {
29
+ INCLUDE_COLUMNS: ['COUNTERPARTY_NAME', 'AMOUNT', 'NAME'], // NAME is orphaned
30
+ },
31
+ },
32
+ ],
33
+ DESTINATION_IDS: [],
34
+ OUTPUT_DIRECTORY: '/reports',
35
+ };
36
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
37
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
38
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
39
+ assert.equal((_a = cleanedConfig.INCLUDE_COLUMNS) === null || _a === void 0 ? void 0 : _a.length, 2);
40
+ assert.ok((_b = cleanedConfig.INCLUDE_COLUMNS) === null || _b === void 0 ? void 0 : _b.includes('COUNTERPARTY_NAME'));
41
+ assert.ok((_c = cleanedConfig.INCLUDE_COLUMNS) === null || _c === void 0 ? void 0 : _c.includes('AMOUNT'));
42
+ assert.ok(!((_d = cleanedConfig.INCLUDE_COLUMNS) === null || _d === void 0 ? void 0 : _d.includes('NAME')));
43
+ }));
44
+ TransformFromServerPayload('cleans up orphaned fields from COLUMN_RENAMES', () => __awaiter(void 0, void 0, void 0, function* () {
45
+ var _a, _b, _c;
46
+ const mockGetSchema = sinon.stub();
47
+ const validSchema = {
48
+ properties: {
49
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
50
+ AMOUNT: { genesisType: 'DOUBLE' },
51
+ },
52
+ };
53
+ mockGetSchema.resolves(validSchema);
54
+ const payload = {
55
+ ID: 'test-id',
56
+ NAME: 'Test Report',
57
+ SCHEDULES: [],
58
+ DATA_SOURCES: [
59
+ {
60
+ KEY: 'COUNTERPARTY',
61
+ INPUT_TYPE: 'REQ_REP',
62
+ NAME: 'COUNTERPARTY',
63
+ OUTPUT_TYPE: 'TABLE',
64
+ TRANSFORMER_CONFIGURATION: {
65
+ COLUMN_RENAMES: {
66
+ COUNTERPARTY_NAME: 'Counterparty Name',
67
+ AMOUNT: 'Amount',
68
+ NAME: 'Old Name', // orphaned
69
+ },
70
+ },
71
+ },
72
+ ],
73
+ DESTINATION_IDS: [],
74
+ OUTPUT_DIRECTORY: '/reports',
75
+ };
76
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
77
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
78
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
79
+ assert.equal(Object.keys(cleanedConfig.COLUMN_RENAMES || {}).length, 2);
80
+ assert.equal((_a = cleanedConfig.COLUMN_RENAMES) === null || _a === void 0 ? void 0 : _a['COUNTERPARTY_NAME'], 'Counterparty Name');
81
+ assert.equal((_b = cleanedConfig.COLUMN_RENAMES) === null || _b === void 0 ? void 0 : _b['AMOUNT'], 'Amount');
82
+ assert.ok(!((_c = cleanedConfig.COLUMN_RENAMES) === null || _c === void 0 ? void 0 : _c['NAME']));
83
+ }));
84
+ TransformFromServerPayload('cleans up orphaned fields from COLUMN_FORMATS', () => __awaiter(void 0, void 0, void 0, function* () {
85
+ var _a, _b, _c;
86
+ const mockGetSchema = sinon.stub();
87
+ const validSchema = {
88
+ properties: {
89
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
90
+ AMOUNT: { genesisType: 'DOUBLE' },
91
+ },
92
+ };
93
+ mockGetSchema.resolves(validSchema);
94
+ const payload = {
95
+ ID: 'test-id',
96
+ NAME: 'Test Report',
97
+ SCHEDULES: [],
98
+ DATA_SOURCES: [
99
+ {
100
+ KEY: 'COUNTERPARTY',
101
+ INPUT_TYPE: 'REQ_REP',
102
+ NAME: 'COUNTERPARTY',
103
+ OUTPUT_TYPE: 'TABLE',
104
+ TRANSFORMER_CONFIGURATION: {
105
+ COLUMN_FORMATS: {
106
+ COUNTERPARTY_NAME: 'text',
107
+ AMOUNT: '#,##0.00',
108
+ NAME: 'text', // orphaned
109
+ },
110
+ },
111
+ },
112
+ ],
113
+ DESTINATION_IDS: [],
114
+ OUTPUT_DIRECTORY: '/reports',
115
+ };
116
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
117
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
118
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
119
+ assert.equal(Object.keys(cleanedConfig.COLUMN_FORMATS || {}).length, 2);
120
+ assert.equal((_a = cleanedConfig.COLUMN_FORMATS) === null || _a === void 0 ? void 0 : _a['COUNTERPARTY_NAME'], 'text');
121
+ assert.equal((_b = cleanedConfig.COLUMN_FORMATS) === null || _b === void 0 ? void 0 : _b['AMOUNT'], '#,##0.00');
122
+ assert.ok(!((_c = cleanedConfig.COLUMN_FORMATS) === null || _c === void 0 ? void 0 : _c['NAME']));
123
+ }));
124
+ TransformFromServerPayload('cleans up orphaned fields from COLUMN_TRANSFORMS', () => __awaiter(void 0, void 0, void 0, function* () {
125
+ var _a, _b, _c;
126
+ const mockGetSchema = sinon.stub();
127
+ const validSchema = {
128
+ properties: {
129
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
130
+ AMOUNT: { genesisType: 'DOUBLE' },
131
+ },
132
+ };
133
+ mockGetSchema.resolves(validSchema);
134
+ const payload = {
135
+ ID: 'test-id',
136
+ NAME: 'Test Report',
137
+ SCHEDULES: [],
138
+ DATA_SOURCES: [
139
+ {
140
+ KEY: 'COUNTERPARTY',
141
+ INPUT_TYPE: 'REQ_REP',
142
+ NAME: 'COUNTERPARTY',
143
+ OUTPUT_TYPE: 'TABLE',
144
+ TRANSFORMER_CONFIGURATION: {
145
+ COLUMN_TRANSFORMS: {
146
+ COUNTERPARTY_NAME: { TYPE: 'BINARY_EXPRESSION', LEFT: {}, OPERATION: 'AND', RIGHT: {} },
147
+ AMOUNT: { TYPE: 'METHOD_EXPRESSION', METHOD: 'TRIM', PARAMETERS: [] },
148
+ NAME: { TYPE: 'BINARY_EXPRESSION', LEFT: {}, OPERATION: 'AND', RIGHT: {} }, // orphaned
149
+ },
150
+ },
151
+ },
152
+ ],
153
+ DESTINATION_IDS: [],
154
+ OUTPUT_DIRECTORY: '/reports',
155
+ };
156
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
157
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
158
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
159
+ assert.equal(Object.keys(cleanedConfig.COLUMN_TRANSFORMS || {}).length, 2);
160
+ assert.ok((_a = cleanedConfig.COLUMN_TRANSFORMS) === null || _a === void 0 ? void 0 : _a['COUNTERPARTY_NAME']);
161
+ assert.ok((_b = cleanedConfig.COLUMN_TRANSFORMS) === null || _b === void 0 ? void 0 : _b['AMOUNT']);
162
+ assert.ok(!((_c = cleanedConfig.COLUMN_TRANSFORMS) === null || _c === void 0 ? void 0 : _c['NAME']));
163
+ }));
164
+ TransformFromServerPayload('handles schema fetch failure gracefully', () => __awaiter(void 0, void 0, void 0, function* () {
165
+ const mockGetSchema = sinon.stub();
166
+ const consoleWarnStub = sinon.stub(console, 'warn');
167
+ mockGetSchema.rejects(new Error('Schema fetch failed'));
168
+ const originalConfig = {
169
+ INCLUDE_COLUMNS: ['NAME', 'AMOUNT'],
170
+ COLUMN_RENAMES: { NAME: 'Name' },
171
+ };
172
+ const payload = {
173
+ ID: 'test-id',
174
+ NAME: 'Test Report',
175
+ SCHEDULES: [],
176
+ DATA_SOURCES: [
177
+ {
178
+ KEY: 'COUNTERPARTY',
179
+ INPUT_TYPE: 'REQ_REP',
180
+ NAME: 'COUNTERPARTY',
181
+ OUTPUT_TYPE: 'TABLE',
182
+ TRANSFORMER_CONFIGURATION: originalConfig,
183
+ },
184
+ ],
185
+ DESTINATION_IDS: [],
186
+ OUTPUT_DIRECTORY: '/reports',
187
+ };
188
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
189
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
190
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
191
+ // Should keep original config when schema fetch fails
192
+ assert.equal(JSON.stringify(cleanedConfig), JSON.stringify(originalConfig));
193
+ assert.ok(consoleWarnStub.calledOnce);
194
+ assert.ok(consoleWarnStub.calledWithMatch(sinon.match.string, sinon.match.instanceOf(Error)));
195
+ consoleWarnStub.restore();
196
+ }));
197
+ TransformFromServerPayload('handles multiple datasources independently', () => __awaiter(void 0, void 0, void 0, function* () {
198
+ var _a, _b, _c, _d;
199
+ const mockGetSchema = sinon.stub();
200
+ mockGetSchema
201
+ .onFirstCall()
202
+ .resolves({
203
+ properties: {
204
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
205
+ },
206
+ })
207
+ .onSecondCall()
208
+ .resolves({
209
+ properties: {
210
+ TRADE_ID: { genesisType: 'STRING' },
211
+ },
212
+ });
213
+ const payload = {
214
+ ID: 'test-id',
215
+ NAME: 'Test Report',
216
+ SCHEDULES: [],
217
+ DATA_SOURCES: [
218
+ {
219
+ KEY: 'COUNTERPARTY',
220
+ INPUT_TYPE: 'REQ_REP',
221
+ NAME: 'COUNTERPARTY',
222
+ OUTPUT_TYPE: 'TABLE',
223
+ TRANSFORMER_CONFIGURATION: {
224
+ INCLUDE_COLUMNS: ['COUNTERPARTY_NAME', 'NAME'], // NAME is orphaned
225
+ },
226
+ },
227
+ {
228
+ KEY: 'TRADE',
229
+ INPUT_TYPE: 'REQ_REP',
230
+ NAME: 'TRADE',
231
+ OUTPUT_TYPE: 'TABLE',
232
+ TRANSFORMER_CONFIGURATION: {
233
+ INCLUDE_COLUMNS: ['TRADE_ID', 'OLD_FIELD'], // OLD_FIELD is orphaned
234
+ },
235
+ },
236
+ ],
237
+ DESTINATION_IDS: [],
238
+ OUTPUT_DIRECTORY: '/reports',
239
+ };
240
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
241
+ const counterpartyKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
242
+ const tradeKey = buildDatasourceName('TRADE', 'REQ_REP');
243
+ assert.equal((_a = result.datasourceConfig[counterpartyKey].TRANSFORMER_CONFIGURATION.INCLUDE_COLUMNS) === null || _a === void 0 ? void 0 : _a.length, 1);
244
+ assert.ok((_b = result.datasourceConfig[counterpartyKey].TRANSFORMER_CONFIGURATION.INCLUDE_COLUMNS) === null || _b === void 0 ? void 0 : _b.includes('COUNTERPARTY_NAME'));
245
+ assert.equal((_c = result.datasourceConfig[tradeKey].TRANSFORMER_CONFIGURATION.INCLUDE_COLUMNS) === null || _c === void 0 ? void 0 : _c.length, 1);
246
+ assert.ok((_d = result.datasourceConfig[tradeKey].TRANSFORMER_CONFIGURATION.INCLUDE_COLUMNS) === null || _d === void 0 ? void 0 : _d.includes('TRADE_ID'));
247
+ }));
248
+ TransformFromServerPayload('handles empty transformer configuration', () => __awaiter(void 0, void 0, void 0, function* () {
249
+ const mockGetSchema = sinon.stub();
250
+ const validSchema = {
251
+ properties: {
252
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
253
+ },
254
+ };
255
+ mockGetSchema.resolves(validSchema);
256
+ const payload = {
257
+ ID: 'test-id',
258
+ NAME: 'Test Report',
259
+ SCHEDULES: [],
260
+ DATA_SOURCES: [
261
+ {
262
+ KEY: 'COUNTERPARTY',
263
+ INPUT_TYPE: 'REQ_REP',
264
+ NAME: 'COUNTERPARTY',
265
+ OUTPUT_TYPE: 'TABLE',
266
+ TRANSFORMER_CONFIGURATION: {},
267
+ },
268
+ ],
269
+ DESTINATION_IDS: [],
270
+ OUTPUT_DIRECTORY: '/reports',
271
+ };
272
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
273
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
274
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
275
+ assert.equal(JSON.stringify(cleanedConfig), JSON.stringify({}));
276
+ }));
277
+ TransformFromServerPayload('handles missing schema properties', () => __awaiter(void 0, void 0, void 0, function* () {
278
+ var _a;
279
+ const mockGetSchema = sinon.stub();
280
+ const schemaWithoutProperties = {};
281
+ mockGetSchema.resolves(schemaWithoutProperties);
282
+ const payload = {
283
+ ID: 'test-id',
284
+ NAME: 'Test Report',
285
+ SCHEDULES: [],
286
+ DATA_SOURCES: [
287
+ {
288
+ KEY: 'COUNTERPARTY',
289
+ INPUT_TYPE: 'REQ_REP',
290
+ NAME: 'COUNTERPARTY',
291
+ OUTPUT_TYPE: 'TABLE',
292
+ TRANSFORMER_CONFIGURATION: {
293
+ INCLUDE_COLUMNS: ['NAME', 'AMOUNT'],
294
+ },
295
+ },
296
+ ],
297
+ DESTINATION_IDS: [],
298
+ OUTPUT_DIRECTORY: '/reports',
299
+ };
300
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
301
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
302
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
303
+ // All fields should be removed when schema has no properties
304
+ assert.equal((_a = cleanedConfig.INCLUDE_COLUMNS) === null || _a === void 0 ? void 0 : _a.length, 0);
305
+ }));
306
+ TransformFromServerPayload('preserves base config correctly', () => __awaiter(void 0, void 0, void 0, function* () {
307
+ var _a, _b;
308
+ const mockGetSchema = sinon.stub();
309
+ const validSchema = {
310
+ properties: {
311
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
312
+ },
313
+ };
314
+ mockGetSchema.resolves(validSchema);
315
+ const payload = {
316
+ ID: 'test-id',
317
+ NAME: 'Test Report',
318
+ DESCRIPTION: 'Test Description',
319
+ OUTPUT_FORMAT: 'CSV',
320
+ FILE_NAME: 'test.csv',
321
+ AUTO_DISPATCH: true,
322
+ DESTINATION_IDS: ['dest1', 'dest2'],
323
+ OUTPUT_DIRECTORY: '/reports',
324
+ DOCUMENT_TEMPLATE_ID: 'template-123',
325
+ SCHEDULES: [
326
+ {
327
+ CRON_EXPRESSION: '0 0 0 * * ?',
328
+ TIME_ZONE: 'UTC',
329
+ },
330
+ ],
331
+ DATA_SOURCES: [
332
+ {
333
+ KEY: 'COUNTERPARTY',
334
+ INPUT_TYPE: 'REQ_REP',
335
+ NAME: 'COUNTERPARTY',
336
+ OUTPUT_TYPE: 'TABLE',
337
+ TRANSFORMER_CONFIGURATION: {},
338
+ },
339
+ ],
340
+ };
341
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
342
+ assert.equal(result.baseConfig.ID, 'test-id');
343
+ assert.equal(result.baseConfig.NAME, 'Test Report');
344
+ assert.equal(result.baseConfig.DESCRIPTION, 'Test Description');
345
+ assert.equal(result.baseConfig.OUTPUT_FORMAT, 'CSV');
346
+ assert.equal(result.baseConfig.FILE_NAME, 'test.csv');
347
+ assert.equal(result.baseConfig.AUTO_DISPATCH, true);
348
+ assert.equal(JSON.stringify(result.baseConfig.DESTINATION_IDS), JSON.stringify(['dest1', 'dest2']));
349
+ assert.equal(result.baseConfig.OUTPUT_DIRECTORY, '/reports');
350
+ assert.equal(result.baseConfig.DOCUMENT_TEMPLATE_ID, 'template-123');
351
+ assert.ok(result.baseConfig.SCHEDULE);
352
+ assert.equal((_a = result.baseConfig.SCHEDULE) === null || _a === void 0 ? void 0 : _a.CRON_EXPRESSION, '0 0 0 * * ?');
353
+ assert.equal((_b = result.baseConfig.SCHEDULE) === null || _b === void 0 ? void 0 : _b.TIME_ZONE, 'UTC');
354
+ }));
355
+ TransformFromServerPayload('handles all transformer config types together', () => __awaiter(void 0, void 0, void 0, function* () {
356
+ var _a, _b, _c, _d, _e, _f;
357
+ const mockGetSchema = sinon.stub();
358
+ const validSchema = {
359
+ properties: {
360
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
361
+ AMOUNT: { genesisType: 'DOUBLE' },
362
+ },
363
+ };
364
+ mockGetSchema.resolves(validSchema);
365
+ const payload = {
366
+ ID: 'test-id',
367
+ NAME: 'Test Report',
368
+ SCHEDULES: [],
369
+ DATA_SOURCES: [
370
+ {
371
+ KEY: 'COUNTERPARTY',
372
+ INPUT_TYPE: 'REQ_REP',
373
+ NAME: 'COUNTERPARTY',
374
+ OUTPUT_TYPE: 'TABLE',
375
+ TRANSFORMER_CONFIGURATION: {
376
+ INCLUDE_COLUMNS: ['COUNTERPARTY_NAME', 'AMOUNT', 'NAME'], // NAME orphaned
377
+ COLUMN_RENAMES: {
378
+ COUNTERPARTY_NAME: 'Counterparty',
379
+ NAME: 'Old Name', // orphaned
380
+ },
381
+ COLUMN_FORMATS: {
382
+ AMOUNT: '#,##0.00',
383
+ NAME: 'text', // orphaned
384
+ },
385
+ COLUMN_TRANSFORMS: {
386
+ COUNTERPARTY_NAME: { TYPE: 'BINARY_EXPRESSION', LEFT: {}, OPERATION: 'AND', RIGHT: {} },
387
+ NAME: { TYPE: 'METHOD_EXPRESSION', METHOD: 'TRIM', PARAMETERS: [] }, // orphaned
388
+ },
389
+ ROW_FILTERS: {
390
+ TYPE: 'PREDICATE_EXPRESSION',
391
+ OPERATION: 'AND',
392
+ EXPRESSIONS: [],
393
+ },
394
+ },
395
+ },
396
+ ],
397
+ DESTINATION_IDS: [],
398
+ OUTPUT_DIRECTORY: '/reports',
399
+ };
400
+ const result = yield transformFromServerPayload(payload, mockGetSchema);
401
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
402
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
403
+ // INCLUDE_COLUMNS should only have valid fields
404
+ assert.equal((_a = cleanedConfig.INCLUDE_COLUMNS) === null || _a === void 0 ? void 0 : _a.length, 2);
405
+ assert.ok((_b = cleanedConfig.INCLUDE_COLUMNS) === null || _b === void 0 ? void 0 : _b.includes('COUNTERPARTY_NAME'));
406
+ assert.ok((_c = cleanedConfig.INCLUDE_COLUMNS) === null || _c === void 0 ? void 0 : _c.includes('AMOUNT'));
407
+ // COLUMN_RENAMES should only have valid fields
408
+ assert.equal(Object.keys(cleanedConfig.COLUMN_RENAMES || {}).length, 1);
409
+ assert.equal((_d = cleanedConfig.COLUMN_RENAMES) === null || _d === void 0 ? void 0 : _d['COUNTERPARTY_NAME'], 'Counterparty');
410
+ // COLUMN_FORMATS should only have valid fields
411
+ assert.equal(Object.keys(cleanedConfig.COLUMN_FORMATS || {}).length, 1);
412
+ assert.equal((_e = cleanedConfig.COLUMN_FORMATS) === null || _e === void 0 ? void 0 : _e['AMOUNT'], '#,##0.00');
413
+ // COLUMN_TRANSFORMS should only have valid fields
414
+ assert.equal(Object.keys(cleanedConfig.COLUMN_TRANSFORMS || {}).length, 1);
415
+ assert.ok((_f = cleanedConfig.COLUMN_TRANSFORMS) === null || _f === void 0 ? void 0 : _f['COUNTERPARTY_NAME']);
416
+ // ROW_FILTERS should be preserved
417
+ assert.ok(cleanedConfig.ROW_FILTERS);
418
+ }));
419
+ TransformFromServerPayload.run();
@@ -1 +1 @@
1
- {"root":["../src/globals.d.ts","../src/index.federated.ts","../src/index.ts","../src/sandbox.ts","../src/typings.d.ts","../src/new/components/components.ts","../src/new/components/clone-report-config-modal/clone-report-config-modal.styles.ts","../src/new/components/clone-report-config-modal/clone-report-config-modal.template.ts","../src/new/components/clone-report-config-modal/clone-report-config-modal.ts","../src/new/components/renderers/data-transform-renderer.ts","../src/new/components/reporting-configurations/reporting-configurations.styles.ts","../src/new/components/reporting-configurations/reporting-configurations.template.ts","../src/new/components/reporting-configurations/reporting-configurations.ts","../src/new/lib/redux-store/index.ts","../src/new/lib/redux-store/state-utils.ts","../src/new/lib/redux-store/store.ts","../src/new/main/index.ts","../src/new/main/main.styles.ts","../src/new/main/main.template.ts","../src/new/main/main.ts","../src/new/main/edit-config/config-journey-orchestrator.styles.ts","../src/new/main/edit-config/config-journey-orchestrator.template.ts","../src/new/main/edit-config/config-journey-orchestrator.ts","../src/new/main/edit-config/base-config/base-config.styles.ts","../src/new/main/edit-config/base-config/base-config.template.ts","../src/new/main/edit-config/base-config/base-config.ts","../src/new/main/edit-config/col-filters/col-filters-grid.helpers.test.ts","../src/new/main/edit-config/col-filters/col-filters-grid.helpers.ts","../src/new/main/edit-config/col-filters/col-filters-grid.styles.ts","../src/new/main/edit-config/col-filters/col-filters-grid.ts","../src/new/main/edit-config/col-filters/col-filters-grid.types.ts","../src/new/main/edit-config/col-filters/col-filters-tutorial.ts","../src/new/main/edit-config/col-filters/col-fitlers-grid.template.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.helpers.test.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.helpers.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.styles.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.template.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.types.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-tutorial.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms-tutorial.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.helpers.test.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.helpers.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.styles.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.template.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.types.ts","../src/new/main/edit-config/data-transforms-derived-fields/date-format-modal/date-format-modal.styles.ts","../src/new/main/edit-config/data-transforms-derived-fields/date-format-modal/date-format-modal.template.ts","../src/new/main/edit-config/data-transforms-derived-fields/date-format-modal/date-format-modal.ts","../src/new/main/edit-config/data-transforms-derived-fields/date-format-modal/index.ts","../src/new/main/edit-config/data-transforms-derived-fields/number-format-modal/index.ts","../src/new/main/edit-config/data-transforms-derived-fields/number-format-modal/number-format-modal.styles.ts","../src/new/main/edit-config/data-transforms-derived-fields/number-format-modal/number-format-modal.template.ts","../src/new/main/edit-config/data-transforms-derived-fields/number-format-modal/number-format-modal.ts","../src/new/main/edit-config/datasource-config/datasource-config-container.styles.ts","../src/new/main/edit-config/datasource-config/datasource-config-item.styles.ts","../src/new/main/edit-config/datasource-config/datasource-config-item.template.ts","../src/new/main/edit-config/datasource-config/datasource-config-item.ts","../src/new/main/edit-config/datasource-config/datasources-config-container.helpers.test.ts","../src/new/main/edit-config/datasource-config/datasources-config-container.helpers.ts","../src/new/main/edit-config/datasource-config/datasources-config-container.template.ts","../src/new/main/edit-config/datasource-config/datasources-config-container.ts","../src/new/main/edit-config/datasource-config/types.ts","../src/new/main/edit-config/outputs-config/outputs-config.style.ts","../src/new/main/edit-config/outputs-config/outputs-config.template.ts","../src/new/main/edit-config/outputs-config/outputs-config.ts","../src/new/main/edit-config/row-filters/row-filters-tutorial.styles.ts","../src/new/main/edit-config/row-filters/row-filters-tutorial.template.ts","../src/new/main/edit-config/row-filters/row-filters-tutorial.ts","../src/new/main/edit-config/row-filters/row-filters.helpers.test.ts","../src/new/main/edit-config/row-filters/row-filters.helpers.ts","../src/new/main/edit-config/row-filters/row-filters.styles.ts","../src/new/main/edit-config/row-filters/row-filters.template.ts","../src/new/main/edit-config/row-filters/row-filters.ts","../src/new/main/edit-config/row-filters/row-filters.types.ts","../src/new/main/edit-config/scheduling/scheduling.styles.ts","../src/new/main/edit-config/scheduling/scheduling.template.ts","../src/new/main/edit-config/scheduling/scheduling.ts","../src/new/main/edit-config/shared/datasource-data-base-component.helpers.ts.ts","../src/new/main/edit-config/shared/datasource-data-base-component.test.ts","../src/new/main/edit-config/shared/datasource-data-base-component.ts","../src/new/main/edit-config/shared/datasource-data-base-component.types.ts","../src/new/main/edit-config/shared/index.ts","../src/new/main/edit-config/tabbed-datasource-container/index.ts","../src/new/main/edit-config/tabbed-datasource-container/tabbed-datasource-container.styles.ts","../src/new/main/edit-config/tabbed-datasource-container/tabbed-datasource-container.template.ts","../src/new/main/edit-config/tabbed-datasource-container/tabbed-datasource-container.ts","../src/new/main/edit-config/tabbed-datasource-container/tabbed-datasource-container.types.ts","../src/new/main/generated-reports/generated-reports.styles.ts","../src/new/main/generated-reports/generated-reports.template.ts","../src/new/main/generated-reports/generated-reports.ts","../src/new/main/report-destinations/report-destinations.template.ts","../src/new/main/report-destinations/report-destinations.ts","../src/new/store/index.ts","../src/new/store/store.ts","../src/new/store/types.ts","../src/new/store/slices/base-config.ts","../src/new/store/slices/datasources-config.ts","../src/new/store/slices/index.ts","../src/new/store/slices/types.ts","../src/new/styles/constraints.styles.ts","../src/new/styles/forms.styles.ts","../src/new/styles/index.ts","../src/new/styles/misc.styles.ts","../src/new/types/display.ts","../src/new/types/index.ts","../src/new/types/misc.ts","../src/new/types/redux.ts","../src/new/types/rights.ts","../src/new/utils/date-filter-params.ts","../src/new/utils/endpoint.test.ts","../src/new/utils/endpoint.ts","../src/new/utils/event-map.ts","../src/new/utils/format-utils.ts","../src/new/utils/formatters.ts","../src/new/utils/index.ts","../src/new/utils/notifications.ts","../src/new/utils/renderer.ts","../src/new/utils/rights.ts","../src/new/utils/sorter.ts","../src/new/utils/tooltip.ts","../src/new/utils/transformers.ts","../src/new/utils/validators.ts","../src/old/assets/images/index.ts","../src/old/components/rapid-components.ts","../src/old/components/zero-components.ts","../src/old/components/create-edit/create-edit.styles.ts","../src/old/components/create-edit/create-edit.template.ts","../src/old/components/create-edit/create-edit.ts","../src/old/components/create-edit/index.ts","../src/old/components/list/columns.ts","../src/old/components/list/index.ts","../src/old/components/list/list.styles.ts","../src/old/components/list/list.template.ts","../src/old/components/list/list.ts","../src/old/components/preview/columns.ts","../src/old/components/preview/index.ts","../src/old/components/preview/preview.styles.ts","../src/old/components/preview/preview.template.ts","../src/old/components/preview/preview.ts","../src/old/components/renderers/custom-header-component.ts","../src/old/components/renderers/row-select.renderer.ts","../src/old/components/select-fields/columns.ts","../src/old/components/select-fields/data.ts","../src/old/components/select-fields/index.ts","../src/old/components/select-fields/select-fields.styles.ts","../src/old/components/select-fields/select-fields.template.ts","../src/old/components/select-fields/select-fields.ts","../src/old/components/select-filters/columns.ts","../src/old/components/select-filters/index.ts","../src/old/components/select-filters/select-filters.styles.ts","../src/old/components/select-filters/select-filters.template.ts","../src/old/components/select-filters/select-filters.ts","../src/old/components/wizard/debug.ts","../src/old/components/wizard/index.ts","../src/old/components/wizard/wizard.styles.ts","../src/old/components/wizard/wizard.template.ts","../src/old/components/wizard/wizard.ts","../src/old/components/wizard/wizard.types.ts","../src/old/components/wizard/steps/filters.ts","../src/old/components/wizard/steps/index.ts","../src/old/components/wizard/steps/name.ts","../src/old/components/wizard/steps/run.ts","../src/old/components/wizard/steps/select.ts","../src/old/config/config.ts","../src/old/config/configure.ts","../src/old/config/index.ts","../src/old/config/templates.ts","../src/old/constants/grid-config.ts","../src/old/layouts/default.ts","../src/old/layouts/index.ts","../src/old/layouts/two-pane-horizontal.ts","../src/old/main/index.ts","../src/old/main/main.styles.ts","../src/old/main/main.template.ts","../src/old/main/main.test.ts","../src/old/main/main.ts","../src/old/main/types.ts","../src/old/styles/colors.ts","../src/old/styles/helpers.ts","../src/old/styles/index.ts","../src/old/styles/normalize.ts","../src/old/styles/styles.ts","../src/old/tags/index.ts","../src/old/tags/tags.ts","../src/old/utils/filterObjectArray.test.ts","../src/old/utils/filterObjectArray.ts","../src/old/utils/getFiltersByType.ts","../src/old/utils/getSelectedFields.ts","../src/old/utils/index.ts","../src/old/utils/logger.ts"],"version":"5.9.2"}
1
+ {"root":["../src/globals.d.ts","../src/index.federated.ts","../src/index.ts","../src/sandbox.ts","../src/typings.d.ts","../src/new/components/components.ts","../src/new/components/clone-report-config-modal/clone-report-config-modal.styles.ts","../src/new/components/clone-report-config-modal/clone-report-config-modal.template.ts","../src/new/components/clone-report-config-modal/clone-report-config-modal.ts","../src/new/components/renderers/data-transform-renderer.ts","../src/new/components/reporting-configurations/reporting-configurations.styles.ts","../src/new/components/reporting-configurations/reporting-configurations.template.ts","../src/new/components/reporting-configurations/reporting-configurations.ts","../src/new/lib/redux-store/index.ts","../src/new/lib/redux-store/state-utils.ts","../src/new/lib/redux-store/store.ts","../src/new/main/index.ts","../src/new/main/main.styles.ts","../src/new/main/main.template.ts","../src/new/main/main.ts","../src/new/main/edit-config/config-journey-orchestrator.styles.ts","../src/new/main/edit-config/config-journey-orchestrator.template.ts","../src/new/main/edit-config/config-journey-orchestrator.ts","../src/new/main/edit-config/base-config/base-config.styles.ts","../src/new/main/edit-config/base-config/base-config.template.ts","../src/new/main/edit-config/base-config/base-config.ts","../src/new/main/edit-config/col-filters/col-filters-grid.helpers.test.ts","../src/new/main/edit-config/col-filters/col-filters-grid.helpers.ts","../src/new/main/edit-config/col-filters/col-filters-grid.styles.ts","../src/new/main/edit-config/col-filters/col-filters-grid.ts","../src/new/main/edit-config/col-filters/col-filters-grid.types.ts","../src/new/main/edit-config/col-filters/col-filters-tutorial.ts","../src/new/main/edit-config/col-filters/col-fitlers-grid.template.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.helpers.test.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.helpers.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.styles.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.template.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-grid.types.ts","../src/new/main/edit-config/col-rename-alias/col-rename-alias-tutorial.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms-tutorial.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.helpers.test.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.helpers.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.styles.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.template.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.ts","../src/new/main/edit-config/data-transforms-derived-fields/data-transforms.types.ts","../src/new/main/edit-config/data-transforms-derived-fields/date-format-modal/date-format-modal.styles.ts","../src/new/main/edit-config/data-transforms-derived-fields/date-format-modal/date-format-modal.template.ts","../src/new/main/edit-config/data-transforms-derived-fields/date-format-modal/date-format-modal.ts","../src/new/main/edit-config/data-transforms-derived-fields/date-format-modal/index.ts","../src/new/main/edit-config/data-transforms-derived-fields/number-format-modal/index.ts","../src/new/main/edit-config/data-transforms-derived-fields/number-format-modal/number-format-modal.styles.ts","../src/new/main/edit-config/data-transforms-derived-fields/number-format-modal/number-format-modal.template.ts","../src/new/main/edit-config/data-transforms-derived-fields/number-format-modal/number-format-modal.ts","../src/new/main/edit-config/datasource-config/datasource-config-container.styles.ts","../src/new/main/edit-config/datasource-config/datasource-config-item.styles.ts","../src/new/main/edit-config/datasource-config/datasource-config-item.template.ts","../src/new/main/edit-config/datasource-config/datasource-config-item.ts","../src/new/main/edit-config/datasource-config/datasources-config-container.helpers.test.ts","../src/new/main/edit-config/datasource-config/datasources-config-container.helpers.ts","../src/new/main/edit-config/datasource-config/datasources-config-container.template.ts","../src/new/main/edit-config/datasource-config/datasources-config-container.ts","../src/new/main/edit-config/datasource-config/types.ts","../src/new/main/edit-config/outputs-config/outputs-config.style.ts","../src/new/main/edit-config/outputs-config/outputs-config.template.ts","../src/new/main/edit-config/outputs-config/outputs-config.ts","../src/new/main/edit-config/row-filters/row-filters-tutorial.styles.ts","../src/new/main/edit-config/row-filters/row-filters-tutorial.template.ts","../src/new/main/edit-config/row-filters/row-filters-tutorial.ts","../src/new/main/edit-config/row-filters/row-filters.helpers.test.ts","../src/new/main/edit-config/row-filters/row-filters.helpers.ts","../src/new/main/edit-config/row-filters/row-filters.styles.ts","../src/new/main/edit-config/row-filters/row-filters.template.ts","../src/new/main/edit-config/row-filters/row-filters.ts","../src/new/main/edit-config/row-filters/row-filters.types.ts","../src/new/main/edit-config/scheduling/scheduling.styles.ts","../src/new/main/edit-config/scheduling/scheduling.template.ts","../src/new/main/edit-config/scheduling/scheduling.ts","../src/new/main/edit-config/shared/datasource-data-base-component.helpers.ts.ts","../src/new/main/edit-config/shared/datasource-data-base-component.test.ts","../src/new/main/edit-config/shared/datasource-data-base-component.ts","../src/new/main/edit-config/shared/datasource-data-base-component.types.ts","../src/new/main/edit-config/shared/index.ts","../src/new/main/edit-config/tabbed-datasource-container/index.ts","../src/new/main/edit-config/tabbed-datasource-container/tabbed-datasource-container.styles.ts","../src/new/main/edit-config/tabbed-datasource-container/tabbed-datasource-container.template.ts","../src/new/main/edit-config/tabbed-datasource-container/tabbed-datasource-container.ts","../src/new/main/edit-config/tabbed-datasource-container/tabbed-datasource-container.types.ts","../src/new/main/generated-reports/generated-reports.styles.ts","../src/new/main/generated-reports/generated-reports.template.ts","../src/new/main/generated-reports/generated-reports.ts","../src/new/main/report-destinations/report-destinations.template.ts","../src/new/main/report-destinations/report-destinations.ts","../src/new/store/index.ts","../src/new/store/store.ts","../src/new/store/types.ts","../src/new/store/slices/base-config.ts","../src/new/store/slices/datasources-config.ts","../src/new/store/slices/index.ts","../src/new/store/slices/types.ts","../src/new/styles/constraints.styles.ts","../src/new/styles/forms.styles.ts","../src/new/styles/index.ts","../src/new/styles/misc.styles.ts","../src/new/types/display.ts","../src/new/types/index.ts","../src/new/types/misc.ts","../src/new/types/redux.ts","../src/new/types/rights.ts","../src/new/utils/date-filter-params.ts","../src/new/utils/endpoint.test.ts","../src/new/utils/endpoint.ts","../src/new/utils/event-map.ts","../src/new/utils/format-utils.ts","../src/new/utils/formatters.ts","../src/new/utils/index.ts","../src/new/utils/notifications.ts","../src/new/utils/renderer.ts","../src/new/utils/rights.ts","../src/new/utils/sorter.ts","../src/new/utils/tooltip.ts","../src/new/utils/transformers.test.ts","../src/new/utils/transformers.ts","../src/new/utils/validators.ts","../src/old/assets/images/index.ts","../src/old/components/rapid-components.ts","../src/old/components/zero-components.ts","../src/old/components/create-edit/create-edit.styles.ts","../src/old/components/create-edit/create-edit.template.ts","../src/old/components/create-edit/create-edit.ts","../src/old/components/create-edit/index.ts","../src/old/components/list/columns.ts","../src/old/components/list/index.ts","../src/old/components/list/list.styles.ts","../src/old/components/list/list.template.ts","../src/old/components/list/list.ts","../src/old/components/preview/columns.ts","../src/old/components/preview/index.ts","../src/old/components/preview/preview.styles.ts","../src/old/components/preview/preview.template.ts","../src/old/components/preview/preview.ts","../src/old/components/renderers/custom-header-component.ts","../src/old/components/renderers/row-select.renderer.ts","../src/old/components/select-fields/columns.ts","../src/old/components/select-fields/data.ts","../src/old/components/select-fields/index.ts","../src/old/components/select-fields/select-fields.styles.ts","../src/old/components/select-fields/select-fields.template.ts","../src/old/components/select-fields/select-fields.ts","../src/old/components/select-filters/columns.ts","../src/old/components/select-filters/index.ts","../src/old/components/select-filters/select-filters.styles.ts","../src/old/components/select-filters/select-filters.template.ts","../src/old/components/select-filters/select-filters.ts","../src/old/components/wizard/debug.ts","../src/old/components/wizard/index.ts","../src/old/components/wizard/wizard.styles.ts","../src/old/components/wizard/wizard.template.ts","../src/old/components/wizard/wizard.ts","../src/old/components/wizard/wizard.types.ts","../src/old/components/wizard/steps/filters.ts","../src/old/components/wizard/steps/index.ts","../src/old/components/wizard/steps/name.ts","../src/old/components/wizard/steps/run.ts","../src/old/components/wizard/steps/select.ts","../src/old/config/config.ts","../src/old/config/configure.ts","../src/old/config/index.ts","../src/old/config/templates.ts","../src/old/constants/grid-config.ts","../src/old/layouts/default.ts","../src/old/layouts/index.ts","../src/old/layouts/two-pane-horizontal.ts","../src/old/main/index.ts","../src/old/main/main.styles.ts","../src/old/main/main.template.ts","../src/old/main/main.test.ts","../src/old/main/main.ts","../src/old/main/types.ts","../src/old/styles/colors.ts","../src/old/styles/helpers.ts","../src/old/styles/index.ts","../src/old/styles/normalize.ts","../src/old/styles/styles.ts","../src/old/tags/index.ts","../src/old/tags/tags.ts","../src/old/utils/filterObjectArray.test.ts","../src/old/utils/filterObjectArray.ts","../src/old/utils/getFiltersByType.ts","../src/old/utils/getSelectedFields.ts","../src/old/utils/index.ts","../src/old/utils/logger.ts"],"version":"5.9.2"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/pbc-reporting-ui",
3
3
  "description": "Genesis PBC Reporting UI",
4
- "version": "14.353.4-alpha-f6000a0.0",
4
+ "version": "14.353.4",
5
5
  "license": "SEE LICENSE IN license.txt",
6
6
  "main": "dist/esm/index.js",
7
7
  "types": "dist/dts/index.d.ts",
@@ -104,21 +104,21 @@
104
104
  "@ag-grid-community/core": "29.2.0"
105
105
  },
106
106
  "dependencies": {
107
- "@genesislcap/foundation-comms": "14.353.4-alpha-f6000a0.0",
108
- "@genesislcap/foundation-entity-management": "14.353.4-alpha-f6000a0.0",
109
- "@genesislcap/foundation-events": "14.353.4-alpha-f6000a0.0",
110
- "@genesislcap/foundation-forms": "14.353.4-alpha-f6000a0.0",
111
- "@genesislcap/foundation-logger": "14.353.4-alpha-f6000a0.0",
112
- "@genesislcap/foundation-notifications": "14.353.4-alpha-f6000a0.0",
113
- "@genesislcap/foundation-ui": "14.353.4-alpha-f6000a0.0",
114
- "@genesislcap/foundation-user": "14.353.4-alpha-f6000a0.0",
115
- "@genesislcap/foundation-utils": "14.353.4-alpha-f6000a0.0",
116
- "@genesislcap/foundation-zero": "14.353.4-alpha-f6000a0.0",
117
- "@genesislcap/foundation-zero-grid-pro": "14.353.4-alpha-f6000a0.0",
118
- "@genesislcap/grid-pro": "14.353.4-alpha-f6000a0.0",
119
- "@genesislcap/rapid-design-system": "14.353.4-alpha-f6000a0.0",
120
- "@genesislcap/rapid-grid-pro": "14.353.4-alpha-f6000a0.0",
121
- "@genesislcap/web-core": "14.353.4-alpha-f6000a0.0",
107
+ "@genesislcap/foundation-comms": "14.353.4",
108
+ "@genesislcap/foundation-entity-management": "14.353.4",
109
+ "@genesislcap/foundation-events": "14.353.4",
110
+ "@genesislcap/foundation-forms": "14.353.4",
111
+ "@genesislcap/foundation-logger": "14.353.4",
112
+ "@genesislcap/foundation-notifications": "14.353.4",
113
+ "@genesislcap/foundation-ui": "14.353.4",
114
+ "@genesislcap/foundation-user": "14.353.4",
115
+ "@genesislcap/foundation-utils": "14.353.4",
116
+ "@genesislcap/foundation-zero": "14.353.4",
117
+ "@genesislcap/foundation-zero-grid-pro": "14.353.4",
118
+ "@genesislcap/grid-pro": "14.353.4",
119
+ "@genesislcap/rapid-design-system": "14.353.4",
120
+ "@genesislcap/rapid-grid-pro": "14.353.4",
121
+ "@genesislcap/web-core": "14.353.4",
122
122
  "@reduxjs/toolkit": "^2.2.5",
123
123
  "@types/node": "^22.10.2",
124
124
  "change-case": "^5.4.3",
@@ -127,11 +127,11 @@
127
127
  "devDependencies": {
128
128
  "@genesiscommunitysuccess/cep-fast-plugin": "^5.0.3",
129
129
  "@genesiscommunitysuccess/custom-elements-lsp": "^5.0.3",
130
- "@genesislcap/eslint-config": "14.353.4-alpha-f6000a0.0",
131
- "@genesislcap/foundation-testing": "14.353.4-alpha-f6000a0.0",
132
- "@genesislcap/genx": "14.353.4-alpha-f6000a0.0",
133
- "@genesislcap/prettier-config": "14.353.4-alpha-f6000a0.0",
134
- "@genesislcap/stylelint-config": "14.353.4-alpha-f6000a0.0",
130
+ "@genesislcap/eslint-config": "14.353.4",
131
+ "@genesislcap/foundation-testing": "14.353.4",
132
+ "@genesislcap/genx": "14.353.4",
133
+ "@genesislcap/prettier-config": "14.353.4",
134
+ "@genesislcap/stylelint-config": "14.353.4",
135
135
  "@types/json-schema": "^7.0.11",
136
136
  "playwright-lighthouse": "^4.0.0",
137
137
  "rimraf": "^5.0.0"
@@ -140,5 +140,5 @@
140
140
  "access": "public"
141
141
  },
142
142
  "customElements": "dist/custom-elements.json",
143
- "gitHead": "d2fe388a1ca5bd5cc1c633135154412898614373"
143
+ "gitHead": "9a01f1754679f390838a644b4d56aeb077e23c0b"
144
144
  }
@@ -0,0 +1,487 @@
1
+ import { assert, sinon, suite } from '@genesislcap/foundation-testing';
2
+ import type { Genesis } from '../types';
3
+ import { buildDatasourceName, transformFromServerPayload } from './transformers';
4
+
5
+ const TransformFromServerPayload = suite('transformFromServerPayload');
6
+
7
+ TransformFromServerPayload.before.each(() => {
8
+ sinon.restore();
9
+ });
10
+
11
+ TransformFromServerPayload('cleans up orphaned fields from INCLUDE_COLUMNS', async () => {
12
+ const mockGetSchema = sinon.stub();
13
+ const validSchema: Genesis.JSONSchema7 = {
14
+ properties: {
15
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
16
+ AMOUNT: { genesisType: 'DOUBLE' },
17
+ },
18
+ };
19
+ mockGetSchema.resolves(validSchema);
20
+
21
+ const payload: Genesis.ServerReportConfig = {
22
+ ID: 'test-id',
23
+ NAME: 'Test Report',
24
+ SCHEDULES: [],
25
+ DATA_SOURCES: [
26
+ {
27
+ KEY: 'COUNTERPARTY',
28
+ INPUT_TYPE: 'REQ_REP',
29
+ NAME: 'COUNTERPARTY',
30
+ OUTPUT_TYPE: 'TABLE',
31
+ TRANSFORMER_CONFIGURATION: {
32
+ INCLUDE_COLUMNS: ['COUNTERPARTY_NAME', 'AMOUNT', 'NAME'], // NAME is orphaned
33
+ },
34
+ },
35
+ ],
36
+ DESTINATION_IDS: [],
37
+ OUTPUT_DIRECTORY: '/reports',
38
+ };
39
+
40
+ const result = await transformFromServerPayload(payload, mockGetSchema);
41
+
42
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
43
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
44
+
45
+ assert.equal(cleanedConfig.INCLUDE_COLUMNS?.length, 2);
46
+ assert.ok(cleanedConfig.INCLUDE_COLUMNS?.includes('COUNTERPARTY_NAME'));
47
+ assert.ok(cleanedConfig.INCLUDE_COLUMNS?.includes('AMOUNT'));
48
+ assert.ok(!cleanedConfig.INCLUDE_COLUMNS?.includes('NAME'));
49
+ });
50
+
51
+ TransformFromServerPayload('cleans up orphaned fields from COLUMN_RENAMES', async () => {
52
+ const mockGetSchema = sinon.stub();
53
+ const validSchema: Genesis.JSONSchema7 = {
54
+ properties: {
55
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
56
+ AMOUNT: { genesisType: 'DOUBLE' },
57
+ },
58
+ };
59
+ mockGetSchema.resolves(validSchema);
60
+
61
+ const payload: Genesis.ServerReportConfig = {
62
+ ID: 'test-id',
63
+ NAME: 'Test Report',
64
+ SCHEDULES: [],
65
+ DATA_SOURCES: [
66
+ {
67
+ KEY: 'COUNTERPARTY',
68
+ INPUT_TYPE: 'REQ_REP',
69
+ NAME: 'COUNTERPARTY',
70
+ OUTPUT_TYPE: 'TABLE',
71
+ TRANSFORMER_CONFIGURATION: {
72
+ COLUMN_RENAMES: {
73
+ COUNTERPARTY_NAME: 'Counterparty Name',
74
+ AMOUNT: 'Amount',
75
+ NAME: 'Old Name', // orphaned
76
+ },
77
+ },
78
+ },
79
+ ],
80
+ DESTINATION_IDS: [],
81
+ OUTPUT_DIRECTORY: '/reports',
82
+ };
83
+
84
+ const result = await transformFromServerPayload(payload, mockGetSchema);
85
+
86
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
87
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
88
+
89
+ assert.equal(Object.keys(cleanedConfig.COLUMN_RENAMES || {}).length, 2);
90
+ assert.equal(cleanedConfig.COLUMN_RENAMES?.['COUNTERPARTY_NAME'], 'Counterparty Name');
91
+ assert.equal(cleanedConfig.COLUMN_RENAMES?.['AMOUNT'], 'Amount');
92
+ assert.ok(!cleanedConfig.COLUMN_RENAMES?.['NAME']);
93
+ });
94
+
95
+ TransformFromServerPayload('cleans up orphaned fields from COLUMN_FORMATS', async () => {
96
+ const mockGetSchema = sinon.stub();
97
+ const validSchema: Genesis.JSONSchema7 = {
98
+ properties: {
99
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
100
+ AMOUNT: { genesisType: 'DOUBLE' },
101
+ },
102
+ };
103
+ mockGetSchema.resolves(validSchema);
104
+
105
+ const payload: Genesis.ServerReportConfig = {
106
+ ID: 'test-id',
107
+ NAME: 'Test Report',
108
+ SCHEDULES: [],
109
+ DATA_SOURCES: [
110
+ {
111
+ KEY: 'COUNTERPARTY',
112
+ INPUT_TYPE: 'REQ_REP',
113
+ NAME: 'COUNTERPARTY',
114
+ OUTPUT_TYPE: 'TABLE',
115
+ TRANSFORMER_CONFIGURATION: {
116
+ COLUMN_FORMATS: {
117
+ COUNTERPARTY_NAME: 'text',
118
+ AMOUNT: '#,##0.00',
119
+ NAME: 'text', // orphaned
120
+ },
121
+ },
122
+ },
123
+ ],
124
+ DESTINATION_IDS: [],
125
+ OUTPUT_DIRECTORY: '/reports',
126
+ };
127
+
128
+ const result = await transformFromServerPayload(payload, mockGetSchema);
129
+
130
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
131
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
132
+
133
+ assert.equal(Object.keys(cleanedConfig.COLUMN_FORMATS || {}).length, 2);
134
+ assert.equal(cleanedConfig.COLUMN_FORMATS?.['COUNTERPARTY_NAME'], 'text');
135
+ assert.equal(cleanedConfig.COLUMN_FORMATS?.['AMOUNT'], '#,##0.00');
136
+ assert.ok(!cleanedConfig.COLUMN_FORMATS?.['NAME']);
137
+ });
138
+
139
+ TransformFromServerPayload('cleans up orphaned fields from COLUMN_TRANSFORMS', async () => {
140
+ const mockGetSchema = sinon.stub();
141
+ const validSchema: Genesis.JSONSchema7 = {
142
+ properties: {
143
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
144
+ AMOUNT: { genesisType: 'DOUBLE' },
145
+ },
146
+ };
147
+ mockGetSchema.resolves(validSchema);
148
+
149
+ const payload: Genesis.ServerReportConfig = {
150
+ ID: 'test-id',
151
+ NAME: 'Test Report',
152
+ SCHEDULES: [],
153
+ DATA_SOURCES: [
154
+ {
155
+ KEY: 'COUNTERPARTY',
156
+ INPUT_TYPE: 'REQ_REP',
157
+ NAME: 'COUNTERPARTY',
158
+ OUTPUT_TYPE: 'TABLE',
159
+ TRANSFORMER_CONFIGURATION: {
160
+ COLUMN_TRANSFORMS: {
161
+ COUNTERPARTY_NAME: { TYPE: 'BINARY_EXPRESSION', LEFT: {}, OPERATION: 'AND', RIGHT: {} },
162
+ AMOUNT: { TYPE: 'METHOD_EXPRESSION', METHOD: 'TRIM', PARAMETERS: [] },
163
+ NAME: { TYPE: 'BINARY_EXPRESSION', LEFT: {}, OPERATION: 'AND', RIGHT: {} }, // orphaned
164
+ } as any,
165
+ },
166
+ },
167
+ ],
168
+ DESTINATION_IDS: [],
169
+ OUTPUT_DIRECTORY: '/reports',
170
+ };
171
+
172
+ const result = await transformFromServerPayload(payload, mockGetSchema);
173
+
174
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
175
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
176
+
177
+ assert.equal(Object.keys(cleanedConfig.COLUMN_TRANSFORMS || {}).length, 2);
178
+ assert.ok(cleanedConfig.COLUMN_TRANSFORMS?.['COUNTERPARTY_NAME']);
179
+ assert.ok(cleanedConfig.COLUMN_TRANSFORMS?.['AMOUNT']);
180
+ assert.ok(!cleanedConfig.COLUMN_TRANSFORMS?.['NAME']);
181
+ });
182
+
183
+ TransformFromServerPayload('handles schema fetch failure gracefully', async () => {
184
+ const mockGetSchema = sinon.stub();
185
+ const consoleWarnStub = sinon.stub(console, 'warn');
186
+ mockGetSchema.rejects(new Error('Schema fetch failed'));
187
+
188
+ const originalConfig = {
189
+ INCLUDE_COLUMNS: ['NAME', 'AMOUNT'],
190
+ COLUMN_RENAMES: { NAME: 'Name' },
191
+ };
192
+
193
+ const payload: Genesis.ServerReportConfig = {
194
+ ID: 'test-id',
195
+ NAME: 'Test Report',
196
+ SCHEDULES: [],
197
+ DATA_SOURCES: [
198
+ {
199
+ KEY: 'COUNTERPARTY',
200
+ INPUT_TYPE: 'REQ_REP',
201
+ NAME: 'COUNTERPARTY',
202
+ OUTPUT_TYPE: 'TABLE',
203
+ TRANSFORMER_CONFIGURATION: originalConfig,
204
+ },
205
+ ],
206
+ DESTINATION_IDS: [],
207
+ OUTPUT_DIRECTORY: '/reports',
208
+ };
209
+
210
+ const result = await transformFromServerPayload(payload, mockGetSchema);
211
+
212
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
213
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
214
+
215
+ // Should keep original config when schema fetch fails
216
+ assert.equal(JSON.stringify(cleanedConfig), JSON.stringify(originalConfig));
217
+ assert.ok(consoleWarnStub.calledOnce);
218
+ assert.ok(consoleWarnStub.calledWithMatch(sinon.match.string, sinon.match.instanceOf(Error)));
219
+
220
+ consoleWarnStub.restore();
221
+ });
222
+
223
+ TransformFromServerPayload('handles multiple datasources independently', async () => {
224
+ const mockGetSchema = sinon.stub();
225
+ mockGetSchema
226
+ .onFirstCall()
227
+ .resolves({
228
+ properties: {
229
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
230
+ },
231
+ } as Genesis.JSONSchema7)
232
+ .onSecondCall()
233
+ .resolves({
234
+ properties: {
235
+ TRADE_ID: { genesisType: 'STRING' },
236
+ },
237
+ } as Genesis.JSONSchema7);
238
+
239
+ const payload: Genesis.ServerReportConfig = {
240
+ ID: 'test-id',
241
+ NAME: 'Test Report',
242
+ SCHEDULES: [],
243
+ DATA_SOURCES: [
244
+ {
245
+ KEY: 'COUNTERPARTY',
246
+ INPUT_TYPE: 'REQ_REP',
247
+ NAME: 'COUNTERPARTY',
248
+ OUTPUT_TYPE: 'TABLE',
249
+ TRANSFORMER_CONFIGURATION: {
250
+ INCLUDE_COLUMNS: ['COUNTERPARTY_NAME', 'NAME'], // NAME is orphaned
251
+ },
252
+ },
253
+ {
254
+ KEY: 'TRADE',
255
+ INPUT_TYPE: 'REQ_REP',
256
+ NAME: 'TRADE',
257
+ OUTPUT_TYPE: 'TABLE',
258
+ TRANSFORMER_CONFIGURATION: {
259
+ INCLUDE_COLUMNS: ['TRADE_ID', 'OLD_FIELD'], // OLD_FIELD is orphaned
260
+ },
261
+ },
262
+ ],
263
+ DESTINATION_IDS: [],
264
+ OUTPUT_DIRECTORY: '/reports',
265
+ };
266
+
267
+ const result = await transformFromServerPayload(payload, mockGetSchema);
268
+
269
+ const counterpartyKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
270
+ const tradeKey = buildDatasourceName('TRADE', 'REQ_REP');
271
+
272
+ assert.equal(
273
+ result.datasourceConfig[counterpartyKey].TRANSFORMER_CONFIGURATION.INCLUDE_COLUMNS?.length,
274
+ 1,
275
+ );
276
+ assert.ok(
277
+ result.datasourceConfig[counterpartyKey].TRANSFORMER_CONFIGURATION.INCLUDE_COLUMNS?.includes(
278
+ 'COUNTERPARTY_NAME',
279
+ ),
280
+ );
281
+
282
+ assert.equal(
283
+ result.datasourceConfig[tradeKey].TRANSFORMER_CONFIGURATION.INCLUDE_COLUMNS?.length,
284
+ 1,
285
+ );
286
+ assert.ok(
287
+ result.datasourceConfig[tradeKey].TRANSFORMER_CONFIGURATION.INCLUDE_COLUMNS?.includes(
288
+ 'TRADE_ID',
289
+ ),
290
+ );
291
+ });
292
+
293
+ TransformFromServerPayload('handles empty transformer configuration', async () => {
294
+ const mockGetSchema = sinon.stub();
295
+ const validSchema: Genesis.JSONSchema7 = {
296
+ properties: {
297
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
298
+ },
299
+ };
300
+ mockGetSchema.resolves(validSchema);
301
+
302
+ const payload: Genesis.ServerReportConfig = {
303
+ ID: 'test-id',
304
+ NAME: 'Test Report',
305
+ SCHEDULES: [],
306
+ DATA_SOURCES: [
307
+ {
308
+ KEY: 'COUNTERPARTY',
309
+ INPUT_TYPE: 'REQ_REP',
310
+ NAME: 'COUNTERPARTY',
311
+ OUTPUT_TYPE: 'TABLE',
312
+ TRANSFORMER_CONFIGURATION: {},
313
+ },
314
+ ],
315
+ DESTINATION_IDS: [],
316
+ OUTPUT_DIRECTORY: '/reports',
317
+ };
318
+
319
+ const result = await transformFromServerPayload(payload, mockGetSchema);
320
+
321
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
322
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
323
+
324
+ assert.equal(JSON.stringify(cleanedConfig), JSON.stringify({}));
325
+ });
326
+
327
+ TransformFromServerPayload('handles missing schema properties', async () => {
328
+ const mockGetSchema = sinon.stub();
329
+ const schemaWithoutProperties: Genesis.JSONSchema7 = {};
330
+ mockGetSchema.resolves(schemaWithoutProperties);
331
+
332
+ const payload: Genesis.ServerReportConfig = {
333
+ ID: 'test-id',
334
+ NAME: 'Test Report',
335
+ SCHEDULES: [],
336
+ DATA_SOURCES: [
337
+ {
338
+ KEY: 'COUNTERPARTY',
339
+ INPUT_TYPE: 'REQ_REP',
340
+ NAME: 'COUNTERPARTY',
341
+ OUTPUT_TYPE: 'TABLE',
342
+ TRANSFORMER_CONFIGURATION: {
343
+ INCLUDE_COLUMNS: ['NAME', 'AMOUNT'],
344
+ },
345
+ },
346
+ ],
347
+ DESTINATION_IDS: [],
348
+ OUTPUT_DIRECTORY: '/reports',
349
+ };
350
+
351
+ const result = await transformFromServerPayload(payload, mockGetSchema);
352
+
353
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
354
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
355
+
356
+ // All fields should be removed when schema has no properties
357
+ assert.equal(cleanedConfig.INCLUDE_COLUMNS?.length, 0);
358
+ });
359
+
360
+ TransformFromServerPayload('preserves base config correctly', async () => {
361
+ const mockGetSchema = sinon.stub();
362
+ const validSchema: Genesis.JSONSchema7 = {
363
+ properties: {
364
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
365
+ },
366
+ };
367
+ mockGetSchema.resolves(validSchema);
368
+
369
+ const payload: Genesis.ServerReportConfig = {
370
+ ID: 'test-id',
371
+ NAME: 'Test Report',
372
+ DESCRIPTION: 'Test Description',
373
+ OUTPUT_FORMAT: 'CSV',
374
+ FILE_NAME: 'test.csv',
375
+ AUTO_DISPATCH: true,
376
+ DESTINATION_IDS: ['dest1', 'dest2'],
377
+ OUTPUT_DIRECTORY: '/reports',
378
+ DOCUMENT_TEMPLATE_ID: 'template-123',
379
+ SCHEDULES: [
380
+ {
381
+ CRON_EXPRESSION: '0 0 0 * * ?',
382
+ TIME_ZONE: 'UTC',
383
+ },
384
+ ],
385
+ DATA_SOURCES: [
386
+ {
387
+ KEY: 'COUNTERPARTY',
388
+ INPUT_TYPE: 'REQ_REP',
389
+ NAME: 'COUNTERPARTY',
390
+ OUTPUT_TYPE: 'TABLE',
391
+ TRANSFORMER_CONFIGURATION: {},
392
+ },
393
+ ],
394
+ };
395
+
396
+ const result = await transformFromServerPayload(payload, mockGetSchema);
397
+
398
+ assert.equal(result.baseConfig.ID, 'test-id');
399
+ assert.equal(result.baseConfig.NAME, 'Test Report');
400
+ assert.equal(result.baseConfig.DESCRIPTION, 'Test Description');
401
+ assert.equal(result.baseConfig.OUTPUT_FORMAT, 'CSV');
402
+ assert.equal(result.baseConfig.FILE_NAME, 'test.csv');
403
+ assert.equal(result.baseConfig.AUTO_DISPATCH, true);
404
+ assert.equal(
405
+ JSON.stringify(result.baseConfig.DESTINATION_IDS),
406
+ JSON.stringify(['dest1', 'dest2']),
407
+ );
408
+ assert.equal(result.baseConfig.OUTPUT_DIRECTORY, '/reports');
409
+ assert.equal(result.baseConfig.DOCUMENT_TEMPLATE_ID, 'template-123');
410
+ assert.ok(result.baseConfig.SCHEDULE);
411
+ assert.equal(result.baseConfig.SCHEDULE?.CRON_EXPRESSION, '0 0 0 * * ?');
412
+ assert.equal(result.baseConfig.SCHEDULE?.TIME_ZONE, 'UTC');
413
+ });
414
+
415
+ TransformFromServerPayload('handles all transformer config types together', async () => {
416
+ const mockGetSchema = sinon.stub();
417
+ const validSchema: Genesis.JSONSchema7 = {
418
+ properties: {
419
+ COUNTERPARTY_NAME: { genesisType: 'STRING' },
420
+ AMOUNT: { genesisType: 'DOUBLE' },
421
+ },
422
+ };
423
+ mockGetSchema.resolves(validSchema);
424
+
425
+ const payload: Genesis.ServerReportConfig = {
426
+ ID: 'test-id',
427
+ NAME: 'Test Report',
428
+ SCHEDULES: [],
429
+ DATA_SOURCES: [
430
+ {
431
+ KEY: 'COUNTERPARTY',
432
+ INPUT_TYPE: 'REQ_REP',
433
+ NAME: 'COUNTERPARTY',
434
+ OUTPUT_TYPE: 'TABLE',
435
+ TRANSFORMER_CONFIGURATION: {
436
+ INCLUDE_COLUMNS: ['COUNTERPARTY_NAME', 'AMOUNT', 'NAME'], // NAME orphaned
437
+ COLUMN_RENAMES: {
438
+ COUNTERPARTY_NAME: 'Counterparty',
439
+ NAME: 'Old Name', // orphaned
440
+ },
441
+ COLUMN_FORMATS: {
442
+ AMOUNT: '#,##0.00',
443
+ NAME: 'text', // orphaned
444
+ },
445
+ COLUMN_TRANSFORMS: {
446
+ COUNTERPARTY_NAME: { TYPE: 'BINARY_EXPRESSION', LEFT: {}, OPERATION: 'AND', RIGHT: {} },
447
+ NAME: { TYPE: 'METHOD_EXPRESSION', METHOD: 'TRIM', PARAMETERS: [] }, // orphaned
448
+ } as any,
449
+ ROW_FILTERS: {
450
+ TYPE: 'PREDICATE_EXPRESSION' as const,
451
+ OPERATION: 'AND' as const,
452
+ EXPRESSIONS: [],
453
+ },
454
+ },
455
+ },
456
+ ],
457
+ DESTINATION_IDS: [],
458
+ OUTPUT_DIRECTORY: '/reports',
459
+ };
460
+
461
+ const result = await transformFromServerPayload(payload, mockGetSchema);
462
+
463
+ const datasourceKey = buildDatasourceName('COUNTERPARTY', 'REQ_REP');
464
+ const cleanedConfig = result.datasourceConfig[datasourceKey].TRANSFORMER_CONFIGURATION;
465
+
466
+ // INCLUDE_COLUMNS should only have valid fields
467
+ assert.equal(cleanedConfig.INCLUDE_COLUMNS?.length, 2);
468
+ assert.ok(cleanedConfig.INCLUDE_COLUMNS?.includes('COUNTERPARTY_NAME'));
469
+ assert.ok(cleanedConfig.INCLUDE_COLUMNS?.includes('AMOUNT'));
470
+
471
+ // COLUMN_RENAMES should only have valid fields
472
+ assert.equal(Object.keys(cleanedConfig.COLUMN_RENAMES || {}).length, 1);
473
+ assert.equal(cleanedConfig.COLUMN_RENAMES?.['COUNTERPARTY_NAME'], 'Counterparty');
474
+
475
+ // COLUMN_FORMATS should only have valid fields
476
+ assert.equal(Object.keys(cleanedConfig.COLUMN_FORMATS || {}).length, 1);
477
+ assert.equal(cleanedConfig.COLUMN_FORMATS?.['AMOUNT'], '#,##0.00');
478
+
479
+ // COLUMN_TRANSFORMS should only have valid fields
480
+ assert.equal(Object.keys(cleanedConfig.COLUMN_TRANSFORMS || {}).length, 1);
481
+ assert.ok(cleanedConfig.COLUMN_TRANSFORMS?.['COUNTERPARTY_NAME']);
482
+
483
+ // ROW_FILTERS should be preserved
484
+ assert.ok(cleanedConfig.ROW_FILTERS);
485
+ });
486
+
487
+ TransformFromServerPayload.run();