durable-map 0.1.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/README.md +137 -0
- package/dist/analyzer/annotationParser.d.ts +4 -0
- package/dist/analyzer/annotationParser.d.ts.map +1 -0
- package/dist/analyzer/annotationParser.js +34 -0
- package/dist/analyzer/annotationParser.js.map +1 -0
- package/dist/analyzer/callGraphBuilder.d.ts +4 -0
- package/dist/analyzer/callGraphBuilder.d.ts.map +1 -0
- package/dist/analyzer/callGraphBuilder.js +84 -0
- package/dist/analyzer/callGraphBuilder.js.map +1 -0
- package/dist/analyzer/functionAnalyzer.d.ts +3 -0
- package/dist/analyzer/functionAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/functionAnalyzer.js +17 -0
- package/dist/analyzer/functionAnalyzer.js.map +1 -0
- package/dist/analyzer/types.d.ts +85 -0
- package/dist/analyzer/types.d.ts.map +1 -0
- package/dist/analyzer/types.js +2 -0
- package/dist/analyzer/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +71 -0
- package/dist/cli.js.map +1 -0
- package/dist/generator/htmlGenerator.d.ts +6 -0
- package/dist/generator/htmlGenerator.d.ts.map +1 -0
- package/dist/generator/htmlGenerator.js +178 -0
- package/dist/generator/htmlGenerator.js.map +1 -0
- package/dist/generator/jsonGenerator.d.ts +6 -0
- package/dist/generator/jsonGenerator.d.ts.map +1 -0
- package/dist/generator/jsonGenerator.js +19 -0
- package/dist/generator/jsonGenerator.js.map +1 -0
- package/dist/generator/markdownGenerator.d.ts +7 -0
- package/dist/generator/markdownGenerator.d.ts.map +1 -0
- package/dist/generator/markdownGenerator.js +115 -0
- package/dist/generator/markdownGenerator.js.map +1 -0
- package/dist/generator/mermaidGenerator.d.ts +6 -0
- package/dist/generator/mermaidGenerator.d.ts.map +1 -0
- package/dist/generator/mermaidGenerator.js +102 -0
- package/dist/generator/mermaidGenerator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/scanner/csharpParser.d.ts +7 -0
- package/dist/scanner/csharpParser.d.ts.map +1 -0
- package/dist/scanner/csharpParser.js +344 -0
- package/dist/scanner/csharpParser.js.map +1 -0
- package/dist/scanner/fileScanner.d.ts +6 -0
- package/dist/scanner/fileScanner.d.ts.map +1 -0
- package/dist/scanner/fileScanner.js +26 -0
- package/dist/scanner/fileScanner.js.map +1 -0
- package/dist/scanner/parserRegistry.d.ts +5 -0
- package/dist/scanner/parserRegistry.d.ts.map +1 -0
- package/dist/scanner/parserRegistry.js +15 -0
- package/dist/scanner/parserRegistry.js.map +1 -0
- package/dist/scanner/patterns.d.ts +20 -0
- package/dist/scanner/patterns.d.ts.map +1 -0
- package/dist/scanner/patterns.js +20 -0
- package/dist/scanner/patterns.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +23 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# durable-map
|
|
2
|
+
|
|
3
|
+
Azure Durable Functions の C# プロジェクトを解析し、関数の呼び出し関係を Markdown / JSON / HTML + Mermaid で可視化する CLI ツール。
|
|
4
|
+
|
|
5
|
+
## インストール
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
npm run build
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 基本的な使い方
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx tsx src/index.ts <C#プロジェクトのパス> [options]
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
対象パスの `.cs` ファイルを再帰的にスキャンし、Durable Functions の定義(Client / Orchestrator / Activity / Entity)と呼び出し関係を解析します。
|
|
19
|
+
|
|
20
|
+
### 出力形式
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Markdown 出力(デフォルト)— stdout に出力
|
|
24
|
+
npx tsx src/index.ts ./MyFunctionsProject
|
|
25
|
+
|
|
26
|
+
# ファイルに保存
|
|
27
|
+
npx tsx src/index.ts ./MyFunctionsProject -o output.md
|
|
28
|
+
|
|
29
|
+
# HTML 出力(ブラウザで Mermaid 図をレンダリング)
|
|
30
|
+
npx tsx src/index.ts ./MyFunctionsProject -f html -o output.html
|
|
31
|
+
|
|
32
|
+
# JSON 出力(他ツールとの連携用)
|
|
33
|
+
npx tsx src/index.ts ./MyFunctionsProject -f json -o output.json
|
|
34
|
+
|
|
35
|
+
# Mermaid 図なしの Markdown
|
|
36
|
+
npx tsx src/index.ts ./MyFunctionsProject --no-mermaid
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 表示深度(`--depth`)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# shallow(デフォルト): Client → Orchestrator の関係のみ
|
|
43
|
+
npx tsx src/index.ts ./MyFunctionsProject
|
|
44
|
+
|
|
45
|
+
# deep: Client → Orchestrator → Activity まで表示
|
|
46
|
+
npx tsx src/index.ts ./MyFunctionsProject -d deep
|
|
47
|
+
|
|
48
|
+
# deep + HTML で全体像をブラウザ確認
|
|
49
|
+
npx tsx src/index.ts ./MyFunctionsProject -d deep -f html -o output.html
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
| Mode | 表示内容 |
|
|
53
|
+
|---|---|
|
|
54
|
+
| `shallow` (デフォルト) | Client → Orchestrator の呼び出し関係のみ |
|
|
55
|
+
| `deep` | Client → Orchestrator → Activity ノードまで表示。アノテーションで指定されたインフラ情報も含む |
|
|
56
|
+
|
|
57
|
+
### その他のオプション
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# 特定ディレクトリを除外
|
|
61
|
+
npx tsx src/index.ts ./MyFunctionsProject --exclude "**/Tests/**" "**/bin/**"
|
|
62
|
+
|
|
63
|
+
# 詳細ログ
|
|
64
|
+
npx tsx src/index.ts ./MyFunctionsProject -v
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### オプション一覧
|
|
68
|
+
|
|
69
|
+
| Option | Description |
|
|
70
|
+
|---|---|
|
|
71
|
+
| `-f, --format <format>` | 出力形式 (`markdown` \| `json` \| `html`) デフォルト: `markdown` |
|
|
72
|
+
| `-o, --output <file>` | 出力先ファイル (デフォルト: stdout) |
|
|
73
|
+
| `-d, --depth <mode>` | 表示深度 (`shallow` \| `deep`) デフォルト: `shallow` |
|
|
74
|
+
| `--exclude <patterns...>` | 除外パターン |
|
|
75
|
+
| `--no-mermaid` | Mermaid 図を生成しない |
|
|
76
|
+
| `-v, --verbose` | 詳細ログ |
|
|
77
|
+
|
|
78
|
+
## アノテーション
|
|
79
|
+
|
|
80
|
+
Activity 関数のコード内に `// @durable-map:infra` コメントを記述すると、`--depth deep` 使用時に Mermaid 図へインフラノード(DB・Queue 等)を表示できます。
|
|
81
|
+
|
|
82
|
+
```csharp
|
|
83
|
+
[Function("SaveOrderActivity")]
|
|
84
|
+
public async Task Run([ActivityTrigger] OrderData input)
|
|
85
|
+
{
|
|
86
|
+
// @durable-map:infra cosmosdb:orders "Order database"
|
|
87
|
+
// @durable-map:infra blob:receipts
|
|
88
|
+
await _container.CreateItemAsync(input);
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**書式:** `// @durable-map:infra <kind>:<resource> "<description>"`
|
|
93
|
+
|
|
94
|
+
| パラメータ | 必須 | 説明 |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `kind` | Yes | `cosmosdb` \| `blob` \| `queue` \| `table` \| `servicebus` \| `eventhub` \| `http` \| `sql` |
|
|
97
|
+
| `resource` | No | リソース名(コンテナ名、キュー名など) |
|
|
98
|
+
| `description` | No | 説明文(ダブルクォートで囲む) |
|
|
99
|
+
|
|
100
|
+
## Mermaid 図の手動編集
|
|
101
|
+
|
|
102
|
+
生成された Mermaid 図にインフラ層を手動で追記することもできます。
|
|
103
|
+
|
|
104
|
+
```mermaid
|
|
105
|
+
graph LR
|
|
106
|
+
HttpStart(["HttpStart"])
|
|
107
|
+
Orchestrator[["Orchestrator"]]
|
|
108
|
+
SaveOrder["SaveOrder"]
|
|
109
|
+
HttpStart -->|scheduleOrchestration| Orchestrator
|
|
110
|
+
Orchestrator -->|callActivity| SaveOrder
|
|
111
|
+
|
|
112
|
+
%% インフラ層(手動追記)
|
|
113
|
+
CosmosDB[("CosmosDB\norders")]
|
|
114
|
+
BlobStorage[("Blob\nuploads")]
|
|
115
|
+
SaveOrder -.->|cosmosdb| CosmosDB
|
|
116
|
+
SaveOrder -.->|blob| BlobStorage
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
ノード形状の目安:
|
|
120
|
+
|
|
121
|
+
| 種別 | Mermaid 記法 | 例 |
|
|
122
|
+
|---|---|---|
|
|
123
|
+
| DB 系 | `[("label")]` (シリンダー) | `CosmosDB[("CosmosDB")]` |
|
|
124
|
+
| Queue / Stream 系 | `[["label"]]` (二重四角) | `Queue[["Queue"]]` |
|
|
125
|
+
| 外部 API | `>"label"]` (非対称) | `API>"External API"]` |
|
|
126
|
+
|
|
127
|
+
## Development
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npm install
|
|
131
|
+
npm test
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Roadmap
|
|
135
|
+
|
|
136
|
+
- Mermaid 図の整形・レイアウト改善
|
|
137
|
+
- Azure Subscription 連携 (App Service Plan / App Service 名などのインフラ情報を出力に含める)
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { InfraUsage } from "./types.js";
|
|
2
|
+
export declare function parseAnnotations(text: string, startLine: number): InfraUsage[];
|
|
3
|
+
export declare function mergeWithAutoDetection(auto: InfraUsage[], annotations: InfraUsage[]): InfraUsage[];
|
|
4
|
+
//# sourceMappingURL=annotationParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotationParser.d.ts","sourceRoot":"","sources":["../../src/analyzer/annotationParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,YAAY,CAAC;AAQxD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAyB9E;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAUlG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const ANNOTATION_RE = /\/\/\s*@durable-map:infra\s+(\w+)(?::(\S+))?\s*(?:"([^"]*)")?/g;
|
|
2
|
+
const VALID_KINDS = new Set([
|
|
3
|
+
"cosmosdb", "blob", "queue", "table", "servicebus", "eventhub", "http", "sql",
|
|
4
|
+
]);
|
|
5
|
+
export function parseAnnotations(text, startLine) {
|
|
6
|
+
const usages = [];
|
|
7
|
+
const re = new RegExp(ANNOTATION_RE.source, ANNOTATION_RE.flags);
|
|
8
|
+
let m;
|
|
9
|
+
while ((m = re.exec(text)) !== null) {
|
|
10
|
+
const kind = m[1];
|
|
11
|
+
if (!VALID_KINDS.has(kind))
|
|
12
|
+
continue;
|
|
13
|
+
let line = startLine;
|
|
14
|
+
for (let i = 0; i < m.index; i++) {
|
|
15
|
+
if (text[i] === "\n")
|
|
16
|
+
line++;
|
|
17
|
+
}
|
|
18
|
+
usages.push({
|
|
19
|
+
kind,
|
|
20
|
+
resource: m[2] || undefined,
|
|
21
|
+
description: m[3] || undefined,
|
|
22
|
+
raw: m[0],
|
|
23
|
+
line,
|
|
24
|
+
source: "annotation",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return usages;
|
|
28
|
+
}
|
|
29
|
+
export function mergeWithAutoDetection(auto, annotations) {
|
|
30
|
+
const annotationKeys = new Set(annotations.map((a) => `${a.kind}:${a.resource ?? ""}`));
|
|
31
|
+
const filtered = auto.filter((a) => !annotationKeys.has(`${a.kind}:${a.resource ?? ""}`));
|
|
32
|
+
return [...filtered, ...annotations];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=annotationParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotationParser.js","sourceRoot":"","sources":["../../src/analyzer/annotationParser.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,gEAAgE,CAAC;AAEvF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAY;IACrC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK;CAC9E,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAiB;IAC9D,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACjE,IAAI,CAAyB,CAAC;IAE9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAc,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAErC,IAAI,IAAI,GAAG,SAAS,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,IAAI,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS;YAC3B,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS;YAC9B,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACT,IAAI;YACJ,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAkB,EAAE,WAAyB;IAClF,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CACxD,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAC5D,CAAC;IAEF,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DurableFunction, AnalysisResult } from "./types.js";
|
|
2
|
+
export declare function buildCallGraph(functions: DurableFunction[]): AnalysisResult;
|
|
3
|
+
export declare function enrichWithInfra(result: AnalysisResult): AnalysisResult;
|
|
4
|
+
//# sourceMappingURL=callGraphBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callGraphBuilder.d.ts","sourceRoot":"","sources":["../../src/analyzer/callGraphBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAY,cAAc,EAAwB,MAAM,YAAY,CAAC;AAGlG,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,cAAc,CAgD3E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CA6CtE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { parseAnnotations } from "./annotationParser.js";
|
|
2
|
+
export function buildCallGraph(functions) {
|
|
3
|
+
const warnings = [];
|
|
4
|
+
const nameIndex = new Map();
|
|
5
|
+
const classIndex = new Map();
|
|
6
|
+
for (const fn of functions) {
|
|
7
|
+
if (nameIndex.has(fn.name)) {
|
|
8
|
+
warnings.push(`Duplicate function name: "${fn.name}"`);
|
|
9
|
+
}
|
|
10
|
+
nameIndex.set(fn.name, fn);
|
|
11
|
+
if (fn.className) {
|
|
12
|
+
classIndex.set(fn.className, fn);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const edges = [];
|
|
16
|
+
for (const fn of functions) {
|
|
17
|
+
for (const call of fn.calls) {
|
|
18
|
+
const target = nameIndex.get(call.targetName) ?? classIndex.get(call.targetName);
|
|
19
|
+
if (target) {
|
|
20
|
+
edges.push({
|
|
21
|
+
from: fn.name,
|
|
22
|
+
to: target.name,
|
|
23
|
+
kind: call.kind,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
warnings.push(`Unresolved reference: "${fn.name}" calls "${call.targetName}" but no matching function found`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
functions,
|
|
33
|
+
edges,
|
|
34
|
+
infraNodes: [],
|
|
35
|
+
infraEdges: [],
|
|
36
|
+
warnings,
|
|
37
|
+
metadata: {
|
|
38
|
+
analyzedAt: new Date().toISOString(),
|
|
39
|
+
fileCount: new Set(functions.map((f) => f.filePath)).size,
|
|
40
|
+
functionCount: functions.length,
|
|
41
|
+
infraNodeCount: 0,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function enrichWithInfra(result) {
|
|
46
|
+
const infraNodeMap = new Map();
|
|
47
|
+
const infraEdges = [];
|
|
48
|
+
for (const fn of result.functions) {
|
|
49
|
+
if (fn.role !== "activity" || !fn.bodyText)
|
|
50
|
+
continue;
|
|
51
|
+
const bodyStartLine = fn.line;
|
|
52
|
+
const annotations = parseAnnotations(fn.bodyText, bodyStartLine);
|
|
53
|
+
fn.infraUsages = annotations;
|
|
54
|
+
for (const usage of annotations) {
|
|
55
|
+
const nodeId = usage.resource ? `${usage.kind}:${usage.resource}` : usage.kind;
|
|
56
|
+
if (!infraNodeMap.has(nodeId)) {
|
|
57
|
+
infraNodeMap.set(nodeId, {
|
|
58
|
+
id: nodeId,
|
|
59
|
+
kind: usage.kind,
|
|
60
|
+
resource: usage.resource,
|
|
61
|
+
description: usage.description,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
infraEdges.push({
|
|
65
|
+
from: fn.name,
|
|
66
|
+
to: nodeId,
|
|
67
|
+
kind: "usesInfra",
|
|
68
|
+
infraKind: usage.kind,
|
|
69
|
+
resource: usage.resource,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const infraNodes = Array.from(infraNodeMap.values());
|
|
74
|
+
return {
|
|
75
|
+
...result,
|
|
76
|
+
infraNodes,
|
|
77
|
+
infraEdges,
|
|
78
|
+
metadata: {
|
|
79
|
+
...result.metadata,
|
|
80
|
+
infraNodeCount: infraNodes.length,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=callGraphBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callGraphBuilder.js","sourceRoot":"","sources":["../../src/analyzer/callGraphBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functionAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/functionAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhF,wBAAgB,YAAY,CAC1B,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,eAAe,EAAE,GACzB,eAAe,EAAE,CAanB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function analyzeFiles(files, parsers) {
|
|
2
|
+
const functions = [];
|
|
3
|
+
for (const file of files) {
|
|
4
|
+
const ext = getExtension(file.path);
|
|
5
|
+
const parser = parsers.find((p) => p.fileExtensions.includes(ext));
|
|
6
|
+
if (!parser)
|
|
7
|
+
continue;
|
|
8
|
+
const parsed = parser.parseFunctions(file);
|
|
9
|
+
functions.push(...parsed);
|
|
10
|
+
}
|
|
11
|
+
return functions;
|
|
12
|
+
}
|
|
13
|
+
function getExtension(filePath) {
|
|
14
|
+
const dot = filePath.lastIndexOf(".");
|
|
15
|
+
return dot === -1 ? "" : filePath.substring(dot);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=functionAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functionAnalyzer.js","sourceRoot":"","sources":["../../src/analyzer/functionAnalyzer.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAC1B,KAAoB,EACpB,OAA0B;IAE1B,MAAM,SAAS,GAAsB,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export type TriggerKind = "http" | "orchestration" | "activity" | "entity" | "timer" | "queue" | "blob" | "durableClient";
|
|
2
|
+
export type FunctionRole = "orchestrator" | "activity" | "entity" | "client" | "unknown";
|
|
3
|
+
export type CallKind = "callActivity" | "callSubOrchestrator" | "scheduleOrchestration" | "callEntity";
|
|
4
|
+
export type FunctionStyle = "attribute" | "class-based";
|
|
5
|
+
export type InfraKind = "cosmosdb" | "blob" | "queue" | "table" | "servicebus" | "eventhub" | "http" | "sql";
|
|
6
|
+
export type DepthMode = "shallow" | "deep";
|
|
7
|
+
export interface InfraUsage {
|
|
8
|
+
kind: InfraKind;
|
|
9
|
+
resource?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
raw: string;
|
|
12
|
+
line: number;
|
|
13
|
+
source: "auto" | "annotation";
|
|
14
|
+
}
|
|
15
|
+
export interface InfraNode {
|
|
16
|
+
id: string;
|
|
17
|
+
kind: InfraKind;
|
|
18
|
+
resource?: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface InfraEdge {
|
|
22
|
+
from: string;
|
|
23
|
+
to: string;
|
|
24
|
+
kind: "usesInfra";
|
|
25
|
+
infraKind: InfraKind;
|
|
26
|
+
resource?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface TriggerInfo {
|
|
29
|
+
kind: TriggerKind;
|
|
30
|
+
raw: string;
|
|
31
|
+
httpMethods?: string[];
|
|
32
|
+
route?: string;
|
|
33
|
+
authLevel?: string;
|
|
34
|
+
schedule?: string;
|
|
35
|
+
queueName?: string;
|
|
36
|
+
blobPath?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface CallInfo {
|
|
39
|
+
kind: CallKind;
|
|
40
|
+
targetName: string;
|
|
41
|
+
returnType?: string;
|
|
42
|
+
raw: string;
|
|
43
|
+
line: number;
|
|
44
|
+
}
|
|
45
|
+
export interface DurableFunction {
|
|
46
|
+
name: string;
|
|
47
|
+
style: FunctionStyle;
|
|
48
|
+
role: FunctionRole;
|
|
49
|
+
triggers: TriggerInfo[];
|
|
50
|
+
calls: CallInfo[];
|
|
51
|
+
infraUsages: InfraUsage[];
|
|
52
|
+
className?: string;
|
|
53
|
+
filePath: string;
|
|
54
|
+
line: number;
|
|
55
|
+
bodyText?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface CallEdge {
|
|
58
|
+
from: string;
|
|
59
|
+
to: string;
|
|
60
|
+
kind: CallKind;
|
|
61
|
+
}
|
|
62
|
+
export interface AnalysisResult {
|
|
63
|
+
functions: DurableFunction[];
|
|
64
|
+
edges: CallEdge[];
|
|
65
|
+
infraNodes: InfraNode[];
|
|
66
|
+
infraEdges: InfraEdge[];
|
|
67
|
+
warnings: string[];
|
|
68
|
+
metadata: {
|
|
69
|
+
analyzedAt: string;
|
|
70
|
+
fileCount: number;
|
|
71
|
+
functionCount: number;
|
|
72
|
+
infraNodeCount: number;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export interface ScannedFile {
|
|
76
|
+
path: string;
|
|
77
|
+
absolutePath: string;
|
|
78
|
+
content: string;
|
|
79
|
+
}
|
|
80
|
+
export interface ILanguageParser {
|
|
81
|
+
language: string;
|
|
82
|
+
fileExtensions: string[];
|
|
83
|
+
parseFunctions(file: ScannedFile): DurableFunction[];
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analyzer/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analyzer/types.ts"],"names":[],"mappings":""}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,aAAa,IAAI,OAAO,CAmEvC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { writeFile } from "node:fs/promises";
|
|
4
|
+
import { scanFiles } from "./scanner/fileScanner.js";
|
|
5
|
+
import { getRegisteredExtensions } from "./scanner/parserRegistry.js";
|
|
6
|
+
import { CSharpParser } from "./scanner/csharpParser.js";
|
|
7
|
+
import { analyzeFiles } from "./analyzer/functionAnalyzer.js";
|
|
8
|
+
import { buildCallGraph, enrichWithInfra } from "./analyzer/callGraphBuilder.js";
|
|
9
|
+
import { generateMarkdown } from "./generator/markdownGenerator.js";
|
|
10
|
+
import { generateJson } from "./generator/jsonGenerator.js";
|
|
11
|
+
import { generateHtml } from "./generator/htmlGenerator.js";
|
|
12
|
+
import { setVerbose, info, success, warn, verbose } from "./utils/logger.js";
|
|
13
|
+
export function createProgram() {
|
|
14
|
+
const program = new Command();
|
|
15
|
+
program
|
|
16
|
+
.name("durable-map")
|
|
17
|
+
.description("Azure Durable Functions の構成を Markdown + Mermaid で可視化する CLI ツール")
|
|
18
|
+
.version("0.1.0")
|
|
19
|
+
.argument("<path>", "C# プロジェクトのパス")
|
|
20
|
+
.option("-o, --output <file>", "出力先ファイル (デフォルト: stdout)")
|
|
21
|
+
.option("-f, --format <format>", "出力形式 (markdown | json | html)", "markdown")
|
|
22
|
+
.option("-d, --depth <mode>", "表示の深さ (shallow | deep)", "shallow")
|
|
23
|
+
.option("--exclude <patterns...>", "除外パターン")
|
|
24
|
+
.option("--no-mermaid", "Mermaid 図を生成しない")
|
|
25
|
+
.option("-v, --verbose", "詳細ログ")
|
|
26
|
+
.action(async (inputPath, opts) => {
|
|
27
|
+
if (opts.verbose)
|
|
28
|
+
setVerbose(true);
|
|
29
|
+
const absPath = resolve(inputPath);
|
|
30
|
+
const depth = opts.depth === "deep" ? "deep" : "shallow";
|
|
31
|
+
verbose(`Scanning: ${absPath}`);
|
|
32
|
+
const extensions = getRegisteredExtensions();
|
|
33
|
+
const files = await scanFiles(absPath, extensions, {
|
|
34
|
+
exclude: opts.exclude,
|
|
35
|
+
});
|
|
36
|
+
if (files.length === 0) {
|
|
37
|
+
warn("No files found.");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
info(`Found ${files.length} file(s)`);
|
|
41
|
+
const parser = new CSharpParser();
|
|
42
|
+
const functions = analyzeFiles(files, [parser]);
|
|
43
|
+
verbose(`Parsed ${functions.length} function(s)`);
|
|
44
|
+
let result = buildCallGraph(functions);
|
|
45
|
+
if (depth === "deep") {
|
|
46
|
+
result = enrichWithInfra(result);
|
|
47
|
+
}
|
|
48
|
+
for (const w of result.warnings) {
|
|
49
|
+
warn(w);
|
|
50
|
+
}
|
|
51
|
+
let output;
|
|
52
|
+
if (opts.format === "json") {
|
|
53
|
+
output = generateJson(result, true, { depth });
|
|
54
|
+
}
|
|
55
|
+
else if (opts.format === "html") {
|
|
56
|
+
output = generateHtml(result, { depth });
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
output = generateMarkdown(result, { includeMermaid: opts.mermaid, depth });
|
|
60
|
+
}
|
|
61
|
+
if (opts.output) {
|
|
62
|
+
await writeFile(opts.output, output, "utf-8");
|
|
63
|
+
success(`Output written to ${opts.output}`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
process.stdout.write(output);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return program;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG7E,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,aAAa,CAAC;SACnB,WAAW,CACV,gEAAgE,CACjE;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;SACxD,MAAM,CAAC,uBAAuB,EAAE,+BAA+B,EAAE,UAAU,CAAC;SAC5E,MAAM,CAAC,oBAAoB,EAAE,wBAAwB,EAAE,SAAS,CAAC;SACjE,MAAM,CAAC,yBAAyB,EAAE,QAAQ,CAAC;SAC3C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;SACzC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,IAAI,EAAE,EAAE;QACxC,IAAI,IAAI,CAAC,OAAO;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAEnC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,KAAK,GAAc,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,OAAO,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;QAEhC,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE;YACjD,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,UAAU,SAAS,CAAC,MAAM,cAAc,CAAC,CAAC;QAElD,IAAI,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,CAAC,CAAC;QACV,CAAC;QAED,IAAI,MAAc,CAAC;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAClC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,CAAC,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htmlGenerator.d.ts","sourceRoot":"","sources":["../../src/generator/htmlGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAgB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAkBpF,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAwID,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CA6CtF"}
|