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.
Files changed (62) hide show
  1. package/README.md +137 -0
  2. package/dist/analyzer/annotationParser.d.ts +4 -0
  3. package/dist/analyzer/annotationParser.d.ts.map +1 -0
  4. package/dist/analyzer/annotationParser.js +34 -0
  5. package/dist/analyzer/annotationParser.js.map +1 -0
  6. package/dist/analyzer/callGraphBuilder.d.ts +4 -0
  7. package/dist/analyzer/callGraphBuilder.d.ts.map +1 -0
  8. package/dist/analyzer/callGraphBuilder.js +84 -0
  9. package/dist/analyzer/callGraphBuilder.js.map +1 -0
  10. package/dist/analyzer/functionAnalyzer.d.ts +3 -0
  11. package/dist/analyzer/functionAnalyzer.d.ts.map +1 -0
  12. package/dist/analyzer/functionAnalyzer.js +17 -0
  13. package/dist/analyzer/functionAnalyzer.js.map +1 -0
  14. package/dist/analyzer/types.d.ts +85 -0
  15. package/dist/analyzer/types.d.ts.map +1 -0
  16. package/dist/analyzer/types.js +2 -0
  17. package/dist/analyzer/types.js.map +1 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +71 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/generator/htmlGenerator.d.ts +6 -0
  23. package/dist/generator/htmlGenerator.d.ts.map +1 -0
  24. package/dist/generator/htmlGenerator.js +178 -0
  25. package/dist/generator/htmlGenerator.js.map +1 -0
  26. package/dist/generator/jsonGenerator.d.ts +6 -0
  27. package/dist/generator/jsonGenerator.d.ts.map +1 -0
  28. package/dist/generator/jsonGenerator.js +19 -0
  29. package/dist/generator/jsonGenerator.js.map +1 -0
  30. package/dist/generator/markdownGenerator.d.ts +7 -0
  31. package/dist/generator/markdownGenerator.d.ts.map +1 -0
  32. package/dist/generator/markdownGenerator.js +115 -0
  33. package/dist/generator/markdownGenerator.js.map +1 -0
  34. package/dist/generator/mermaidGenerator.d.ts +6 -0
  35. package/dist/generator/mermaidGenerator.d.ts.map +1 -0
  36. package/dist/generator/mermaidGenerator.js +102 -0
  37. package/dist/generator/mermaidGenerator.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +4 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/scanner/csharpParser.d.ts +7 -0
  43. package/dist/scanner/csharpParser.d.ts.map +1 -0
  44. package/dist/scanner/csharpParser.js +344 -0
  45. package/dist/scanner/csharpParser.js.map +1 -0
  46. package/dist/scanner/fileScanner.d.ts +6 -0
  47. package/dist/scanner/fileScanner.d.ts.map +1 -0
  48. package/dist/scanner/fileScanner.js +26 -0
  49. package/dist/scanner/fileScanner.js.map +1 -0
  50. package/dist/scanner/parserRegistry.d.ts +5 -0
  51. package/dist/scanner/parserRegistry.d.ts.map +1 -0
  52. package/dist/scanner/parserRegistry.js +15 -0
  53. package/dist/scanner/parserRegistry.js.map +1 -0
  54. package/dist/scanner/patterns.d.ts +20 -0
  55. package/dist/scanner/patterns.d.ts.map +1 -0
  56. package/dist/scanner/patterns.js +20 -0
  57. package/dist/scanner/patterns.js.map +1 -0
  58. package/dist/utils/logger.d.ts +7 -0
  59. package/dist/utils/logger.d.ts.map +1 -0
  60. package/dist/utils/logger.js +23 -0
  61. package/dist/utils/logger.js.map +1 -0
  62. 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,3 @@
1
+ import type { ScannedFile, DurableFunction, ILanguageParser } from "./types.js";
2
+ export declare function analyzeFiles(files: ScannedFile[], parsers: ILanguageParser[]): DurableFunction[];
3
+ //# sourceMappingURL=functionAnalyzer.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createProgram(): Command;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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,6 @@
1
+ import type { AnalysisResult, DepthMode } from "../analyzer/types.js";
2
+ export interface HtmlOptions {
3
+ depth?: DepthMode;
4
+ }
5
+ export declare function generateHtml(result: AnalysisResult, options?: HtmlOptions): string;
6
+ //# sourceMappingURL=htmlGenerator.d.ts.map
@@ -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"}