@pactosigna/records 0.1.6 → 0.1.7
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.js +177 -2
- package/dist/generate.d.ts.map +1 -1
- package/dist/generators/cer-generator.d.ts +10 -0
- package/dist/generators/cer-generator.d.ts.map +1 -0
- package/dist/generators/csf-generator.d.ts +10 -0
- package/dist/generators/csf-generator.d.ts.map +1 -0
- package/dist/generators/uef-generator.d.ts +15 -0
- package/dist/generators/uef-generator.d.ts.map +1 -0
- package/dist/generators/vv-generator.d.ts +10 -0
- package/dist/generators/vv-generator.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +169 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -3212,7 +3212,18 @@ var DocumentSignoffStatusResponseSchema = z33.object({
|
|
|
3212
3212
|
var DocumentExportResponseSchema = z33.object({
|
|
3213
3213
|
message: z33.string()
|
|
3214
3214
|
});
|
|
3215
|
-
var CompiledDocumentPresetSchema = z43.enum([
|
|
3215
|
+
var CompiledDocumentPresetSchema = z43.enum([
|
|
3216
|
+
"srs",
|
|
3217
|
+
"prs",
|
|
3218
|
+
"dmr",
|
|
3219
|
+
"risk",
|
|
3220
|
+
"hld",
|
|
3221
|
+
"sdd",
|
|
3222
|
+
"vv",
|
|
3223
|
+
"uef",
|
|
3224
|
+
"csf",
|
|
3225
|
+
"cer"
|
|
3226
|
+
]);
|
|
3216
3227
|
var CompiledDocumentQuerySchema = z43.object({
|
|
3217
3228
|
organizationId: z43.string().min(1),
|
|
3218
3229
|
repositoryId: z43.string().min(1).optional(),
|
|
@@ -5351,6 +5362,166 @@ function generateSdd(input) {
|
|
|
5351
5362
|
});
|
|
5352
5363
|
}
|
|
5353
5364
|
|
|
5365
|
+
// src/generators/vv-generator.ts
|
|
5366
|
+
function generateVv(input) {
|
|
5367
|
+
const protocols = readDocuments(input.rootDir, "docs/test/protocols");
|
|
5368
|
+
const reports = readDocuments(input.rootDir, "docs/test/reports");
|
|
5369
|
+
const plans = readDocuments(input.rootDir, "docs/software/plans").filter(
|
|
5370
|
+
(d) => d.frontmatter.id.startsWith("STP-")
|
|
5371
|
+
);
|
|
5372
|
+
const docs = [...plans, ...protocols, ...reports];
|
|
5373
|
+
if (docs.length === 0) {
|
|
5374
|
+
console.warn("VV: no approved/effective V&V documents found \u2014 skipping");
|
|
5375
|
+
return null;
|
|
5376
|
+
}
|
|
5377
|
+
const content = [];
|
|
5378
|
+
content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
|
|
5379
|
+
content.push({
|
|
5380
|
+
ol: docs.map((d) => ({
|
|
5381
|
+
text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
|
|
5382
|
+
margin: [0, 2, 0, 2]
|
|
5383
|
+
}))
|
|
5384
|
+
});
|
|
5385
|
+
content.push({ text: "", pageBreak: "after" });
|
|
5386
|
+
for (const doc of docs) {
|
|
5387
|
+
content.push({
|
|
5388
|
+
text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
|
|
5389
|
+
style: "h2",
|
|
5390
|
+
margin: [0, 10, 0, 6]
|
|
5391
|
+
});
|
|
5392
|
+
content.push(...markdownToPdfmake(doc.body));
|
|
5393
|
+
content.push({ text: "", margin: [0, 20, 0, 0] });
|
|
5394
|
+
}
|
|
5395
|
+
return buildDocumentDefinition({
|
|
5396
|
+
config: input.config,
|
|
5397
|
+
rootDir: input.rootDir,
|
|
5398
|
+
recordTitle: "Verification & Validation",
|
|
5399
|
+
recordId: "VV",
|
|
5400
|
+
version: input.version,
|
|
5401
|
+
date: input.date,
|
|
5402
|
+
revisionHistory: input.revisionHistory,
|
|
5403
|
+
content
|
|
5404
|
+
});
|
|
5405
|
+
}
|
|
5406
|
+
|
|
5407
|
+
// src/generators/uef-generator.ts
|
|
5408
|
+
function generateUef(input) {
|
|
5409
|
+
const plans = readDocuments(input.rootDir, "docs/usability");
|
|
5410
|
+
const useSpecs = readDocuments(input.rootDir, "docs/usability/use-specifications");
|
|
5411
|
+
const taskAnalyses = readDocuments(input.rootDir, "docs/usability/task-analyses");
|
|
5412
|
+
const evaluations = readDocuments(input.rootDir, "docs/usability/evaluations");
|
|
5413
|
+
const docs = [...plans, ...useSpecs, ...taskAnalyses, ...evaluations];
|
|
5414
|
+
if (docs.length === 0) {
|
|
5415
|
+
console.warn("UEF: no approved/effective usability documents found \u2014 skipping");
|
|
5416
|
+
return null;
|
|
5417
|
+
}
|
|
5418
|
+
const content = [];
|
|
5419
|
+
content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
|
|
5420
|
+
content.push({
|
|
5421
|
+
ol: docs.map((d) => ({
|
|
5422
|
+
text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
|
|
5423
|
+
margin: [0, 2, 0, 2]
|
|
5424
|
+
}))
|
|
5425
|
+
});
|
|
5426
|
+
content.push({ text: "", pageBreak: "after" });
|
|
5427
|
+
for (const doc of docs) {
|
|
5428
|
+
content.push({
|
|
5429
|
+
text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
|
|
5430
|
+
style: "h2",
|
|
5431
|
+
margin: [0, 10, 0, 6]
|
|
5432
|
+
});
|
|
5433
|
+
content.push(...markdownToPdfmake(doc.body));
|
|
5434
|
+
content.push({ text: "", margin: [0, 20, 0, 0] });
|
|
5435
|
+
}
|
|
5436
|
+
return buildDocumentDefinition({
|
|
5437
|
+
config: input.config,
|
|
5438
|
+
rootDir: input.rootDir,
|
|
5439
|
+
recordTitle: "Usability Engineering File",
|
|
5440
|
+
recordId: "UEF",
|
|
5441
|
+
version: input.version,
|
|
5442
|
+
date: input.date,
|
|
5443
|
+
revisionHistory: input.revisionHistory,
|
|
5444
|
+
content
|
|
5445
|
+
});
|
|
5446
|
+
}
|
|
5447
|
+
|
|
5448
|
+
// src/generators/csf-generator.ts
|
|
5449
|
+
function generateCsf(input) {
|
|
5450
|
+
const plans = readDocuments(input.rootDir, "docs/cybersecurity/plans");
|
|
5451
|
+
const risks = readDocuments(input.rootDir, "docs/cybersecurity/risks");
|
|
5452
|
+
const sboms = readDocuments(input.rootDir, "docs/cybersecurity/sbom");
|
|
5453
|
+
const docs = [...plans, ...risks, ...sboms];
|
|
5454
|
+
if (docs.length === 0) {
|
|
5455
|
+
console.warn("CSF: no approved/effective cybersecurity documents found \u2014 skipping");
|
|
5456
|
+
return null;
|
|
5457
|
+
}
|
|
5458
|
+
const content = [];
|
|
5459
|
+
content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
|
|
5460
|
+
content.push({
|
|
5461
|
+
ol: docs.map((d) => ({
|
|
5462
|
+
text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
|
|
5463
|
+
margin: [0, 2, 0, 2]
|
|
5464
|
+
}))
|
|
5465
|
+
});
|
|
5466
|
+
content.push({ text: "", pageBreak: "after" });
|
|
5467
|
+
for (const doc of docs) {
|
|
5468
|
+
content.push({
|
|
5469
|
+
text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
|
|
5470
|
+
style: "h2",
|
|
5471
|
+
margin: [0, 10, 0, 6]
|
|
5472
|
+
});
|
|
5473
|
+
content.push(...markdownToPdfmake(doc.body));
|
|
5474
|
+
content.push({ text: "", margin: [0, 20, 0, 0] });
|
|
5475
|
+
}
|
|
5476
|
+
return buildDocumentDefinition({
|
|
5477
|
+
config: input.config,
|
|
5478
|
+
rootDir: input.rootDir,
|
|
5479
|
+
recordTitle: "Cybersecurity File",
|
|
5480
|
+
recordId: "CSF",
|
|
5481
|
+
version: input.version,
|
|
5482
|
+
date: input.date,
|
|
5483
|
+
revisionHistory: input.revisionHistory,
|
|
5484
|
+
content
|
|
5485
|
+
});
|
|
5486
|
+
}
|
|
5487
|
+
|
|
5488
|
+
// src/generators/cer-generator.ts
|
|
5489
|
+
function generateCer(input) {
|
|
5490
|
+
const docs = readDocuments(input.rootDir, "docs/clinical");
|
|
5491
|
+
if (docs.length === 0) {
|
|
5492
|
+
console.warn("CER: no approved/effective clinical documents found \u2014 skipping");
|
|
5493
|
+
return null;
|
|
5494
|
+
}
|
|
5495
|
+
const content = [];
|
|
5496
|
+
content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
|
|
5497
|
+
content.push({
|
|
5498
|
+
ol: docs.map((d) => ({
|
|
5499
|
+
text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
|
|
5500
|
+
margin: [0, 2, 0, 2]
|
|
5501
|
+
}))
|
|
5502
|
+
});
|
|
5503
|
+
content.push({ text: "", pageBreak: "after" });
|
|
5504
|
+
for (const doc of docs) {
|
|
5505
|
+
content.push({
|
|
5506
|
+
text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
|
|
5507
|
+
style: "h2",
|
|
5508
|
+
margin: [0, 10, 0, 6]
|
|
5509
|
+
});
|
|
5510
|
+
content.push(...markdownToPdfmake(doc.body));
|
|
5511
|
+
content.push({ text: "", margin: [0, 20, 0, 0] });
|
|
5512
|
+
}
|
|
5513
|
+
return buildDocumentDefinition({
|
|
5514
|
+
config: input.config,
|
|
5515
|
+
rootDir: input.rootDir,
|
|
5516
|
+
recordTitle: "Clinical Evaluation Report",
|
|
5517
|
+
recordId: "CER",
|
|
5518
|
+
version: input.version,
|
|
5519
|
+
date: input.date,
|
|
5520
|
+
revisionHistory: input.revisionHistory,
|
|
5521
|
+
content
|
|
5522
|
+
});
|
|
5523
|
+
}
|
|
5524
|
+
|
|
5354
5525
|
// src/github/changelog.ts
|
|
5355
5526
|
import { execFileSync } from "child_process";
|
|
5356
5527
|
import { resolve as resolve5 } from "path";
|
|
@@ -5409,7 +5580,11 @@ var RECORD_GENERATORS = [
|
|
|
5409
5580
|
{ name: "ARC-Software-Architecture-Description", fn: generateArc },
|
|
5410
5581
|
{ name: "SDD-Software-Detailed-Design", fn: generateSdd },
|
|
5411
5582
|
{ name: "PTA-Product-Traceability-Analysis", fn: generatePta },
|
|
5412
|
-
{ name: "RMR-Risk-Management-Report", fn: generateRmr }
|
|
5583
|
+
{ name: "RMR-Risk-Management-Report", fn: generateRmr },
|
|
5584
|
+
{ name: "VV-Verification-And-Validation", fn: generateVv },
|
|
5585
|
+
{ name: "UEF-Usability-Engineering-File", fn: generateUef },
|
|
5586
|
+
{ name: "CSF-Cybersecurity-File", fn: generateCsf },
|
|
5587
|
+
{ name: "CER-Clinical-Evaluation-Report", fn: generateCer }
|
|
5413
5588
|
];
|
|
5414
5589
|
var noopUrlResolver = {
|
|
5415
5590
|
resolve: () => {
|
package/dist/generate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsCD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA8C1E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TDocumentDefinitions } from 'pdfmake/interfaces.js';
|
|
2
|
+
import type { GeneratorInput } from './urs-generator.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a Clinical Evaluation Report (CER) compiled PDF.
|
|
5
|
+
*
|
|
6
|
+
* Reads clinical evaluation plans and reports.
|
|
7
|
+
* Regulatory basis: MDR Annex XIV
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateCer(input: GeneratorInput): TDocumentDefinitions | null;
|
|
10
|
+
//# sourceMappingURL=cer-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cer-generator.d.ts","sourceRoot":"","sources":["../../src/generators/cer-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,IAAI,CAyC9E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TDocumentDefinitions } from 'pdfmake/interfaces.js';
|
|
2
|
+
import type { GeneratorInput } from './urs-generator.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a Cybersecurity File (CSF) compiled PDF.
|
|
5
|
+
*
|
|
6
|
+
* Reads cybersecurity plans, SBOMs, and security risk documents.
|
|
7
|
+
* Regulatory basis: IEC 81001-5-1
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateCsf(input: GeneratorInput): TDocumentDefinitions | null;
|
|
10
|
+
//# sourceMappingURL=csf-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csf-generator.d.ts","sourceRoot":"","sources":["../../src/generators/csf-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,IAAI,CA8C9E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TDocumentDefinitions } from 'pdfmake/interfaces.js';
|
|
2
|
+
import type { GeneratorInput } from './urs-generator.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a Usability Engineering File (UEF) compiled PDF.
|
|
5
|
+
*
|
|
6
|
+
* Reads usability plans, use specifications, task analyses, and evaluations.
|
|
7
|
+
* Regulatory basis: IEC 62366
|
|
8
|
+
*
|
|
9
|
+
* Note: docs/usability/risks (usability_risk type) is intentionally excluded.
|
|
10
|
+
* Per ISO 14971, usability-related risks belong in the Risk Management File (RMF/RMR),
|
|
11
|
+
* not the Usability Engineering File. IEC 62366 §5.9 references risk analysis but
|
|
12
|
+
* delegates the actual risk documentation to ISO 14971.
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateUef(input: GeneratorInput): TDocumentDefinitions | null;
|
|
15
|
+
//# sourceMappingURL=uef-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uef-generator.d.ts","sourceRoot":"","sources":["../../src/generators/uef-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,IAAI,CA6C9E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TDocumentDefinitions } from 'pdfmake/interfaces.js';
|
|
2
|
+
import type { GeneratorInput } from './urs-generator.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a Verification & Validation (V&V) compiled PDF.
|
|
5
|
+
*
|
|
6
|
+
* Reads test protocols, test reports, and software test plans.
|
|
7
|
+
* Regulatory basis: IEC 62304 Section 5.7
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateVv(input: GeneratorInput): TDocumentDefinitions | null;
|
|
10
|
+
//# sourceMappingURL=vv-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vv-generator.d.ts","sourceRoot":"","sources":["../../src/generators/vv-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,GAAG,IAAI,CA8C7E"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,10 @@ export { generatePrs } from './generators/prs-generator.js';
|
|
|
6
6
|
export { generateSrs } from './generators/srs-generator.js';
|
|
7
7
|
export { generatePta, buildTraceabilityMatrix } from './generators/pta-generator.js';
|
|
8
8
|
export { generateRmr, buildRiskGraph } from './generators/rmr-generator.js';
|
|
9
|
+
export { generateVv } from './generators/vv-generator.js';
|
|
10
|
+
export { generateUef } from './generators/uef-generator.js';
|
|
11
|
+
export { generateCsf } from './generators/csf-generator.js';
|
|
12
|
+
export { generateCer } from './generators/cer-generator.js';
|
|
9
13
|
export { loadConfig, RecordsConfigSchema } from './config.js';
|
|
10
14
|
export type { RecordsConfig } from './config.js';
|
|
11
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1193,6 +1193,166 @@ function generateSdd(input) {
|
|
|
1193
1193
|
});
|
|
1194
1194
|
}
|
|
1195
1195
|
|
|
1196
|
+
// src/generators/vv-generator.ts
|
|
1197
|
+
function generateVv(input) {
|
|
1198
|
+
const protocols = readDocuments(input.rootDir, "docs/test/protocols");
|
|
1199
|
+
const reports = readDocuments(input.rootDir, "docs/test/reports");
|
|
1200
|
+
const plans = readDocuments(input.rootDir, "docs/software/plans").filter(
|
|
1201
|
+
(d) => d.frontmatter.id.startsWith("STP-")
|
|
1202
|
+
);
|
|
1203
|
+
const docs = [...plans, ...protocols, ...reports];
|
|
1204
|
+
if (docs.length === 0) {
|
|
1205
|
+
console.warn("VV: no approved/effective V&V documents found \u2014 skipping");
|
|
1206
|
+
return null;
|
|
1207
|
+
}
|
|
1208
|
+
const content = [];
|
|
1209
|
+
content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
|
|
1210
|
+
content.push({
|
|
1211
|
+
ol: docs.map((d) => ({
|
|
1212
|
+
text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
|
|
1213
|
+
margin: [0, 2, 0, 2]
|
|
1214
|
+
}))
|
|
1215
|
+
});
|
|
1216
|
+
content.push({ text: "", pageBreak: "after" });
|
|
1217
|
+
for (const doc of docs) {
|
|
1218
|
+
content.push({
|
|
1219
|
+
text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
|
|
1220
|
+
style: "h2",
|
|
1221
|
+
margin: [0, 10, 0, 6]
|
|
1222
|
+
});
|
|
1223
|
+
content.push(...markdownToPdfmake(doc.body));
|
|
1224
|
+
content.push({ text: "", margin: [0, 20, 0, 0] });
|
|
1225
|
+
}
|
|
1226
|
+
return buildDocumentDefinition({
|
|
1227
|
+
config: input.config,
|
|
1228
|
+
rootDir: input.rootDir,
|
|
1229
|
+
recordTitle: "Verification & Validation",
|
|
1230
|
+
recordId: "VV",
|
|
1231
|
+
version: input.version,
|
|
1232
|
+
date: input.date,
|
|
1233
|
+
revisionHistory: input.revisionHistory,
|
|
1234
|
+
content
|
|
1235
|
+
});
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
// src/generators/uef-generator.ts
|
|
1239
|
+
function generateUef(input) {
|
|
1240
|
+
const plans = readDocuments(input.rootDir, "docs/usability");
|
|
1241
|
+
const useSpecs = readDocuments(input.rootDir, "docs/usability/use-specifications");
|
|
1242
|
+
const taskAnalyses = readDocuments(input.rootDir, "docs/usability/task-analyses");
|
|
1243
|
+
const evaluations = readDocuments(input.rootDir, "docs/usability/evaluations");
|
|
1244
|
+
const docs = [...plans, ...useSpecs, ...taskAnalyses, ...evaluations];
|
|
1245
|
+
if (docs.length === 0) {
|
|
1246
|
+
console.warn("UEF: no approved/effective usability documents found \u2014 skipping");
|
|
1247
|
+
return null;
|
|
1248
|
+
}
|
|
1249
|
+
const content = [];
|
|
1250
|
+
content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
|
|
1251
|
+
content.push({
|
|
1252
|
+
ol: docs.map((d) => ({
|
|
1253
|
+
text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
|
|
1254
|
+
margin: [0, 2, 0, 2]
|
|
1255
|
+
}))
|
|
1256
|
+
});
|
|
1257
|
+
content.push({ text: "", pageBreak: "after" });
|
|
1258
|
+
for (const doc of docs) {
|
|
1259
|
+
content.push({
|
|
1260
|
+
text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
|
|
1261
|
+
style: "h2",
|
|
1262
|
+
margin: [0, 10, 0, 6]
|
|
1263
|
+
});
|
|
1264
|
+
content.push(...markdownToPdfmake(doc.body));
|
|
1265
|
+
content.push({ text: "", margin: [0, 20, 0, 0] });
|
|
1266
|
+
}
|
|
1267
|
+
return buildDocumentDefinition({
|
|
1268
|
+
config: input.config,
|
|
1269
|
+
rootDir: input.rootDir,
|
|
1270
|
+
recordTitle: "Usability Engineering File",
|
|
1271
|
+
recordId: "UEF",
|
|
1272
|
+
version: input.version,
|
|
1273
|
+
date: input.date,
|
|
1274
|
+
revisionHistory: input.revisionHistory,
|
|
1275
|
+
content
|
|
1276
|
+
});
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
// src/generators/csf-generator.ts
|
|
1280
|
+
function generateCsf(input) {
|
|
1281
|
+
const plans = readDocuments(input.rootDir, "docs/cybersecurity/plans");
|
|
1282
|
+
const risks = readDocuments(input.rootDir, "docs/cybersecurity/risks");
|
|
1283
|
+
const sboms = readDocuments(input.rootDir, "docs/cybersecurity/sbom");
|
|
1284
|
+
const docs = [...plans, ...risks, ...sboms];
|
|
1285
|
+
if (docs.length === 0) {
|
|
1286
|
+
console.warn("CSF: no approved/effective cybersecurity documents found \u2014 skipping");
|
|
1287
|
+
return null;
|
|
1288
|
+
}
|
|
1289
|
+
const content = [];
|
|
1290
|
+
content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
|
|
1291
|
+
content.push({
|
|
1292
|
+
ol: docs.map((d) => ({
|
|
1293
|
+
text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
|
|
1294
|
+
margin: [0, 2, 0, 2]
|
|
1295
|
+
}))
|
|
1296
|
+
});
|
|
1297
|
+
content.push({ text: "", pageBreak: "after" });
|
|
1298
|
+
for (const doc of docs) {
|
|
1299
|
+
content.push({
|
|
1300
|
+
text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
|
|
1301
|
+
style: "h2",
|
|
1302
|
+
margin: [0, 10, 0, 6]
|
|
1303
|
+
});
|
|
1304
|
+
content.push(...markdownToPdfmake(doc.body));
|
|
1305
|
+
content.push({ text: "", margin: [0, 20, 0, 0] });
|
|
1306
|
+
}
|
|
1307
|
+
return buildDocumentDefinition({
|
|
1308
|
+
config: input.config,
|
|
1309
|
+
rootDir: input.rootDir,
|
|
1310
|
+
recordTitle: "Cybersecurity File",
|
|
1311
|
+
recordId: "CSF",
|
|
1312
|
+
version: input.version,
|
|
1313
|
+
date: input.date,
|
|
1314
|
+
revisionHistory: input.revisionHistory,
|
|
1315
|
+
content
|
|
1316
|
+
});
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
// src/generators/cer-generator.ts
|
|
1320
|
+
function generateCer(input) {
|
|
1321
|
+
const docs = readDocuments(input.rootDir, "docs/clinical");
|
|
1322
|
+
if (docs.length === 0) {
|
|
1323
|
+
console.warn("CER: no approved/effective clinical documents found \u2014 skipping");
|
|
1324
|
+
return null;
|
|
1325
|
+
}
|
|
1326
|
+
const content = [];
|
|
1327
|
+
content.push({ text: "Table of Contents", style: "h2", margin: [0, 0, 0, 10] });
|
|
1328
|
+
content.push({
|
|
1329
|
+
ol: docs.map((d) => ({
|
|
1330
|
+
text: `${d.frontmatter.id}: ${d.frontmatter.title}`,
|
|
1331
|
+
margin: [0, 2, 0, 2]
|
|
1332
|
+
}))
|
|
1333
|
+
});
|
|
1334
|
+
content.push({ text: "", pageBreak: "after" });
|
|
1335
|
+
for (const doc of docs) {
|
|
1336
|
+
content.push({
|
|
1337
|
+
text: `${doc.frontmatter.id}: ${doc.frontmatter.title}`,
|
|
1338
|
+
style: "h2",
|
|
1339
|
+
margin: [0, 10, 0, 6]
|
|
1340
|
+
});
|
|
1341
|
+
content.push(...markdownToPdfmake(doc.body));
|
|
1342
|
+
content.push({ text: "", margin: [0, 20, 0, 0] });
|
|
1343
|
+
}
|
|
1344
|
+
return buildDocumentDefinition({
|
|
1345
|
+
config: input.config,
|
|
1346
|
+
rootDir: input.rootDir,
|
|
1347
|
+
recordTitle: "Clinical Evaluation Report",
|
|
1348
|
+
recordId: "CER",
|
|
1349
|
+
version: input.version,
|
|
1350
|
+
date: input.date,
|
|
1351
|
+
revisionHistory: input.revisionHistory,
|
|
1352
|
+
content
|
|
1353
|
+
});
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1196
1356
|
// src/github/changelog.ts
|
|
1197
1357
|
import { execFileSync } from "child_process";
|
|
1198
1358
|
import { resolve as resolve5 } from "path";
|
|
@@ -1251,7 +1411,11 @@ var RECORD_GENERATORS = [
|
|
|
1251
1411
|
{ name: "ARC-Software-Architecture-Description", fn: generateArc },
|
|
1252
1412
|
{ name: "SDD-Software-Detailed-Design", fn: generateSdd },
|
|
1253
1413
|
{ name: "PTA-Product-Traceability-Analysis", fn: generatePta },
|
|
1254
|
-
{ name: "RMR-Risk-Management-Report", fn: generateRmr }
|
|
1414
|
+
{ name: "RMR-Risk-Management-Report", fn: generateRmr },
|
|
1415
|
+
{ name: "VV-Verification-And-Validation", fn: generateVv },
|
|
1416
|
+
{ name: "UEF-Usability-Engineering-File", fn: generateUef },
|
|
1417
|
+
{ name: "CSF-Cybersecurity-File", fn: generateCsf },
|
|
1418
|
+
{ name: "CER-Clinical-Evaluation-Report", fn: generateCer }
|
|
1255
1419
|
];
|
|
1256
1420
|
var noopUrlResolver = {
|
|
1257
1421
|
resolve: () => {
|
|
@@ -1313,10 +1477,14 @@ export {
|
|
|
1313
1477
|
buildRiskGraph,
|
|
1314
1478
|
buildTraceabilityMatrix,
|
|
1315
1479
|
generate,
|
|
1480
|
+
generateCer,
|
|
1481
|
+
generateCsf,
|
|
1316
1482
|
generatePrs,
|
|
1317
1483
|
generatePta,
|
|
1318
1484
|
generateRmr,
|
|
1319
1485
|
generateSrs,
|
|
1486
|
+
generateUef,
|
|
1320
1487
|
generateUrs,
|
|
1488
|
+
generateVv,
|
|
1321
1489
|
loadConfig
|
|
1322
1490
|
};
|