durable-map 0.1.1 → 0.1.3
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/LICENSE +21 -0
- package/README.md +132 -91
- package/dist/analyzer/annotationParser.d.ts.map +1 -1
- package/dist/analyzer/annotationParser.js +0 -5
- package/dist/analyzer/annotationParser.js.map +1 -1
- package/dist/analyzer/autoDetector.d.ts +3 -0
- package/dist/analyzer/autoDetector.d.ts.map +1 -0
- package/dist/analyzer/autoDetector.js +39 -0
- package/dist/analyzer/autoDetector.js.map +1 -0
- package/dist/analyzer/callGraphBuilder.d.ts +2 -1
- package/dist/analyzer/callGraphBuilder.d.ts.map +1 -1
- package/dist/analyzer/callGraphBuilder.js +29 -7
- package/dist/analyzer/callGraphBuilder.js.map +1 -1
- package/dist/analyzer/types.d.ts +3 -2
- package/dist/analyzer/types.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +41 -6
- package/dist/cli.js.map +1 -1
- package/dist/config/configManager.d.ts +14 -0
- package/dist/config/configManager.d.ts.map +1 -0
- package/dist/config/configManager.js +61 -0
- package/dist/config/configManager.js.map +1 -0
- package/dist/generator/htmlGenerator.d.ts.map +1 -1
- package/dist/generator/htmlGenerator.js +53 -20
- package/dist/generator/htmlGenerator.js.map +1 -1
- package/dist/generator/jsonGenerator.d.ts.map +1 -1
- package/dist/generator/jsonGenerator.js +10 -5
- package/dist/generator/jsonGenerator.js.map +1 -1
- package/dist/generator/markdownGenerator.d.ts.map +1 -1
- package/dist/generator/markdownGenerator.js +44 -17
- package/dist/generator/markdownGenerator.js.map +1 -1
- package/dist/generator/mermaidGenerator.d.ts +5 -0
- package/dist/generator/mermaidGenerator.d.ts.map +1 -1
- package/dist/generator/mermaidGenerator.js +142 -14
- package/dist/generator/mermaidGenerator.js.map +1 -1
- package/package.json +31 -5
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Taishi Yamashita
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,137 +1,178 @@
|
|
|
1
1
|
# durable-map
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/durable-map)
|
|
4
|
+
[](https://www.npmjs.com/package/durable-map)
|
|
5
|
+
[](https://github.com/taishiyamashita1114/durable-map/blob/main/LICENSE)
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
> Analyze Azure Durable Functions projects and auto-generate documentation with Mermaid flow diagrams.
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
Azure Durable Functions の構成を静的解析し、トリガー → オーケストレーター → アクティビティ → インフラ層の呼び出し関係をドキュメントと Mermaid フローチャートで自動生成する CLI ツール。
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- C# isolated worker model の自動解析
|
|
14
|
+
- Mermaid フローチャートの自動生成
|
|
15
|
+
- Markdown / JSON / HTML ドキュメントの自動生成
|
|
16
|
+
- トリガー → オーケストレーター → アクティビティの呼び出し関係を可視化
|
|
17
|
+
- インフラ層の自動検出 + `.durable-map.yml` による設定管理
|
|
18
|
+
- `@durable-map:infra` アノテーションによる手動補完
|
|
19
|
+
|
|
20
|
+
## Output Example
|
|
21
|
+
|
|
22
|
+
```mermaid
|
|
23
|
+
graph LR
|
|
24
|
+
A(["HTTP POST /api/order"]) --> B[["Orchestrator: ProcessOrder"]]
|
|
25
|
+
B -->|activity| C["ValidateOrder"]
|
|
26
|
+
B -->|activity| D["ChargePayment"]
|
|
27
|
+
B -->|activity| E["SendConfirmation"]
|
|
28
|
+
C -.->|SQL| F[("SQL:orders-db")]
|
|
29
|
+
D -.->|HTTP| G["HTTP:stripe-api"]
|
|
30
|
+
E -.->|Email| H["Email:sendgrid"]
|
|
10
31
|
```
|
|
11
32
|
|
|
12
|
-
##
|
|
33
|
+
## Quick Start
|
|
13
34
|
|
|
14
35
|
```bash
|
|
15
|
-
npx
|
|
36
|
+
npx durable-map ./path/to/azure-functions-project
|
|
16
37
|
```
|
|
17
38
|
|
|
18
|
-
|
|
39
|
+
### 2-Step Workflow
|
|
19
40
|
|
|
20
|
-
|
|
41
|
+
**Step 1**: 初回実行 — 解析 + `.durable-map.yml` の自動生成
|
|
21
42
|
|
|
22
43
|
```bash
|
|
23
|
-
|
|
24
|
-
|
|
44
|
+
npx durable-map ./path/to/project -o docs/durable-map.md
|
|
45
|
+
```
|
|
25
46
|
|
|
26
|
-
|
|
27
|
-
|
|
47
|
+
初回実行時に解析対象ディレクトリに `.durable-map.yml` が生成されます。
|
|
48
|
+
自動検出された Azure SDK パターンは自動で埋まり、検出できなかったアクティビティは空欄になります。
|
|
28
49
|
|
|
29
|
-
|
|
30
|
-
|
|
50
|
+
```
|
|
51
|
+
🔍 Scanning .cs files...
|
|
52
|
+
📦 Found 36 functions (12 Client, 6 Orchestrator, 18 Activities)
|
|
53
|
+
✅ Generated: .durable-map.yml
|
|
54
|
+
⚠️ 以下のアクティビティのインフラ層が未設定です:
|
|
55
|
+
- ChargePayment
|
|
56
|
+
- SendConfirmation
|
|
57
|
+
→ .durable-map.yml を編集して再実行してください
|
|
58
|
+
```
|
|
31
59
|
|
|
32
|
-
|
|
33
|
-
|
|
60
|
+
**Step 2**: `.durable-map.yml` を編集して再実行
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
# .durable-map.yml
|
|
64
|
+
infrastructure:
|
|
65
|
+
ValidateOrder:
|
|
66
|
+
- type: SQL
|
|
67
|
+
resource: orders-db
|
|
68
|
+
description: Validate order data
|
|
69
|
+
ChargePayment:
|
|
70
|
+
- type: HTTP
|
|
71
|
+
resource: stripe-api
|
|
72
|
+
description: Process payment via Stripe
|
|
73
|
+
SendConfirmation:
|
|
74
|
+
- type: Email
|
|
75
|
+
resource: sendgrid
|
|
76
|
+
description: Send confirmation email
|
|
77
|
+
```
|
|
34
78
|
|
|
35
|
-
|
|
36
|
-
npx
|
|
79
|
+
```bash
|
|
80
|
+
npx durable-map ./path/to/project -o docs/durable-map.md
|
|
37
81
|
```
|
|
38
82
|
|
|
39
|
-
|
|
83
|
+
設定済みのインフラ情報が Mermaid 図とドキュメントに反映されます。
|
|
84
|
+
|
|
85
|
+
## Options
|
|
40
86
|
|
|
41
87
|
```bash
|
|
42
|
-
|
|
43
|
-
npx tsx src/index.ts ./MyFunctionsProject
|
|
88
|
+
durable-map ./path/to/project -o ./docs/durable-map.md
|
|
44
89
|
|
|
45
|
-
|
|
46
|
-
npx tsx src/index.ts ./MyFunctionsProject -d deep
|
|
90
|
+
durable-map ./path/to/project --format json
|
|
47
91
|
|
|
48
|
-
|
|
49
|
-
|
|
92
|
+
durable-map ./path/to/project --format html -o output.html
|
|
93
|
+
|
|
94
|
+
durable-map ./path/to/project --depth shallow
|
|
50
95
|
```
|
|
51
96
|
|
|
52
|
-
|
|
|
97
|
+
| Option | Description |
|
|
53
98
|
|---|---|
|
|
54
|
-
| `
|
|
55
|
-
|
|
|
99
|
+
| `-f, --format <format>` | Output format (`markdown` \| `json` \| `html`) Default: `markdown` |
|
|
100
|
+
| `-o, --output <file>` | Output file (default: stdout) |
|
|
101
|
+
| `-d, --depth <mode>` | Display depth (`shallow` \| `deep`) Default: `deep` |
|
|
102
|
+
| `--exclude <patterns...>` | Exclude patterns |
|
|
103
|
+
| `--no-mermaid` | Disable Mermaid diagram generation |
|
|
104
|
+
| `-v, --verbose` | Verbose logging |
|
|
56
105
|
|
|
57
|
-
|
|
106
|
+
## Infrastructure Detection
|
|
58
107
|
|
|
59
|
-
|
|
60
|
-
# 特定ディレクトリを除外
|
|
61
|
-
npx tsx src/index.ts ./MyFunctionsProject --exclude "**/Tests/**" "**/bin/**"
|
|
108
|
+
### Auto-Detection
|
|
62
109
|
|
|
63
|
-
|
|
64
|
-
npx tsx src/index.ts ./MyFunctionsProject -v
|
|
65
|
-
```
|
|
110
|
+
Activities are scanned for Azure SDK client usage:
|
|
66
111
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
| Option | Description |
|
|
112
|
+
| Pattern | Type |
|
|
70
113
|
|---|---|
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
|
114
|
+
| `CosmosClient`, `CosmosContainer` | CosmosDB |
|
|
115
|
+
| `BlobServiceClient`, `BlobContainerClient` | BlobStorage |
|
|
116
|
+
| `QueueClient`, `QueueServiceClient` | Queue |
|
|
117
|
+
| `TableClient`, `TableServiceClient` | TableStorage |
|
|
118
|
+
| `ServiceBusClient`, `ServiceBusSender` | ServiceBus |
|
|
119
|
+
| `EventHubProducerClient`, `EventHubConsumerClient` | EventHub |
|
|
120
|
+
| `HttpClient`, `IHttpClientFactory` | HTTP |
|
|
121
|
+
| `SqlConnection`, `SqlCommand` | SQL |
|
|
122
|
+
| `IConnectionMultiplexer`, `ConnectionMultiplexer` | Redis |
|
|
123
|
+
| `SendGridClient`, `SmtpClient` | Email |
|
|
124
|
+
|
|
125
|
+
### `.durable-map.yml` Config
|
|
126
|
+
|
|
127
|
+
自動検出できないインフラ依存関係は `.durable-map.yml` で設定できます。
|
|
128
|
+
`type` には任意の文字列が使えます(上記のビルトインパターンに限定されません)。
|
|
129
|
+
|
|
130
|
+
```yaml
|
|
131
|
+
infrastructure:
|
|
132
|
+
MyActivity:
|
|
133
|
+
- type: LogAnalytics
|
|
134
|
+
resource: workspace-name
|
|
135
|
+
description: Query security logs
|
|
136
|
+
- type: SQL
|
|
137
|
+
resource: my-db
|
|
138
|
+
description: Store analysis results
|
|
139
|
+
```
|
|
77
140
|
|
|
78
|
-
|
|
141
|
+
### `@durable-map:infra` Annotation
|
|
79
142
|
|
|
80
|
-
|
|
143
|
+
コード内にアノテーションを直接記述することもできます:
|
|
81
144
|
|
|
82
145
|
```csharp
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
{
|
|
86
|
-
// @durable-map:infra cosmosdb:orders "Order database"
|
|
87
|
-
// @durable-map:infra blob:receipts
|
|
88
|
-
await _container.CreateItemAsync(input);
|
|
89
|
-
}
|
|
146
|
+
// @durable-map:infra SQL:orders "Order database"
|
|
147
|
+
// @durable-map:infra HTTP:stripe-api
|
|
148
|
+
public class SaveOrder : TaskActivity<OrderData, bool> { ... }
|
|
90
149
|
```
|
|
91
150
|
|
|
92
|
-
|
|
151
|
+
### Priority
|
|
93
152
|
|
|
94
|
-
|
|
95
|
-
|---|---|---|
|
|
96
|
-
| `kind` | Yes | `cosmosdb` \| `blob` \| `queue` \| `table` \| `servicebus` \| `eventhub` \| `http` \| `sql` |
|
|
97
|
-
| `resource` | No | リソース名(コンテナ名、キュー名など) |
|
|
98
|
-
| `description` | No | 説明文(ダブルクォートで囲む) |
|
|
153
|
+
config (`.durable-map.yml`) > annotation (`@durable-map:infra`) > auto-detection
|
|
99
154
|
|
|
100
|
-
##
|
|
155
|
+
## Supported Languages
|
|
101
156
|
|
|
102
|
-
|
|
157
|
+
| Language | Model | Status |
|
|
158
|
+
|----------|-------|--------|
|
|
159
|
+
| C# | isolated worker | Supported |
|
|
160
|
+
| Python | V2 | Planned |
|
|
161
|
+
| TypeScript | V4 | Planned |
|
|
103
162
|
|
|
104
|
-
|
|
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
|
-
```
|
|
163
|
+
## How It Works
|
|
118
164
|
|
|
119
|
-
|
|
165
|
+
1. Recursively scans `.cs` files in the target directory
|
|
166
|
+
2. Detects `[Function]`, `[HttpTrigger]`, `[OrchestrationTrigger]`, `[ActivityTrigger]` attributes
|
|
167
|
+
3. Analyzes `CallActivityAsync`, `CallSubOrchestratorAsync` call patterns
|
|
168
|
+
4. Auto-detects Azure SDK usage in activity bodies
|
|
169
|
+
5. Loads `.durable-map.yml` config for manual infrastructure mapping
|
|
170
|
+
6. Builds a call graph and outputs Markdown + Mermaid / JSON / HTML
|
|
120
171
|
|
|
121
|
-
|
|
122
|
-
|---|---|---|
|
|
123
|
-
| DB 系 | `[("label")]` (シリンダー) | `CosmosDB[("CosmosDB")]` |
|
|
124
|
-
| Queue / Stream 系 | `[["label"]]` (二重四角) | `Queue[["Queue"]]` |
|
|
125
|
-
| 外部 API | `>"label"]` (非対称) | `API>"External API"]` |
|
|
172
|
+
## Feedback / Contact
|
|
126
173
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
npm install
|
|
131
|
-
npm test
|
|
132
|
-
```
|
|
174
|
+
[Contact Form](https://forms.gle/2VvCjT3EDesHJsBU8)
|
|
133
175
|
|
|
134
|
-
##
|
|
176
|
+
## License
|
|
135
177
|
|
|
136
|
-
|
|
137
|
-
- Azure Subscription 連携 (App Service Plan / App Service 名などのインフラ情報を出力に含める)
|
|
178
|
+
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotationParser.d.ts","sourceRoot":"","sources":["../../src/analyzer/annotationParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"annotationParser.d.ts","sourceRoot":"","sources":["../../src/analyzer/annotationParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAwB9E;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAUlG"}
|
|
@@ -1,15 +1,10 @@
|
|
|
1
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
2
|
export function parseAnnotations(text, startLine) {
|
|
6
3
|
const usages = [];
|
|
7
4
|
const re = new RegExp(ANNOTATION_RE.source, ANNOTATION_RE.flags);
|
|
8
5
|
let m;
|
|
9
6
|
while ((m = re.exec(text)) !== null) {
|
|
10
7
|
const kind = m[1];
|
|
11
|
-
if (!VALID_KINDS.has(kind))
|
|
12
|
-
continue;
|
|
13
8
|
let line = startLine;
|
|
14
9
|
for (let i = 0; i < m.index; i++) {
|
|
15
10
|
if (text[i] === "\n")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotationParser.js","sourceRoot":"","sources":["../../src/analyzer/annotationParser.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,gEAAgE,CAAC;AAEvF,MAAM,
|
|
1
|
+
{"version":3,"file":"annotationParser.js","sourceRoot":"","sources":["../../src/analyzer/annotationParser.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,gEAAgE,CAAC;AAEvF,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;QAElB,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 @@
|
|
|
1
|
+
{"version":3,"file":"autoDetector.d.ts","sourceRoot":"","sources":["../../src/analyzer/autoDetector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAe7C,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CA4BnF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const PATTERNS = [
|
|
2
|
+
[/\bCosmosClient\b|\bCosmosContainer\b|\bContainer\s*=\s*.*\.GetContainer\b/, "CosmosDB"],
|
|
3
|
+
[/\bBlobServiceClient\b|\bBlobContainerClient\b|\bBlobClient\b/, "BlobStorage"],
|
|
4
|
+
[/\bQueueClient\b|\bQueueServiceClient\b/, "Queue"],
|
|
5
|
+
[/\bTableClient\b|\bTableServiceClient\b/, "TableStorage"],
|
|
6
|
+
[/\bServiceBusClient\b|\bServiceBusSender\b|\bServiceBusReceiver\b/, "ServiceBus"],
|
|
7
|
+
[/\bEventHubProducerClient\b|\bEventHubConsumerClient\b/, "EventHub"],
|
|
8
|
+
[/\bHttpClient\b|\bIHttpClientFactory\b/, "HTTP"],
|
|
9
|
+
[/\bSqlConnection\b|\bSqlCommand\b/, "SQL"],
|
|
10
|
+
[/\bIConnectionMultiplexer\b|\bIDatabase\b|\bConnectionMultiplexer\b/, "Redis"],
|
|
11
|
+
[/\bSendGridClient\b|\bSmtpClient\b|\bMailMessage\b/, "Email"],
|
|
12
|
+
];
|
|
13
|
+
export function detectInfraUsages(bodyText, startLine) {
|
|
14
|
+
const usages = [];
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
for (const [pattern, kind] of PATTERNS) {
|
|
17
|
+
const re = new RegExp(pattern.source, pattern.flags + "g");
|
|
18
|
+
let m;
|
|
19
|
+
while ((m = re.exec(bodyText)) !== null) {
|
|
20
|
+
if (seen.has(kind))
|
|
21
|
+
continue;
|
|
22
|
+
seen.add(kind);
|
|
23
|
+
let line = startLine;
|
|
24
|
+
for (let i = 0; i < m.index; i++) {
|
|
25
|
+
if (bodyText[i] === "\n")
|
|
26
|
+
line++;
|
|
27
|
+
}
|
|
28
|
+
usages.push({
|
|
29
|
+
kind,
|
|
30
|
+
raw: m[0],
|
|
31
|
+
line,
|
|
32
|
+
source: "auto",
|
|
33
|
+
});
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return usages;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=autoDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoDetector.js","sourceRoot":"","sources":["../../src/analyzer/autoDetector.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAuB;IACnC,CAAC,2EAA2E,EAAE,UAAU,CAAC;IACzF,CAAC,8DAA8D,EAAE,aAAa,CAAC;IAC/E,CAAC,wCAAwC,EAAE,OAAO,CAAC;IACnD,CAAC,wCAAwC,EAAE,cAAc,CAAC;IAC1D,CAAC,kEAAkE,EAAE,YAAY,CAAC;IAClF,CAAC,uDAAuD,EAAE,UAAU,CAAC;IACrE,CAAC,uCAAuC,EAAE,MAAM,CAAC;IACjD,CAAC,kCAAkC,EAAE,KAAK,CAAC;IAC3C,CAAC,oEAAoE,EAAE,OAAO,CAAC;IAC/E,CAAC,mDAAmD,EAAE,OAAO,CAAC;CAC/D,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,SAAiB;IACnE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;QAC3D,IAAI,CAAyB,CAAC;QAE9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEf,IAAI,IAAI,GAAG,SAAS,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI;oBAAE,IAAI,EAAE,CAAC;YACnC,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBACT,IAAI;gBACJ,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DurableFunction, AnalysisResult } from "./types.js";
|
|
2
|
+
import type { DurableMapConfig } from "../config/configManager.js";
|
|
2
3
|
export declare function buildCallGraph(functions: DurableFunction[]): AnalysisResult;
|
|
3
|
-
export declare function enrichWithInfra(result: AnalysisResult): AnalysisResult;
|
|
4
|
+
export declare function enrichWithInfra(result: AnalysisResult, config?: DurableMapConfig | null): AnalysisResult;
|
|
4
5
|
//# sourceMappingURL=callGraphBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callGraphBuilder.d.ts","sourceRoot":"","sources":["../../src/analyzer/callGraphBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAY,cAAc,
|
|
1
|
+
{"version":3,"file":"callGraphBuilder.d.ts","sourceRoot":"","sources":["../../src/analyzer/callGraphBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAY,cAAc,EAAoC,MAAM,YAAY,CAAC;AAG9G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,cAAc,CAgD3E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,GAAE,gBAAgB,GAAG,IAAW,GAAG,cAAc,CAkE9G"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { parseAnnotations } from "./annotationParser.js";
|
|
1
|
+
import { parseAnnotations, mergeWithAutoDetection } from "./annotationParser.js";
|
|
2
|
+
import { detectInfraUsages } from "./autoDetector.js";
|
|
2
3
|
export function buildCallGraph(functions) {
|
|
3
4
|
const warnings = [];
|
|
4
5
|
const nameIndex = new Map();
|
|
@@ -42,16 +43,36 @@ export function buildCallGraph(functions) {
|
|
|
42
43
|
},
|
|
43
44
|
};
|
|
44
45
|
}
|
|
45
|
-
export function enrichWithInfra(result) {
|
|
46
|
+
export function enrichWithInfra(result, config = null) {
|
|
46
47
|
const infraNodeMap = new Map();
|
|
47
48
|
const infraEdges = [];
|
|
49
|
+
const autoDetectedMap = new Map();
|
|
48
50
|
for (const fn of result.functions) {
|
|
49
|
-
if (fn.role !== "activity"
|
|
51
|
+
if (fn.role !== "activity")
|
|
50
52
|
continue;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
let usages = [];
|
|
54
|
+
if (config && config.infrastructure[fn.name]) {
|
|
55
|
+
const entries = config.infrastructure[fn.name];
|
|
56
|
+
usages = entries
|
|
57
|
+
.filter((e) => e.type !== "")
|
|
58
|
+
.map((e) => ({
|
|
59
|
+
kind: e.type,
|
|
60
|
+
resource: e.resource || undefined,
|
|
61
|
+
description: e.description || undefined,
|
|
62
|
+
raw: `config:${e.type}`,
|
|
63
|
+
line: fn.line,
|
|
64
|
+
source: "config",
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
else if (fn.bodyText) {
|
|
68
|
+
const bodyStartLine = fn.line;
|
|
69
|
+
const auto = detectInfraUsages(fn.bodyText, bodyStartLine);
|
|
70
|
+
const annotations = parseAnnotations(fn.bodyText, bodyStartLine);
|
|
71
|
+
usages = mergeWithAutoDetection(auto, annotations);
|
|
72
|
+
autoDetectedMap.set(fn.name, auto);
|
|
73
|
+
}
|
|
74
|
+
fn.infraUsages = usages;
|
|
75
|
+
for (const usage of usages) {
|
|
55
76
|
const nodeId = usage.resource ? `${usage.kind}:${usage.resource}` : usage.kind;
|
|
56
77
|
if (!infraNodeMap.has(nodeId)) {
|
|
57
78
|
infraNodeMap.set(nodeId, {
|
|
@@ -75,6 +96,7 @@ export function enrichWithInfra(result) {
|
|
|
75
96
|
...result,
|
|
76
97
|
infraNodes,
|
|
77
98
|
infraEdges,
|
|
99
|
+
autoDetectedMap,
|
|
78
100
|
metadata: {
|
|
79
101
|
...result.metadata,
|
|
80
102
|
infraNodeCount: infraNodes.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callGraphBuilder.js","sourceRoot":"","sources":["../../src/analyzer/callGraphBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"callGraphBuilder.js","sourceRoot":"","sources":["../../src/analyzer/callGraphBuilder.ts"],"names":[],"mappings":"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"}
|
package/dist/analyzer/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export type TriggerKind = "http" | "orchestration" | "activity" | "entity" | "ti
|
|
|
2
2
|
export type FunctionRole = "orchestrator" | "activity" | "entity" | "client" | "unknown";
|
|
3
3
|
export type CallKind = "callActivity" | "callSubOrchestrator" | "scheduleOrchestration" | "callEntity";
|
|
4
4
|
export type FunctionStyle = "attribute" | "class-based";
|
|
5
|
-
export type InfraKind =
|
|
5
|
+
export type InfraKind = string;
|
|
6
6
|
export type DepthMode = "shallow" | "deep";
|
|
7
7
|
export interface InfraUsage {
|
|
8
8
|
kind: InfraKind;
|
|
@@ -10,7 +10,7 @@ export interface InfraUsage {
|
|
|
10
10
|
description?: string;
|
|
11
11
|
raw: string;
|
|
12
12
|
line: number;
|
|
13
|
-
source: "auto" | "annotation";
|
|
13
|
+
source: "auto" | "annotation" | "config";
|
|
14
14
|
}
|
|
15
15
|
export interface InfraNode {
|
|
16
16
|
id: string;
|
|
@@ -64,6 +64,7 @@ export interface AnalysisResult {
|
|
|
64
64
|
edges: CallEdge[];
|
|
65
65
|
infraNodes: InfraNode[];
|
|
66
66
|
infraEdges: InfraEdge[];
|
|
67
|
+
autoDetectedMap?: Map<string, InfraUsage[]>;
|
|
67
68
|
warnings: string[];
|
|
68
69
|
metadata: {
|
|
69
70
|
analyzedAt: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analyzer/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,eAAe,GACf,UAAU,GACV,QAAQ,GACR,OAAO,GACP,OAAO,GACP,MAAM,GACN,eAAe,CAAC;AAEpB,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,QAAQ,GAChB,cAAc,GACd,qBAAqB,GACrB,uBAAuB,GACvB,YAAY,CAAC;AAEjB,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,aAAa,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analyzer/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,eAAe,GACf,UAAU,GACV,QAAQ,GACR,OAAO,GACP,OAAO,GACP,MAAM,GACN,eAAe,CAAC;AAEpB,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,QAAQ,GAChB,cAAc,GACd,qBAAqB,GACrB,uBAAuB,GACvB,YAAY,CAAC;AAEjB,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,aAAa,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,CAAC;CAC1C;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,EAAE,CAAC;CACtD"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,aAAa,IAAI,OAAO,CAoGvC"}
|
package/dist/cli.js
CHANGED
|
@@ -9,6 +9,7 @@ import { buildCallGraph, enrichWithInfra } from "./analyzer/callGraphBuilder.js"
|
|
|
9
9
|
import { generateMarkdown } from "./generator/markdownGenerator.js";
|
|
10
10
|
import { generateJson } from "./generator/jsonGenerator.js";
|
|
11
11
|
import { generateHtml } from "./generator/htmlGenerator.js";
|
|
12
|
+
import { loadConfig, saveConfig, mergeConfig, buildConfigFromResult } from "./config/configManager.js";
|
|
12
13
|
import { setVerbose, info, success, warn, verbose } from "./utils/logger.js";
|
|
13
14
|
export function createProgram() {
|
|
14
15
|
const program = new Command();
|
|
@@ -19,7 +20,7 @@ export function createProgram() {
|
|
|
19
20
|
.argument("<path>", "C# プロジェクトのパス")
|
|
20
21
|
.option("-o, --output <file>", "出力先ファイル (デフォルト: stdout)")
|
|
21
22
|
.option("-f, --format <format>", "出力形式 (markdown | json | html)", "markdown")
|
|
22
|
-
.option("-d, --depth <mode>", "表示の深さ (shallow | deep)", "
|
|
23
|
+
.option("-d, --depth <mode>", "表示の深さ (shallow | deep)", "deep")
|
|
23
24
|
.option("--exclude <patterns...>", "除外パターン")
|
|
24
25
|
.option("--no-mermaid", "Mermaid 図を生成しない")
|
|
25
26
|
.option("-v, --verbose", "詳細ログ")
|
|
@@ -27,7 +28,8 @@ export function createProgram() {
|
|
|
27
28
|
if (opts.verbose)
|
|
28
29
|
setVerbose(true);
|
|
29
30
|
const absPath = resolve(inputPath);
|
|
30
|
-
const depth = opts.depth === "
|
|
31
|
+
const depth = opts.depth === "shallow" ? "shallow" : "deep";
|
|
32
|
+
const configDir = absPath;
|
|
31
33
|
verbose(`Scanning: ${absPath}`);
|
|
32
34
|
const extensions = getRegisteredExtensions();
|
|
33
35
|
const files = await scanFiles(absPath, extensions, {
|
|
@@ -37,13 +39,46 @@ export function createProgram() {
|
|
|
37
39
|
warn("No files found.");
|
|
38
40
|
return;
|
|
39
41
|
}
|
|
40
|
-
info(
|
|
42
|
+
info(`🔍 Scanning .cs files...`);
|
|
41
43
|
const parser = new CSharpParser();
|
|
42
44
|
const functions = analyzeFiles(files, [parser]);
|
|
43
45
|
verbose(`Parsed ${functions.length} function(s)`);
|
|
46
|
+
const roleCounts = new Map();
|
|
47
|
+
for (const fn of functions) {
|
|
48
|
+
roleCounts.set(fn.role, (roleCounts.get(fn.role) ?? 0) + 1);
|
|
49
|
+
}
|
|
50
|
+
const countParts = [];
|
|
51
|
+
if (roleCounts.get("client"))
|
|
52
|
+
countParts.push(`${roleCounts.get("client")} Client`);
|
|
53
|
+
if (roleCounts.get("orchestrator"))
|
|
54
|
+
countParts.push(`${roleCounts.get("orchestrator")} Orchestrator`);
|
|
55
|
+
if (roleCounts.get("activity"))
|
|
56
|
+
countParts.push(`${roleCounts.get("activity")} Activities`);
|
|
57
|
+
if (roleCounts.get("entity"))
|
|
58
|
+
countParts.push(`${roleCounts.get("entity")} Entities`);
|
|
59
|
+
info(`📦 Found ${functions.length} functions (${countParts.join(", ")})`);
|
|
44
60
|
let result = buildCallGraph(functions);
|
|
45
|
-
|
|
46
|
-
|
|
61
|
+
const existingConfig = await loadConfig(configDir);
|
|
62
|
+
result = enrichWithInfra(result, existingConfig);
|
|
63
|
+
if (!existingConfig) {
|
|
64
|
+
const activities = result.functions.filter((f) => f.role === "activity");
|
|
65
|
+
const newConfig = buildConfigFromResult(activities, result.autoDetectedMap ?? new Map());
|
|
66
|
+
await saveConfig(configDir, newConfig);
|
|
67
|
+
success(`Generated: .durable-map.yml`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const activities = result.functions.filter((f) => f.role === "activity");
|
|
71
|
+
const merged = mergeConfig(existingConfig, activities, result.autoDetectedMap ?? new Map());
|
|
72
|
+
await saveConfig(configDir, merged);
|
|
73
|
+
}
|
|
74
|
+
const unconfigured = result.functions
|
|
75
|
+
.filter((f) => f.role === "activity" && f.infraUsages.length === 0);
|
|
76
|
+
if (unconfigured.length > 0) {
|
|
77
|
+
warn(`以下のアクティビティのインフラ層が未設定です:`);
|
|
78
|
+
for (const fn of unconfigured) {
|
|
79
|
+
warn(` - ${fn.name}`);
|
|
80
|
+
}
|
|
81
|
+
info(`→ .durable-map.yml を編集して再実行してください`);
|
|
47
82
|
}
|
|
48
83
|
for (const w of result.warnings) {
|
|
49
84
|
warn(w);
|
|
@@ -60,7 +95,7 @@ export function createProgram() {
|
|
|
60
95
|
}
|
|
61
96
|
if (opts.output) {
|
|
62
97
|
await writeFile(opts.output, output, "utf-8");
|
|
63
|
-
success(`
|
|
98
|
+
success(`Generated: ${opts.output}`);
|
|
64
99
|
}
|
|
65
100
|
else {
|
|
66
101
|
process.stdout.write(output);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DurableFunction, InfraUsage } from "../analyzer/types.js";
|
|
2
|
+
export interface ActivityInfraEntry {
|
|
3
|
+
type: string;
|
|
4
|
+
resource: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DurableMapConfig {
|
|
8
|
+
infrastructure: Record<string, ActivityInfraEntry[]>;
|
|
9
|
+
}
|
|
10
|
+
export declare function loadConfig(cwd: string): Promise<DurableMapConfig | null>;
|
|
11
|
+
export declare function saveConfig(cwd: string, config: DurableMapConfig): Promise<void>;
|
|
12
|
+
export declare function mergeConfig(existing: DurableMapConfig, activities: DurableFunction[], detected: Map<string, InfraUsage[]>): DurableMapConfig;
|
|
13
|
+
export declare function buildConfigFromResult(activities: DurableFunction[], detected: Map<string, InfraUsage[]>): DurableMapConfig;
|
|
14
|
+
//# sourceMappingURL=configManager.d.ts.map
|