@nahisaho/musubix-formal-verify 1.7.5
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/README.md +62 -0
- package/dist/converters/EarsToSmtConverter.d.ts +102 -0
- package/dist/converters/EarsToSmtConverter.d.ts.map +1 -0
- package/dist/converters/EarsToSmtConverter.js +368 -0
- package/dist/converters/EarsToSmtConverter.js.map +1 -0
- package/dist/converters/index.d.ts +6 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +5 -0
- package/dist/converters/index.js.map +1 -0
- package/dist/converters/types.d.ts +103 -0
- package/dist/converters/types.d.ts.map +1 -0
- package/dist/converters/types.js +7 -0
- package/dist/converters/types.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/formal-verify-tools.d.ts +60 -0
- package/dist/tools/formal-verify-tools.d.ts.map +1 -0
- package/dist/tools/formal-verify-tools.js +371 -0
- package/dist/tools/formal-verify-tools.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/traceability/ImpactAnalyzer.d.ts +103 -0
- package/dist/traceability/ImpactAnalyzer.d.ts.map +1 -0
- package/dist/traceability/ImpactAnalyzer.js +281 -0
- package/dist/traceability/ImpactAnalyzer.js.map +1 -0
- package/dist/traceability/TraceabilityDB.d.ts +123 -0
- package/dist/traceability/TraceabilityDB.d.ts.map +1 -0
- package/dist/traceability/TraceabilityDB.js +379 -0
- package/dist/traceability/TraceabilityDB.js.map +1 -0
- package/dist/traceability/index.d.ts +8 -0
- package/dist/traceability/index.d.ts.map +1 -0
- package/dist/traceability/index.js +6 -0
- package/dist/traceability/index.js.map +1 -0
- package/dist/traceability/types.d.ts +156 -0
- package/dist/traceability/types.d.ts.map +1 -0
- package/dist/traceability/types.js +7 -0
- package/dist/traceability/types.js.map +1 -0
- package/dist/verifiers/PostconditionVerifier.d.ts +105 -0
- package/dist/verifiers/PostconditionVerifier.d.ts.map +1 -0
- package/dist/verifiers/PostconditionVerifier.js +326 -0
- package/dist/verifiers/PostconditionVerifier.js.map +1 -0
- package/dist/verifiers/PreconditionVerifier.d.ts +87 -0
- package/dist/verifiers/PreconditionVerifier.d.ts.map +1 -0
- package/dist/verifiers/PreconditionVerifier.js +286 -0
- package/dist/verifiers/PreconditionVerifier.js.map +1 -0
- package/dist/verifiers/index.d.ts +7 -0
- package/dist/verifiers/index.d.ts.map +1 -0
- package/dist/verifiers/index.js +6 -0
- package/dist/verifiers/index.js.map +1 -0
- package/dist/verifiers/types.d.ts +109 -0
- package/dist/verifiers/types.d.ts.map +1 -0
- package/dist/verifiers/types.js +7 -0
- package/dist/verifiers/types.js.map +1 -0
- package/dist/z3/Z3Adapter.d.ts +92 -0
- package/dist/z3/Z3Adapter.d.ts.map +1 -0
- package/dist/z3/Z3Adapter.js +189 -0
- package/dist/z3/Z3Adapter.js.map +1 -0
- package/dist/z3/Z3ProcessFallback.d.ts +67 -0
- package/dist/z3/Z3ProcessFallback.d.ts.map +1 -0
- package/dist/z3/Z3ProcessFallback.js +287 -0
- package/dist/z3/Z3ProcessFallback.js.map +1 -0
- package/dist/z3/Z3WasmClient.d.ts +55 -0
- package/dist/z3/Z3WasmClient.d.ts.map +1 -0
- package/dist/z3/Z3WasmClient.js +172 -0
- package/dist/z3/Z3WasmClient.js.map +1 -0
- package/dist/z3/index.d.ts +9 -0
- package/dist/z3/index.d.ts.map +1 -0
- package/dist/z3/index.js +7 -0
- package/dist/z3/index.js.map +1 -0
- package/dist/z3/types.d.ts +82 -0
- package/dist/z3/types.d.ts.map +1 -0
- package/dist/z3/types.js +7 -0
- package/dist/z3/types.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Impact Analyzer
|
|
3
|
+
*
|
|
4
|
+
* 変更の影響範囲を分析するクラス
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 影響分析器
|
|
8
|
+
*
|
|
9
|
+
* トレーサビリティDBを使用して、特定のノードが変更された場合の
|
|
10
|
+
* 影響範囲を分析します。
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const db = new TraceabilityDB('./trace.db');
|
|
15
|
+
* const analyzer = new ImpactAnalyzer(db);
|
|
16
|
+
*
|
|
17
|
+
* // REQ-001が変更された場合の影響分析
|
|
18
|
+
* const impact = await analyzer.analyze('REQ-001');
|
|
19
|
+
*
|
|
20
|
+
* console.log(`影響を受けるノード: ${impact.totalImpacted}件`);
|
|
21
|
+
* for (const node of impact.impactedNodes) {
|
|
22
|
+
* console.log(`- ${node.id}: 影響度 ${node.impactScore}`);
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export class ImpactAnalyzer {
|
|
27
|
+
db;
|
|
28
|
+
constructor(db) {
|
|
29
|
+
this.db = db;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 影響分析を実行
|
|
33
|
+
*
|
|
34
|
+
* @param sourceId - 変更の起点となるノードID
|
|
35
|
+
* @param options - 分析オプション
|
|
36
|
+
* @returns 影響分析結果
|
|
37
|
+
*/
|
|
38
|
+
async analyze(sourceId, options = {}) {
|
|
39
|
+
const startTime = Date.now();
|
|
40
|
+
const { maxDepth = 5, linkTypes, nodeTypes, decayRate = 0.7, minImpactScore = 0.1, } = options;
|
|
41
|
+
const impactedNodes = [];
|
|
42
|
+
const visited = new Set();
|
|
43
|
+
// BFSで影響範囲を探索
|
|
44
|
+
const queue = [];
|
|
45
|
+
// 初期ノードの隣接ノードをキューに追加
|
|
46
|
+
const initialLinks = await this.getOutgoingLinks(sourceId, linkTypes);
|
|
47
|
+
for (const link of initialLinks) {
|
|
48
|
+
queue.push({
|
|
49
|
+
id: link.target,
|
|
50
|
+
depth: 1,
|
|
51
|
+
path: [sourceId, link.target],
|
|
52
|
+
linkType: link.type,
|
|
53
|
+
impactScore: 1.0 * decayRate,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
visited.add(sourceId);
|
|
57
|
+
while (queue.length > 0) {
|
|
58
|
+
const current = queue.shift();
|
|
59
|
+
if (visited.has(current.id)) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (current.depth > maxDepth) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (current.impactScore < minImpactScore) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
visited.add(current.id);
|
|
69
|
+
// ノード情報を取得
|
|
70
|
+
const node = await this.db.getNode(current.id);
|
|
71
|
+
if (!node) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// ノードタイプフィルタ
|
|
75
|
+
if (nodeTypes && !nodeTypes.includes(node.type)) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// 影響ノードとして追加
|
|
79
|
+
impactedNodes.push({
|
|
80
|
+
id: node.id,
|
|
81
|
+
type: node.type,
|
|
82
|
+
title: node.title,
|
|
83
|
+
distance: current.depth,
|
|
84
|
+
path: current.path,
|
|
85
|
+
linkType: current.linkType,
|
|
86
|
+
impactScore: current.impactScore,
|
|
87
|
+
});
|
|
88
|
+
// 次の隣接ノードをキューに追加
|
|
89
|
+
const nextLinks = await this.getOutgoingLinks(current.id, linkTypes);
|
|
90
|
+
for (const link of nextLinks) {
|
|
91
|
+
if (!visited.has(link.target)) {
|
|
92
|
+
queue.push({
|
|
93
|
+
id: link.target,
|
|
94
|
+
depth: current.depth + 1,
|
|
95
|
+
path: [...current.path, link.target],
|
|
96
|
+
linkType: link.type,
|
|
97
|
+
impactScore: current.impactScore * decayRate,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// 影響度でソート
|
|
103
|
+
impactedNodes.sort((a, b) => b.impactScore - a.impactScore);
|
|
104
|
+
return {
|
|
105
|
+
sourceId,
|
|
106
|
+
impactedNodes,
|
|
107
|
+
depth: Math.max(0, ...impactedNodes.map(n => n.distance)),
|
|
108
|
+
totalImpacted: impactedNodes.length,
|
|
109
|
+
duration: Date.now() - startTime,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 逆方向の影響分析(依存元を探す)
|
|
114
|
+
*
|
|
115
|
+
* @param targetId - 調査対象のノードID
|
|
116
|
+
* @param options - 分析オプション
|
|
117
|
+
*/
|
|
118
|
+
async analyzeReverse(targetId, options = {}) {
|
|
119
|
+
const startTime = Date.now();
|
|
120
|
+
const { maxDepth = 5, linkTypes, nodeTypes, decayRate = 0.7, minImpactScore = 0.1, } = options;
|
|
121
|
+
const impactedNodes = [];
|
|
122
|
+
const visited = new Set();
|
|
123
|
+
const queue = [];
|
|
124
|
+
// 初期ノードの入力リンクをキューに追加
|
|
125
|
+
const initialLinks = await this.getIncomingLinks(targetId, linkTypes);
|
|
126
|
+
for (const link of initialLinks) {
|
|
127
|
+
queue.push({
|
|
128
|
+
id: link.source,
|
|
129
|
+
depth: 1,
|
|
130
|
+
path: [targetId, link.source],
|
|
131
|
+
linkType: link.type,
|
|
132
|
+
impactScore: 1.0 * decayRate,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
visited.add(targetId);
|
|
136
|
+
while (queue.length > 0) {
|
|
137
|
+
const current = queue.shift();
|
|
138
|
+
if (visited.has(current.id) || current.depth > maxDepth || current.impactScore < minImpactScore) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
visited.add(current.id);
|
|
142
|
+
const node = await this.db.getNode(current.id);
|
|
143
|
+
if (!node)
|
|
144
|
+
continue;
|
|
145
|
+
if (nodeTypes && !nodeTypes.includes(node.type))
|
|
146
|
+
continue;
|
|
147
|
+
impactedNodes.push({
|
|
148
|
+
id: node.id,
|
|
149
|
+
type: node.type,
|
|
150
|
+
title: node.title,
|
|
151
|
+
distance: current.depth,
|
|
152
|
+
path: current.path,
|
|
153
|
+
linkType: current.linkType,
|
|
154
|
+
impactScore: current.impactScore,
|
|
155
|
+
});
|
|
156
|
+
const nextLinks = await this.getIncomingLinks(current.id, linkTypes);
|
|
157
|
+
for (const link of nextLinks) {
|
|
158
|
+
if (!visited.has(link.source)) {
|
|
159
|
+
queue.push({
|
|
160
|
+
id: link.source,
|
|
161
|
+
depth: current.depth + 1,
|
|
162
|
+
path: [...current.path, link.source],
|
|
163
|
+
linkType: link.type,
|
|
164
|
+
impactScore: current.impactScore * decayRate,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
impactedNodes.sort((a, b) => b.impactScore - a.impactScore);
|
|
170
|
+
return {
|
|
171
|
+
sourceId: targetId,
|
|
172
|
+
impactedNodes,
|
|
173
|
+
depth: Math.max(0, ...impactedNodes.map(n => n.distance)),
|
|
174
|
+
totalImpacted: impactedNodes.length,
|
|
175
|
+
duration: Date.now() - startTime,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* カバレッジ分析
|
|
180
|
+
*
|
|
181
|
+
* 要件がどの程度テストでカバーされているかを分析
|
|
182
|
+
*/
|
|
183
|
+
async analyzeCoverage(requirementType = 'requirement', testType = 'test') {
|
|
184
|
+
const requirements = await this.db.getNodesByType(requirementType);
|
|
185
|
+
const tests = await this.db.getNodesByType(testType);
|
|
186
|
+
const covered = [];
|
|
187
|
+
const uncovered = [];
|
|
188
|
+
for (const req of requirements) {
|
|
189
|
+
const impact = await this.analyze(req.id, {
|
|
190
|
+
maxDepth: 10,
|
|
191
|
+
nodeTypes: [testType],
|
|
192
|
+
});
|
|
193
|
+
if (impact.totalImpacted > 0) {
|
|
194
|
+
covered.push(req.id);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
uncovered.push(req.id);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const coveragePercentage = requirements.length > 0
|
|
201
|
+
? (covered.length / requirements.length) * 100
|
|
202
|
+
: 0;
|
|
203
|
+
return {
|
|
204
|
+
totalRequirements: requirements.length,
|
|
205
|
+
coveredRequirements: covered.length,
|
|
206
|
+
uncoveredRequirements: uncovered.length,
|
|
207
|
+
coveragePercentage,
|
|
208
|
+
covered,
|
|
209
|
+
uncovered,
|
|
210
|
+
totalTests: tests.length,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* 循環依存を検出
|
|
215
|
+
*/
|
|
216
|
+
async detectCycles() {
|
|
217
|
+
const cycles = [];
|
|
218
|
+
const visited = new Set();
|
|
219
|
+
const recursionStack = new Set();
|
|
220
|
+
const stats = await this.db.getStats();
|
|
221
|
+
const allNodeTypes = Object.keys(stats.nodesByType);
|
|
222
|
+
for (const nodeType of allNodeTypes) {
|
|
223
|
+
const nodes = await this.db.getNodesByType(nodeType);
|
|
224
|
+
for (const node of nodes) {
|
|
225
|
+
if (!visited.has(node.id)) {
|
|
226
|
+
await this.detectCyclesDFS(node.id, visited, recursionStack, [], cycles);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return cycles;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* DFSで循環を検出
|
|
234
|
+
*/
|
|
235
|
+
async detectCyclesDFS(nodeId, visited, recursionStack, path, cycles) {
|
|
236
|
+
visited.add(nodeId);
|
|
237
|
+
recursionStack.add(nodeId);
|
|
238
|
+
path.push(nodeId);
|
|
239
|
+
const links = await this.getOutgoingLinks(nodeId);
|
|
240
|
+
for (const link of links) {
|
|
241
|
+
if (!visited.has(link.target)) {
|
|
242
|
+
await this.detectCyclesDFS(link.target, visited, recursionStack, [...path], cycles);
|
|
243
|
+
}
|
|
244
|
+
else if (recursionStack.has(link.target)) {
|
|
245
|
+
// 循環を検出
|
|
246
|
+
const cycleStart = path.indexOf(link.target);
|
|
247
|
+
const cycle = path.slice(cycleStart);
|
|
248
|
+
cycle.push(link.target); // サイクルを閉じる
|
|
249
|
+
cycles.push(cycle);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
recursionStack.delete(nodeId);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* 出力リンクを取得
|
|
256
|
+
*/
|
|
257
|
+
async getOutgoingLinks(nodeId, linkTypes) {
|
|
258
|
+
const result = await this.db.query(nodeId, {
|
|
259
|
+
direction: 'forward',
|
|
260
|
+
linkTypes,
|
|
261
|
+
maxDepth: 1,
|
|
262
|
+
});
|
|
263
|
+
return result.links
|
|
264
|
+
.filter(link => link.source === nodeId)
|
|
265
|
+
.map(link => ({ target: link.target, type: link.type }));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* 入力リンクを取得
|
|
269
|
+
*/
|
|
270
|
+
async getIncomingLinks(nodeId, linkTypes) {
|
|
271
|
+
const result = await this.db.query(nodeId, {
|
|
272
|
+
direction: 'backward',
|
|
273
|
+
linkTypes,
|
|
274
|
+
maxDepth: 1,
|
|
275
|
+
});
|
|
276
|
+
return result.links
|
|
277
|
+
.filter(link => link.target === nodeId)
|
|
278
|
+
.map(link => ({ source: link.source, type: link.type }));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=ImpactAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImpactAnalyzer.js","sourceRoot":"","sources":["../../src/traceability/ImpactAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Traceability Database
|
|
3
|
+
*
|
|
4
|
+
* SQLiteベースのトレーサビリティデータベース
|
|
5
|
+
*/
|
|
6
|
+
import type { TraceNode, TraceNodeInput, TraceLink, TraceNodeType, TraceQueryOptions, TraceQueryResult, TraceDbStats } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* トレーサビリティDB
|
|
9
|
+
*
|
|
10
|
+
* 要件↔設計↔コード↔テストのトレーサビリティを管理するSQLiteベースのデータベース。
|
|
11
|
+
* グラフ構造でノード間の関係を追跡し、影響分析やカバレッジ計算を支援します。
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const db = new TraceabilityDB('./trace.db');
|
|
16
|
+
*
|
|
17
|
+
* // ノードを追加
|
|
18
|
+
* await db.addNode({
|
|
19
|
+
* id: 'REQ-001',
|
|
20
|
+
* type: 'requirement',
|
|
21
|
+
* title: 'User Authentication',
|
|
22
|
+
* createdAt: new Date(),
|
|
23
|
+
* updatedAt: new Date(),
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* // リンクを追加
|
|
27
|
+
* await db.addLink({
|
|
28
|
+
* source: 'REQ-001',
|
|
29
|
+
* target: 'DES-001',
|
|
30
|
+
* type: 'implements',
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // クエリ
|
|
34
|
+
* const related = await db.query('REQ-001', { direction: 'forward' });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class TraceabilityDB {
|
|
38
|
+
private db;
|
|
39
|
+
private readonly _dbPath;
|
|
40
|
+
constructor(dbPath?: string);
|
|
41
|
+
/**
|
|
42
|
+
* データベーススキーマを初期化
|
|
43
|
+
*/
|
|
44
|
+
private initializeSchema;
|
|
45
|
+
/**
|
|
46
|
+
* ノードを追加
|
|
47
|
+
* @throws Error 既に同じIDのノードが存在する場合
|
|
48
|
+
*/
|
|
49
|
+
addNode(input: TraceNodeInput): Promise<TraceNode>;
|
|
50
|
+
/**
|
|
51
|
+
* ノードを取得
|
|
52
|
+
*/
|
|
53
|
+
getNode(id: string): Promise<TraceNode | null>;
|
|
54
|
+
/**
|
|
55
|
+
* ノードを更新
|
|
56
|
+
*/
|
|
57
|
+
updateNode(id: string, updates: Partial<TraceNode>): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* ノードを削除
|
|
60
|
+
*/
|
|
61
|
+
deleteNode(id: string): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* ノードを削除(deleteNodeのエイリアス)
|
|
64
|
+
*/
|
|
65
|
+
removeNode(id: string): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* リンクを追加
|
|
68
|
+
* @throws Error ソースまたはターゲットノードが存在しない場合
|
|
69
|
+
*/
|
|
70
|
+
addLink(link: Omit<TraceLink, 'id' | 'createdAt'> & {
|
|
71
|
+
id?: string;
|
|
72
|
+
createdAt?: Date;
|
|
73
|
+
}): Promise<TraceLink>;
|
|
74
|
+
/**
|
|
75
|
+
* リンクを取得
|
|
76
|
+
*/
|
|
77
|
+
getLink(id: string): Promise<TraceLink | null>;
|
|
78
|
+
/**
|
|
79
|
+
* ノード間のリンクを取得
|
|
80
|
+
*/
|
|
81
|
+
getLinksBetween(source: string, target: string): Promise<TraceLink[]>;
|
|
82
|
+
/**
|
|
83
|
+
* リンクを削除
|
|
84
|
+
*/
|
|
85
|
+
deleteLink(id: string): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* ノードをクエリ
|
|
88
|
+
*/
|
|
89
|
+
query(nodeId: string, options?: TraceQueryOptions): Promise<TraceQueryResult>;
|
|
90
|
+
/**
|
|
91
|
+
* 関連リンクを取得
|
|
92
|
+
*/
|
|
93
|
+
private getRelatedLinks;
|
|
94
|
+
/**
|
|
95
|
+
* タイプ別にノードを取得
|
|
96
|
+
*/
|
|
97
|
+
getNodesByType(type: TraceNodeType): Promise<TraceNode[]>;
|
|
98
|
+
/**
|
|
99
|
+
* 孤立ノードを取得
|
|
100
|
+
*/
|
|
101
|
+
getOrphanNodes(): Promise<TraceNode[]>;
|
|
102
|
+
/**
|
|
103
|
+
* 統計情報を取得
|
|
104
|
+
*/
|
|
105
|
+
getStats(): Promise<TraceDbStats>;
|
|
106
|
+
/**
|
|
107
|
+
* データベースを閉じる
|
|
108
|
+
*/
|
|
109
|
+
close(): void;
|
|
110
|
+
/**
|
|
111
|
+
* リンクIDを生成
|
|
112
|
+
*/
|
|
113
|
+
private generateLinkId;
|
|
114
|
+
/**
|
|
115
|
+
* DBの行をノードに変換
|
|
116
|
+
*/
|
|
117
|
+
private rowToNode;
|
|
118
|
+
/**
|
|
119
|
+
* DBの行をリンクに変換
|
|
120
|
+
*/
|
|
121
|
+
private rowToLink;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=TraceabilityDB.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TraceabilityDB.d.ts","sourceRoot":"","sources":["../../src/traceability/TraceabilityDB.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,SAAS,EAET,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,GAAE,MAAmB;IAMvC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoCxB;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;IAiCxD;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASpD;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BxE;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IA4ChH;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASpD;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAS3E;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkEvF;;OAEG;YACW,eAAe;IAoC7B;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAO/D;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAW5C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IA4CvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,SAAS;CAYlB"}
|