@panguard-ai/panguard-report 0.1.1 → 0.2.1
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/LICENSE +1 -1
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +53 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/generator/index.d.ts +2 -0
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +1 -0
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/pdf-generator.d.ts +63 -0
- package/dist/generator/pdf-generator.d.ts.map +1 -0
- package/dist/generator/pdf-generator.js +795 -0
- package/dist/generator/pdf-generator.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/package.json +14 -2
package/LICENSE
CHANGED
package/dist/cli/index.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export interface ReportCliOptions {
|
|
|
20
20
|
verbose?: boolean;
|
|
21
21
|
/** Run live system assessment / 執行即時系統評估 */
|
|
22
22
|
assess?: boolean;
|
|
23
|
+
/** Path to panguard-scan JSON results file / panguard-scan JSON 結果檔案路徑 */
|
|
24
|
+
scanResultsFile?: string;
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
27
|
* Parse CLI arguments
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AAUrB,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,iBAAiB,GACjB,UAAU,GACV,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,2BAA2B;AAC3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAmC7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAoB9E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgBzD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAqCpC;AA6CD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4J9D"}
|
package/dist/cli/index.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { DEFAULT_REPORT_CONFIG } from '../types.js';
|
|
9
9
|
import { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from '../generator/report-generator.js';
|
|
10
|
+
import { generatePDFReport } from '../generator/pdf-generator.js';
|
|
10
11
|
/**
|
|
11
12
|
* Parse CLI arguments
|
|
12
13
|
* 解析 CLI 參數
|
|
@@ -46,6 +47,10 @@ export function parseCliArgs(args) {
|
|
|
46
47
|
else if (arg === '--assess') {
|
|
47
48
|
options.assess = true;
|
|
48
49
|
}
|
|
50
|
+
else if (arg === '--scan-results' && args[i + 1]) {
|
|
51
|
+
options.scanResultsFile = args[i + 1];
|
|
52
|
+
i++;
|
|
53
|
+
}
|
|
49
54
|
}
|
|
50
55
|
return options;
|
|
51
56
|
}
|
|
@@ -128,10 +133,12 @@ Options / 選項:
|
|
|
128
133
|
--framework <name> Compliance framework / 合規框架
|
|
129
134
|
(tw_cyber_security_act, iso27001, soc2)
|
|
130
135
|
--language <lang> Report language / 報告語言 (zh-TW, en)
|
|
131
|
-
--format <fmt> Output format / 輸出格式 (json, pdf)
|
|
136
|
+
--format <fmt> Output format / 輸出格式 (json, html, pdf)
|
|
132
137
|
--output-dir <path> Output directory / 輸出目錄
|
|
133
138
|
--org <name> Organization name / 組織名稱
|
|
134
139
|
--input <file> Findings input file (JSON) / 發現輸入檔案 (JSON)
|
|
140
|
+
--scan-results <file> Panguard scan JSON results file / panguard scan JSON 結果檔案
|
|
141
|
+
(auto-converts scan findings to compliance findings)
|
|
135
142
|
--assess Run live system assessment / 執行即時系統評估
|
|
136
143
|
--verbose, -v Verbose output / 詳細輸出
|
|
137
144
|
|
|
@@ -139,6 +146,7 @@ Examples / 範例:
|
|
|
139
146
|
panguard-report generate --framework tw_cyber_security_act --assess
|
|
140
147
|
panguard-report generate --framework iso27001 --org "ACME Corp" --assess
|
|
141
148
|
panguard-report generate --framework iso27001 --org "ACME Corp" --input findings.json
|
|
149
|
+
panguard-report generate --framework soc2 --scan-results scan-output.json
|
|
142
150
|
panguard-report list-frameworks
|
|
143
151
|
panguard-report summary --input findings.json --framework soc2
|
|
144
152
|
`.trim();
|
|
@@ -209,10 +217,28 @@ export async function executeCli(args) {
|
|
|
209
217
|
console.log('Generating compliance report... / 產生合規報告中...');
|
|
210
218
|
console.log(`Framework / 框架: ${framework}`);
|
|
211
219
|
console.log(`Language / 語言: ${language}`);
|
|
220
|
+
// Convert scan results to compliance findings if --scan-results provided
|
|
221
|
+
let scanFindings = [];
|
|
222
|
+
if (options.scanResultsFile) {
|
|
223
|
+
const { readFile } = await import('node:fs/promises');
|
|
224
|
+
const raw = await readFile(options.scanResultsFile, 'utf-8');
|
|
225
|
+
const scanOutput = JSON.parse(raw);
|
|
226
|
+
scanFindings = scanOutput.findings.map((f) => ({
|
|
227
|
+
findingId: `SCAN-${String(f.id).padStart(3, '0')}`,
|
|
228
|
+
severity: f.severity,
|
|
229
|
+
title: f.title,
|
|
230
|
+
description: f.description,
|
|
231
|
+
category: f.category,
|
|
232
|
+
timestamp: new Date(),
|
|
233
|
+
source: 'panguard-scan',
|
|
234
|
+
}));
|
|
235
|
+
console.log(`Scan results loaded / 已載入掃描結果: ${scanFindings.length} findings from ${options.scanResultsFile}`);
|
|
236
|
+
}
|
|
212
237
|
let report;
|
|
213
238
|
if (options.assess) {
|
|
214
239
|
console.log('Running live system assessment... / 執行即時系統評估...');
|
|
215
|
-
const
|
|
240
|
+
const inputFindings = options.inputFile ? await loadFindings(options.inputFile) : [];
|
|
241
|
+
const additionalFindings = [...inputFindings, ...scanFindings];
|
|
216
242
|
report = await generateComplianceReportWithAssessment(framework, language, {
|
|
217
243
|
organizationName: options.organizationName,
|
|
218
244
|
includeRecommendations: true,
|
|
@@ -221,14 +247,36 @@ export async function executeCli(args) {
|
|
|
221
247
|
console.log(`Assessment findings / 評估發現: ${report.findings.length}`);
|
|
222
248
|
}
|
|
223
249
|
else {
|
|
224
|
-
const
|
|
250
|
+
const inputFindings = await loadFindings(options.inputFile);
|
|
251
|
+
const findings = [...inputFindings, ...scanFindings];
|
|
225
252
|
console.log(`Findings loaded / 已載入發現: ${findings.length}`);
|
|
226
253
|
report = generateComplianceReport(findings, framework, language, {
|
|
227
254
|
organizationName: options.organizationName,
|
|
228
255
|
includeRecommendations: true,
|
|
229
256
|
});
|
|
230
257
|
}
|
|
231
|
-
if (format === '
|
|
258
|
+
if (format === 'pdf') {
|
|
259
|
+
const { mkdir } = await import('node:fs/promises');
|
|
260
|
+
const outputDir = options.outputDir ?? DEFAULT_REPORT_CONFIG.outputDir;
|
|
261
|
+
await mkdir(outputDir, { recursive: true });
|
|
262
|
+
const pdfPath = `${outputDir}/${report.metadata.reportId}.pdf`;
|
|
263
|
+
const isZh = language === 'zh-TW';
|
|
264
|
+
const pdfTitle = isZh
|
|
265
|
+
? `Panguard AI - ${framework} 合規報告`
|
|
266
|
+
: `Panguard AI - ${framework} Compliance Report`;
|
|
267
|
+
await generatePDFReport({
|
|
268
|
+
title: pdfTitle,
|
|
269
|
+
framework,
|
|
270
|
+
lang: language,
|
|
271
|
+
outputPath: pdfPath,
|
|
272
|
+
findings: report.findings,
|
|
273
|
+
assessmentResult: report,
|
|
274
|
+
organizationName: options.organizationName,
|
|
275
|
+
generatedAt: report.metadata.generatedAt.toISOString().split('T')[0],
|
|
276
|
+
});
|
|
277
|
+
console.log(`PDF report saved to / PDF 報告已儲存至: ${pdfPath}`);
|
|
278
|
+
}
|
|
279
|
+
else if (format === 'json') {
|
|
232
280
|
const json = reportToJSON(report);
|
|
233
281
|
if (options.outputDir) {
|
|
234
282
|
const { writeFile, mkdir } = await import('node:fs/promises');
|
|
@@ -243,7 +291,7 @@ export async function executeCli(args) {
|
|
|
243
291
|
}
|
|
244
292
|
}
|
|
245
293
|
else {
|
|
246
|
-
// For
|
|
294
|
+
// For other formats, output the summary text
|
|
247
295
|
const summary = generateSummaryText(report);
|
|
248
296
|
console.log('');
|
|
249
297
|
console.log(summary);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,6 @@
|
|
|
5
5
|
* @module @panguard-ai/panguard-report/generator
|
|
6
6
|
*/
|
|
7
7
|
export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './report-generator.js';
|
|
8
|
+
export { generatePDFReport } from './pdf-generator.js';
|
|
9
|
+
export type { PDFReportOptions } from './pdf-generator.js';
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/generator/index.js
CHANGED
|
@@ -5,4 +5,5 @@
|
|
|
5
5
|
* @module @panguard-ai/panguard-report/generator
|
|
6
6
|
*/
|
|
7
7
|
export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './report-generator.js';
|
|
8
|
+
export { generatePDFReport } from './pdf-generator.js';
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compliance Report PDF Generator
|
|
3
|
+
* 合規報告 PDF 產生器
|
|
4
|
+
*
|
|
5
|
+
* Generates professional PDF compliance reports with CJK font support,
|
|
6
|
+
* cover page, executive summary, findings table, compliance matrix,
|
|
7
|
+
* and page footers with confidential watermark.
|
|
8
|
+
*
|
|
9
|
+
* 產生具有 CJK 字型支援的專業 PDF 合規報告,包含封面頁、執行摘要、
|
|
10
|
+
* 發現列表、合規矩陣,以及帶有機密浮水印的頁尾。
|
|
11
|
+
*
|
|
12
|
+
* @module @panguard-ai/panguard-report/generator/pdf-generator
|
|
13
|
+
*/
|
|
14
|
+
import type { ComplianceFinding, ComplianceReportData } from '../types.js';
|
|
15
|
+
/** Options for PDF report generation / PDF 報告產生選項 */
|
|
16
|
+
export interface PDFReportOptions {
|
|
17
|
+
/** Report title / 報告標題 */
|
|
18
|
+
title: string;
|
|
19
|
+
/** Compliance framework identifier / 合規框架識別碼 */
|
|
20
|
+
framework: string;
|
|
21
|
+
/** Output language / 輸出語言 */
|
|
22
|
+
lang: 'zh-TW' | 'en';
|
|
23
|
+
/** Output file path / 輸出檔案路徑 */
|
|
24
|
+
outputPath: string;
|
|
25
|
+
/** Compliance findings / 合規發現 */
|
|
26
|
+
findings: ComplianceFinding[];
|
|
27
|
+
/** Pre-computed assessment result (optional) / 預先計算的評估結果(選用) */
|
|
28
|
+
assessmentResult?: ComplianceReportData;
|
|
29
|
+
/** Report generation timestamp / 報告產生時間戳 */
|
|
30
|
+
generatedAt?: string;
|
|
31
|
+
/** Organization name / 組織名稱 */
|
|
32
|
+
organizationName?: string;
|
|
33
|
+
/** Disable PDF stream compression (useful for testing) / 停用 PDF 壓縮(測試用) */
|
|
34
|
+
compress?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Attempt to detect and register a CJK font for Chinese text rendering
|
|
38
|
+
* 嘗試偵測並註冊 CJK 字型以進行中文文字渲染
|
|
39
|
+
*/
|
|
40
|
+
export declare function registerCjkFont(doc: PDFKit.PDFDocument): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Generate a complete PDF compliance report
|
|
43
|
+
* 產生完整的 PDF 合規報告
|
|
44
|
+
*
|
|
45
|
+
* Creates a multi-page PDF document with the following sections:
|
|
46
|
+
* 1. Cover page with report title, framework name, date
|
|
47
|
+
* 2. Executive summary with overall score, pass/fail counts
|
|
48
|
+
* 3. Findings table with severity badges, descriptions
|
|
49
|
+
* 4. Compliance matrix showing framework requirements vs results
|
|
50
|
+
* 5. Page footers with page numbers and "Confidential" watermark
|
|
51
|
+
*
|
|
52
|
+
* 建立多頁 PDF 文件,包含以下區段:
|
|
53
|
+
* 1. 封面頁(含報告標題、框架名稱、日期)
|
|
54
|
+
* 2. 執行摘要(含整體分數、通過/未通過計數)
|
|
55
|
+
* 3. 發現列表(含嚴重度標記、描述)
|
|
56
|
+
* 4. 合規矩陣(顯示框架要求與評估結果對照)
|
|
57
|
+
* 5. 頁尾(含頁碼和「機密」浮水印)
|
|
58
|
+
*
|
|
59
|
+
* @param options - PDF report generation options / PDF 報告產生選項
|
|
60
|
+
* @returns Path to the generated PDF file / 產生的 PDF 檔案路徑
|
|
61
|
+
*/
|
|
62
|
+
export declare function generatePDFReport(options: PDFReportOptions): Promise<string>;
|
|
63
|
+
//# sourceMappingURL=pdf-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-generator.d.ts","sourceRoot":"","sources":["../../src/generator/pdf-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EAGrB,MAAM,aAAa,CAAC;AA4DrB,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAyCD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAwC/E;AAumBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmGlF"}
|
|
@@ -0,0 +1,795 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compliance Report PDF Generator
|
|
3
|
+
* 合規報告 PDF 產生器
|
|
4
|
+
*
|
|
5
|
+
* Generates professional PDF compliance reports with CJK font support,
|
|
6
|
+
* cover page, executive summary, findings table, compliance matrix,
|
|
7
|
+
* and page footers with confidential watermark.
|
|
8
|
+
*
|
|
9
|
+
* 產生具有 CJK 字型支援的專業 PDF 合規報告,包含封面頁、執行摘要、
|
|
10
|
+
* 發現列表、合規矩陣,以及帶有機密浮水印的頁尾。
|
|
11
|
+
*
|
|
12
|
+
* @module @panguard-ai/panguard-report/generator/pdf-generator
|
|
13
|
+
*/
|
|
14
|
+
import PDFDocument from 'pdfkit';
|
|
15
|
+
import { createWriteStream } from 'node:fs';
|
|
16
|
+
import { access, constants, mkdir } from 'node:fs/promises';
|
|
17
|
+
import { dirname } from 'node:path';
|
|
18
|
+
import { createLogger } from '@panguard-ai/core';
|
|
19
|
+
import { getFrameworkName, getFrameworkControls } from '../frameworks/index.js';
|
|
20
|
+
import { evaluateControls, generateExecutiveSummary, generateStatistics, generateRecommendations, } from '../mapper/index.js';
|
|
21
|
+
import { getSectionLabels, getSeverityLabel, getStatusLabel } from '../templates/index.js';
|
|
22
|
+
const logger = createLogger('panguard-report:pdf');
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Layout & Style Constants
|
|
25
|
+
// 版面配置與樣式常數
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/** Color palette for severity badges and layout / 嚴重度標記與版面配置的色彩配置 */
|
|
28
|
+
const COLORS = {
|
|
29
|
+
primary: '#1a365d',
|
|
30
|
+
secondary: '#2d3748',
|
|
31
|
+
accent: '#3182ce',
|
|
32
|
+
critical: '#c53030',
|
|
33
|
+
high: '#c05621',
|
|
34
|
+
medium: '#b7791f',
|
|
35
|
+
low: '#2b6cb0',
|
|
36
|
+
info: '#718096',
|
|
37
|
+
pass: '#276749',
|
|
38
|
+
fail: '#c53030',
|
|
39
|
+
partial: '#b7791f',
|
|
40
|
+
background: '#f7fafc',
|
|
41
|
+
white: '#ffffff',
|
|
42
|
+
text: '#2d3748',
|
|
43
|
+
lightText: '#718096',
|
|
44
|
+
border: '#e2e8f0',
|
|
45
|
+
watermark: '#e2e8f0',
|
|
46
|
+
};
|
|
47
|
+
/** Font families / 字型家族 */
|
|
48
|
+
const FONTS = {
|
|
49
|
+
heading: 'Helvetica-Bold',
|
|
50
|
+
body: 'Helvetica',
|
|
51
|
+
mono: 'Courier',
|
|
52
|
+
};
|
|
53
|
+
/** A4 page layout dimensions in points / A4 頁面版面尺寸(點) */
|
|
54
|
+
const LAYOUT = {
|
|
55
|
+
pageWidth: 595.28,
|
|
56
|
+
pageHeight: 841.89,
|
|
57
|
+
margin: 50,
|
|
58
|
+
contentWidth: 495.28,
|
|
59
|
+
headerHeight: 30,
|
|
60
|
+
footerHeight: 20,
|
|
61
|
+
};
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// CJK Font Detection
|
|
64
|
+
// CJK 字型偵測
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
/**
|
|
67
|
+
* CJK font search paths per platform
|
|
68
|
+
* 各平台的 CJK 字型搜尋路徑
|
|
69
|
+
*/
|
|
70
|
+
const CJK_FONT_PATHS = {
|
|
71
|
+
darwin: [
|
|
72
|
+
{ path: '/System/Library/Fonts/STHeiti Light.ttc', family: 'STHeitiTC-Light' },
|
|
73
|
+
{ path: '/System/Library/Fonts/PingFang.ttc', family: 'PingFangTC-Regular' },
|
|
74
|
+
],
|
|
75
|
+
linux: [
|
|
76
|
+
{
|
|
77
|
+
path: '/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc',
|
|
78
|
+
family: 'Noto Sans CJK TC',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
path: '/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc',
|
|
82
|
+
family: 'Noto Sans CJK TC',
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Check if a file exists at the given path
|
|
88
|
+
* 檢查指定路徑是否存在檔案
|
|
89
|
+
*/
|
|
90
|
+
async function fileExists(filePath) {
|
|
91
|
+
try {
|
|
92
|
+
await access(filePath, constants.R_OK);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Attempt to detect and register a CJK font for Chinese text rendering
|
|
101
|
+
* 嘗試偵測並註冊 CJK 字型以進行中文文字渲染
|
|
102
|
+
*/
|
|
103
|
+
export async function registerCjkFont(doc) {
|
|
104
|
+
const platform = process.platform;
|
|
105
|
+
const candidates = CJK_FONT_PATHS[platform];
|
|
106
|
+
if (!candidates || candidates.length === 0) {
|
|
107
|
+
logger.warn('No CJK font candidates for this platform', { platform });
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
for (const candidate of candidates) {
|
|
111
|
+
const exists = await fileExists(candidate.path);
|
|
112
|
+
if (exists) {
|
|
113
|
+
try {
|
|
114
|
+
if (candidate.family) {
|
|
115
|
+
doc.registerFont('CJK', candidate.path, candidate.family);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
doc.registerFont('CJK', candidate.path);
|
|
119
|
+
}
|
|
120
|
+
// Verify the font can actually be used by switching to it
|
|
121
|
+
// Some TTC files may register but fail on use
|
|
122
|
+
doc.font('CJK');
|
|
123
|
+
// Reset to default font
|
|
124
|
+
doc.font(FONTS.body);
|
|
125
|
+
logger.info('CJK font registered and verified successfully', { path: candidate.path });
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
130
|
+
logger.warn('Failed to register or verify CJK font', {
|
|
131
|
+
path: candidate.path,
|
|
132
|
+
error: message,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
logger.warn('No CJK font found on this system. Chinese characters may not render correctly.', { platform });
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// Helper: Severity Color
|
|
142
|
+
// 輔助: 嚴重度顏色
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
/**
|
|
145
|
+
* Return the color associated with a given severity level
|
|
146
|
+
* 根據給定的嚴重等級回傳對應的顏色
|
|
147
|
+
*/
|
|
148
|
+
function severityColor(severity) {
|
|
149
|
+
switch (severity) {
|
|
150
|
+
case 'critical':
|
|
151
|
+
return COLORS.critical;
|
|
152
|
+
case 'high':
|
|
153
|
+
return COLORS.high;
|
|
154
|
+
case 'medium':
|
|
155
|
+
return COLORS.medium;
|
|
156
|
+
case 'low':
|
|
157
|
+
return COLORS.low;
|
|
158
|
+
case 'info':
|
|
159
|
+
return COLORS.info;
|
|
160
|
+
default:
|
|
161
|
+
return COLORS.lightText;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Return the color associated with a control status
|
|
166
|
+
* 根據控制項狀態回傳對應的顏色
|
|
167
|
+
*/
|
|
168
|
+
function statusColor(status) {
|
|
169
|
+
switch (status) {
|
|
170
|
+
case 'pass':
|
|
171
|
+
return COLORS.pass;
|
|
172
|
+
case 'fail':
|
|
173
|
+
return COLORS.fail;
|
|
174
|
+
case 'partial':
|
|
175
|
+
return COLORS.partial;
|
|
176
|
+
default:
|
|
177
|
+
return COLORS.lightText;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// Helper: Font selection for CJK
|
|
182
|
+
// 輔助: CJK 字型選擇
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
/**
|
|
185
|
+
* Select the appropriate font based on CJK availability and style
|
|
186
|
+
* 根據 CJK 可用性與樣式選擇適當字型
|
|
187
|
+
*/
|
|
188
|
+
function selectFont(hasCjk, style) {
|
|
189
|
+
if (hasCjk && style !== 'mono') {
|
|
190
|
+
return 'CJK';
|
|
191
|
+
}
|
|
192
|
+
return FONTS[style];
|
|
193
|
+
}
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
// Helper: Check remaining page space
|
|
196
|
+
// 輔助: 檢查頁面剩餘空間
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
/**
|
|
199
|
+
* Check if there is enough vertical space remaining on the current page.
|
|
200
|
+
* If not, add a new page and return the new Y position.
|
|
201
|
+
* 檢查目前頁面是否有足夠的垂直空間,如果不夠則新增頁面並回傳新的 Y 位置。
|
|
202
|
+
*/
|
|
203
|
+
function ensureSpace(doc, currentY, requiredHeight) {
|
|
204
|
+
const maxY = LAYOUT.pageHeight - LAYOUT.margin - LAYOUT.footerHeight - 10;
|
|
205
|
+
if (currentY + requiredHeight > maxY) {
|
|
206
|
+
doc.addPage();
|
|
207
|
+
return LAYOUT.margin;
|
|
208
|
+
}
|
|
209
|
+
return currentY;
|
|
210
|
+
}
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
// Section 1: Cover Page
|
|
213
|
+
// 區段 1: 封面頁
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
/**
|
|
216
|
+
* Render the cover page
|
|
217
|
+
* 渲染封面頁
|
|
218
|
+
*/
|
|
219
|
+
function renderCoverPage(doc, options, hasCjk) {
|
|
220
|
+
const isZh = options.lang === 'zh-TW';
|
|
221
|
+
const font = selectFont(hasCjk, 'body');
|
|
222
|
+
const headingFont = selectFont(hasCjk, 'heading');
|
|
223
|
+
// Background accent bar at top
|
|
224
|
+
doc.rect(0, 0, LAYOUT.pageWidth, 6).fill(COLORS.primary);
|
|
225
|
+
// Title
|
|
226
|
+
const titleY = 200;
|
|
227
|
+
doc
|
|
228
|
+
.font(headingFont)
|
|
229
|
+
.fontSize(28)
|
|
230
|
+
.fillColor(COLORS.primary)
|
|
231
|
+
.text(options.title, LAYOUT.margin, titleY, {
|
|
232
|
+
width: LAYOUT.contentWidth,
|
|
233
|
+
align: 'center',
|
|
234
|
+
});
|
|
235
|
+
// Framework name
|
|
236
|
+
const frameworkName = getFrameworkName(options.framework, options.lang);
|
|
237
|
+
doc
|
|
238
|
+
.font(font)
|
|
239
|
+
.fontSize(16)
|
|
240
|
+
.fillColor(COLORS.secondary)
|
|
241
|
+
.text(frameworkName, LAYOUT.margin, titleY + 50, {
|
|
242
|
+
width: LAYOUT.contentWidth,
|
|
243
|
+
align: 'center',
|
|
244
|
+
});
|
|
245
|
+
// Separator line
|
|
246
|
+
const sepY = titleY + 90;
|
|
247
|
+
doc
|
|
248
|
+
.strokeColor(COLORS.accent)
|
|
249
|
+
.lineWidth(2)
|
|
250
|
+
.moveTo(LAYOUT.pageWidth / 2 - 80, sepY)
|
|
251
|
+
.lineTo(LAYOUT.pageWidth / 2 + 80, sepY)
|
|
252
|
+
.stroke();
|
|
253
|
+
// Date
|
|
254
|
+
const dateStr = options.generatedAt ?? new Date().toISOString().split('T')[0];
|
|
255
|
+
const dateLabel = isZh ? `產生日期: ${dateStr}` : `Generated: ${dateStr}`;
|
|
256
|
+
doc
|
|
257
|
+
.font(font)
|
|
258
|
+
.fontSize(12)
|
|
259
|
+
.fillColor(COLORS.lightText)
|
|
260
|
+
.text(dateLabel, LAYOUT.margin, sepY + 20, {
|
|
261
|
+
width: LAYOUT.contentWidth,
|
|
262
|
+
align: 'center',
|
|
263
|
+
});
|
|
264
|
+
// Organization name
|
|
265
|
+
if (options.organizationName) {
|
|
266
|
+
const orgLabel = isZh
|
|
267
|
+
? `組織: ${options.organizationName}`
|
|
268
|
+
: `Organization: ${options.organizationName}`;
|
|
269
|
+
doc
|
|
270
|
+
.font(font)
|
|
271
|
+
.fontSize(12)
|
|
272
|
+
.fillColor(COLORS.lightText)
|
|
273
|
+
.text(orgLabel, LAYOUT.margin, sepY + 40, {
|
|
274
|
+
width: LAYOUT.contentWidth,
|
|
275
|
+
align: 'center',
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Brand footer
|
|
279
|
+
const brandY = LAYOUT.pageHeight - LAYOUT.margin - 40;
|
|
280
|
+
doc
|
|
281
|
+
.font(font)
|
|
282
|
+
.fontSize(10)
|
|
283
|
+
.fillColor(COLORS.lightText)
|
|
284
|
+
.text('Generated by Panguard AI', LAYOUT.margin, brandY, {
|
|
285
|
+
width: LAYOUT.contentWidth,
|
|
286
|
+
align: 'center',
|
|
287
|
+
});
|
|
288
|
+
doc
|
|
289
|
+
.font(font)
|
|
290
|
+
.fontSize(8)
|
|
291
|
+
.fillColor(COLORS.lightText)
|
|
292
|
+
.text('https://panguard.ai', LAYOUT.margin, brandY + 16, {
|
|
293
|
+
width: LAYOUT.contentWidth,
|
|
294
|
+
align: 'center',
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
// ---------------------------------------------------------------------------
|
|
298
|
+
// Section 2: Executive Summary
|
|
299
|
+
// 區段 2: 執行摘要
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
/**
|
|
302
|
+
* Render the executive summary section
|
|
303
|
+
* 渲染執行摘要區段
|
|
304
|
+
*/
|
|
305
|
+
function renderExecutiveSummary(doc, reportData, lang, hasCjk) {
|
|
306
|
+
const isZh = lang === 'zh-TW';
|
|
307
|
+
const labels = getSectionLabels(lang);
|
|
308
|
+
const font = selectFont(hasCjk, 'body');
|
|
309
|
+
const headingFont = selectFont(hasCjk, 'heading');
|
|
310
|
+
const es = reportData.executiveSummary;
|
|
311
|
+
let y = LAYOUT.margin;
|
|
312
|
+
// Section title
|
|
313
|
+
doc
|
|
314
|
+
.font(headingFont)
|
|
315
|
+
.fontSize(20)
|
|
316
|
+
.fillColor(COLORS.primary)
|
|
317
|
+
.text(labels.executiveSummary, LAYOUT.margin, y);
|
|
318
|
+
y += 35;
|
|
319
|
+
// Separator
|
|
320
|
+
doc
|
|
321
|
+
.strokeColor(COLORS.border)
|
|
322
|
+
.lineWidth(1)
|
|
323
|
+
.moveTo(LAYOUT.margin, y)
|
|
324
|
+
.lineTo(LAYOUT.pageWidth - LAYOUT.margin, y)
|
|
325
|
+
.stroke();
|
|
326
|
+
y += 15;
|
|
327
|
+
// Overall score
|
|
328
|
+
const scoreLabel = isZh
|
|
329
|
+
? `整體合規分數: ${es.overallScore}%`
|
|
330
|
+
: `Overall Compliance Score: ${es.overallScore}%`;
|
|
331
|
+
const scoreColor = es.overallScore >= 80 ? COLORS.pass : es.overallScore >= 50 ? COLORS.medium : COLORS.fail;
|
|
332
|
+
doc
|
|
333
|
+
.font(headingFont)
|
|
334
|
+
.fontSize(16)
|
|
335
|
+
.fillColor(scoreColor)
|
|
336
|
+
.text(scoreLabel, LAYOUT.margin, y);
|
|
337
|
+
y += 30;
|
|
338
|
+
// Controls summary
|
|
339
|
+
const controlLines = isZh
|
|
340
|
+
? [
|
|
341
|
+
`控制項總數: ${es.totalControls}`,
|
|
342
|
+
`通過: ${es.controlsPassed} | 未通過: ${es.controlsFailed} | 部分符合: ${es.controlsPartial} | 不適用: ${es.controlsNA}`,
|
|
343
|
+
]
|
|
344
|
+
: [
|
|
345
|
+
`Total Controls: ${es.totalControls}`,
|
|
346
|
+
`Passed: ${es.controlsPassed} | Failed: ${es.controlsFailed} | Partial: ${es.controlsPartial} | N/A: ${es.controlsNA}`,
|
|
347
|
+
];
|
|
348
|
+
for (const line of controlLines) {
|
|
349
|
+
doc.font(font).fontSize(11).fillColor(COLORS.text).text(line, LAYOUT.margin, y);
|
|
350
|
+
y += 18;
|
|
351
|
+
}
|
|
352
|
+
y += 5;
|
|
353
|
+
// Findings summary
|
|
354
|
+
const findingLines = isZh
|
|
355
|
+
? [
|
|
356
|
+
`發現總數: ${es.totalFindings}`,
|
|
357
|
+
`嚴重: ${es.criticalFindings} | 高風險: ${es.highFindings}`,
|
|
358
|
+
]
|
|
359
|
+
: [
|
|
360
|
+
`Total Findings: ${es.totalFindings}`,
|
|
361
|
+
`Critical: ${es.criticalFindings} | High: ${es.highFindings}`,
|
|
362
|
+
];
|
|
363
|
+
for (const line of findingLines) {
|
|
364
|
+
doc.font(font).fontSize(11).fillColor(COLORS.text).text(line, LAYOUT.margin, y);
|
|
365
|
+
y += 18;
|
|
366
|
+
}
|
|
367
|
+
y += 10;
|
|
368
|
+
// Key risks
|
|
369
|
+
if (es.keyRisks.length > 0) {
|
|
370
|
+
const risksTitle = isZh ? '主要風險:' : 'Key Risks:';
|
|
371
|
+
doc.font(headingFont).fontSize(12).fillColor(COLORS.fail).text(risksTitle, LAYOUT.margin, y);
|
|
372
|
+
y += 18;
|
|
373
|
+
for (const risk of es.keyRisks) {
|
|
374
|
+
y = ensureSpace(doc, y, 16);
|
|
375
|
+
doc
|
|
376
|
+
.font(font)
|
|
377
|
+
.fontSize(10)
|
|
378
|
+
.fillColor(COLORS.text)
|
|
379
|
+
.text(` - ${risk}`, LAYOUT.margin + 10, y, { width: LAYOUT.contentWidth - 10 });
|
|
380
|
+
y += 16;
|
|
381
|
+
}
|
|
382
|
+
y += 5;
|
|
383
|
+
}
|
|
384
|
+
// Key achievements
|
|
385
|
+
if (es.keyAchievements.length > 0) {
|
|
386
|
+
const achieveTitle = isZh ? '主要成果:' : 'Key Achievements:';
|
|
387
|
+
doc
|
|
388
|
+
.font(headingFont)
|
|
389
|
+
.fontSize(12)
|
|
390
|
+
.fillColor(COLORS.pass)
|
|
391
|
+
.text(achieveTitle, LAYOUT.margin, y);
|
|
392
|
+
y += 18;
|
|
393
|
+
for (const achievement of es.keyAchievements) {
|
|
394
|
+
y = ensureSpace(doc, y, 16);
|
|
395
|
+
doc
|
|
396
|
+
.font(font)
|
|
397
|
+
.fontSize(10)
|
|
398
|
+
.fillColor(COLORS.text)
|
|
399
|
+
.text(` - ${achievement}`, LAYOUT.margin + 10, y, {
|
|
400
|
+
width: LAYOUT.contentWidth - 10,
|
|
401
|
+
});
|
|
402
|
+
y += 16;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
// ---------------------------------------------------------------------------
|
|
407
|
+
// Section 3: Findings Table
|
|
408
|
+
// 區段 3: 發現列表
|
|
409
|
+
// ---------------------------------------------------------------------------
|
|
410
|
+
/**
|
|
411
|
+
* Render the findings table section
|
|
412
|
+
* 渲染發現列表區段
|
|
413
|
+
*/
|
|
414
|
+
function renderFindingsTable(doc, findings, lang, hasCjk) {
|
|
415
|
+
const isZh = lang === 'zh-TW';
|
|
416
|
+
const labels = getSectionLabels(lang);
|
|
417
|
+
const font = selectFont(hasCjk, 'body');
|
|
418
|
+
const headingFont = selectFont(hasCjk, 'heading');
|
|
419
|
+
let y = LAYOUT.margin;
|
|
420
|
+
// Section title
|
|
421
|
+
doc
|
|
422
|
+
.font(headingFont)
|
|
423
|
+
.fontSize(20)
|
|
424
|
+
.fillColor(COLORS.primary)
|
|
425
|
+
.text(labels.findings, LAYOUT.margin, y);
|
|
426
|
+
y += 35;
|
|
427
|
+
// Separator
|
|
428
|
+
doc
|
|
429
|
+
.strokeColor(COLORS.border)
|
|
430
|
+
.lineWidth(1)
|
|
431
|
+
.moveTo(LAYOUT.margin, y)
|
|
432
|
+
.lineTo(LAYOUT.pageWidth - LAYOUT.margin, y)
|
|
433
|
+
.stroke();
|
|
434
|
+
y += 15;
|
|
435
|
+
if (findings.length === 0) {
|
|
436
|
+
const noFindings = isZh ? '未發現任何問題。' : 'No findings detected.';
|
|
437
|
+
doc.font(font).fontSize(11).fillColor(COLORS.lightText).text(noFindings, LAYOUT.margin, y);
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
// Sort findings by severity: critical > high > medium > low > info
|
|
441
|
+
const severityOrder = {
|
|
442
|
+
critical: 0,
|
|
443
|
+
high: 1,
|
|
444
|
+
medium: 2,
|
|
445
|
+
low: 3,
|
|
446
|
+
info: 4,
|
|
447
|
+
};
|
|
448
|
+
const sortedFindings = [...findings].sort((a, b) => (severityOrder[a.severity] ?? 5) - (severityOrder[b.severity] ?? 5));
|
|
449
|
+
for (const finding of sortedFindings) {
|
|
450
|
+
// Each finding needs approximately 80pt of vertical space
|
|
451
|
+
y = ensureSpace(doc, y, 80);
|
|
452
|
+
// Severity badge
|
|
453
|
+
const badgeColor = severityColor(finding.severity);
|
|
454
|
+
const badgeWidth = 60;
|
|
455
|
+
const badgeHeight = 16;
|
|
456
|
+
doc
|
|
457
|
+
.roundedRect(LAYOUT.margin, y, badgeWidth, badgeHeight, 3)
|
|
458
|
+
.fill(badgeColor);
|
|
459
|
+
doc
|
|
460
|
+
.font(FONTS.body)
|
|
461
|
+
.fontSize(8)
|
|
462
|
+
.fillColor(COLORS.white)
|
|
463
|
+
.text(getSeverityLabel(finding.severity, lang).toUpperCase(), LAYOUT.margin + 2, y + 3, { width: badgeWidth - 4, align: 'center' });
|
|
464
|
+
// Finding ID
|
|
465
|
+
doc
|
|
466
|
+
.font(FONTS.mono)
|
|
467
|
+
.fontSize(8)
|
|
468
|
+
.fillColor(COLORS.lightText)
|
|
469
|
+
.text(finding.findingId, LAYOUT.margin + badgeWidth + 10, y + 3);
|
|
470
|
+
y += badgeHeight + 5;
|
|
471
|
+
// Title
|
|
472
|
+
doc
|
|
473
|
+
.font(headingFont)
|
|
474
|
+
.fontSize(11)
|
|
475
|
+
.fillColor(COLORS.text)
|
|
476
|
+
.text(finding.title, LAYOUT.margin + 10, y, { width: LAYOUT.contentWidth - 10 });
|
|
477
|
+
y += 18;
|
|
478
|
+
// Description
|
|
479
|
+
doc
|
|
480
|
+
.font(font)
|
|
481
|
+
.fontSize(9)
|
|
482
|
+
.fillColor(COLORS.secondary)
|
|
483
|
+
.text(finding.description, LAYOUT.margin + 10, y, {
|
|
484
|
+
width: LAYOUT.contentWidth - 20,
|
|
485
|
+
});
|
|
486
|
+
y += doc.heightOfString(finding.description, {
|
|
487
|
+
width: LAYOUT.contentWidth - 20,
|
|
488
|
+
});
|
|
489
|
+
y += 12;
|
|
490
|
+
// Light separator between findings
|
|
491
|
+
doc
|
|
492
|
+
.strokeColor(COLORS.border)
|
|
493
|
+
.lineWidth(0.5)
|
|
494
|
+
.moveTo(LAYOUT.margin + 10, y)
|
|
495
|
+
.lineTo(LAYOUT.pageWidth - LAYOUT.margin - 10, y)
|
|
496
|
+
.stroke();
|
|
497
|
+
y += 10;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
// ---------------------------------------------------------------------------
|
|
501
|
+
// Section 4: Compliance Matrix
|
|
502
|
+
// 區段 4: 合規矩陣
|
|
503
|
+
// ---------------------------------------------------------------------------
|
|
504
|
+
/**
|
|
505
|
+
* Render the compliance matrix section
|
|
506
|
+
* 渲染合規矩陣區段
|
|
507
|
+
*/
|
|
508
|
+
function renderComplianceMatrix(doc, controls, lang, hasCjk) {
|
|
509
|
+
const isZh = lang === 'zh-TW';
|
|
510
|
+
const labels = getSectionLabels(lang);
|
|
511
|
+
const font = selectFont(hasCjk, 'body');
|
|
512
|
+
const headingFont = selectFont(hasCjk, 'heading');
|
|
513
|
+
let y = LAYOUT.margin;
|
|
514
|
+
// Section title
|
|
515
|
+
doc
|
|
516
|
+
.font(headingFont)
|
|
517
|
+
.fontSize(20)
|
|
518
|
+
.fillColor(COLORS.primary)
|
|
519
|
+
.text(labels.complianceOverview, LAYOUT.margin, y);
|
|
520
|
+
y += 35;
|
|
521
|
+
// Separator
|
|
522
|
+
doc
|
|
523
|
+
.strokeColor(COLORS.border)
|
|
524
|
+
.lineWidth(1)
|
|
525
|
+
.moveTo(LAYOUT.margin, y)
|
|
526
|
+
.lineTo(LAYOUT.pageWidth - LAYOUT.margin, y)
|
|
527
|
+
.stroke();
|
|
528
|
+
y += 15;
|
|
529
|
+
// Table header
|
|
530
|
+
const colWidths = {
|
|
531
|
+
id: 70,
|
|
532
|
+
title: 220,
|
|
533
|
+
status: 70,
|
|
534
|
+
findings: 135,
|
|
535
|
+
};
|
|
536
|
+
const headerLabels = isZh
|
|
537
|
+
? { id: '控制項 ID', title: '標題', status: '狀態', findings: '相關發現' }
|
|
538
|
+
: { id: 'Control ID', title: 'Title', status: 'Status', findings: 'Findings' };
|
|
539
|
+
// Header background
|
|
540
|
+
doc.rect(LAYOUT.margin, y, LAYOUT.contentWidth, 20).fill(COLORS.primary);
|
|
541
|
+
let headerX = LAYOUT.margin + 5;
|
|
542
|
+
doc.font(FONTS.body).fontSize(8).fillColor(COLORS.white);
|
|
543
|
+
doc.text(headerLabels.id, headerX, y + 5, { width: colWidths.id });
|
|
544
|
+
headerX += colWidths.id;
|
|
545
|
+
doc.text(headerLabels.title, headerX, y + 5, { width: colWidths.title });
|
|
546
|
+
headerX += colWidths.title;
|
|
547
|
+
doc.text(headerLabels.status, headerX, y + 5, { width: colWidths.status, align: 'center' });
|
|
548
|
+
headerX += colWidths.status;
|
|
549
|
+
doc.text(headerLabels.findings, headerX, y + 5, { width: colWidths.findings });
|
|
550
|
+
y += 22;
|
|
551
|
+
// Table rows
|
|
552
|
+
let rowIndex = 0;
|
|
553
|
+
for (const control of controls) {
|
|
554
|
+
y = ensureSpace(doc, y, 22);
|
|
555
|
+
// Alternating row background
|
|
556
|
+
if (rowIndex % 2 === 0) {
|
|
557
|
+
doc.rect(LAYOUT.margin, y, LAYOUT.contentWidth, 20).fill(COLORS.background);
|
|
558
|
+
}
|
|
559
|
+
let cellX = LAYOUT.margin + 5;
|
|
560
|
+
// Control ID
|
|
561
|
+
doc
|
|
562
|
+
.font(FONTS.mono)
|
|
563
|
+
.fontSize(7)
|
|
564
|
+
.fillColor(COLORS.text)
|
|
565
|
+
.text(control.controlId, cellX, y + 5, { width: colWidths.id });
|
|
566
|
+
cellX += colWidths.id;
|
|
567
|
+
// Title (use localized title)
|
|
568
|
+
const title = isZh ? control.titleZh : control.titleEn;
|
|
569
|
+
const truncatedTitle = title.length > 40 ? `${title.substring(0, 37)}...` : title;
|
|
570
|
+
doc
|
|
571
|
+
.font(font)
|
|
572
|
+
.fontSize(7)
|
|
573
|
+
.fillColor(COLORS.text)
|
|
574
|
+
.text(truncatedTitle, cellX, y + 5, { width: colWidths.title });
|
|
575
|
+
cellX += colWidths.title;
|
|
576
|
+
// Status badge
|
|
577
|
+
const sColor = statusColor(control.status);
|
|
578
|
+
const statusLabel = getStatusLabel(control.status, lang);
|
|
579
|
+
doc
|
|
580
|
+
.roundedRect(cellX + 10, y + 3, 50, 14, 2)
|
|
581
|
+
.fill(sColor);
|
|
582
|
+
doc
|
|
583
|
+
.font(FONTS.body)
|
|
584
|
+
.fontSize(7)
|
|
585
|
+
.fillColor(COLORS.white)
|
|
586
|
+
.text(statusLabel, cellX + 10, y + 5, { width: 50, align: 'center' });
|
|
587
|
+
cellX += colWidths.status;
|
|
588
|
+
// Related findings count
|
|
589
|
+
const findingCount = control.relatedFindings.length;
|
|
590
|
+
const findingText = findingCount === 0
|
|
591
|
+
? '-'
|
|
592
|
+
: `${findingCount} ${isZh ? '個' : findingCount === 1 ? 'finding' : 'findings'}`;
|
|
593
|
+
doc
|
|
594
|
+
.font(font)
|
|
595
|
+
.fontSize(7)
|
|
596
|
+
.fillColor(findingCount > 0 ? COLORS.fail : COLORS.lightText)
|
|
597
|
+
.text(findingText, cellX, y + 5, { width: colWidths.findings });
|
|
598
|
+
y += 20;
|
|
599
|
+
rowIndex += 1;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
// ---------------------------------------------------------------------------
|
|
603
|
+
// Page Footer
|
|
604
|
+
// 頁尾
|
|
605
|
+
// ---------------------------------------------------------------------------
|
|
606
|
+
/**
|
|
607
|
+
* Add a page footer with page number, brand name, and confidential watermark
|
|
608
|
+
* 新增包含頁碼、品牌名稱和機密浮水印的頁尾
|
|
609
|
+
*/
|
|
610
|
+
function addPageFooter(doc, pageNumber) {
|
|
611
|
+
const footerY = LAYOUT.pageHeight - LAYOUT.margin;
|
|
612
|
+
// Separator line
|
|
613
|
+
doc
|
|
614
|
+
.strokeColor(COLORS.border)
|
|
615
|
+
.lineWidth(0.5)
|
|
616
|
+
.moveTo(LAYOUT.margin, footerY - 10)
|
|
617
|
+
.lineTo(LAYOUT.pageWidth - LAYOUT.margin, footerY - 10)
|
|
618
|
+
.stroke();
|
|
619
|
+
// Brand name on left
|
|
620
|
+
doc
|
|
621
|
+
.font(FONTS.body)
|
|
622
|
+
.fontSize(7)
|
|
623
|
+
.fillColor(COLORS.lightText)
|
|
624
|
+
.text('Panguard AI', LAYOUT.margin, footerY - 4, {
|
|
625
|
+
width: LAYOUT.contentWidth / 3,
|
|
626
|
+
align: 'left',
|
|
627
|
+
});
|
|
628
|
+
// Confidential in center
|
|
629
|
+
doc
|
|
630
|
+
.font(FONTS.body)
|
|
631
|
+
.fontSize(7)
|
|
632
|
+
.fillColor(COLORS.watermark)
|
|
633
|
+
.text('Confidential', LAYOUT.margin + LAYOUT.contentWidth / 3, footerY - 4, {
|
|
634
|
+
width: LAYOUT.contentWidth / 3,
|
|
635
|
+
align: 'center',
|
|
636
|
+
});
|
|
637
|
+
// Page number on right
|
|
638
|
+
doc
|
|
639
|
+
.font(FONTS.body)
|
|
640
|
+
.fontSize(7)
|
|
641
|
+
.fillColor(COLORS.lightText)
|
|
642
|
+
.text(String(pageNumber), LAYOUT.margin + (LAYOUT.contentWidth * 2) / 3, footerY - 4, {
|
|
643
|
+
width: LAYOUT.contentWidth / 3,
|
|
644
|
+
align: 'right',
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
// ---------------------------------------------------------------------------
|
|
648
|
+
// Main Generator Function
|
|
649
|
+
// 主要產生器函式
|
|
650
|
+
// ---------------------------------------------------------------------------
|
|
651
|
+
/**
|
|
652
|
+
* Generate a complete PDF compliance report
|
|
653
|
+
* 產生完整的 PDF 合規報告
|
|
654
|
+
*
|
|
655
|
+
* Creates a multi-page PDF document with the following sections:
|
|
656
|
+
* 1. Cover page with report title, framework name, date
|
|
657
|
+
* 2. Executive summary with overall score, pass/fail counts
|
|
658
|
+
* 3. Findings table with severity badges, descriptions
|
|
659
|
+
* 4. Compliance matrix showing framework requirements vs results
|
|
660
|
+
* 5. Page footers with page numbers and "Confidential" watermark
|
|
661
|
+
*
|
|
662
|
+
* 建立多頁 PDF 文件,包含以下區段:
|
|
663
|
+
* 1. 封面頁(含報告標題、框架名稱、日期)
|
|
664
|
+
* 2. 執行摘要(含整體分數、通過/未通過計數)
|
|
665
|
+
* 3. 發現列表(含嚴重度標記、描述)
|
|
666
|
+
* 4. 合規矩陣(顯示框架要求與評估結果對照)
|
|
667
|
+
* 5. 頁尾(含頁碼和「機密」浮水印)
|
|
668
|
+
*
|
|
669
|
+
* @param options - PDF report generation options / PDF 報告產生選項
|
|
670
|
+
* @returns Path to the generated PDF file / 產生的 PDF 檔案路徑
|
|
671
|
+
*/
|
|
672
|
+
export async function generatePDFReport(options) {
|
|
673
|
+
logger.info('Starting PDF compliance report generation', {
|
|
674
|
+
outputPath: options.outputPath,
|
|
675
|
+
lang: options.lang,
|
|
676
|
+
framework: options.framework,
|
|
677
|
+
});
|
|
678
|
+
// Ensure output directory exists
|
|
679
|
+
const outputDir = dirname(options.outputPath);
|
|
680
|
+
await mkdir(outputDir, { recursive: true });
|
|
681
|
+
// Build or use provided assessment result
|
|
682
|
+
const reportData = options.assessmentResult ?? buildReportData(options);
|
|
683
|
+
// Create PDF document
|
|
684
|
+
const doc = new PDFDocument({
|
|
685
|
+
size: 'A4',
|
|
686
|
+
margins: {
|
|
687
|
+
top: LAYOUT.margin,
|
|
688
|
+
bottom: LAYOUT.margin,
|
|
689
|
+
left: LAYOUT.margin,
|
|
690
|
+
right: LAYOUT.margin,
|
|
691
|
+
},
|
|
692
|
+
info: {
|
|
693
|
+
Title: options.title,
|
|
694
|
+
Author: 'Panguard AI',
|
|
695
|
+
Creator: 'PanguardReport PDF Generator',
|
|
696
|
+
Producer: 'PDFKit',
|
|
697
|
+
},
|
|
698
|
+
autoFirstPage: true,
|
|
699
|
+
bufferPages: true,
|
|
700
|
+
compress: options.compress ?? true,
|
|
701
|
+
});
|
|
702
|
+
// Register CJK font for zh-TW
|
|
703
|
+
let hasCjkFont = false;
|
|
704
|
+
if (options.lang === 'zh-TW') {
|
|
705
|
+
hasCjkFont = await registerCjkFont(doc);
|
|
706
|
+
if (hasCjkFont) {
|
|
707
|
+
logger.info('CJK font available; Chinese text should render correctly');
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
logger.warn('CJK font not available; falling back to Helvetica. ' +
|
|
711
|
+
'Chinese characters will not render correctly but the report will not crash.');
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
// Pipe to output file
|
|
715
|
+
const writeStream = createWriteStream(options.outputPath);
|
|
716
|
+
doc.pipe(writeStream);
|
|
717
|
+
// -- Section 1: Cover page --
|
|
718
|
+
logger.info('Rendering cover page');
|
|
719
|
+
renderCoverPage(doc, options, hasCjkFont);
|
|
720
|
+
// -- Section 2: Executive summary --
|
|
721
|
+
logger.info('Rendering executive summary');
|
|
722
|
+
doc.addPage();
|
|
723
|
+
renderExecutiveSummary(doc, reportData, options.lang, hasCjkFont);
|
|
724
|
+
// -- Section 3: Findings table --
|
|
725
|
+
logger.info('Rendering findings table');
|
|
726
|
+
doc.addPage();
|
|
727
|
+
renderFindingsTable(doc, reportData.findings, options.lang, hasCjkFont);
|
|
728
|
+
// -- Section 4: Compliance matrix --
|
|
729
|
+
logger.info('Rendering compliance matrix');
|
|
730
|
+
doc.addPage();
|
|
731
|
+
renderComplianceMatrix(doc, reportData.controls, options.lang, hasCjkFont);
|
|
732
|
+
// -- Add page footers to all pages --
|
|
733
|
+
const pageRange = doc.bufferedPageRange();
|
|
734
|
+
for (let i = pageRange.start; i < pageRange.start + pageRange.count; i++) {
|
|
735
|
+
doc.switchToPage(i);
|
|
736
|
+
addPageFooter(doc, i + 1);
|
|
737
|
+
}
|
|
738
|
+
// Finalize the document
|
|
739
|
+
doc.end();
|
|
740
|
+
// Return a promise that resolves when the write stream finishes
|
|
741
|
+
return new Promise((resolve, reject) => {
|
|
742
|
+
writeStream.on('finish', () => {
|
|
743
|
+
logger.info('PDF compliance report generated successfully', {
|
|
744
|
+
outputPath: options.outputPath,
|
|
745
|
+
});
|
|
746
|
+
resolve(options.outputPath);
|
|
747
|
+
});
|
|
748
|
+
writeStream.on('error', (err) => {
|
|
749
|
+
logger.error('Failed to write PDF compliance report', {
|
|
750
|
+
outputPath: options.outputPath,
|
|
751
|
+
error: err.message,
|
|
752
|
+
});
|
|
753
|
+
reject(new Error(`Failed to write PDF report to ${options.outputPath}: ${err.message}`));
|
|
754
|
+
});
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
// ---------------------------------------------------------------------------
|
|
758
|
+
// Internal: Build report data from options
|
|
759
|
+
// 內部: 從選項建構報告資料
|
|
760
|
+
// ---------------------------------------------------------------------------
|
|
761
|
+
/**
|
|
762
|
+
* Build a ComplianceReportData from the provided options when no
|
|
763
|
+
* pre-computed assessmentResult is given.
|
|
764
|
+
* 當未提供預先計算的 assessmentResult 時,從選項建構 ComplianceReportData。
|
|
765
|
+
*/
|
|
766
|
+
function buildReportData(options) {
|
|
767
|
+
const framework = options.framework;
|
|
768
|
+
const controls = getFrameworkControls(framework);
|
|
769
|
+
const evaluatedControls = evaluateControls(controls, options.findings);
|
|
770
|
+
const executiveSummary = generateExecutiveSummary(evaluatedControls, options.findings, options.lang);
|
|
771
|
+
const statistics = generateStatistics(evaluatedControls, options.findings);
|
|
772
|
+
const recommendations = generateRecommendations(evaluatedControls, options.lang);
|
|
773
|
+
const now = new Date();
|
|
774
|
+
return {
|
|
775
|
+
metadata: {
|
|
776
|
+
reportId: `RPT-PDF-${now.getTime()}`,
|
|
777
|
+
type: 'compliance',
|
|
778
|
+
framework,
|
|
779
|
+
language: options.lang,
|
|
780
|
+
period: {
|
|
781
|
+
start: new Date(now.getFullYear(), now.getMonth(), 1),
|
|
782
|
+
end: now,
|
|
783
|
+
},
|
|
784
|
+
generatedAt: now,
|
|
785
|
+
organizationName: options.organizationName,
|
|
786
|
+
version: '1.0.0',
|
|
787
|
+
},
|
|
788
|
+
executiveSummary,
|
|
789
|
+
controls: evaluatedControls,
|
|
790
|
+
findings: options.findings,
|
|
791
|
+
statistics,
|
|
792
|
+
recommendations,
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
//# sourceMappingURL=pdf-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-generator.js","sourceRoot":"","sources":["../../src/generator/pdf-generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,13 +9,14 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module @panguard-ai/panguard-report
|
|
11
11
|
*/
|
|
12
|
-
export declare const PANGUARD_REPORT_VERSION
|
|
12
|
+
export declare const PANGUARD_REPORT_VERSION: string;
|
|
13
13
|
export declare const CLAWREPORT_NAME = "PanguardReport";
|
|
14
14
|
export type { ComplianceFramework, ControlStatus, ComplianceControl, EvaluatedControl, ComplianceFinding, ReportType, ReportFormat, ReportLanguage, ReportMetadata, ComplianceReportData, ExecutiveSummary, ComplianceStatistics, ReportRecommendation, ReportConfig, } from './types.js';
|
|
15
15
|
export { DEFAULT_REPORT_CONFIG } from './types.js';
|
|
16
16
|
export { getFrameworkControls, getFrameworkName, getSupportedFrameworks, TW_CYBER_SECURITY_CONTROLS, ISO27001_CONTROLS, SOC2_CONTROLS, } from './frameworks/index.js';
|
|
17
17
|
export { evaluateControls, generateExecutiveSummary, generateStatistics, generateRecommendations, } from './mapper/index.js';
|
|
18
|
-
export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './generator/index.js';
|
|
18
|
+
export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, generatePDFReport, } from './generator/index.js';
|
|
19
|
+
export type { PDFReportOptions } from './generator/index.js';
|
|
19
20
|
export { assessAccessControl, assessFirewallAndNetwork, assessEncryption, assessMonitoring, assessPatching, assessIncidentResponse, runAssessment, runFullAssessment, } from './assessors/index.js';
|
|
20
21
|
export { getSectionLabels, getStatusLabel, getSeverityLabel, getPriorityLabel, getFrameworkDescription, } from './templates/index.js';
|
|
21
22
|
export type { ReportSectionLabels, FrameworkDescription } from './templates/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,eAAO,MAAM,uBAAuB,EAAE,MAAqB,CAAC;AAC5D,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAGhD,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,10 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module @panguard-ai/panguard-report
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
import { createRequire } from 'node:module';
|
|
13
|
+
const _require = createRequire(import.meta.url);
|
|
14
|
+
const _pkg = _require('../package.json');
|
|
15
|
+
export const PANGUARD_REPORT_VERSION = _pkg.version;
|
|
13
16
|
export const CLAWREPORT_NAME = 'PanguardReport';
|
|
14
17
|
export { DEFAULT_REPORT_CONFIG } from './types.js';
|
|
15
18
|
// Frameworks
|
|
@@ -17,7 +20,7 @@ export { getFrameworkControls, getFrameworkName, getSupportedFrameworks, TW_CYBE
|
|
|
17
20
|
// Mapper
|
|
18
21
|
export { evaluateControls, generateExecutiveSummary, generateStatistics, generateRecommendations, } from './mapper/index.js';
|
|
19
22
|
// Generator
|
|
20
|
-
export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './generator/index.js';
|
|
23
|
+
export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, generatePDFReport, } from './generator/index.js';
|
|
21
24
|
// Assessors
|
|
22
25
|
export { assessAccessControl, assessFirewallAndNetwork, assessEncryption, assessMonitoring, assessPatching, assessIncidentResponse, runAssessment, runFullAssessment, } from './assessors/index.js';
|
|
23
26
|
// Templates
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,iBAAiB,CAAwB,CAAC;AAEhE,MAAM,CAAC,MAAM,uBAAuB,GAAW,IAAI,CAAC,OAAO,CAAC;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAmBhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,aAAa;AACb,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACZ,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,YAAY;AACZ,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,MAAM;AACN,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,26 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@panguard-ai/panguard-report",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"license": "MIT",
|
|
4
5
|
"type": "module",
|
|
5
6
|
"description": "AI-powered security incident report generator / AI 自動產生資安事件報告",
|
|
6
7
|
"main": "./dist/index.js",
|
|
7
8
|
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
8
15
|
"bin": {
|
|
9
16
|
"panguard-report": "./dist/cli/index.js"
|
|
10
17
|
},
|
|
11
18
|
"publishConfig": {
|
|
12
19
|
"access": "public"
|
|
13
20
|
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18.0.0"
|
|
23
|
+
},
|
|
14
24
|
"files": [
|
|
15
25
|
"dist",
|
|
16
26
|
"package.json",
|
|
17
27
|
"README.md"
|
|
18
28
|
],
|
|
19
29
|
"dependencies": {
|
|
20
|
-
"
|
|
30
|
+
"pdfkit": "^0.15.0",
|
|
31
|
+
"@panguard-ai/core": "0.3.2"
|
|
21
32
|
},
|
|
22
33
|
"devDependencies": {
|
|
23
34
|
"@types/node": "^22.14.0",
|
|
35
|
+
"@types/pdfkit": "^0.13.9",
|
|
24
36
|
"typescript": "~5.7.3"
|
|
25
37
|
},
|
|
26
38
|
"scripts": {
|