@sun-asterisk/sungen 3.2.17 → 3.2.18
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/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +23 -0
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +209 -16
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/snapshot-builder.d.ts.map +1 -1
- package/dist/dashboard/snapshot-builder.js +8 -1
- package/dist/dashboard/snapshot-builder.js.map +1 -1
- package/dist/dashboard/templates/index.html +1 -1
- package/dist/exporters/api-environment.d.ts +11 -0
- package/dist/exporters/api-environment.d.ts.map +1 -0
- package/dist/exporters/api-environment.js +129 -0
- package/dist/exporters/api-environment.js.map +1 -0
- package/dist/exporters/feature-parser.d.ts +16 -1
- package/dist/exporters/feature-parser.d.ts.map +1 -1
- package/dist/exporters/feature-parser.js +21 -2
- package/dist/exporters/feature-parser.js.map +1 -1
- package/dist/exporters/matrix/build.d.ts +70 -0
- package/dist/exporters/matrix/build.d.ts.map +1 -0
- package/dist/exporters/matrix/build.js +516 -0
- package/dist/exporters/matrix/build.js.map +1 -0
- package/dist/exporters/matrix/export.d.ts +50 -0
- package/dist/exporters/matrix/export.d.ts.map +1 -0
- package/dist/exporters/matrix/export.js +152 -0
- package/dist/exporters/matrix/export.js.map +1 -0
- package/dist/exporters/matrix/fingerprint.d.ts +20 -0
- package/dist/exporters/matrix/fingerprint.d.ts.map +1 -0
- package/dist/exporters/matrix/fingerprint.js +83 -0
- package/dist/exporters/matrix/fingerprint.js.map +1 -0
- package/dist/exporters/matrix/gates.d.ts +21 -0
- package/dist/exporters/matrix/gates.d.ts.map +1 -0
- package/dist/exporters/matrix/gates.js +367 -0
- package/dist/exporters/matrix/gates.js.map +1 -0
- package/dist/exporters/matrix/map-loader.d.ts +22 -0
- package/dist/exporters/matrix/map-loader.d.ts.map +1 -0
- package/dist/exporters/matrix/map-loader.js +193 -0
- package/dist/exporters/matrix/map-loader.js.map +1 -0
- package/dist/exporters/matrix/render-csv.d.ts +9 -0
- package/dist/exporters/matrix/render-csv.d.ts.map +1 -0
- package/dist/exporters/matrix/render-csv.js +92 -0
- package/dist/exporters/matrix/render-csv.js.map +1 -0
- package/dist/exporters/matrix/render-xlsx.d.ts +41 -0
- package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -0
- package/dist/exporters/matrix/render-xlsx.js +430 -0
- package/dist/exporters/matrix/render-xlsx.js.map +1 -0
- package/dist/exporters/matrix/types.d.ts +199 -0
- package/dist/exporters/matrix/types.d.ts.map +1 -0
- package/dist/exporters/matrix/types.js +15 -0
- package/dist/exporters/matrix/types.js.map +1 -0
- package/dist/exporters/matrix/wording.d.ts +61 -0
- package/dist/exporters/matrix/wording.d.ts.map +1 -0
- package/dist/exporters/matrix/wording.js +221 -0
- package/dist/exporters/matrix/wording.js.map +1 -0
- package/dist/exporters/scenario-merger.d.ts.map +1 -1
- package/dist/exporters/scenario-merger.js +2 -1
- package/dist/exporters/scenario-merger.js.map +1 -1
- package/dist/exporters/spec-parser.d.ts.map +1 -1
- package/dist/exporters/spec-parser.js +2 -1
- package/dist/exporters/spec-parser.js.map +1 -1
- package/dist/exporters/xlsx-report-builder.d.ts +1 -1
- package/dist/exporters/xlsx-report-builder.d.ts.map +1 -1
- package/dist/exporters/xlsx-report-builder.js +3 -3
- package/dist/exporters/xlsx-report-builder.js.map +1 -1
- package/dist/harness/audit.d.ts +10 -0
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +98 -16
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/blindspot.d.ts.map +1 -1
- package/dist/harness/blindspot.js +2 -1
- package/dist/harness/blindspot.js.map +1 -1
- package/dist/harness/capability-plan.d.ts +2 -0
- package/dist/harness/capability-plan.d.ts.map +1 -1
- package/dist/harness/capability-plan.js +17 -4
- package/dist/harness/capability-plan.js.map +1 -1
- package/dist/harness/feedback.d.ts.map +1 -1
- package/dist/harness/feedback.js +3 -2
- package/dist/harness/feedback.js.map +1 -1
- package/dist/harness/flow-check.d.ts.map +1 -1
- package/dist/harness/flow-check.js +2 -1
- package/dist/harness/flow-check.js.map +1 -1
- package/dist/harness/flow-plan.d.ts.map +1 -1
- package/dist/harness/flow-plan.js +3 -2
- package/dist/harness/flow-plan.js.map +1 -1
- package/dist/harness/intent.d.ts.map +1 -1
- package/dist/harness/intent.js +2 -1
- package/dist/harness/intent.js.map +1 -1
- package/dist/harness/journey.d.ts.map +1 -1
- package/dist/harness/journey.js +3 -2
- package/dist/harness/journey.js.map +1 -1
- package/dist/harness/ledger.d.ts.map +1 -1
- package/dist/harness/ledger.js +3 -2
- package/dist/harness/ledger.js.map +1 -1
- package/dist/harness/manifest.d.ts.map +1 -1
- package/dist/harness/manifest.js +4 -3
- package/dist/harness/manifest.js.map +1 -1
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +16 -3
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/quality-gates.d.ts.map +1 -1
- package/dist/harness/quality-gates.js +2 -1
- package/dist/harness/quality-gates.js.map +1 -1
- package/dist/harness/read-text.d.ts +22 -0
- package/dist/harness/read-text.d.ts.map +1 -0
- package/dist/harness/read-text.js +64 -0
- package/dist/harness/read-text.js.map +1 -0
- package/dist/harness/script-check.d.ts.map +1 -1
- package/dist/harness/script-check.js +3 -2
- package/dist/harness/script-check.js.map +1 -1
- package/dist/harness/sensors.d.ts +13 -1
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +63 -20
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/spec-coverage.d.ts +5 -0
- package/dist/harness/spec-coverage.d.ts.map +1 -1
- package/dist/harness/spec-coverage.js +17 -7
- package/dist/harness/spec-coverage.js.map +1 -1
- package/dist/harness/trace.d.ts.map +1 -1
- package/dist/harness/trace.js +4 -3
- package/dist/harness/trace.js.map +1 -1
- package/dist/harness/viewpoint-baseline.d.ts +49 -0
- package/dist/harness/viewpoint-baseline.d.ts.map +1 -0
- package/dist/harness/viewpoint-baseline.js +141 -0
- package/dist/harness/viewpoint-baseline.js.map +1 -0
- package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
- package/dist/harness/viewpoint-ledger.js +2 -1
- package/dist/harness/viewpoint-ledger.js.map +1 -1
- package/dist/orchestrator/assets-drift.d.ts +24 -0
- package/dist/orchestrator/assets-drift.d.ts.map +1 -0
- package/dist/orchestrator/assets-drift.js +80 -0
- package/dist/orchestrator/assets-drift.js.map +1 -0
- package/dist/orchestrator/templates/ai-src/commands/create-test.md +24 -0
- package/dist/orchestrator/templates/ai-src/commands/delivery.md +203 -120
- package/dist/orchestrator/templates/ai-src/config/claude.md +1 -1
- package/dist/orchestrator/templates/ai-src/config/copilot.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +102 -6
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +1 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +23 -0
- package/package.json +3 -3
- package/src/cli/commands/audit.ts +23 -1
- package/src/cli/commands/delivery.ts +240 -18
- package/src/cli/index.ts +6 -0
- package/src/dashboard/snapshot-builder.ts +8 -1
- package/src/dashboard/templates/index.html +1 -1
- package/src/exporters/api-environment.ts +97 -0
- package/src/exporters/feature-parser.ts +21 -2
- package/src/exporters/matrix/build.ts +551 -0
- package/src/exporters/matrix/export.ts +149 -0
- package/src/exporters/matrix/fingerprint.ts +49 -0
- package/src/exporters/matrix/gates.ts +400 -0
- package/src/exporters/matrix/map-loader.ts +163 -0
- package/src/exporters/matrix/render-csv.ts +94 -0
- package/src/exporters/matrix/render-xlsx.ts +420 -0
- package/src/exporters/matrix/types.ts +226 -0
- package/src/exporters/matrix/wording.ts +221 -0
- package/src/exporters/scenario-merger.ts +2 -1
- package/src/exporters/spec-parser.ts +2 -1
- package/src/exporters/xlsx-report-builder.ts +3 -2
- package/src/harness/audit.ts +104 -18
- package/src/harness/blindspot.ts +2 -1
- package/src/harness/capability-plan.ts +17 -4
- package/src/harness/feedback.ts +3 -2
- package/src/harness/flow-check.ts +2 -1
- package/src/harness/flow-plan.ts +3 -2
- package/src/harness/intent.ts +2 -1
- package/src/harness/journey.ts +3 -2
- package/src/harness/ledger.ts +3 -2
- package/src/harness/manifest.ts +4 -3
- package/src/harness/parse.ts +17 -3
- package/src/harness/quality-gates.ts +2 -1
- package/src/harness/read-text.ts +28 -0
- package/src/harness/script-check.ts +3 -2
- package/src/harness/sensors.ts +55 -8
- package/src/harness/spec-coverage.ts +22 -7
- package/src/harness/trace.ts +4 -3
- package/src/harness/viewpoint-baseline.ts +128 -0
- package/src/harness/viewpoint-ledger.ts +2 -1
- package/src/orchestrator/assets-drift.ts +64 -0
- package/src/orchestrator/templates/ai-src/commands/create-test.md +24 -0
- package/src/orchestrator/templates/ai-src/commands/delivery.md +203 -120
- package/src/orchestrator/templates/ai-src/config/claude.md +1 -1
- package/src/orchestrator/templates/ai-src/config/copilot.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +102 -6
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +1 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +23 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Flat CSV rendering of the matrix — same model as the workbook, one row per
|
|
4
|
+
* delivery item (`Level: item`) followed by its variant rows (`Level: variant`;
|
|
5
|
+
* every item has them — the variant row carries the source scenario id, data,
|
|
6
|
+
* and result), so downstream pipelines can re-derive both views from one file.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.renderMatrixCsv = renderMatrixCsv;
|
|
10
|
+
const build_1 = require("./build");
|
|
11
|
+
const render_xlsx_1 = require("./render-xlsx");
|
|
12
|
+
const HEADERS = [
|
|
13
|
+
'Level', 'ID', 'Target', 'Test Intent / Condition', 'Category', 'Priority',
|
|
14
|
+
'Precondition', 'Coverage / Test Data', 'Action / Trigger', 'Expected Result',
|
|
15
|
+
'Mode', 'Trace', 'Result', 'Executed Date', 'Note / Evidence', 'Defect ID',
|
|
16
|
+
];
|
|
17
|
+
function esc(value) {
|
|
18
|
+
if (/[",\n]/.test(value))
|
|
19
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
function isoDate(startTime) {
|
|
23
|
+
if (!startTime)
|
|
24
|
+
return '';
|
|
25
|
+
const d = new Date(startTime);
|
|
26
|
+
if (isNaN(d.getTime()))
|
|
27
|
+
return '';
|
|
28
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
|
29
|
+
}
|
|
30
|
+
function renderMatrixCsv(model) {
|
|
31
|
+
const BOM = '\ufeff'; // Excel compatibility (Vietnamese/Japanese content)
|
|
32
|
+
const lines = [];
|
|
33
|
+
lines.push(`# Test Case & Coverage Matrix — ${model.unit}`);
|
|
34
|
+
lines.push(`# delivery items: ${model.manifest.itemCount} · coverage variants: ${model.manifest.variantCount} · state: ${model.manifest.approvalState}`);
|
|
35
|
+
lines.push(HEADERS.map(esc).join(','));
|
|
36
|
+
for (const item of model.items) {
|
|
37
|
+
lines.push([
|
|
38
|
+
'item',
|
|
39
|
+
item.id,
|
|
40
|
+
item.target,
|
|
41
|
+
item.intent,
|
|
42
|
+
item.category,
|
|
43
|
+
item.priority,
|
|
44
|
+
item.precondition.join('\n'),
|
|
45
|
+
(0, render_xlsx_1.coverageSummary)(item),
|
|
46
|
+
// Shared leading steps only; each variant row carries its remaining steps.
|
|
47
|
+
item.trigger.join('\n'),
|
|
48
|
+
item.oracle,
|
|
49
|
+
(0, render_xlsx_1.itemModeLabel)(item),
|
|
50
|
+
item.traces.join(' '),
|
|
51
|
+
(0, render_xlsx_1.itemResultLabel)(item),
|
|
52
|
+
'',
|
|
53
|
+
item.review === 'proposed' ? 'REVIEW REQUIRED' : '',
|
|
54
|
+
'',
|
|
55
|
+
].map(esc).join(','));
|
|
56
|
+
for (const v of item.variants) {
|
|
57
|
+
const expected = v.verification.length > 0
|
|
58
|
+
? `${v.oracle.join('\n')}\nVerification method: ${v.verification.join(' ')}`
|
|
59
|
+
: v.oracle.join('\n');
|
|
60
|
+
lines.push([
|
|
61
|
+
'variant',
|
|
62
|
+
v.ref,
|
|
63
|
+
'',
|
|
64
|
+
v.condition,
|
|
65
|
+
'', '',
|
|
66
|
+
// Precondition DELTA — variant-specific setup only (review GAP-03).
|
|
67
|
+
(item.preconditionDeltas[v.ref] ?? []).join('\n'),
|
|
68
|
+
v.data.join('\n'),
|
|
69
|
+
// Steps after the parent's shared prefix only.
|
|
70
|
+
(item.triggerDeltas[v.ref] ?? []).join('\n'),
|
|
71
|
+
expected,
|
|
72
|
+
v.mode === 'manual' ? 'Manual' : 'Auto',
|
|
73
|
+
v.traces.join(' '),
|
|
74
|
+
(0, build_1.variantState)(v),
|
|
75
|
+
isoDate(v.result?.startTime),
|
|
76
|
+
v.result?.error ? String(v.result.error).slice(0, 200) : '',
|
|
77
|
+
'',
|
|
78
|
+
].map(esc).join(','));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Requirement coverage appendix — keeps the CSV self-contained for pipelines.
|
|
82
|
+
if (model.requirements.length > 0) {
|
|
83
|
+
lines.push('');
|
|
84
|
+
lines.push('# Requirement coverage');
|
|
85
|
+
lines.push(['Requirement', 'Status', 'Delivery items', 'Variants', 'Note'].join(','));
|
|
86
|
+
for (const r of model.requirements) {
|
|
87
|
+
lines.push([r.id, r.status, r.items.join(' '), String(r.variantCount), r.note].map(esc).join(','));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return BOM + lines.join('\n') + '\n';
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=render-csv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-csv.js","sourceRoot":"","sources":["../../../src/exporters/matrix/render-csv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render the Test Case & Coverage Matrix workbook.
|
|
3
|
+
*
|
|
4
|
+
* Sheets:
|
|
5
|
+
* 1. Testcases — one parent row per delivery item; EVERY item (including
|
|
6
|
+
* single-variant ones) carries variant sub-rows on Excel outline level 1 —
|
|
7
|
+
* the sub-row is where source traceability (VP-id), test data, and the
|
|
8
|
+
* manual result/evidence entry live (review B-05/B-06). Collapse outline
|
|
9
|
+
* level 1 for the customer/review view; expand to execute.
|
|
10
|
+
* 2. Coverage — requirement coverage (id ↔ items ↔ status), the target ×
|
|
11
|
+
* category grid (explicit `—` gaps), dispositions, and the manifest.
|
|
12
|
+
*
|
|
13
|
+
* Manual-execution support: variant Result cells carry a dropdown
|
|
14
|
+
* (Passed/Failed/Blocked/Pending/N/A) and the parent Result is a live Excel
|
|
15
|
+
* formula derived from its children — a parent can never contradict its
|
|
16
|
+
* variants, even after QA edits results by hand (review B-06).
|
|
17
|
+
*
|
|
18
|
+
* Every sheet keeps the company ISO masthead. A draft matrix (unapproved
|
|
19
|
+
* groups / review findings) carries a red DRAFT banner.
|
|
20
|
+
*/
|
|
21
|
+
import * as ExcelJS from 'exceljs';
|
|
22
|
+
import { DeliveryItem, MatrixModel } from './types';
|
|
23
|
+
/** Mode is a coverage dimension: mixed items show both counts. */
|
|
24
|
+
export declare function itemModeLabel(item: DeliveryItem): string;
|
|
25
|
+
/**
|
|
26
|
+
* Parent roll-up label. It must NEVER be exactly one of the variant state words
|
|
27
|
+
* (`Passed`/`Failed`/`Blocked`/`Pending`/`N/A`) — the summary band counts the
|
|
28
|
+
* Result column with exact-match COUNTIF over parent AND child rows, so a parent
|
|
29
|
+
* reading plain "Pending" was counted as an extra pending variant (109 instead
|
|
30
|
+
* of 77 on st-login).
|
|
31
|
+
*/
|
|
32
|
+
export declare function itemResultLabel(item: DeliveryItem): string;
|
|
33
|
+
/**
|
|
34
|
+
* Compact coverage summary for the parent row. A declared `dimensions:` digest
|
|
35
|
+
* wins ("15 variants — required ×3 · format ×9 …"); otherwise a single variant
|
|
36
|
+
* shows its condition and a group falls back to its variant REFS. Concatenating
|
|
37
|
+
* every variant's full title turned this cell into an 800-character paragraph.
|
|
38
|
+
*/
|
|
39
|
+
export declare function coverageSummary(item: DeliveryItem): string;
|
|
40
|
+
export declare function renderMatrixXlsx(model: MatrixModel, sungenVersion?: string): ExcelJS.Workbook;
|
|
41
|
+
//# sourceMappingURL=render-xlsx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-xlsx.d.ts","sourceRoot":"","sources":["../../../src/exporters/matrix/render-xlsx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AASnC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AA0BjE,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAMxD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAQ1D;AAgBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAM1D;AAkTD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAK7F"}
|
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Render the Test Case & Coverage Matrix workbook.
|
|
4
|
+
*
|
|
5
|
+
* Sheets:
|
|
6
|
+
* 1. Testcases — one parent row per delivery item; EVERY item (including
|
|
7
|
+
* single-variant ones) carries variant sub-rows on Excel outline level 1 —
|
|
8
|
+
* the sub-row is where source traceability (VP-id), test data, and the
|
|
9
|
+
* manual result/evidence entry live (review B-05/B-06). Collapse outline
|
|
10
|
+
* level 1 for the customer/review view; expand to execute.
|
|
11
|
+
* 2. Coverage — requirement coverage (id ↔ items ↔ status), the target ×
|
|
12
|
+
* category grid (explicit `—` gaps), dispositions, and the manifest.
|
|
13
|
+
*
|
|
14
|
+
* Manual-execution support: variant Result cells carry a dropdown
|
|
15
|
+
* (Passed/Failed/Blocked/Pending/N/A) and the parent Result is a live Excel
|
|
16
|
+
* formula derived from its children — a parent can never contradict its
|
|
17
|
+
* variants, even after QA edits results by hand (review B-06).
|
|
18
|
+
*
|
|
19
|
+
* Every sheet keeps the company ISO masthead. A draft matrix (unapproved
|
|
20
|
+
* groups / review findings) carries a red DRAFT banner.
|
|
21
|
+
*/
|
|
22
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
25
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
26
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
27
|
+
}
|
|
28
|
+
Object.defineProperty(o, k2, desc);
|
|
29
|
+
}) : (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
o[k2] = m[k];
|
|
32
|
+
}));
|
|
33
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
34
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
35
|
+
}) : function(o, v) {
|
|
36
|
+
o["default"] = v;
|
|
37
|
+
});
|
|
38
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
39
|
+
var ownKeys = function(o) {
|
|
40
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
41
|
+
var ar = [];
|
|
42
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
43
|
+
return ar;
|
|
44
|
+
};
|
|
45
|
+
return ownKeys(o);
|
|
46
|
+
};
|
|
47
|
+
return function (mod) {
|
|
48
|
+
if (mod && mod.__esModule) return mod;
|
|
49
|
+
var result = {};
|
|
50
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
51
|
+
__setModuleDefault(result, mod);
|
|
52
|
+
return result;
|
|
53
|
+
};
|
|
54
|
+
})();
|
|
55
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
|
+
exports.itemModeLabel = itemModeLabel;
|
|
57
|
+
exports.itemResultLabel = itemResultLabel;
|
|
58
|
+
exports.coverageSummary = coverageSummary;
|
|
59
|
+
exports.renderMatrixXlsx = renderMatrixXlsx;
|
|
60
|
+
const ExcelJS = __importStar(require("exceljs"));
|
|
61
|
+
const xlsx_report_builder_1 = require("../xlsx-report-builder");
|
|
62
|
+
const build_1 = require("./build");
|
|
63
|
+
const CATEGORY_ORDER = ['normal', 'abnormal', 'security', 'nfr'];
|
|
64
|
+
const SOFT_BLUE = { argb: 'FFDCE6F1' };
|
|
65
|
+
const DRAFT_RED = { argb: 'FFC00000' };
|
|
66
|
+
const GAP_FILL = { argb: 'FFFCE4EC' };
|
|
67
|
+
const RESULT_STATES = 'Passed,Failed,Blocked,Pending,N/A';
|
|
68
|
+
function headerCell(c, label) {
|
|
69
|
+
c.value = label;
|
|
70
|
+
c.font = { bold: true, size: 10, color: xlsx_report_builder_1.BLACK, name: xlsx_report_builder_1.ARIAL_FONT };
|
|
71
|
+
c.fill = { type: 'pattern', pattern: 'solid', fgColor: xlsx_report_builder_1.LAVENDER };
|
|
72
|
+
c.alignment = { horizontal: 'center', vertical: 'middle', wrapText: true };
|
|
73
|
+
c.border = xlsx_report_builder_1.allBordersBlack;
|
|
74
|
+
}
|
|
75
|
+
function dataCell(c, value, opts) {
|
|
76
|
+
// An empty value stays a genuinely blank cell — never an empty shared string,
|
|
77
|
+
// which some renderers display as its string-table index (review M-03).
|
|
78
|
+
if (value !== '' && value !== undefined && value !== null)
|
|
79
|
+
c.value = value;
|
|
80
|
+
c.font = { bold: opts?.bold ?? false, size: 10, name: xlsx_report_builder_1.ARIAL_FONT, ...(opts?.color ? { color: opts.color } : {}) };
|
|
81
|
+
c.alignment = { horizontal: opts?.center ? 'center' : 'left', vertical: 'top', wrapText: true };
|
|
82
|
+
c.border = xlsx_report_builder_1.allBordersBlack;
|
|
83
|
+
if (opts?.fill)
|
|
84
|
+
c.fill = { type: 'pattern', pattern: 'solid', fgColor: opts.fill };
|
|
85
|
+
}
|
|
86
|
+
/** Mode is a coverage dimension: mixed items show both counts. */
|
|
87
|
+
function itemModeLabel(item) {
|
|
88
|
+
if (item.mode === 'mixed') {
|
|
89
|
+
const auto = item.variants.filter((v) => v.mode === 'auto').length;
|
|
90
|
+
return `Auto ${auto} · Manual ${item.variants.length - auto}`;
|
|
91
|
+
}
|
|
92
|
+
return item.mode === 'manual' ? 'Manual' : 'Auto';
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Parent roll-up label. It must NEVER be exactly one of the variant state words
|
|
96
|
+
* (`Passed`/`Failed`/`Blocked`/`Pending`/`N/A`) — the summary band counts the
|
|
97
|
+
* Result column with exact-match COUNTIF over parent AND child rows, so a parent
|
|
98
|
+
* reading plain "Pending" was counted as an extra pending variant (109 instead
|
|
99
|
+
* of 77 on st-login).
|
|
100
|
+
*/
|
|
101
|
+
function itemResultLabel(item) {
|
|
102
|
+
const { passed, failed, blocked, na } = item.resultCounts;
|
|
103
|
+
const eff = item.variants.length - na;
|
|
104
|
+
const suffix = na > 0 ? ` · ${na} N/A` : '';
|
|
105
|
+
if (item.result === 'na')
|
|
106
|
+
return 'All N/A';
|
|
107
|
+
if (item.result === 'failed')
|
|
108
|
+
return `${passed}/${eff} Passed · ${failed} Failed${suffix}`;
|
|
109
|
+
if (item.result === 'blocked')
|
|
110
|
+
return `${passed}/${eff} Passed · ${blocked} Blocked${suffix}`;
|
|
111
|
+
return `${passed}/${eff} Passed${suffix}`;
|
|
112
|
+
}
|
|
113
|
+
/** ISO date (2026-08-04) — unambiguous across locales (review §9). */
|
|
114
|
+
function isoDate(startTime) {
|
|
115
|
+
if (!startTime)
|
|
116
|
+
return '';
|
|
117
|
+
const d = new Date(startTime);
|
|
118
|
+
if (isNaN(d.getTime()))
|
|
119
|
+
return '';
|
|
120
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
|
121
|
+
}
|
|
122
|
+
function numbered(lines, start = 1) {
|
|
123
|
+
if (lines.length === 0)
|
|
124
|
+
return '';
|
|
125
|
+
if (lines.length === 1 && start === 1)
|
|
126
|
+
return lines[0];
|
|
127
|
+
return lines.map((l, i) => `${start + i}. ${l}`).join('\n');
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Compact coverage summary for the parent row. A declared `dimensions:` digest
|
|
131
|
+
* wins ("15 variants — required ×3 · format ×9 …"); otherwise a single variant
|
|
132
|
+
* shows its condition and a group falls back to its variant REFS. Concatenating
|
|
133
|
+
* every variant's full title turned this cell into an 800-character paragraph.
|
|
134
|
+
*/
|
|
135
|
+
function coverageSummary(item) {
|
|
136
|
+
const n = item.variants.length;
|
|
137
|
+
const head = `${n} variant${n === 1 ? '' : 's'}:`;
|
|
138
|
+
if (item.dimensions)
|
|
139
|
+
return `${head} ${item.dimensions}`;
|
|
140
|
+
if (n === 1)
|
|
141
|
+
return `${head} ${item.variants[0].condition}`;
|
|
142
|
+
return `${head} ${item.variants.map((v) => v.ref).join(' · ')}`;
|
|
143
|
+
}
|
|
144
|
+
/** Expected cell = observable outcomes; the HOW moves under a separate heading. */
|
|
145
|
+
function expectedWithVerification(oracle, verification) {
|
|
146
|
+
const expected = numbered(oracle);
|
|
147
|
+
if (verification.length === 0)
|
|
148
|
+
return expected;
|
|
149
|
+
return `${expected}\nVerification method: ${verification.join(' ')}`;
|
|
150
|
+
}
|
|
151
|
+
/** Red DRAFT banner on row 5 when the matrix is not approved for official delivery. */
|
|
152
|
+
function draftBanner(ws, model) {
|
|
153
|
+
if (model.manifest.approvalState !== 'draft')
|
|
154
|
+
return;
|
|
155
|
+
ws.mergeCells('B5:H5');
|
|
156
|
+
const c = ws.getCell('B5');
|
|
157
|
+
c.value = 'DRAFT — NOT APPROVED FOR OFFICIAL DELIVERY (review-required findings or proposed groups remain)';
|
|
158
|
+
c.font = { bold: true, size: 11, name: xlsx_report_builder_1.ARIAL_FONT, color: { argb: 'FFFFFFFF' } };
|
|
159
|
+
c.fill = { type: 'pattern', pattern: 'solid', fgColor: DRAFT_RED };
|
|
160
|
+
c.alignment = { horizontal: 'center', vertical: 'middle' };
|
|
161
|
+
}
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Sheet 1 — Testcases (the matrix)
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
const MATRIX_HEADERS = [
|
|
166
|
+
'ID', 'Target', 'Test Intent / Condition', 'Category', 'Priority', 'Precondition',
|
|
167
|
+
'Coverage / Test Data', 'Action / Trigger', 'Expected Result', 'Mode', 'Trace',
|
|
168
|
+
'Result', 'Executed Date', 'Executor', 'Note / Evidence', 'Defect ID',
|
|
169
|
+
];
|
|
170
|
+
const RESULT_COL = 13; // column M
|
|
171
|
+
function addMatrixSheet(wb, model, sungenVersion) {
|
|
172
|
+
const ws = wb.addWorksheet('Testcases');
|
|
173
|
+
ws.properties.outlineLevelRow = 1;
|
|
174
|
+
ws.columns = [
|
|
175
|
+
{ width: 3 }, // A margin
|
|
176
|
+
{ width: 22 }, // B ID
|
|
177
|
+
{ width: 18 }, // C Target
|
|
178
|
+
{ width: 42 }, // D Intent / Condition
|
|
179
|
+
{ width: 11 }, // E Category
|
|
180
|
+
{ width: 9 }, // F Priority
|
|
181
|
+
{ width: 26 }, // G Precondition
|
|
182
|
+
{ width: 34 }, // H Coverage / Data
|
|
183
|
+
{ width: 34 }, // I Trigger
|
|
184
|
+
{ width: 42 }, // J Expected
|
|
185
|
+
{ width: 11 }, // K Mode
|
|
186
|
+
{ width: 13 }, // L Trace
|
|
187
|
+
{ width: 22 }, // M Result
|
|
188
|
+
{ width: 12 }, // N Executed
|
|
189
|
+
{ width: 13 }, // O Executor
|
|
190
|
+
{ width: 22 }, // P Note / Evidence
|
|
191
|
+
{ width: 12 }, // Q Defect ID
|
|
192
|
+
];
|
|
193
|
+
(0, xlsx_report_builder_1.renderReportHeaderBand)(wb, ws, `${model.unit.toUpperCase()} TEST CASE & COVERAGE MATRIX`, sungenVersion, model.formNo);
|
|
194
|
+
draftBanner(ws, model);
|
|
195
|
+
// Summary band (row 6) — items vs variants stay separate metrics by design (I8).
|
|
196
|
+
// The execution counters are LIVE formulas over the variant Result cells, so
|
|
197
|
+
// hand-entered results update the totals (review GAP-06). Variant cells hold the
|
|
198
|
+
// exact state words and parent cells NEVER do (itemResultLabel + the roll-up
|
|
199
|
+
// formula always compose a "n/m Passed …" label), so exact-match COUNTIF over
|
|
200
|
+
// the whole column counts variants only.
|
|
201
|
+
const sum = (k) => model.items.reduce((a, i) => a + i.resultCounts[k], 0);
|
|
202
|
+
const passed = sum('passed');
|
|
203
|
+
const failed = sum('failed');
|
|
204
|
+
const blocked = sum('blocked');
|
|
205
|
+
const notRun = sum('notRun');
|
|
206
|
+
const na = sum('na');
|
|
207
|
+
const RANGE = 'M9:M10000';
|
|
208
|
+
const band = ws.getRow(6);
|
|
209
|
+
const bandCells = [
|
|
210
|
+
['items', `Delivery items: ${model.manifest.itemCount}`],
|
|
211
|
+
['variants', `Coverage variants: ${model.manifest.variantCount}`],
|
|
212
|
+
['passed', { formula: `"Passed: "&COUNTIF(${RANGE},"Passed")`, result: `Passed: ${passed}` }],
|
|
213
|
+
['failed', { formula: `"Failed: "&COUNTIF(${RANGE},"Failed")`, result: `Failed: ${failed}` }],
|
|
214
|
+
['blocked', { formula: `"Blocked: "&COUNTIF(${RANGE},"Blocked")`, result: `Blocked: ${blocked}` }],
|
|
215
|
+
['pending', { formula: `"Pending: "&COUNTIF(${RANGE},"Pending")`, result: `Pending: ${notRun}` }],
|
|
216
|
+
['na', { formula: `"N/A: "&COUNTIF(${RANGE},"N/A")`, result: `N/A: ${na}` }],
|
|
217
|
+
];
|
|
218
|
+
bandCells.forEach(([, v], i) => {
|
|
219
|
+
const c = band.getCell(2 + i);
|
|
220
|
+
dataCell(c, v, { bold: true, fill: SOFT_BLUE, center: true });
|
|
221
|
+
});
|
|
222
|
+
const HEADER_ROW = 8;
|
|
223
|
+
const hr = ws.getRow(HEADER_ROW);
|
|
224
|
+
hr.height = 28;
|
|
225
|
+
MATRIX_HEADERS.forEach((label, i) => headerCell(hr.getCell(2 + i), label));
|
|
226
|
+
let rowIdx = HEADER_ROW + 1;
|
|
227
|
+
for (const item of model.items) {
|
|
228
|
+
const parentRowIdx = rowIdx++;
|
|
229
|
+
// --- Variant sub-rows FIRST (to know their cell range for the parent formula).
|
|
230
|
+
// Every item gets sub-rows — the sub-row is where the source scenario id, the
|
|
231
|
+
// resolved data, and the manual result/evidence entry live (review B-05).
|
|
232
|
+
const firstChild = rowIdx;
|
|
233
|
+
// Delta-only sub-rows (review GAP-01): content identical across the whole
|
|
234
|
+
// item lives ONCE on the parent — a child repeats only what distinguishes it.
|
|
235
|
+
// The child's Expected Result is always kept: it is the precise source
|
|
236
|
+
// oracle (the semantic anchor), not a repetition of the parent's summary.
|
|
237
|
+
for (const v of item.variants) {
|
|
238
|
+
const vr = ws.getRow(rowIdx++);
|
|
239
|
+
vr.outlineLevel = 1;
|
|
240
|
+
const vValues = [
|
|
241
|
+
v.ref,
|
|
242
|
+
'',
|
|
243
|
+
v.condition,
|
|
244
|
+
'', '',
|
|
245
|
+
numbered(item.preconditionDeltas[v.ref] ?? []),
|
|
246
|
+
numbered(v.data),
|
|
247
|
+
// Only the steps after the parent's shared prefix, numbered so the
|
|
248
|
+
// parent's steps + these read as one continuous procedure.
|
|
249
|
+
numbered(item.triggerDeltas[v.ref] ?? [], item.trigger.length + 1),
|
|
250
|
+
expectedWithVerification(v.oracle, v.verification),
|
|
251
|
+
v.mode === 'manual' ? `Manual${v.manualReason ? ` (${v.manualReason})` : ''}` : 'Auto',
|
|
252
|
+
v.traces.join(', '),
|
|
253
|
+
(0, build_1.variantState)(v),
|
|
254
|
+
isoDate(v.result?.startTime),
|
|
255
|
+
'',
|
|
256
|
+
v.result?.error ? String(v.result.error).slice(0, 200) : '',
|
|
257
|
+
'',
|
|
258
|
+
];
|
|
259
|
+
vValues.forEach((val, i) => dataCell(vr.getCell(2 + i), val, { center: i === 9 }));
|
|
260
|
+
// Manual-execution entry: constrain the Result cell to the known states.
|
|
261
|
+
vr.getCell(2 + 11).dataValidation = {
|
|
262
|
+
type: 'list', allowBlank: true, formulae: [`"${RESULT_STATES}"`],
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
const lastChild = rowIdx - 1;
|
|
266
|
+
// --- Parent row: only values that are genuinely COMMON to the whole item
|
|
267
|
+
// (review M-04); everything variant-specific stays on the sub-rows.
|
|
268
|
+
const pr = ws.getRow(parentRowIdx);
|
|
269
|
+
const coverage = coverageSummary(item);
|
|
270
|
+
// Live roll-up derived from the child Result cells — precedence
|
|
271
|
+
// failed → blocked → pending → partial → passed. N/A variants leave the
|
|
272
|
+
// denominator (review GAP-06): eff = n − COUNTIF(N/A); all-N/A → "N/A".
|
|
273
|
+
const rng = `M${firstChild}:M${lastChild}`;
|
|
274
|
+
const n = item.variants.length;
|
|
275
|
+
const EFF = `(${n}-COUNTIF(${rng},"N/A"))`;
|
|
276
|
+
const NA = `IF(COUNTIF(${rng},"N/A")>0," · "&COUNTIF(${rng},"N/A")&" N/A","")`;
|
|
277
|
+
// Mirrors itemResultLabel exactly — and never yields a bare state word.
|
|
278
|
+
const rollUpFormula = `IF(COUNTIF(${rng},"Failed")>0,COUNTIF(${rng},"Passed")&"/"&${EFF}&" Passed · "&COUNTIF(${rng},"Failed")&" Failed"&${NA},` +
|
|
279
|
+
`IF(COUNTIF(${rng},"Blocked")>0,COUNTIF(${rng},"Passed")&"/"&${EFF}&" Passed · "&COUNTIF(${rng},"Blocked")&" Blocked"&${NA},` +
|
|
280
|
+
`IF(${EFF}=0,"All N/A",` +
|
|
281
|
+
`COUNTIF(${rng},"Passed")&"/"&${EFF}&" Passed"&${NA})))`;
|
|
282
|
+
const values = [
|
|
283
|
+
item.id,
|
|
284
|
+
item.target,
|
|
285
|
+
item.intent,
|
|
286
|
+
item.category,
|
|
287
|
+
item.priority,
|
|
288
|
+
numbered(item.precondition),
|
|
289
|
+
coverage,
|
|
290
|
+
// The shared leading steps; each variant's remaining steps sit on its sub-row.
|
|
291
|
+
numbered(item.trigger),
|
|
292
|
+
item.oracle,
|
|
293
|
+
itemModeLabel(item),
|
|
294
|
+
item.traces.join(', '),
|
|
295
|
+
{ formula: rollUpFormula, result: itemResultLabel(item) },
|
|
296
|
+
'',
|
|
297
|
+
'',
|
|
298
|
+
item.review === 'proposed' ? 'REVIEW REQUIRED' : '',
|
|
299
|
+
'',
|
|
300
|
+
];
|
|
301
|
+
values.forEach((v, i) => dataCell(pr.getCell(2 + i), v, {
|
|
302
|
+
bold: true,
|
|
303
|
+
fill: SOFT_BLUE,
|
|
304
|
+
center: i === 3 || i === 4 || i === 9,
|
|
305
|
+
...(i === 14 && item.review === 'proposed' ? { color: DRAFT_RED } : {}),
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
ws.autoFilter = { from: { row: HEADER_ROW, column: 2 }, to: { row: rowIdx - 1, column: 17 } };
|
|
309
|
+
// Freeze the header band AND the ID + Target columns (review §9).
|
|
310
|
+
ws.views = [{ state: 'frozen', xSplit: 3, ySplit: HEADER_ROW }];
|
|
311
|
+
// Print: landscape, fit width only (never squash all rows into one page),
|
|
312
|
+
// repeat the masthead + header rows on every page (review GAP-08).
|
|
313
|
+
ws.pageSetup = {
|
|
314
|
+
orientation: 'landscape',
|
|
315
|
+
fitToPage: true,
|
|
316
|
+
fitToWidth: 1,
|
|
317
|
+
fitToHeight: 0,
|
|
318
|
+
printTitlesRow: '1:8',
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
// Sheet 2 — Coverage (requirements + overview grid + dispositions + manifest)
|
|
323
|
+
// ---------------------------------------------------------------------------
|
|
324
|
+
function addCoverageSheet(wb, model, sungenVersion) {
|
|
325
|
+
const ws = wb.addWorksheet('Coverage');
|
|
326
|
+
ws.columns = [
|
|
327
|
+
{ width: 3 }, { width: 22 }, { width: 18 }, { width: 16 }, { width: 16 }, { width: 16 },
|
|
328
|
+
{ width: 16 }, { width: 44 },
|
|
329
|
+
];
|
|
330
|
+
(0, xlsx_report_builder_1.renderReportHeaderBand)(wb, ws, `${model.unit.toUpperCase()} COVERAGE OVERVIEW`, sungenVersion, model.formNo);
|
|
331
|
+
draftBanner(ws, model);
|
|
332
|
+
let rowIdx = 7;
|
|
333
|
+
// --- Requirement coverage (review §6): every requirement id gets ONE explicit status.
|
|
334
|
+
if (model.requirements.length > 0) {
|
|
335
|
+
dataCell(ws.getRow(rowIdx).getCell(2), 'Requirement coverage — every id has an explicit status', { bold: true });
|
|
336
|
+
rowIdx += 1;
|
|
337
|
+
const rh = ws.getRow(rowIdx);
|
|
338
|
+
ws.mergeCells(rowIdx, 4, rowIdx, 6);
|
|
339
|
+
headerCell(rh.getCell(2), 'Requirement');
|
|
340
|
+
headerCell(rh.getCell(3), 'Status');
|
|
341
|
+
headerCell(rh.getCell(4), 'Delivery items');
|
|
342
|
+
headerCell(rh.getCell(7), 'Variants');
|
|
343
|
+
headerCell(rh.getCell(8), 'Note');
|
|
344
|
+
rowIdx += 1;
|
|
345
|
+
for (const r of model.requirements) {
|
|
346
|
+
const row = ws.getRow(rowIdx++);
|
|
347
|
+
dataCell(row.getCell(2), r.id, { bold: true });
|
|
348
|
+
dataCell(row.getCell(3), r.status, {
|
|
349
|
+
center: true,
|
|
350
|
+
...(r.status === 'gap' ? { fill: GAP_FILL, bold: true } : {}),
|
|
351
|
+
});
|
|
352
|
+
ws.mergeCells(rowIdx - 1, 4, rowIdx - 1, 6);
|
|
353
|
+
dataCell(row.getCell(4), r.items.join(', '));
|
|
354
|
+
dataCell(row.getCell(7), r.variantCount > 0 ? String(r.variantCount) : '', { center: true });
|
|
355
|
+
dataCell(row.getCell(8), r.note);
|
|
356
|
+
}
|
|
357
|
+
rowIdx += 1;
|
|
358
|
+
}
|
|
359
|
+
// --- Target × category grid ---
|
|
360
|
+
dataCell(ws.getRow(rowIdx).getCell(2), 'Coverage matrix — delivery items (coverage variants) per target × category', { bold: true });
|
|
361
|
+
rowIdx += 1;
|
|
362
|
+
const gridHeader = ws.getRow(rowIdx++);
|
|
363
|
+
headerCell(gridHeader.getCell(2), 'Target');
|
|
364
|
+
CATEGORY_ORDER.forEach((cat, i) => headerCell(gridHeader.getCell(3 + i), cat));
|
|
365
|
+
headerCell(gridHeader.getCell(3 + CATEGORY_ORDER.length), 'Total');
|
|
366
|
+
const targets = Array.from(new Set(model.items.map((i) => i.target)));
|
|
367
|
+
for (const target of targets) {
|
|
368
|
+
const row = ws.getRow(rowIdx++);
|
|
369
|
+
dataCell(row.getCell(2), target, { bold: true });
|
|
370
|
+
let totalItems = 0;
|
|
371
|
+
let totalVariants = 0;
|
|
372
|
+
CATEGORY_ORDER.forEach((cat, i) => {
|
|
373
|
+
const cell = row.getCell(3 + i);
|
|
374
|
+
const items = model.items.filter((it) => it.target === target && it.category === cat);
|
|
375
|
+
const variants = items.reduce((a, it) => a + it.variants.length, 0);
|
|
376
|
+
totalItems += items.length;
|
|
377
|
+
totalVariants += variants;
|
|
378
|
+
// `—` is an explicit statement: this target × category cell has NO coverage.
|
|
379
|
+
dataCell(cell, items.length === 0 ? '—' : `${items.length} (${variants})`, {
|
|
380
|
+
center: true,
|
|
381
|
+
...(items.length === 0 ? { fill: GAP_FILL } : {}),
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
dataCell(row.getCell(3 + CATEGORY_ORDER.length), `${totalItems} (${totalVariants})`, { center: true, bold: true });
|
|
385
|
+
}
|
|
386
|
+
// --- Dispositions ---
|
|
387
|
+
if (model.dispositions.length > 0) {
|
|
388
|
+
rowIdx += 1;
|
|
389
|
+
dataCell(ws.getRow(rowIdx).getCell(2), 'Not in the matrix (explicit dispositions)', { bold: true });
|
|
390
|
+
rowIdx += 1;
|
|
391
|
+
const dh = ws.getRow(rowIdx++);
|
|
392
|
+
['Source', 'Disposition', 'Reason', 'Title'].forEach((l, i) => headerCell(dh.getCell(2 + i), l));
|
|
393
|
+
for (const d of model.dispositions) {
|
|
394
|
+
const row = ws.getRow(rowIdx++);
|
|
395
|
+
dataCell(row.getCell(2), d.vpId);
|
|
396
|
+
dataCell(row.getCell(3), d.as, { center: true });
|
|
397
|
+
dataCell(row.getCell(4), d.reason);
|
|
398
|
+
dataCell(row.getCell(5), d.title);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// --- Manifest ---
|
|
402
|
+
rowIdx += 1;
|
|
403
|
+
dataCell(ws.getRow(rowIdx).getCell(2), 'Generation manifest', { bold: true });
|
|
404
|
+
rowIdx += 1;
|
|
405
|
+
const m = model.manifest;
|
|
406
|
+
const manifestRows = [
|
|
407
|
+
['Unit', m.unit],
|
|
408
|
+
['Approval state', m.approvalState],
|
|
409
|
+
['Delivery items', String(m.itemCount)],
|
|
410
|
+
['Coverage variants', String(m.variantCount)],
|
|
411
|
+
['Source fingerprint', m.sourceFingerprint],
|
|
412
|
+
['Map fingerprint', m.mapFingerprint],
|
|
413
|
+
['Transformer version', m.transformerVersion],
|
|
414
|
+
['Max variants / item (warn)', String(m.thresholds.maxVariantsPerItem)],
|
|
415
|
+
];
|
|
416
|
+
for (const [k, v] of manifestRows) {
|
|
417
|
+
const row = ws.getRow(rowIdx++);
|
|
418
|
+
dataCell(row.getCell(2), k, { bold: true, fill: SOFT_BLUE });
|
|
419
|
+
ws.mergeCells(rowIdx - 1, 3, rowIdx - 1, 7);
|
|
420
|
+
dataCell(row.getCell(3), v);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// ---------------------------------------------------------------------------
|
|
424
|
+
function renderMatrixXlsx(model, sungenVersion) {
|
|
425
|
+
const wb = new ExcelJS.Workbook();
|
|
426
|
+
addMatrixSheet(wb, model, sungenVersion);
|
|
427
|
+
addCoverageSheet(wb, model, sungenVersion);
|
|
428
|
+
return wb;
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=render-xlsx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-xlsx.js","sourceRoot":"","sources":["../../../src/exporters/matrix/render-xlsx.ts"],"names":[],"mappings":"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"}
|