@genesislcap/pbc-reporting-ui 14.353.3 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"clone-report-config-modal.d.ts","sourceRoot":"","sources":["../../../../../src/new/components/clone-report-config-modal/clone-report-config-modal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAiB,cAAc,EAAc,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAmBtC,qBAKa,sBAAuB,SAAQ,cAAc;IAC/C,OAAO,EAAE,OAAO,CAAC;IAC1B,sBAAsB,EAAE,KAAK,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAChD,UAAU,EAAE,MAAM,CAAM;IACxB,QAAQ,EAAE,MAAM,CAAM;IAE5B,sBAAsB,CAAC,EAAE,EAAE,MAAM;IAOjC,qBAAqB,CAAC,EAAE,EAAE,MAAM;IAKtC,2BAA2B;IAM3B,cAAc;IAKd,OAAO,CAAC,YAAY;IASd,iBAAiB;IAoCvB,cAAc,CAAC,OAAO,EAAE,MAAM;CAO/B"}
1
+ {"version":3,"file":"clone-report-config-modal.d.ts","sourceRoot":"","sources":["../../../../../src/new/components/clone-report-config-modal/clone-report-config-modal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAiB,cAAc,EAAc,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAoBtC,qBAKa,sBAAuB,SAAQ,cAAc;IAC/C,OAAO,EAAE,OAAO,CAAC;IAC1B,sBAAsB,EAAE,KAAK,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAChD,UAAU,EAAE,MAAM,CAAM;IACxB,QAAQ,EAAE,MAAM,CAAM;IAE5B,sBAAsB,CAAC,EAAE,EAAE,MAAM;IAOjC,qBAAqB,CAAC,EAAE,EAAE,MAAM;IAKtC,2BAA2B;IAM3B,cAAc;IAKd,OAAO,CAAC,YAAY;IASd,iBAAiB;IAqCvB,cAAc,CAAC,OAAO,EAAE,MAAM;CAO/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"reporting-configurations.d.ts","sourceRoot":"","sources":["../../../../../src/new/components/reporting-configurations/reporting-configurations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD,OAAO,EAAwC,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAEpD,OAAO,EAEL,iBAAiB,EACjB,wBAAwB,EAEzB,MAAM,6BAA6B,CAAC;AAYrC,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIhG,qBAKa,uBAAwB,SAAQ,4BAAqD;IACvF,OAAO,EAAE,OAAO,CAAC;IAC1B,8BAA8B,EAAE,wBAAwB,CAAC;IAC7C,YAAY,EAAE,MAAM,CAAM;IAC1B,gBAAgB,EAAE,sBAAsB,CAAC;IAC/C,IAAI,EAAG,IAAI,CAAC;IAEX,eAAe;;;;;QAWpB;IAEF,sBAAsB;IAMhB,uBAAuB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;IAoBxE,aAAa;IAmHb,cAAc;YAkBA,kBAAkB;YA8BlB,SAAS;IA6BvB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAiBjD,0BAA0B,CAAC,CAAC,KAAA;CAGnC"}
1
+ {"version":3,"file":"reporting-configurations.d.ts","sourceRoot":"","sources":["../../../../../src/new/components/reporting-configurations/reporting-configurations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD,OAAO,EAAwC,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAEpD,OAAO,EAEL,iBAAiB,EACjB,wBAAwB,EAEzB,MAAM,6BAA6B,CAAC;AAarC,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIhG,qBAKa,uBAAwB,SAAQ,4BAAqD;IACvF,OAAO,EAAE,OAAO,CAAC;IAC1B,8BAA8B,EAAE,wBAAwB,CAAC;IAC7C,YAAY,EAAE,MAAM,CAAM;IAC1B,gBAAgB,EAAE,sBAAsB,CAAC;IAC/C,IAAI,EAAG,IAAI,CAAC;IAEX,eAAe;;;;;QAWpB;IAEF,sBAAsB;IAMhB,uBAAuB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;IAqBxE,aAAa;IAmHb,cAAc;YAkBA,kBAAkB;YA8BlB,SAAS;IA6BvB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAiBjD,0BAA0B,CAAC,CAAC,KAAA;CAGnC"}
@@ -1,7 +1,8 @@
1
+ import type { JSONSchema7 } from 'json-schema';
1
2
  import type { DatasourceInputTypes, DatasourceName, ReportingConfig } from '../store';
2
3
  import { Display, Genesis } from '../types';
3
4
  export declare function transformToServerPayload(state: ReportingConfig): Genesis.ServerReportConfig;
4
- export declare function transformFromServerPaylaod(payload: Genesis.ServerReportConfig): ReportingConfig;
5
+ export declare function transformFromServerPayload(payload: Genesis.ServerReportConfig, getSchema: (name: string) => Promise<JSONSchema7>): Promise<ReportingConfig>;
5
6
  export declare function datasourceInputForDisplay(input: DatasourceInputTypes): Display.DatasourceInputTypes;
6
7
  export declare function datasourceInputFromDisplay(display: Display.DatasourceInputTypes): DatasourceInputTypes;
7
8
  export declare function buildDatasourceName(key: string, type: DatasourceInputTypes): DatasourceName;
@@ -1 +1 @@
1
- {"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../../../../src/new/utils/transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,oBAAoB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAE5C,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAiB3F;AAID,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,GAAG,eAAe,CA6C/F;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,oBAAoB,CAI9B;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,CAAC,oBAAoB,GACpC,oBAAoB,CAItB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,cAAc,CAE3F"}
1
+ {"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../../../../src/new/utils/transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAc,oBAAoB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAElG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAE5C,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAiB3F;AAiCD,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,OAAO,CAAC,kBAAkB,EACnC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,GAChD,OAAO,CAAC,eAAe,CAAC,CAuE1B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,oBAAoB,CAI9B;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,CAAC,oBAAoB,GACpC,oBAAoB,CAItB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,cAAc,CAE3F"}
@@ -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":""}
@@ -1,7 +1,7 @@
1
1
  import { __awaiter, __decorate } from "tslib";
2
2
  import { Connect } from '@genesislcap/foundation-comms';
3
3
  import { customElement, GenesisElement, observable } from '@genesislcap/web-core';
4
- import { showNotificationToast, transformFromServerPaylaod, validateReportingConfig, } from '../../utils';
4
+ import { getDatasourceSchema, showNotificationToast, transformFromServerPayload, validateReportingConfig, } from '../../utils';
5
5
  import { cloneReportConfigModalStyles as styles } from './clone-report-config-modal.styles';
6
6
  import { CloneReportConfigModalTemplate as template } from './clone-report-config-modal.template';
7
7
  const EXCLUDED_FIELDS = [
@@ -52,7 +52,8 @@ let CloneReportConfigModal = class CloneReportConfigModal extends GenesisElement
52
52
  var _a, _b;
53
53
  try {
54
54
  const DETAILS = Object.assign(Object.assign({}, this.filterFields(this.reportConfigDetails, EXCLUDED_FIELDS)), { NAME: this.reportName, FILE_NAME: this.fileName });
55
- const result = yield validateReportingConfig(this.connect)(transformFromServerPaylaod(DETAILS));
55
+ const getSchema = getDatasourceSchema(this.connect);
56
+ const result = yield validateReportingConfig(this.connect)(yield transformFromServerPayload(DETAILS, getSchema));
56
57
  if (result.k === 'err') {
57
58
  this.showErrorToast((_a = result.info) === null || _a === void 0 ? void 0 : _a.join('\n\n'));
58
59
  return;
@@ -8,7 +8,7 @@ import { getActionsMenuDef, GridProRendererTypes, } from '@genesislcap/rapid-gri
8
8
  import { customElement, GenesisElement, html, observable } from '@genesislcap/web-core';
9
9
  import { writeReduxState, reduxBlankState, StorageKey } from '../../store';
10
10
  import { Permissions } from '../../types';
11
- import { formatDate, getFormattedDateTime, permissionGuard, showNotificationToast, transformFromServerPaylaod, } from '../../utils';
11
+ import { formatDate, getDatasourceSchema, getFormattedDateTime, permissionGuard, showNotificationToast, transformFromServerPayload, } from '../../utils';
12
12
  import { getFilterParams } from '../../utils/date-filter-params';
13
13
  import { ReportingEvents } from '../../utils/event-map';
14
14
  import { ReportingConfigurationStyles as styles } from './reporting-configurations.styles';
@@ -41,7 +41,8 @@ let ReportingConfigurations = class ReportingConfigurations extends EventEmitter
41
41
  const data = (_b = response.REPLY) === null || _b === void 0 ? void 0 : _b[0];
42
42
  if (!data)
43
43
  throw new Error(`No data returned for edit report with ID ${ID}`);
44
- const transformed = transformFromServerPaylaod(data);
44
+ const getSchema = getDatasourceSchema(this.connect);
45
+ const transformed = yield transformFromServerPayload(data, getSchema);
45
46
  console.log({ transformed });
46
47
  writeReduxState(transformed);
47
48
  this.$emit(ReportingEvents.setReportConfigDisplayMode, 'edit');
@@ -1,4 +1,4 @@
1
- import { __rest } from "tslib";
1
+ import { __awaiter, __rest } from "tslib";
2
2
  export function transformToServerPayload(state) {
3
3
  var _a, _b;
4
4
  const { datasourceConfig, baseConfig } = state;
@@ -12,30 +12,71 @@ export function transformToServerPayload(state) {
12
12
  ? restBaseConfig.DOCUMENT_TEMPLATE_ID
13
13
  : null, DATA_SOURCES: Object.values(datasourceConfig) });
14
14
  }
15
- // TODO: we'll suppress the bigints on the server so won't need to do this
16
- // horrible destructing
17
- export function transformFromServerPaylaod(payload) {
18
- const { DATA_SOURCES, ID, NAME, DESCRIPTION, OUTPUT_FORMAT, FILE_NAME, AUTO_DISPATCH, DESTINATION_IDS, SCHEDULES, OUTPUT_DIRECTORY, DOCUMENT_TEMPLATE_ID, } = payload;
19
- const baseConfig = Object.assign({ ID,
20
- NAME,
21
- DESCRIPTION,
22
- OUTPUT_FORMAT,
23
- FILE_NAME,
24
- AUTO_DISPATCH,
25
- DESTINATION_IDS,
26
- OUTPUT_DIRECTORY,
27
- DOCUMENT_TEMPLATE_ID }, (SCHEDULES.length > 0 && { SCHEDULE: SCHEDULES[0] }));
15
+ /**
16
+ * Cleans up orphaned field references from transformer configuration
17
+ * by validating against current schema
18
+ */
19
+ function cleanupTransformerConfig(config, validFields) {
20
+ var _a;
28
21
  return {
29
- baseConfig,
30
- datasourceConfig: DATA_SOURCES.map(({ KEY, INPUT_TYPE, NAME: DS_NAME, OUTPUT_TYPE, TRANSFORMER_CONFIGURATION }) => ({
31
- KEY,
32
- INPUT_TYPE,
33
- NAME: DS_NAME,
34
- OUTPUT_TYPE,
35
- TRANSFORMER_CONFIGURATION,
36
- })).reduce((acum, ds) => (Object.assign(Object.assign({}, acum), { [buildDatasourceName(ds.NAME, ds.INPUT_TYPE)]: ds })), {}),
22
+ INCLUDE_COLUMNS: (_a = config.INCLUDE_COLUMNS) === null || _a === void 0 ? void 0 : _a.filter((field) => validFields.has(field)),
23
+ COLUMN_RENAMES: config.COLUMN_RENAMES
24
+ ? Object.fromEntries(Object.entries(config.COLUMN_RENAMES).filter(([key]) => validFields.has(key)))
25
+ : undefined,
26
+ COLUMN_FORMATS: config.COLUMN_FORMATS
27
+ ? Object.fromEntries(Object.entries(config.COLUMN_FORMATS).filter(([key]) => validFields.has(key)))
28
+ : undefined,
29
+ COLUMN_TRANSFORMS: config.COLUMN_TRANSFORMS
30
+ ? Object.fromEntries(Object.entries(config.COLUMN_TRANSFORMS).filter(([key]) => validFields.has(key)))
31
+ : undefined,
32
+ ROW_FILTERS: config.ROW_FILTERS,
37
33
  };
38
34
  }
35
+ // TODO: we'll suppress the bigints on the server so won't need to do this
36
+ // horrible destructing
37
+ export function transformFromServerPayload(payload, getSchema) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ const { DATA_SOURCES, ID, NAME, DESCRIPTION, OUTPUT_FORMAT, FILE_NAME, AUTO_DISPATCH, DESTINATION_IDS, SCHEDULES, OUTPUT_DIRECTORY, DOCUMENT_TEMPLATE_ID, } = payload;
40
+ const baseConfig = Object.assign({ ID,
41
+ NAME,
42
+ DESCRIPTION,
43
+ OUTPUT_FORMAT,
44
+ FILE_NAME,
45
+ AUTO_DISPATCH,
46
+ DESTINATION_IDS,
47
+ OUTPUT_DIRECTORY,
48
+ DOCUMENT_TEMPLATE_ID }, (SCHEDULES.length > 0 && { SCHEDULE: SCHEDULES[0] }));
49
+ const cleanedDatasources = yield Promise.all(DATA_SOURCES.map((_a) => __awaiter(this, [_a], void 0, function* ({ KEY, INPUT_TYPE, NAME: DS_NAME, OUTPUT_TYPE, TRANSFORMER_CONFIGURATION }) {
50
+ try {
51
+ const schema = yield getSchema(KEY);
52
+ const validFields = new Set(Object.keys(schema.properties || {}));
53
+ const cleanedConfig = cleanupTransformerConfig(TRANSFORMER_CONFIGURATION || {}, validFields);
54
+ return {
55
+ KEY,
56
+ INPUT_TYPE,
57
+ NAME: DS_NAME,
58
+ OUTPUT_TYPE,
59
+ TRANSFORMER_CONFIGURATION: cleanedConfig,
60
+ };
61
+ }
62
+ catch (error) {
63
+ // If schema fetch fails, log warning but keep original config
64
+ console.warn(`Failed to fetch schema for ${KEY}, skipping cleanup:`, error);
65
+ return {
66
+ KEY,
67
+ INPUT_TYPE,
68
+ NAME: DS_NAME,
69
+ OUTPUT_TYPE,
70
+ TRANSFORMER_CONFIGURATION: TRANSFORMER_CONFIGURATION || {},
71
+ };
72
+ }
73
+ })));
74
+ return {
75
+ baseConfig,
76
+ datasourceConfig: cleanedDatasources.reduce((acum, ds) => (Object.assign(Object.assign({}, acum), { [buildDatasourceName(ds.NAME, ds.INPUT_TYPE)]: ds })), {}),
77
+ };
78
+ });
79
+ }
39
80
  export function datasourceInputForDisplay(input) {
40
81
  if (input === 'REQ_REP')
41
82
  return 'Snapshot';
@@ -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();