@memoarchitect/tools 0.4.4 → 0.4.6

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.
Files changed (154) hide show
  1. package/README.md +17 -9
  2. package/package.json +25 -24
  3. package/packages/tools/lib/bin/memo.js +0 -0
  4. package/packages/tools/lib/commands/dev.d.ts.map +1 -1
  5. package/packages/tools/lib/commands/dev.js +6 -1
  6. package/packages/tools/lib/commands/dev.js.map +1 -1
  7. package/packages/tools/lib/dhf/template-resolver.d.ts +1 -1
  8. package/packages/tools/lib/dhf/template-resolver.d.ts.map +1 -1
  9. package/packages/tools/lib/dhf/template-resolver.js +20 -16
  10. package/packages/tools/lib/dhf/template-resolver.js.map +1 -1
  11. package/packages/tools/lib/language/generated/ast.d.ts +1380 -115
  12. package/packages/tools/lib/language/generated/ast.d.ts.map +1 -1
  13. package/packages/tools/lib/language/generated/ast.js +1468 -843
  14. package/packages/tools/lib/language/generated/ast.js.map +1 -1
  15. package/packages/tools/lib/language/generated/grammar.d.ts +1 -1
  16. package/packages/tools/lib/language/generated/grammar.d.ts.map +1 -1
  17. package/packages/tools/lib/language/generated/grammar.js +97 -329
  18. package/packages/tools/lib/language/generated/grammar.js.map +1 -1
  19. package/packages/tools/lib/language/generated/module.d.ts +1 -1
  20. package/packages/tools/lib/language/generated/module.js +1 -1
  21. package/packages/tools/lib/model/ontology-loader.js +1 -1
  22. package/packages/tools/lib/model/ontology-loader.js.map +1 -1
  23. package/packages/tools/lib/model/paths.d.ts +6 -4
  24. package/packages/tools/lib/model/paths.d.ts.map +1 -1
  25. package/packages/tools/lib/model/paths.js +20 -9
  26. package/packages/tools/lib/model/paths.js.map +1 -1
  27. package/packages/tools/lib/__tests__/archetype-parsing.test.d.ts +0 -2
  28. package/packages/tools/lib/__tests__/archetype-parsing.test.d.ts.map +0 -1
  29. package/packages/tools/lib/__tests__/archetype-parsing.test.js +0 -42
  30. package/packages/tools/lib/__tests__/archetype-parsing.test.js.map +0 -1
  31. package/packages/tools/lib/__tests__/architecture-discovery.test.d.ts +0 -2
  32. package/packages/tools/lib/__tests__/architecture-discovery.test.d.ts.map +0 -1
  33. package/packages/tools/lib/__tests__/architecture-discovery.test.js +0 -82
  34. package/packages/tools/lib/__tests__/architecture-discovery.test.js.map +0 -1
  35. package/packages/tools/lib/__tests__/behavior.test.d.ts +0 -2
  36. package/packages/tools/lib/__tests__/behavior.test.d.ts.map +0 -1
  37. package/packages/tools/lib/__tests__/behavior.test.js +0 -766
  38. package/packages/tools/lib/__tests__/behavior.test.js.map +0 -1
  39. package/packages/tools/lib/__tests__/builder.test.d.ts +0 -2
  40. package/packages/tools/lib/__tests__/builder.test.d.ts.map +0 -1
  41. package/packages/tools/lib/__tests__/builder.test.js +0 -728
  42. package/packages/tools/lib/__tests__/builder.test.js.map +0 -1
  43. package/packages/tools/lib/__tests__/config-loader.test.d.ts +0 -2
  44. package/packages/tools/lib/__tests__/config-loader.test.d.ts.map +0 -1
  45. package/packages/tools/lib/__tests__/config-loader.test.js +0 -196
  46. package/packages/tools/lib/__tests__/config-loader.test.js.map +0 -1
  47. package/packages/tools/lib/__tests__/conformance.test.d.ts +0 -2
  48. package/packages/tools/lib/__tests__/conformance.test.d.ts.map +0 -1
  49. package/packages/tools/lib/__tests__/conformance.test.js +0 -467
  50. package/packages/tools/lib/__tests__/conformance.test.js.map +0 -1
  51. package/packages/tools/lib/__tests__/constraint-eval.test.d.ts +0 -2
  52. package/packages/tools/lib/__tests__/constraint-eval.test.d.ts.map +0 -1
  53. package/packages/tools/lib/__tests__/constraint-eval.test.js +0 -195
  54. package/packages/tools/lib/__tests__/constraint-eval.test.js.map +0 -1
  55. package/packages/tools/lib/__tests__/constraint-grammar.test.d.ts +0 -2
  56. package/packages/tools/lib/__tests__/constraint-grammar.test.d.ts.map +0 -1
  57. package/packages/tools/lib/__tests__/constraint-grammar.test.js +0 -163
  58. package/packages/tools/lib/__tests__/constraint-grammar.test.js.map +0 -1
  59. package/packages/tools/lib/__tests__/constraint-loader.test.d.ts +0 -2
  60. package/packages/tools/lib/__tests__/constraint-loader.test.d.ts.map +0 -1
  61. package/packages/tools/lib/__tests__/constraint-loader.test.js +0 -150
  62. package/packages/tools/lib/__tests__/constraint-loader.test.js.map +0 -1
  63. package/packages/tools/lib/__tests__/csv-io.test.d.ts +0 -2
  64. package/packages/tools/lib/__tests__/csv-io.test.d.ts.map +0 -1
  65. package/packages/tools/lib/__tests__/csv-io.test.js +0 -317
  66. package/packages/tools/lib/__tests__/csv-io.test.js.map +0 -1
  67. package/packages/tools/lib/__tests__/dhf-doc-store.test.d.ts +0 -2
  68. package/packages/tools/lib/__tests__/dhf-doc-store.test.d.ts.map +0 -1
  69. package/packages/tools/lib/__tests__/dhf-doc-store.test.js +0 -94
  70. package/packages/tools/lib/__tests__/dhf-doc-store.test.js.map +0 -1
  71. package/packages/tools/lib/__tests__/dhf-template-resolver.test.d.ts +0 -2
  72. package/packages/tools/lib/__tests__/dhf-template-resolver.test.d.ts.map +0 -1
  73. package/packages/tools/lib/__tests__/dhf-template-resolver.test.js +0 -39
  74. package/packages/tools/lib/__tests__/dhf-template-resolver.test.js.map +0 -1
  75. package/packages/tools/lib/__tests__/dhf.test.d.ts +0 -2
  76. package/packages/tools/lib/__tests__/dhf.test.d.ts.map +0 -1
  77. package/packages/tools/lib/__tests__/dhf.test.js +0 -393
  78. package/packages/tools/lib/__tests__/dhf.test.js.map +0 -1
  79. package/packages/tools/lib/__tests__/dimension-filter.test.d.ts +0 -2
  80. package/packages/tools/lib/__tests__/dimension-filter.test.d.ts.map +0 -1
  81. package/packages/tools/lib/__tests__/dimension-filter.test.js +0 -85
  82. package/packages/tools/lib/__tests__/dimension-filter.test.js.map +0 -1
  83. package/packages/tools/lib/__tests__/dsm.test.d.ts +0 -2
  84. package/packages/tools/lib/__tests__/dsm.test.d.ts.map +0 -1
  85. package/packages/tools/lib/__tests__/dsm.test.js +0 -112
  86. package/packages/tools/lib/__tests__/dsm.test.js.map +0 -1
  87. package/packages/tools/lib/__tests__/e2e-workflow.test.d.ts +0 -2
  88. package/packages/tools/lib/__tests__/e2e-workflow.test.d.ts.map +0 -1
  89. package/packages/tools/lib/__tests__/e2e-workflow.test.js +0 -707
  90. package/packages/tools/lib/__tests__/e2e-workflow.test.js.map +0 -1
  91. package/packages/tools/lib/__tests__/file-watcher.test.d.ts +0 -2
  92. package/packages/tools/lib/__tests__/file-watcher.test.d.ts.map +0 -1
  93. package/packages/tools/lib/__tests__/file-watcher.test.js +0 -31
  94. package/packages/tools/lib/__tests__/file-watcher.test.js.map +0 -1
  95. package/packages/tools/lib/__tests__/impact.test.d.ts +0 -2
  96. package/packages/tools/lib/__tests__/impact.test.d.ts.map +0 -1
  97. package/packages/tools/lib/__tests__/impact.test.js +0 -82
  98. package/packages/tools/lib/__tests__/impact.test.js.map +0 -1
  99. package/packages/tools/lib/__tests__/importer.test.d.ts +0 -2
  100. package/packages/tools/lib/__tests__/importer.test.d.ts.map +0 -1
  101. package/packages/tools/lib/__tests__/importer.test.js +0 -336
  102. package/packages/tools/lib/__tests__/importer.test.js.map +0 -1
  103. package/packages/tools/lib/__tests__/kind-registry.test.d.ts +0 -2
  104. package/packages/tools/lib/__tests__/kind-registry.test.d.ts.map +0 -1
  105. package/packages/tools/lib/__tests__/kind-registry.test.js +0 -132
  106. package/packages/tools/lib/__tests__/kind-registry.test.js.map +0 -1
  107. package/packages/tools/lib/__tests__/llm.test.d.ts +0 -2
  108. package/packages/tools/lib/__tests__/llm.test.d.ts.map +0 -1
  109. package/packages/tools/lib/__tests__/llm.test.js +0 -275
  110. package/packages/tools/lib/__tests__/llm.test.js.map +0 -1
  111. package/packages/tools/lib/__tests__/manifest-resolver.test.d.ts +0 -2
  112. package/packages/tools/lib/__tests__/manifest-resolver.test.d.ts.map +0 -1
  113. package/packages/tools/lib/__tests__/manifest-resolver.test.js +0 -97
  114. package/packages/tools/lib/__tests__/manifest-resolver.test.js.map +0 -1
  115. package/packages/tools/lib/__tests__/markdown-to-ir.test.d.ts +0 -2
  116. package/packages/tools/lib/__tests__/markdown-to-ir.test.d.ts.map +0 -1
  117. package/packages/tools/lib/__tests__/markdown-to-ir.test.js +0 -74
  118. package/packages/tools/lib/__tests__/markdown-to-ir.test.js.map +0 -1
  119. package/packages/tools/lib/__tests__/methodology-scope.test.d.ts +0 -2
  120. package/packages/tools/lib/__tests__/methodology-scope.test.d.ts.map +0 -1
  121. package/packages/tools/lib/__tests__/methodology-scope.test.js +0 -59
  122. package/packages/tools/lib/__tests__/methodology-scope.test.js.map +0 -1
  123. package/packages/tools/lib/__tests__/parser.test.d.ts +0 -2
  124. package/packages/tools/lib/__tests__/parser.test.d.ts.map +0 -1
  125. package/packages/tools/lib/__tests__/parser.test.js +0 -938
  126. package/packages/tools/lib/__tests__/parser.test.js.map +0 -1
  127. package/packages/tools/lib/__tests__/plugin.test.d.ts +0 -2
  128. package/packages/tools/lib/__tests__/plugin.test.d.ts.map +0 -1
  129. package/packages/tools/lib/__tests__/plugin.test.js +0 -308
  130. package/packages/tools/lib/__tests__/plugin.test.js.map +0 -1
  131. package/packages/tools/lib/__tests__/relationship-registry.test.d.ts +0 -2
  132. package/packages/tools/lib/__tests__/relationship-registry.test.d.ts.map +0 -1
  133. package/packages/tools/lib/__tests__/relationship-registry.test.js +0 -96
  134. package/packages/tools/lib/__tests__/relationship-registry.test.js.map +0 -1
  135. package/packages/tools/lib/__tests__/rule-registry.test.d.ts +0 -2
  136. package/packages/tools/lib/__tests__/rule-registry.test.d.ts.map +0 -1
  137. package/packages/tools/lib/__tests__/rule-registry.test.js +0 -53
  138. package/packages/tools/lib/__tests__/rule-registry.test.js.map +0 -1
  139. package/packages/tools/lib/__tests__/toolchain.test.d.ts +0 -2
  140. package/packages/tools/lib/__tests__/toolchain.test.d.ts.map +0 -1
  141. package/packages/tools/lib/__tests__/toolchain.test.js +0 -94
  142. package/packages/tools/lib/__tests__/toolchain.test.js.map +0 -1
  143. package/packages/tools/lib/__tests__/view-deriver-samples.test.d.ts +0 -2
  144. package/packages/tools/lib/__tests__/view-deriver-samples.test.d.ts.map +0 -1
  145. package/packages/tools/lib/__tests__/view-deriver-samples.test.js +0 -39
  146. package/packages/tools/lib/__tests__/view-deriver-samples.test.js.map +0 -1
  147. package/packages/tools/lib/__tests__/view-kinds.test.d.ts +0 -2
  148. package/packages/tools/lib/__tests__/view-kinds.test.d.ts.map +0 -1
  149. package/packages/tools/lib/__tests__/view-kinds.test.js +0 -263
  150. package/packages/tools/lib/__tests__/view-kinds.test.js.map +0 -1
  151. package/packages/tools/lib/__tests__/view-layout-store.test.d.ts +0 -2
  152. package/packages/tools/lib/__tests__/view-layout-store.test.d.ts.map +0 -1
  153. package/packages/tools/lib/__tests__/view-layout-store.test.js +0 -61
  154. package/packages/tools/lib/__tests__/view-layout-store.test.js.map +0 -1
