@elisra-devops/docgen-data-provider 1.74.0 → 1.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/models/mewp-reporting.d.ts +120 -0
- package/bin/models/mewp-reporting.js +3 -0
- package/bin/models/mewp-reporting.js.map +1 -0
- package/bin/modules/ResultDataProvider.d.ts +47 -13
- package/bin/modules/ResultDataProvider.js +1122 -257
- package/bin/modules/ResultDataProvider.js.map +1 -1
- package/bin/tests/modules/ResultDataProvider.test.js +1293 -113
- package/bin/tests/modules/ResultDataProvider.test.js.map +1 -1
- package/bin/utils/mewpExternalIngestionUtils.d.ts +17 -0
- package/bin/utils/mewpExternalIngestionUtils.js +197 -0
- package/bin/utils/mewpExternalIngestionUtils.js.map +1 -0
- package/bin/utils/mewpExternalTableUtils.d.ts +36 -0
- package/bin/utils/mewpExternalTableUtils.js +320 -0
- package/bin/utils/mewpExternalTableUtils.js.map +1 -0
- package/package.json +10 -1
- package/src/models/mewp-reporting.ts +138 -0
- package/src/modules/ResultDataProvider.ts +1325 -353
- package/src/tests/modules/ResultDataProvider.test.ts +1481 -138
- package/src/utils/mewpExternalIngestionUtils.ts +270 -0
- package/src/utils/mewpExternalTableUtils.ts +461 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const logger_1 = require("./logger");
|
|
4
|
+
class MewpExternalIngestionUtils {
|
|
5
|
+
constructor(externalTableUtils) {
|
|
6
|
+
this.externalTableUtils = externalTableUtils;
|
|
7
|
+
}
|
|
8
|
+
async loadExternalBugsByTestCase(externalBugsFile, adapters) {
|
|
9
|
+
const rows = await this.externalTableUtils.loadExternalTableRows(externalBugsFile, 'bugs');
|
|
10
|
+
if (rows.length === 0)
|
|
11
|
+
return new Map();
|
|
12
|
+
const map = new Map();
|
|
13
|
+
let parsedRows = 0;
|
|
14
|
+
for (const row of rows) {
|
|
15
|
+
const testCaseId = this.toPositiveNumber(this.externalTableUtils.readExternalCell(row, [
|
|
16
|
+
'Elisra_SortIndex',
|
|
17
|
+
'Elisra SortIndex',
|
|
18
|
+
'ElisraSortIndex',
|
|
19
|
+
]));
|
|
20
|
+
if (!testCaseId)
|
|
21
|
+
continue;
|
|
22
|
+
const requirementBaseKey = adapters.toRequirementKey(adapters.toComparableText(this.externalTableUtils.readExternalCell(row, ['SR'])));
|
|
23
|
+
if (!requirementBaseKey)
|
|
24
|
+
continue;
|
|
25
|
+
const bugId = this.toPositiveNumber(this.externalTableUtils.readExternalCell(row, [
|
|
26
|
+
'TargetWorkItemId',
|
|
27
|
+
'Bug ID',
|
|
28
|
+
'BugId',
|
|
29
|
+
'Links.TargetWorkItem.WorkItemId',
|
|
30
|
+
'Links TargetWorkItem WorkItemId',
|
|
31
|
+
])) || 0;
|
|
32
|
+
if (!bugId)
|
|
33
|
+
continue;
|
|
34
|
+
const bugState = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, ['TargetState', 'State']));
|
|
35
|
+
if (!adapters.isExternalStateInScope(bugState, 'bug'))
|
|
36
|
+
continue;
|
|
37
|
+
const bugTitle = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, ['Bug Title', 'Title', 'Links.TargetWorkItem.Title']));
|
|
38
|
+
const bugResponsibilityRaw = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, [
|
|
39
|
+
'Responsibility',
|
|
40
|
+
'Division',
|
|
41
|
+
'SAPWBS',
|
|
42
|
+
'TargetSapWbs',
|
|
43
|
+
]));
|
|
44
|
+
const bug = {
|
|
45
|
+
id: bugId,
|
|
46
|
+
title: bugTitle,
|
|
47
|
+
responsibility: adapters.resolveBugResponsibility({
|
|
48
|
+
'Custom.SAPWBS': bugResponsibilityRaw,
|
|
49
|
+
}),
|
|
50
|
+
requirementBaseKey,
|
|
51
|
+
};
|
|
52
|
+
if (!map.has(testCaseId))
|
|
53
|
+
map.set(testCaseId, []);
|
|
54
|
+
map.get(testCaseId).push(bug);
|
|
55
|
+
parsedRows += 1;
|
|
56
|
+
}
|
|
57
|
+
const deduped = new Map();
|
|
58
|
+
for (const [testCaseId, bugs] of map.entries()) {
|
|
59
|
+
const byId = new Map();
|
|
60
|
+
for (const bug of bugs || []) {
|
|
61
|
+
const bugId = Number((bug === null || bug === void 0 ? void 0 : bug.id) || 0);
|
|
62
|
+
if (!Number.isFinite(bugId) || bugId <= 0)
|
|
63
|
+
continue;
|
|
64
|
+
const baseKey = String((bug === null || bug === void 0 ? void 0 : bug.requirementBaseKey) || '').trim();
|
|
65
|
+
const compositeKey = `${bugId}|${baseKey}`;
|
|
66
|
+
const existing = byId.get(compositeKey);
|
|
67
|
+
if (!existing) {
|
|
68
|
+
byId.set(compositeKey, bug);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
byId.set(compositeKey, {
|
|
72
|
+
id: bugId,
|
|
73
|
+
requirementBaseKey: baseKey,
|
|
74
|
+
title: String((existing === null || existing === void 0 ? void 0 : existing.title) || (bug === null || bug === void 0 ? void 0 : bug.title) || '').trim(),
|
|
75
|
+
responsibility: String((existing === null || existing === void 0 ? void 0 : existing.responsibility) || (bug === null || bug === void 0 ? void 0 : bug.responsibility) || '').trim(),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
deduped.set(testCaseId, [...byId.values()].sort((a, b) => {
|
|
79
|
+
const idCompare = Number(a.id) - Number(b.id);
|
|
80
|
+
if (idCompare !== 0)
|
|
81
|
+
return idCompare;
|
|
82
|
+
return String(a.requirementBaseKey || '').localeCompare(String(b.requirementBaseKey || ''));
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
if (parsedRows === 0) {
|
|
86
|
+
logger_1.default.warn(`External bugs source was loaded but no valid rows were parsed. ` +
|
|
87
|
+
`Expected columns include Elisra_SortIndex, SR and bug ID fields.`);
|
|
88
|
+
}
|
|
89
|
+
return deduped;
|
|
90
|
+
}
|
|
91
|
+
async loadExternalL3L4ByBaseKey(externalL3L4File, adapters) {
|
|
92
|
+
var _a;
|
|
93
|
+
const rows = await this.externalTableUtils.loadExternalTableRows(externalL3L4File, 'l3l4');
|
|
94
|
+
if (rows.length === 0)
|
|
95
|
+
return new Map();
|
|
96
|
+
const linksByBaseKey = new Map();
|
|
97
|
+
const addLink = (baseKey, level, id, title) => {
|
|
98
|
+
if (!baseKey || !id)
|
|
99
|
+
return;
|
|
100
|
+
if (!linksByBaseKey.has(baseKey)) {
|
|
101
|
+
linksByBaseKey.set(baseKey, new Map());
|
|
102
|
+
}
|
|
103
|
+
const idKey = String(id).trim();
|
|
104
|
+
const dedupeKey = `${level}:${idKey}`;
|
|
105
|
+
linksByBaseKey.get(baseKey).set(dedupeKey, {
|
|
106
|
+
id: idKey,
|
|
107
|
+
title: String(title || '').trim(),
|
|
108
|
+
level,
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
let parsedRows = 0;
|
|
112
|
+
for (const row of rows) {
|
|
113
|
+
const srRaw = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, ['SR']));
|
|
114
|
+
const baseKey = adapters.toRequirementKey(srRaw);
|
|
115
|
+
if (!baseKey)
|
|
116
|
+
continue;
|
|
117
|
+
const requirementSapWbsFallback = ((_a = adapters.resolveRequirementSapWbsByBaseKey) === null || _a === void 0 ? void 0 : _a.call(adapters, baseKey)) || '';
|
|
118
|
+
const area = adapters
|
|
119
|
+
.toComparableText(this.externalTableUtils.readExternalCell(row, ['AREA 34', 'AREA34']))
|
|
120
|
+
.toLowerCase();
|
|
121
|
+
const targetIdLevel3 = this.toPositiveNumber(this.externalTableUtils.readExternalCell(row, [
|
|
122
|
+
'TargetWorkItemId Level 3',
|
|
123
|
+
'TargetWorkItemIdLevel 3',
|
|
124
|
+
'TargetWorkItemIdLevel3',
|
|
125
|
+
]));
|
|
126
|
+
const targetTitleLevel3 = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, [
|
|
127
|
+
'TargetTitleLevel3',
|
|
128
|
+
'TargetTitleLevel 3',
|
|
129
|
+
'TargetTitle Level 3',
|
|
130
|
+
]));
|
|
131
|
+
const targetStateLevel3 = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, ['TargetStateLevel 3', 'TargetStateLevel3']));
|
|
132
|
+
const targetSapWbsLevel3 = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, [
|
|
133
|
+
'TargetSapWbsLevel 3',
|
|
134
|
+
'TargetSapWbsLevel3',
|
|
135
|
+
'TargetSapWbs Level 3',
|
|
136
|
+
]));
|
|
137
|
+
const targetIdLevel4 = this.toPositiveNumber(this.externalTableUtils.readExternalCell(row, [
|
|
138
|
+
'TargetWorkItemIdLevel 4',
|
|
139
|
+
'TargetWorkItemId Level 4',
|
|
140
|
+
'TargetWorkItemIdLevel4',
|
|
141
|
+
]));
|
|
142
|
+
const targetTitleLevel4 = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, [
|
|
143
|
+
'TargetTitleLevel4',
|
|
144
|
+
'TargetTitleLevel 4',
|
|
145
|
+
'TargetTitle Level 4',
|
|
146
|
+
]));
|
|
147
|
+
const targetStateLevel4 = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, ['TargetStateLevel 4', 'TargetStateLevel4']));
|
|
148
|
+
const targetSapWbsLevel4 = adapters.toComparableText(this.externalTableUtils.readExternalCell(row, [
|
|
149
|
+
'TargetSapWbsLevel 4',
|
|
150
|
+
'TargetSapWbsLevel4',
|
|
151
|
+
'TargetSapWbs Level 4',
|
|
152
|
+
]));
|
|
153
|
+
if (area.includes('level 4')) {
|
|
154
|
+
const effectiveSapWbsLevel3 = targetSapWbsLevel3 || requirementSapWbsFallback;
|
|
155
|
+
if (targetIdLevel3 &&
|
|
156
|
+
adapters.isExternalStateInScope(targetStateLevel3, 'requirement') &&
|
|
157
|
+
!adapters.isExcludedL3L4BySapWbs(effectiveSapWbsLevel3)) {
|
|
158
|
+
addLink(baseKey, 'L4', targetIdLevel3, targetTitleLevel3);
|
|
159
|
+
}
|
|
160
|
+
parsedRows += 1;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const effectiveSapWbsLevel3 = targetSapWbsLevel3 || requirementSapWbsFallback;
|
|
164
|
+
if (targetIdLevel3 &&
|
|
165
|
+
adapters.isExternalStateInScope(targetStateLevel3, 'requirement') &&
|
|
166
|
+
!adapters.isExcludedL3L4BySapWbs(effectiveSapWbsLevel3)) {
|
|
167
|
+
addLink(baseKey, 'L3', targetIdLevel3, targetTitleLevel3);
|
|
168
|
+
}
|
|
169
|
+
const effectiveSapWbsLevel4 = targetSapWbsLevel4 || requirementSapWbsFallback;
|
|
170
|
+
if (targetIdLevel4 &&
|
|
171
|
+
adapters.isExternalStateInScope(targetStateLevel4, 'requirement') &&
|
|
172
|
+
!adapters.isExcludedL3L4BySapWbs(effectiveSapWbsLevel4)) {
|
|
173
|
+
addLink(baseKey, 'L4', targetIdLevel4, targetTitleLevel4);
|
|
174
|
+
}
|
|
175
|
+
parsedRows += 1;
|
|
176
|
+
}
|
|
177
|
+
const out = new Map();
|
|
178
|
+
for (const [baseKey, linksById] of linksByBaseKey.entries()) {
|
|
179
|
+
out.set(baseKey, [...linksById.values()].sort((a, b) => {
|
|
180
|
+
if (a.level !== b.level)
|
|
181
|
+
return a.level === 'L3' ? -1 : 1;
|
|
182
|
+
return a.id.localeCompare(b.id);
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
if (parsedRows === 0) {
|
|
186
|
+
logger_1.default.warn(`External L3/L4 source was loaded but no valid rows were parsed. ` +
|
|
187
|
+
`Expected columns include SR, AREA 34, target IDs/titles/states.`);
|
|
188
|
+
}
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
toPositiveNumber(value) {
|
|
192
|
+
const parsed = Number(String(value || '').replace(/[^\d]/g, ''));
|
|
193
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
exports.default = MewpExternalIngestionUtils;
|
|
197
|
+
//# sourceMappingURL=mewpExternalIngestionUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mewpExternalIngestionUtils.js","sourceRoot":"","sources":["../../src/utils/mewpExternalIngestionUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { MewpExternalFileRef, MewpExternalTableValidationResult } from '../models/mewp-reporting';
|
|
2
|
+
export type MewpExternalTableType = 'bugs' | 'l3l4';
|
|
3
|
+
export interface MewpExternalRowsWithMeta {
|
|
4
|
+
rows: Array<Record<string, any>>;
|
|
5
|
+
meta: {
|
|
6
|
+
sourceName: string;
|
|
7
|
+
headerRow: 'A3' | 'A1' | '';
|
|
8
|
+
matchedRequiredColumns: number;
|
|
9
|
+
totalRequiredColumns: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare class MewpExternalFileValidationError extends Error {
|
|
13
|
+
readonly statusCode: number;
|
|
14
|
+
readonly code: string;
|
|
15
|
+
readonly details: MewpExternalTableValidationResult;
|
|
16
|
+
constructor(message: string, details: MewpExternalTableValidationResult);
|
|
17
|
+
}
|
|
18
|
+
export default class MewpExternalTableUtils {
|
|
19
|
+
private static readonly EXTERNAL_BUGS_REQUIRED_COLUMNS;
|
|
20
|
+
private static readonly EXTERNAL_L3L4_REQUIRED_COLUMNS;
|
|
21
|
+
private static readonly ALLOWED_EXTERNAL_FILE_EXTENSIONS;
|
|
22
|
+
private static readonly DEFAULT_EXTERNAL_FILE_MAX_BYTES;
|
|
23
|
+
getRequiredColumnLabels(tableType: MewpExternalTableType): string[];
|
|
24
|
+
getRequiredColumnCount(tableType: MewpExternalTableType): number;
|
|
25
|
+
readExternalCell(row: Record<string, any>, aliases: string[]): any;
|
|
26
|
+
loadExternalTableRows(source: MewpExternalFileRef | null | undefined, tableType: MewpExternalTableType): Promise<Array<Record<string, any>>>;
|
|
27
|
+
loadExternalTableRowsWithMeta(source: MewpExternalFileRef | null | undefined, tableType: MewpExternalTableType): Promise<MewpExternalRowsWithMeta>;
|
|
28
|
+
private getRequiredColumns;
|
|
29
|
+
private createMewpExternalValidationError;
|
|
30
|
+
private resolveMewpExternalSourceUrl;
|
|
31
|
+
private validateMewpExternalSourceIsolation;
|
|
32
|
+
private extractMewpBucketAndObjectFromUrl;
|
|
33
|
+
private resolveMewpExternalSourceExtension;
|
|
34
|
+
private resolveMewpExternalMaxFileSize;
|
|
35
|
+
private normalizeExternalColumnKey;
|
|
36
|
+
}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MewpExternalFileValidationError = void 0;
|
|
4
|
+
const axios_1 = require("axios");
|
|
5
|
+
const XLSX = require("xlsx");
|
|
6
|
+
const logger_1 = require("./logger");
|
|
7
|
+
class MewpExternalFileValidationError extends Error {
|
|
8
|
+
constructor(message, details) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'MewpExternalFileValidationError';
|
|
11
|
+
this.statusCode = 422;
|
|
12
|
+
this.code = 'MEWP_EXTERNAL_FILE_VALIDATION_FAILED';
|
|
13
|
+
this.details = details;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.MewpExternalFileValidationError = MewpExternalFileValidationError;
|
|
17
|
+
class MewpExternalTableUtils {
|
|
18
|
+
getRequiredColumnLabels(tableType) {
|
|
19
|
+
return this.getRequiredColumns(tableType).map((item) => item.label);
|
|
20
|
+
}
|
|
21
|
+
getRequiredColumnCount(tableType) {
|
|
22
|
+
return this.getRequiredColumns(tableType).length;
|
|
23
|
+
}
|
|
24
|
+
readExternalCell(row, aliases) {
|
|
25
|
+
if (!row || typeof row !== 'object')
|
|
26
|
+
return '';
|
|
27
|
+
const byNormalizedKey = new Map();
|
|
28
|
+
for (const [key, value] of Object.entries(row)) {
|
|
29
|
+
byNormalizedKey.set(this.normalizeExternalColumnKey(key), value);
|
|
30
|
+
}
|
|
31
|
+
for (const alias of aliases) {
|
|
32
|
+
const value = byNormalizedKey.get(this.normalizeExternalColumnKey(alias));
|
|
33
|
+
if (value !== undefined && value !== null && String(value).trim() !== '') {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
async loadExternalTableRows(source, tableType) {
|
|
40
|
+
const { rows } = await this.loadExternalTableRowsWithMeta(source, tableType);
|
|
41
|
+
return rows;
|
|
42
|
+
}
|
|
43
|
+
async loadExternalTableRowsWithMeta(source, tableType) {
|
|
44
|
+
var _a, _b;
|
|
45
|
+
const sourceName = String((source === null || source === void 0 ? void 0 : source.name) || (source === null || source === void 0 ? void 0 : source.objectName) || (source === null || source === void 0 ? void 0 : source.text) || (source === null || source === void 0 ? void 0 : source.url) || '').trim();
|
|
46
|
+
const sourceUrl = this.resolveMewpExternalSourceUrl(source);
|
|
47
|
+
const extension = this.resolveMewpExternalSourceExtension(source);
|
|
48
|
+
const sourceIsolationCheck = this.validateMewpExternalSourceIsolation(source, sourceUrl);
|
|
49
|
+
const requiredColumns = this.getRequiredColumns(tableType);
|
|
50
|
+
if (!sourceName && !sourceUrl) {
|
|
51
|
+
return {
|
|
52
|
+
rows: [],
|
|
53
|
+
meta: {
|
|
54
|
+
sourceName: '',
|
|
55
|
+
headerRow: '',
|
|
56
|
+
matchedRequiredColumns: 0,
|
|
57
|
+
totalRequiredColumns: requiredColumns.length,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (!sourceUrl) {
|
|
62
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || 'unknown', '', 0, requiredColumns.length, requiredColumns.map((item) => item.label), `Missing file URL/object reference for '${sourceName || tableType}'`);
|
|
63
|
+
}
|
|
64
|
+
if (!sourceIsolationCheck.valid) {
|
|
65
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || sourceUrl, '', 0, requiredColumns.length, requiredColumns.map((item) => item.label), sourceIsolationCheck.message);
|
|
66
|
+
}
|
|
67
|
+
if (!MewpExternalTableUtils.ALLOWED_EXTERNAL_FILE_EXTENSIONS.has(extension)) {
|
|
68
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || sourceUrl, '', 0, requiredColumns.length, requiredColumns.map((item) => item.label), `Unsupported file type '${extension || 'unknown'}'. Allowed: .xlsx, .xls, .csv`);
|
|
69
|
+
}
|
|
70
|
+
const parseRows = (sheet, startRowZeroBased) => XLSX.utils.sheet_to_json(sheet, {
|
|
71
|
+
defval: '',
|
|
72
|
+
raw: false,
|
|
73
|
+
range: startRowZeroBased,
|
|
74
|
+
});
|
|
75
|
+
const parseHeaderKeys = (sheet, startRowZeroBased) => {
|
|
76
|
+
const matrix = XLSX.utils.sheet_to_json(sheet, {
|
|
77
|
+
header: 1,
|
|
78
|
+
raw: false,
|
|
79
|
+
range: startRowZeroBased,
|
|
80
|
+
});
|
|
81
|
+
const firstRow = Array.isArray(matrix === null || matrix === void 0 ? void 0 : matrix[0]) ? matrix[0] : [];
|
|
82
|
+
const normalized = firstRow
|
|
83
|
+
.map((item) => this.normalizeExternalColumnKey(item))
|
|
84
|
+
.filter((item) => !!item);
|
|
85
|
+
return new Set(normalized);
|
|
86
|
+
};
|
|
87
|
+
const validateHeaders = (headerKeys) => {
|
|
88
|
+
const missingLabels = [];
|
|
89
|
+
let matched = 0;
|
|
90
|
+
for (const requiredColumn of requiredColumns) {
|
|
91
|
+
const hasMatch = requiredColumn.aliases
|
|
92
|
+
.map((alias) => this.normalizeExternalColumnKey(alias))
|
|
93
|
+
.some((alias) => headerKeys.has(alias));
|
|
94
|
+
if (hasMatch) {
|
|
95
|
+
matched += 1;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
missingLabels.push(requiredColumn.label);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
matched,
|
|
103
|
+
total: requiredColumns.length,
|
|
104
|
+
missingLabels,
|
|
105
|
+
isValid: missingLabels.length === 0,
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
try {
|
|
109
|
+
const response = await axios_1.default.get(sourceUrl, {
|
|
110
|
+
responseType: 'arraybuffer',
|
|
111
|
+
timeout: 45000,
|
|
112
|
+
});
|
|
113
|
+
const maxBytes = this.resolveMewpExternalMaxFileSize();
|
|
114
|
+
const declaredLength = Number(((_a = response === null || response === void 0 ? void 0 : response.headers) === null || _a === void 0 ? void 0 : _a['content-length']) || 0);
|
|
115
|
+
if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {
|
|
116
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || sourceUrl, '', 0, requiredColumns.length, requiredColumns.map((item) => item.label), `File exceeds maximum allowed size (${maxBytes} bytes).`);
|
|
117
|
+
}
|
|
118
|
+
const buffer = Buffer.from((response === null || response === void 0 ? void 0 : response.data) || []);
|
|
119
|
+
if (!buffer.length) {
|
|
120
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || sourceUrl, '', 0, requiredColumns.length, requiredColumns.map((item) => item.label), 'File is empty');
|
|
121
|
+
}
|
|
122
|
+
if (buffer.length > maxBytes) {
|
|
123
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || sourceUrl, '', 0, requiredColumns.length, requiredColumns.map((item) => item.label), `File exceeds maximum allowed size (${maxBytes} bytes).`);
|
|
124
|
+
}
|
|
125
|
+
const workbook = XLSX.read(buffer, { type: 'buffer' });
|
|
126
|
+
const firstSheetName = (_b = workbook === null || workbook === void 0 ? void 0 : workbook.SheetNames) === null || _b === void 0 ? void 0 : _b[0];
|
|
127
|
+
if (!firstSheetName) {
|
|
128
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || sourceUrl, '', 0, requiredColumns.length, requiredColumns.map((item) => item.label), 'No worksheet was found in the uploaded file');
|
|
129
|
+
}
|
|
130
|
+
const sheet = workbook.Sheets[firstSheetName];
|
|
131
|
+
if (!sheet) {
|
|
132
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || sourceUrl, '', 0, requiredColumns.length, requiredColumns.map((item) => item.label), 'Worksheet data could not be read');
|
|
133
|
+
}
|
|
134
|
+
// Expected header row is A3, but keep A1 fallback for backward compatibility.
|
|
135
|
+
const headerA3 = parseHeaderKeys(sheet, 2);
|
|
136
|
+
const headerA1 = parseHeaderKeys(sheet, 0);
|
|
137
|
+
const rowsFromA3 = parseRows(sheet, 2);
|
|
138
|
+
const rowsFromA1 = parseRows(sheet, 0);
|
|
139
|
+
const validationA3 = validateHeaders(headerA3);
|
|
140
|
+
const validationA1 = validateHeaders(headerA1);
|
|
141
|
+
if (validationA3.isValid) {
|
|
142
|
+
return {
|
|
143
|
+
rows: rowsFromA3,
|
|
144
|
+
meta: {
|
|
145
|
+
sourceName: sourceName || sourceUrl,
|
|
146
|
+
headerRow: 'A3',
|
|
147
|
+
matchedRequiredColumns: validationA3.matched,
|
|
148
|
+
totalRequiredColumns: validationA3.total,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (validationA1.isValid) {
|
|
153
|
+
return {
|
|
154
|
+
rows: rowsFromA1,
|
|
155
|
+
meta: {
|
|
156
|
+
sourceName: sourceName || sourceUrl,
|
|
157
|
+
headerRow: 'A1',
|
|
158
|
+
matchedRequiredColumns: validationA1.matched,
|
|
159
|
+
totalRequiredColumns: validationA1.total,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const best = validationA3.matched >= validationA1.matched ? validationA3 : validationA1;
|
|
164
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || sourceUrl, '', best.matched, best.total, best.missingLabels, `Missing required columns: ${best.missingLabels.join(', ')}. Expected header row at A3 (fallback A1 was also checked).`);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (error instanceof MewpExternalFileValidationError) {
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
const msg = String((error === null || error === void 0 ? void 0 : error.message) || error || '').trim();
|
|
171
|
+
logger_1.default.warn(`Could not load external MEWP source '${sourceUrl}': ${msg}`);
|
|
172
|
+
throw this.createMewpExternalValidationError(tableType, sourceName || sourceUrl, '', 0, requiredColumns.length, requiredColumns.map((item) => item.label), `Unable to load or parse the file: ${msg}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
getRequiredColumns(tableType) {
|
|
176
|
+
return tableType === 'bugs'
|
|
177
|
+
? MewpExternalTableUtils.EXTERNAL_BUGS_REQUIRED_COLUMNS
|
|
178
|
+
: MewpExternalTableUtils.EXTERNAL_L3L4_REQUIRED_COLUMNS;
|
|
179
|
+
}
|
|
180
|
+
createMewpExternalValidationError(tableType, sourceName, headerRow, matchedRequiredColumns, totalRequiredColumns, missingRequiredColumns, message) {
|
|
181
|
+
const details = {
|
|
182
|
+
tableType,
|
|
183
|
+
sourceName,
|
|
184
|
+
valid: false,
|
|
185
|
+
headerRow,
|
|
186
|
+
matchedRequiredColumns,
|
|
187
|
+
totalRequiredColumns,
|
|
188
|
+
missingRequiredColumns,
|
|
189
|
+
rowCount: 0,
|
|
190
|
+
message,
|
|
191
|
+
};
|
|
192
|
+
return new MewpExternalFileValidationError(message, details);
|
|
193
|
+
}
|
|
194
|
+
resolveMewpExternalSourceUrl(source) {
|
|
195
|
+
const directUrl = String((source === null || source === void 0 ? void 0 : source.url) || '').trim();
|
|
196
|
+
if (directUrl)
|
|
197
|
+
return directUrl;
|
|
198
|
+
const bucketName = String((source === null || source === void 0 ? void 0 : source.bucketName) || '').trim();
|
|
199
|
+
const objectName = String((source === null || source === void 0 ? void 0 : source.objectName) || (source === null || source === void 0 ? void 0 : source.text) || '').trim();
|
|
200
|
+
const minioBase = String(process.env.MINIOSERVER || '').trim().replace(/\/+$/g, '');
|
|
201
|
+
if (!bucketName || !objectName || !minioBase)
|
|
202
|
+
return '';
|
|
203
|
+
const encodedObjectName = objectName
|
|
204
|
+
.split('/')
|
|
205
|
+
.map((segment) => encodeURIComponent(segment))
|
|
206
|
+
.join('/');
|
|
207
|
+
return `${minioBase}/${bucketName}/${encodedObjectName}`;
|
|
208
|
+
}
|
|
209
|
+
validateMewpExternalSourceIsolation(source, sourceUrl) {
|
|
210
|
+
const dedicatedBucket = String(process.env.MEWP_EXTERNAL_INGESTION_BUCKET || 'mewp-external-ingestion').trim();
|
|
211
|
+
const declaredSourceType = String((source === null || source === void 0 ? void 0 : source.sourceType) || '').trim().toLowerCase();
|
|
212
|
+
if (declaredSourceType && declaredSourceType !== 'mewpexternalingestion') {
|
|
213
|
+
return {
|
|
214
|
+
valid: false,
|
|
215
|
+
message: `Unsupported sourceType '${source === null || source === void 0 ? void 0 : source.sourceType}'. Expected 'mewpExternalIngestion'.`,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
const inferred = this.extractMewpBucketAndObjectFromUrl(sourceUrl);
|
|
219
|
+
const bucketName = String((source === null || source === void 0 ? void 0 : source.bucketName) || inferred.bucketName || '').trim();
|
|
220
|
+
const objectName = String((source === null || source === void 0 ? void 0 : source.objectName) || (source === null || source === void 0 ? void 0 : source.text) || inferred.objectName || '').trim();
|
|
221
|
+
if (bucketName && bucketName !== dedicatedBucket) {
|
|
222
|
+
return {
|
|
223
|
+
valid: false,
|
|
224
|
+
message: `Invalid storage bucket '${bucketName}'. Expected '${dedicatedBucket}'.`,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (objectName) {
|
|
228
|
+
const normalizedObject = objectName.toLowerCase();
|
|
229
|
+
if (!normalizedObject.includes('/mewp-external-ingestion/')) {
|
|
230
|
+
return {
|
|
231
|
+
valid: false,
|
|
232
|
+
message: `Invalid object path '${objectName}'. Expected '/mewp-external-ingestion/' prefix segment.`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return { valid: true, message: '' };
|
|
237
|
+
}
|
|
238
|
+
extractMewpBucketAndObjectFromUrl(url) {
|
|
239
|
+
try {
|
|
240
|
+
const parsed = new URL(String(url || '').trim());
|
|
241
|
+
const segments = decodeURIComponent(parsed.pathname || '')
|
|
242
|
+
.replace(/^\/+/g, '')
|
|
243
|
+
.split('/')
|
|
244
|
+
.filter((item) => !!item);
|
|
245
|
+
if (segments.length < 2)
|
|
246
|
+
return { bucketName: '', objectName: '' };
|
|
247
|
+
return {
|
|
248
|
+
bucketName: String(segments[0] || '').trim(),
|
|
249
|
+
objectName: segments.slice(1).join('/'),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch (_a) {
|
|
253
|
+
return { bucketName: '', objectName: '' };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
resolveMewpExternalSourceExtension(source) {
|
|
257
|
+
const candidates = [source === null || source === void 0 ? void 0 : source.name, source === null || source === void 0 ? void 0 : source.objectName, source === null || source === void 0 ? void 0 : source.text, source === null || source === void 0 ? void 0 : source.url]
|
|
258
|
+
.map((value) => String(value || '').trim())
|
|
259
|
+
.filter((value) => !!value);
|
|
260
|
+
for (const candidate of candidates) {
|
|
261
|
+
const clean = candidate.split('?')[0].split('#')[0];
|
|
262
|
+
const match = /\.([a-z0-9]+)$/i.exec(clean);
|
|
263
|
+
if (!match)
|
|
264
|
+
continue;
|
|
265
|
+
return `.${String(match[1] || '').toLowerCase()}`;
|
|
266
|
+
}
|
|
267
|
+
return '';
|
|
268
|
+
}
|
|
269
|
+
resolveMewpExternalMaxFileSize() {
|
|
270
|
+
const configured = Number(process.env.MEWP_EXTERNAL_MAX_FILE_SIZE_BYTES || 0);
|
|
271
|
+
if (Number.isFinite(configured) && configured > 0)
|
|
272
|
+
return configured;
|
|
273
|
+
return MewpExternalTableUtils.DEFAULT_EXTERNAL_FILE_MAX_BYTES;
|
|
274
|
+
}
|
|
275
|
+
normalizeExternalColumnKey(value) {
|
|
276
|
+
return String(value || '')
|
|
277
|
+
.trim()
|
|
278
|
+
.toLowerCase()
|
|
279
|
+
.replace(/[^a-z0-9]+/g, '');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
MewpExternalTableUtils.EXTERNAL_BUGS_REQUIRED_COLUMNS = [
|
|
283
|
+
{ label: 'Elisra_SortIndex', aliases: ['elisrasortindex', 'elisra sortindex', 'elisra_sortindex'] },
|
|
284
|
+
{ label: 'SR', aliases: ['sr'] },
|
|
285
|
+
{ label: 'TargetWorkItemId', aliases: ['targetworkitemid', 'bugid', 'bug id'] },
|
|
286
|
+
{ label: 'Title', aliases: ['title', 'bugtitle', 'bug title'] },
|
|
287
|
+
{ label: 'TargetState', aliases: ['targetstate', 'state'] },
|
|
288
|
+
];
|
|
289
|
+
MewpExternalTableUtils.EXTERNAL_L3L4_REQUIRED_COLUMNS = [
|
|
290
|
+
{ label: 'SR', aliases: ['sr'] },
|
|
291
|
+
{ label: 'AREA 34', aliases: ['area34', 'area 34'] },
|
|
292
|
+
{
|
|
293
|
+
label: 'TargetWorkItemId Level 3',
|
|
294
|
+
aliases: ['targetworkitemidlevel3', 'targetworkitemid level 3', 'targetworkitemidlevel 3'],
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
label: 'TargetTitleLevel3',
|
|
298
|
+
aliases: ['targettitlelevel3', 'targettitlelevel 3', 'targettitle level 3'],
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
label: 'TargetStateLevel 3',
|
|
302
|
+
aliases: ['targetstatelevel3', 'targetstatelevel 3', 'targetstate level 3'],
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
label: 'TargetWorkItemIdLevel 4',
|
|
306
|
+
aliases: ['targetworkitemidlevel4', 'targetworkitemid level 4', 'targetworkitemidlevel 4'],
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
label: 'TargetTitleLevel4',
|
|
310
|
+
aliases: ['targettitlelevel4', 'targettitlelevel 4', 'targettitle level 4'],
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
label: 'TargetStateLevel 4',
|
|
314
|
+
aliases: ['targetstatelevel4', 'targetstatelevel 4', 'targetstate level 4'],
|
|
315
|
+
},
|
|
316
|
+
];
|
|
317
|
+
MewpExternalTableUtils.ALLOWED_EXTERNAL_FILE_EXTENSIONS = new Set(['.xlsx', '.xls', '.csv']);
|
|
318
|
+
MewpExternalTableUtils.DEFAULT_EXTERNAL_FILE_MAX_BYTES = 20 * 1024 * 1024;
|
|
319
|
+
exports.default = MewpExternalTableUtils;
|
|
320
|
+
//# sourceMappingURL=mewpExternalTableUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mewpExternalTableUtils.js","sourceRoot":"","sources":["../../src/utils/mewpExternalTableUtils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elisra-devops/docgen-data-provider",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.76.0",
|
|
4
4
|
"description": "A document generator data provider, aimed to retrive data from azure devops",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"p-limit": "^3.1.0",
|
|
37
37
|
"winston": "^3.13.1",
|
|
38
38
|
"winston-transport-browserconsole": "^1.0.5",
|
|
39
|
+
"xlsx": "^0.18.5",
|
|
39
40
|
"xml2js": "^0.6.2"
|
|
40
41
|
},
|
|
41
42
|
"jest": {
|
|
@@ -47,6 +48,14 @@
|
|
|
47
48
|
"src/**/*.ts",
|
|
48
49
|
"!src/tests/**"
|
|
49
50
|
],
|
|
51
|
+
"coverageThreshold": {
|
|
52
|
+
"global": {
|
|
53
|
+
"branches": 25,
|
|
54
|
+
"functions": 30,
|
|
55
|
+
"lines": 30,
|
|
56
|
+
"statements": 30
|
|
57
|
+
}
|
|
58
|
+
},
|
|
50
59
|
"testPathIgnorePatterns": [
|
|
51
60
|
"/bin/"
|
|
52
61
|
],
|