@@ -1,393 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { DHF_DOCUMENT_TYPES, getDocumentType, getDocumentsByGroup, getAllDocumentIds, resolveDocumentType, compileDocument, createQueryContext, text, xref, heading, paragraph, table, list, badge, metric, metricGroup, progress, divider, createSnapshot, diffSnapshots, generateRedlineDocument, loadDhfConfig, isDocumentEnabled, getPlugin, getAvailableFormats, } from '../index.js';
3
- // ─── Test Helpers ────────────────────────────────────────────────────────────
4
- function makeElement(overrides = {}) {
5
- return {
6
- id: 'el-1', name: 'TestElement', kind: 'Hazard', construct: 'part',
7
- layer: 'risk', file: 'test.sysml', attributes: {}, ...overrides,
8
- };
9
- }
10
- function makeModel(elements = [], relationships = []) {
11
- const elementMap = new Map(elements.map(e => [e.id, e]));
12
- const elementsByKind = new Map();
13
- const elementsByLayer = new Map();
14
- for (const el of elements) {
15
- if (!elementsByKind.has(el.kind))
16
- elementsByKind.set(el.kind, []);
17
- elementsByKind.get(el.kind).push(el);
18
- if (!elementsByLayer.has(el.layer))
19
- elementsByLayer.set(el.layer, []);
20
- elementsByLayer.get(el.layer).push(el);
21
- }
22
- const relationshipsByType = new Map();
23
- const outgoing = new Map();
24
- const incoming = new Map();
25
- for (const rel of relationships) {
26
- if (!relationshipsByType.has(rel.type))
27
- relationshipsByType.set(rel.type, []);
28
- relationshipsByType.get(rel.type).push(rel);
29
- if (!outgoing.has(rel.sourceId))
30
- outgoing.set(rel.sourceId, []);
31
- outgoing.get(rel.sourceId).push(rel);
32
- if (!incoming.has(rel.targetId))
33
- incoming.set(rel.targetId, []);
34
- incoming.get(rel.targetId).push(rel);
35
- }
36
- return { elements: elementMap, relationships, errors: [], elementsByKind, elementsByLayer, relationshipsByType, outgoing, incoming };
37
- }
38
- function makeValidation(violations = []) {
39
- return { violations, rulesEvaluated: 10, rulesPassed: 10 - violations.length, timestamp: Date.now() };
40
- }
41
- function makeCompleteness() {
42
- return { layers: [], overall: 75, totalElements: 10, completeElements: 7, elementStatus: {} };
43
- }
44
- function makeConfig() {
45
- return { projectName: 'Test Project', projectType: 'device', architectureLayers: [], viewpoints: [], workflows: [] };
46
- }
47
- // ─── Document Registry Tests ─────────────────────────────────────────────────
48
- describe('DHF Document Registry', () => {
49
- it('registers 18 document types', () => {
50
- expect(DHF_DOCUMENT_TYPES).toHaveLength(18);
51
- });
52
- it('each doc has required fields', () => {
53
- for (const doc of DHF_DOCUMENT_TYPES) {
54
- expect(doc.id).toBeTruthy();
55
- expect(doc.title).toBeTruthy();
56
- expect(doc.standards.length).toBeGreaterThan(0);
57
- expect(doc.sections.length).toBeGreaterThan(0);
58
- expect(doc.group).toBeTruthy();
59
- }
60
- });
61
- it('getDocumentType finds by ID', () => {
62
- expect(getDocumentType('rmp')?.title).toBe('Risk Management Plan');
63
- expect(getDocumentType('nonexistent')).toBeUndefined();
64
- });
65
- it('getDocumentsByGroup filters correctly', () => {
66
- const risk = getDocumentsByGroup('risk');
67
- expect(risk.length).toBeGreaterThanOrEqual(3); // rmp, har, fmea + all-group docs
68
- for (const doc of risk) {
69
- expect(doc.group === 'risk' || doc.group === 'all').toBe(true);
70
- }
71
- });
72
- it('getAllDocumentIds returns 18 IDs', () => {
73
- const ids = getAllDocumentIds();
74
- expect(ids).toHaveLength(18);
75
- expect(ids).toContain('rmp');
76
- expect(ids).toContain('dhf-index');
77
- });
78
- it('document IDs are unique', () => {
79
- const ids = getAllDocumentIds();
80
- expect(new Set(ids).size).toBe(ids.length);
81
- });
82
- });
83
- // ─── Artifact Kind → DHF Document Lookup (E-3) ─────────────────────────────
84
- describe('resolveDocumentType — artifact kind lookup', () => {
85
- it('resolves RiskManagementPlan artifact kind to rmp document', () => {
86
- const doc = resolveDocumentType('RiskManagementPlan');
87
- expect(doc).toBeDefined();
88
- expect(doc.id).toBe('rmp');
89
- expect(doc.title).toBe('Risk Management Plan');
90
- });
91
- it('falls back to built-in document ID when no artifact kind matches', () => {
92
- const doc = resolveDocumentType('har');
93
- expect(doc).toBeDefined();
94
- expect(doc.id).toBe('har');
95
- });
96
- it('returns undefined for unknown artifact kind and unknown doc ID', () => {
97
- expect(resolveDocumentType('NonExistentArtifact')).toBeUndefined();
98
- });
99
- });
100
- // ─── Document IR Tests ───────────────────────────────────────────────────────
101
- describe('Document IR Helpers', () => {
102
- it('text creates a DhfText node', () => {
103
- const t = text('hello', { bold: true });
104
- expect(t).toEqual({ type: 'text', value: 'hello', bold: true });
105
- });
106
- it('xref creates a cross-reference', () => {
107
- const x = xref('el-1', 'MyElement', 'Hazard');
108
- expect(x).toEqual({ type: 'xref', elementId: 'el-1', label: 'MyElement', kind: 'Hazard' });
109
- });
110
- it('heading creates heading block', () => {
111
- const h = heading(2, 'Section Title', 'sec-1');
112
- expect(h).toEqual({ type: 'heading', level: 2, text: 'Section Title', id: 'sec-1' });
113
- });
114
- it('table creates table block', () => {
115
- const t = table(['A', 'B'], [[[text('1')], [text('2')]]]);
116
- expect(t.type).toBe('table');
117
- expect(t.headers).toHaveLength(2);
118
- expect(t.rows).toHaveLength(1);
119
- });
120
- it('badge creates inline badge', () => {
121
- const b = badge('OK', 'success');
122
- expect(b).toEqual({ type: 'badge', label: 'OK', variant: 'success' });
123
- });
124
- it('metricGroup wraps metrics', () => {
125
- const mg = metricGroup(metric('Count', 42), metric('Rate', '95%'));
126
- expect(mg.type).toBe('metric-group');
127
- expect(mg.metrics).toHaveLength(2);
128
- });
129
- });
130
- // ─── Query Engine Tests ──────────────────────────────────────────────────────
131
- describe('Query Engine', () => {
132
- const hazard1 = makeElement({ id: 'h1', name: 'Overheating', kind: 'Hazard' });
133
- const hazard2 = makeElement({ id: 'h2', name: 'Leaking', kind: 'Hazard' });
134
- const control = makeElement({ id: 'c1', name: 'TempSensor', kind: 'RiskControl', layer: 'risk' });
135
- const req = makeElement({ id: 'r1', name: 'REQ-001', kind: 'SystemRequirement', layer: 'requirements' });
136
- const mitigatesRel = {
137
- id: 'rel-1', type: 'mitigates', sourceId: 'c1', sourceEnd: 'control',
138
- targetId: 'h1', targetEnd: 'hazard', file: 'test.sysml',
139
- };
140
- const model = makeModel([hazard1, hazard2, control, req], [mitigatesRel]);
141
- const validation = makeValidation([{
142
- ruleId: 'CR-MED-001', description: 'Missing mitigation', severity: 'error',
143
- elementId: 'h2', elementKind: 'Hazard', elementName: 'Leaking', layer: 'risk',
144
- }]);
145
- const completeness = makeCompleteness();
146
- const config = makeConfig();
147
- const ctx = createQueryContext(model, validation, completeness, config);
148
- it('elementsByKind returns matching elements', () => {
149
- expect(ctx.elementsByKind('Hazard')).toHaveLength(2);
150
- expect(ctx.elementsByKind('NonExistent')).toHaveLength(0);
151
- });
152
- it('elementsByKinds returns elements matching any kind', () => {
153
- expect(ctx.elementsByKinds(['Hazard', 'RiskControl'])).toHaveLength(3);
154
- });
155
- it('related returns filtered relationships', () => {
156
- const mitigations = ctx.related('h1', 'mitigates', 'incoming');
157
- expect(mitigations).toHaveLength(1);
158
- expect(mitigations[0].sourceId).toBe('c1');
159
- });
160
- it('unmitigatedCount identifies hazards without controls', () => {
161
- expect(ctx.unmitigatedCount()).toBe(1); // h2 has no mitigation
162
- });
163
- it('errorCount returns validation error count', () => {
164
- expect(ctx.errorCount()).toBe(1);
165
- });
166
- it('totalElements returns model size', () => {
167
- expect(ctx.totalElements()).toBe(4);
168
- });
169
- it('elementName returns name or falls back to ID', () => {
170
- expect(ctx.elementName('h1')).toBe('Overheating');
171
- expect(ctx.elementName('nonexistent')).toBe('nonexistent');
172
- });
173
- it('traceChain follows outgoing relationships', () => {
174
- const chain = ctx.traceChain('c1');
175
- expect(chain).toHaveLength(1);
176
- expect(chain[0].element.id).toBe('h1');
177
- });
178
- });
179
- // ─── Template Engine Tests ───────────────────────────────────────────────────
180
- describe('Template Engine', () => {
181
- const hazard = makeElement({ id: 'h1', name: 'Overheating', kind: 'Hazard', doc: 'Device may overheat' });
182
- const control = makeElement({ id: 'c1', name: 'TempSensor', kind: 'RiskControl' });
183
- const model = makeModel([hazard, control], [{
184
- id: 'rel-1', type: 'mitigates', sourceId: 'c1', sourceEnd: 'control',
185
- targetId: 'h1', targetEnd: 'hazard', file: 'test.sysml',
186
- }]);
187
- const validation = makeValidation();
188
- const completeness = makeCompleteness();
189
- const config = makeConfig();
190
- it('compiles a risk management plan', () => {
191
- const rmpType = getDocumentType('rmp');
192
- const doc = compileDocument({ model, validation, completeness, config, documentType: rmpType });
193
- expect(doc.frontmatter.documentId).toBe('rmp');
194
- expect(doc.frontmatter.title).toBe('Risk Management Plan');
195
- expect(doc.sections.length).toBeGreaterThan(0);
196
- expect(doc.status).toBeDefined();
197
- });
198
- it('compiles a hazard analysis report with elements', () => {
199
- const harType = getDocumentType('har');
200
- const doc = compileDocument({ model, validation, completeness, config, documentType: harType });
201
- expect(doc.totalElements).toBeGreaterThan(0);
202
- });
203
- it('compiles DHF index with all document types', () => {
204
- const indexType = getDocumentType('dhf-index');
205
- const doc = compileDocument({ model, validation, completeness, config, documentType: indexType });
206
- expect(doc.sections.length).toBeGreaterThan(0);
207
- });
208
- it('compiles RTM with coverage summary', () => {
209
- const reqEl = makeElement({ id: 'r1', name: 'REQ-001', kind: 'SystemRequirement', layer: 'requirements' });
210
- const modelWithReq = makeModel([reqEl], []);
211
- const doc = compileDocument({
212
- model: modelWithReq, validation, completeness, config,
213
- documentType: getDocumentType('rtm'),
214
- });
215
- expect(doc.sections.some(s => s.id === 'requirements-list')).toBe(true);
216
- });
217
- it('empty model produces empty status', () => {
218
- const emptyModel = makeModel([], []);
219
- const doc = compileDocument({
220
- model: emptyModel, validation, completeness, config,
221
- documentType: getDocumentType('rmp'),
222
- });
223
- // Most sections should be empty
224
- expect(doc.sections.some(s => s.status === 'empty')).toBe(true);
225
- });
226
- });
227
- // ─── Export Plugin Tests ─────────────────────────────────────────────────────
228
- describe('Export Plugins', () => {
229
- const model = makeModel([makeElement()], []);
230
- const config = makeConfig();
231
- it('has html, md, docx formats available', () => {
232
- const formats = getAvailableFormats();
233
- expect(formats).toContain('html');
234
- expect(formats).toContain('md');
235
- expect(formats).toContain('docx');
236
- });
237
- it('HTML plugin renders a document', async () => {
238
- const rmpType = getDocumentType('rmp');
239
- const doc = compileDocument({
240
- model, validation: makeValidation(), completeness: makeCompleteness(),
241
- config, documentType: rmpType,
242
- });
243
- const plugin = getPlugin('html');
244
- const result = await plugin.render(doc);
245
- expect(result.format).toBe('html');
246
- expect(result.content).toContain('Risk Management Plan');
247
- expect(result.content).toContain('<!DOCTYPE html>');
248
- });
249
- it('HTML plugin renders and escapes the complete document IR', async () => {
250
- const plugin = getPlugin('html');
251
- const doc = {
252
- frontmatter: {
253
- documentId: 'security-review',
254
- title: 'Safety <Review>',
255
- project: 'Pump & Controller',
256
- organization: '"Example" Medical',
257
- version: '1.0',
258
- standards: ['ISO 14971 <2025>'],
259
- generatedAt: '2026-07-16T12:00:00.000Z',
260
- approvers: [{ name: 'A <B', role: 'Quality & Safety' }],
261
- },
262
- sections: [{
263
- id: 'risk" onclick="alert(1)',
264
- title: 'Risk & Controls',
265
- status: 'partial',
266
- blocks: [
267
- heading(3, 'Detailed <analysis>', 'detail" data-bad="true'),
268
- {
269
- ...paragraph(text('added <script>alert(1)</script>', { bold: true, change: 'added' }), text(' removed', { italic: true, change: 'removed' }), xref('hazard" onclick="bad()', 'Hazard <A>', 'Hazard & Harm'), badge('Needs <review>', 'warning')),
270
- change: 'added',
271
- },
272
- table(['Hazard & ID'], [[[text('H-1 <unsafe>')]]], 'Risk <table>'),
273
- list([[text('First & item')], [text('Second <item>')]], true),
274
- metricGroup(metric('Coverage <target>', 95, { unit: '%', variant: 'success' })),
275
- progress('Completion <status>', 12, 10, 'red";display:none'),
276
- divider(),
277
- ],
278
- }],
279
- status: 'partial',
280
- totalElements: 1,
281
- totalGaps: 1,
282
- };
283
- const result = await plugin.render(doc);
284
- const html = String(result.content);
285
- expect(result.extension).toBe('.html');
286
- expect(result.mimeType).toBe('text/html');
287
- expect(html).toContain('<title>Safety &lt;Review&gt; — Pump &amp; Controller</title>');
288
- expect(html).toContain('id="risk&quot; onclick=&quot;alert(1)"');
289
- expect(html).toContain('<ins class="redline-add"><strong>added &lt;script&gt;alert(1)&lt;/script&gt;</strong></ins>');
290
- expect(html).toContain('<del class="redline-del"><em> removed</em></del>');
291
- expect(html).toContain('data-element-id="hazard&quot; onclick=&quot;bad()"');
292
- expect(html).toContain('<caption>Risk &lt;table&gt;</caption>');
293
- expect(html).toContain('<ol><li>First &amp; item</li>');
294
- expect(html).toContain('width:100%;background:red&quot;;display:none');
295
- expect(html).toContain('@media print');
296
- expect(html).not.toContain('<script>alert(1)</script>');
297
- });
298
- it('Markdown plugin renders a document', async () => {
299
- const rmpType = getDocumentType('rmp');
300
- const doc = compileDocument({
301
- model, validation: makeValidation(), completeness: makeCompleteness(),
302
- config, documentType: rmpType,
303
- });
304
- const plugin = getPlugin('md');
305
- const result = await plugin.render(doc);
306
- expect(result.format).toBe('md');
307
- expect(result.content).toContain('# Risk Management Plan');
308
- });
309
- it('DOCX plugin renders a document', async () => {
310
- const rmpType = getDocumentType('rmp');
311
- const doc = compileDocument({
312
- model, validation: makeValidation(), completeness: makeCompleteness(),
313
- config, documentType: rmpType,
314
- });
315
- const plugin = getPlugin('docx');
316
- const result = await plugin.render(doc);
317
- expect(result.format).toBe('docx');
318
- expect(result.content).toContain('Risk Management Plan');
319
- });
320
- });
321
- // ─── Snapshot & Redline Tests ────────────────────────────────────────────────
322
- describe('Snapshot & Redline', () => {
323
- const model = makeModel([
324
- makeElement({ id: 'h1', kind: 'Hazard' }),
325
- makeElement({ id: 'c1', kind: 'RiskControl' }),
326
- ], []);
327
- const config = makeConfig();
328
- const rmpType = getDocumentType('rmp');
329
- it('createSnapshot produces valid snapshot', () => {
330
- const doc = compileDocument({
331
- model, validation: makeValidation(), completeness: makeCompleteness(),
332
- config, documentType: rmpType,
333
- });
334
- const snap = createSnapshot(doc, 'test-snap');
335
- expect(snap.documentId).toBe('rmp');
336
- expect(snap.label).toBe('test-snap');
337
- expect(snap.sections.length).toBeGreaterThan(0);
338
- expect(snap.id).toMatch(/^snap-/);
339
- });
340
- it('diffSnapshots detects changes', () => {
341
- const doc1 = compileDocument({
342
- model: makeModel([makeElement({ id: 'h1', kind: 'Hazard' })], []),
343
- validation: makeValidation(), completeness: makeCompleteness(),
344
- config, documentType: rmpType,
345
- });
346
- const doc2 = compileDocument({
347
- model: makeModel([
348
- makeElement({ id: 'h1', kind: 'Hazard' }),
349
- makeElement({ id: 'h2', kind: 'Hazard', name: 'New Hazard' }),
350
- ], []),
351
- validation: makeValidation(), completeness: makeCompleteness(),
352
- config, documentType: rmpType,
353
- });
354
- const snap1 = createSnapshot(doc1, 'baseline');
355
- const snap2 = createSnapshot(doc2, 'current');
356
- const diff = diffSnapshots(snap1, snap2);
357
- expect(diff.baseline.label).toBe('baseline');
358
- expect(diff.current.label).toBe('current');
359
- expect(diff.changedSections.length).toBeGreaterThan(0);
360
- });
361
- it('generateRedlineDocument produces valid IR', () => {
362
- const doc1 = compileDocument({
363
- model: makeModel([], []),
364
- validation: makeValidation(), completeness: makeCompleteness(),
365
- config, documentType: rmpType,
366
- });
367
- const doc2 = compileDocument({
368
- model, validation: makeValidation(), completeness: makeCompleteness(),
369
- config, documentType: rmpType,
370
- });
371
- const snap1 = createSnapshot(doc1);
372
- const snap2 = createSnapshot(doc2);
373
- const diff = diffSnapshots(snap1, snap2);
374
- const redline = generateRedlineDocument(diff);
375
- expect(redline.frontmatter.documentId).toContain('redline');
376
- expect(redline.sections.length).toBeGreaterThan(0);
377
- });
378
- });
379
- // ─── DHF Config Tests ────────────────────────────────────────────────────────
380
- describe('DHF Config', () => {
381
- it('isDocumentEnabled returns true by default', () => {
382
- expect(isDocumentEnabled('rmp')).toBe(true);
383
- expect(isDocumentEnabled('rmp', {})).toBe(true);
384
- });
385
- it('isDocumentEnabled respects overrides', () => {
386
- expect(isDocumentEnabled('rmp', { documents: { rmp: { enabled: false } } })).toBe(false);
387
- expect(isDocumentEnabled('har', { documents: { rmp: { enabled: false } } })).toBe(true);
388
- });
389
- it('loadDhfConfig returns undefined for missing file', () => {
390
- expect(loadDhfConfig('/nonexistent/path')).toBeUndefined();
391
- });
392
- });
393
- //# sourceMappingURL=dhf.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dhf.test.js","sourceRoot":"","sources":["../../src/__tests__/dhf.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=dimension-filter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dimension-filter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dimension-filter.test.ts"],"names":[],"mappings":""}
@@ -1,85 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { filterKindsByDimension, isKindExcluded } from '../model/dimension-filter.js';
3
- function makeKind(overrides) {
4
- return {
5
- name: 'TestKind',
6
- label: 'Test Kind',
7
- construct: 'part def',
8
- layer: 'risk',
9
- instanceCount: 0,
10
- viewpoints: [],
11
- ...overrides,
12
- };
13
- }
14
- function makeScope(overrides = {}) {
15
- return {
16
- id: 'SCOPE-001',
17
- scopeName: 'test',
18
- includedArchLayers: [],
19
- includedStandards: [],
20
- includedArtifactKinds: [],
21
- includedViewpointTypes: [],
22
- excludedKinds: [],
23
- ...overrides,
24
- };
25
- }
26
- describe('filterKindsByDimension', () => {
27
- const hazard = makeKind({ name: 'Hazard', layer: 'risk', standard: 'iso-14971', viewpoints: ['VP-RISK'] });
28
- const threat = makeKind({ name: 'Threat', layer: 'cybersecurity', viewpoints: ['VP-CYB'] });
29
- const actor = makeKind({ name: 'Actor', layer: 'context', viewpoints: ['VP-CTX'] });
30
- const allKinds = [hazard, threat, actor];
31
- it('passes all kinds through when scope is null', () => {
32
- expect(filterKindsByDimension(allKinds, 'archLayer', null)).toEqual(allKinds);
33
- });
34
- it('passes all kinds through when included set is empty', () => {
35
- const scope = makeScope();
36
- expect(filterKindsByDimension(allKinds, 'archLayer', scope)).toEqual(allKinds);
37
- });
38
- it('filters by archLayer', () => {
39
- const scope = makeScope({ includedArchLayers: ['risk'] });
40
- const result = filterKindsByDimension(allKinds, 'archLayer', scope);
41
- expect(result).toEqual([hazard]);
42
- });
43
- it('filters by standard', () => {
44
- const scope = makeScope({ includedStandards: ['iso-14971'] });
45
- const result = filterKindsByDimension(allKinds, 'standard', scope);
46
- expect(result).toEqual([hazard]);
47
- });
48
- it('filters by viewpointType', () => {
49
- const scope = makeScope({ includedViewpointTypes: ['VP-RISK', 'VP-CTX'] });
50
- const result = filterKindsByDimension(allKinds, 'viewpointType', scope);
51
- expect(result).toEqual([hazard, actor]);
52
- });
53
- it('filters by artifactKind (matches kind name)', () => {
54
- const scope = makeScope({ includedArtifactKinds: ['Threat'] });
55
- const result = filterKindsByDimension(allKinds, 'artifactKind', scope);
56
- expect(result).toEqual([threat]);
57
- });
58
- it('returns empty when no kinds match included set', () => {
59
- const scope = makeScope({ includedArchLayers: ['nonexistent'] });
60
- expect(filterKindsByDimension(allKinds, 'archLayer', scope)).toEqual([]);
61
- });
62
- it('handles multiple included values', () => {
63
- const scope = makeScope({ includedArchLayers: ['risk', 'context'] });
64
- const result = filterKindsByDimension(allKinds, 'archLayer', scope);
65
- expect(result).toEqual([hazard, actor]);
66
- });
67
- });
68
- describe('isKindExcluded', () => {
69
- const hazard = makeKind({ name: 'Hazard' });
70
- it('returns false when scope is null', () => {
71
- expect(isKindExcluded(hazard, null)).toBe(false);
72
- });
73
- it('returns false when excludedKinds is empty', () => {
74
- expect(isKindExcluded(hazard, makeScope())).toBe(false);
75
- });
76
- it('returns true when kind name is in excludedKinds', () => {
77
- const scope = makeScope({ excludedKinds: ['Hazard', 'SOUPComponent'] });
78
- expect(isKindExcluded(hazard, scope)).toBe(true);
79
- });
80
- it('returns false when kind name is not in excludedKinds', () => {
81
- const scope = makeScope({ excludedKinds: ['SOUPComponent'] });
82
- expect(isKindExcluded(hazard, scope)).toBe(false);
83
- });
84
- });
85
- //# sourceMappingURL=dimension-filter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dimension-filter.test.js","sourceRoot":"","sources":["../../src/__tests__/dimension-filter.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=dsm.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dsm.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dsm.test.ts"],"names":[],"mappings":""}