@wtdlee/repomap 0.2.0 → 0.3.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/dist/analyzers/index.d.ts +69 -5
- package/dist/analyzers/index.js +1 -5
- package/dist/chunk-3PWXDB7B.js +153 -0
- package/dist/{generators/page-map-generator.js → chunk-3YFXZAP7.js} +322 -358
- package/dist/chunk-6F4PWJZI.js +1 -0
- package/dist/{generators/rails-map-generator.js → chunk-E4WRODSI.js} +86 -94
- package/dist/chunk-GNBMJMET.js +2519 -0
- package/dist/{server/doc-server.js → chunk-M6YNU536.js} +702 -290
- package/dist/chunk-OWM6WNLE.js +2610 -0
- package/dist/chunk-SSU6QFTX.js +1058 -0
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +348 -452
- package/dist/dataflow-analyzer-BfAiqVUp.d.ts +180 -0
- package/dist/env-detector-EEMVUEIA.js +1 -0
- package/dist/generators/index.d.ts +431 -3
- package/dist/generators/index.js +2 -3
- package/dist/index.d.ts +53 -10
- package/dist/index.js +8 -11
- package/dist/page-map-generator-6MJGPBVA.js +1 -0
- package/dist/rails-UWSDRS33.js +1 -0
- package/dist/rails-map-generator-D2URLMVJ.js +2 -0
- package/dist/server/index.d.ts +33 -1
- package/dist/server/index.js +7 -1
- package/dist/types.d.ts +39 -37
- package/dist/types.js +1 -5
- package/package.json +5 -3
- package/dist/analyzers/base-analyzer.d.ts +0 -45
- package/dist/analyzers/base-analyzer.js +0 -47
- package/dist/analyzers/dataflow-analyzer.d.ts +0 -29
- package/dist/analyzers/dataflow-analyzer.js +0 -425
- package/dist/analyzers/graphql-analyzer.d.ts +0 -22
- package/dist/analyzers/graphql-analyzer.js +0 -386
- package/dist/analyzers/pages-analyzer.d.ts +0 -84
- package/dist/analyzers/pages-analyzer.js +0 -1695
- package/dist/analyzers/rails/index.d.ts +0 -46
- package/dist/analyzers/rails/index.js +0 -145
- package/dist/analyzers/rails/rails-controller-analyzer.d.ts +0 -82
- package/dist/analyzers/rails/rails-controller-analyzer.js +0 -478
- package/dist/analyzers/rails/rails-grpc-analyzer.d.ts +0 -44
- package/dist/analyzers/rails/rails-grpc-analyzer.js +0 -262
- package/dist/analyzers/rails/rails-model-analyzer.d.ts +0 -88
- package/dist/analyzers/rails/rails-model-analyzer.js +0 -493
- package/dist/analyzers/rails/rails-react-analyzer.d.ts +0 -41
- package/dist/analyzers/rails/rails-react-analyzer.js +0 -529
- package/dist/analyzers/rails/rails-routes-analyzer.d.ts +0 -62
- package/dist/analyzers/rails/rails-routes-analyzer.js +0 -540
- package/dist/analyzers/rails/rails-view-analyzer.d.ts +0 -49
- package/dist/analyzers/rails/rails-view-analyzer.js +0 -386
- package/dist/analyzers/rails/ruby-parser.d.ts +0 -63
- package/dist/analyzers/rails/ruby-parser.js +0 -212
- package/dist/analyzers/rest-api-analyzer.d.ts +0 -65
- package/dist/analyzers/rest-api-analyzer.js +0 -479
- package/dist/core/cache.d.ts +0 -47
- package/dist/core/cache.js +0 -151
- package/dist/core/engine.d.ts +0 -46
- package/dist/core/engine.js +0 -319
- package/dist/core/index.d.ts +0 -2
- package/dist/core/index.js +0 -2
- package/dist/generators/markdown-generator.d.ts +0 -25
- package/dist/generators/markdown-generator.js +0 -782
- package/dist/generators/mermaid-generator.d.ts +0 -35
- package/dist/generators/mermaid-generator.js +0 -364
- package/dist/generators/page-map-generator.d.ts +0 -22
- package/dist/generators/rails-map-generator.d.ts +0 -21
- package/dist/server/doc-server.d.ts +0 -30
- package/dist/utils/env-detector.d.ts +0 -31
- package/dist/utils/env-detector.js +0 -188
- package/dist/utils/parallel.d.ts +0 -23
- package/dist/utils/parallel.js +0 -70
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { AnalysisResult, MermaidDiagram, DataFlow, CrossRepoLink } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Mermaid diagram generator
|
|
4
|
-
* Mermaidダイアグラム生成器
|
|
5
|
-
*/
|
|
6
|
-
export declare class MermaidGenerator {
|
|
7
|
-
/**
|
|
8
|
-
* Generate all diagrams from analysis result
|
|
9
|
-
*/
|
|
10
|
-
generateAll(results: AnalysisResult[], crossRepoLinks: CrossRepoLink[]): MermaidDiagram[];
|
|
11
|
-
/**
|
|
12
|
-
* Generate navigation flowchart - grouped by URL category
|
|
13
|
-
*/
|
|
14
|
-
generateNavigationDiagram(result: AnalysisResult): MermaidDiagram;
|
|
15
|
-
/**
|
|
16
|
-
* Generate data flow diagram
|
|
17
|
-
*/
|
|
18
|
-
generateDataFlowDiagram(result: AnalysisResult): MermaidDiagram;
|
|
19
|
-
/**
|
|
20
|
-
* Generate component hierarchy diagram
|
|
21
|
-
*/
|
|
22
|
-
generateComponentDiagram(result: AnalysisResult): MermaidDiagram;
|
|
23
|
-
/**
|
|
24
|
-
* Generate GraphQL operations diagram
|
|
25
|
-
*/
|
|
26
|
-
generateGraphQLDiagram(result: AnalysisResult): MermaidDiagram;
|
|
27
|
-
/**
|
|
28
|
-
* Generate cross-repository diagram
|
|
29
|
-
*/
|
|
30
|
-
generateCrossRepoDiagram(results: AnalysisResult[], crossRepoLinks: CrossRepoLink[]): MermaidDiagram;
|
|
31
|
-
/**
|
|
32
|
-
* Generate sequence diagram for a specific flow
|
|
33
|
-
*/
|
|
34
|
-
generateSequenceDiagram(flow: DataFlow): MermaidDiagram;
|
|
35
|
-
}
|
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mermaid diagram generator
|
|
3
|
-
* Mermaidダイアグラム生成器
|
|
4
|
-
*/
|
|
5
|
-
export class MermaidGenerator {
|
|
6
|
-
/**
|
|
7
|
-
* Generate all diagrams from analysis result
|
|
8
|
-
*/
|
|
9
|
-
generateAll(results, crossRepoLinks) {
|
|
10
|
-
const diagrams = [];
|
|
11
|
-
for (const result of results) {
|
|
12
|
-
// Page navigation flowchart
|
|
13
|
-
diagrams.push(this.generateNavigationDiagram(result));
|
|
14
|
-
// Data flow diagram
|
|
15
|
-
diagrams.push(this.generateDataFlowDiagram(result));
|
|
16
|
-
// Component hierarchy
|
|
17
|
-
diagrams.push(this.generateComponentDiagram(result));
|
|
18
|
-
// GraphQL operations
|
|
19
|
-
diagrams.push(this.generateGraphQLDiagram(result));
|
|
20
|
-
}
|
|
21
|
-
// Cross-repository diagram
|
|
22
|
-
if (results.length > 1) {
|
|
23
|
-
diagrams.push(this.generateCrossRepoDiagram(results, crossRepoLinks));
|
|
24
|
-
}
|
|
25
|
-
return diagrams;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Generate navigation flowchart - grouped by URL category
|
|
29
|
-
*/
|
|
30
|
-
generateNavigationDiagram(result) {
|
|
31
|
-
const lines = ['flowchart TB', ' %% Page Navigation Flow - Grouped by Category'];
|
|
32
|
-
const nodeIds = new Map();
|
|
33
|
-
let nodeCounter = 0;
|
|
34
|
-
// Group pages by URL category
|
|
35
|
-
const byCategory = new Map();
|
|
36
|
-
for (const page of result.pages) {
|
|
37
|
-
const parts = page.path.split('/').filter(Boolean);
|
|
38
|
-
const category = parts[0] || 'root';
|
|
39
|
-
const existing = byCategory.get(category) || [];
|
|
40
|
-
existing.push(page);
|
|
41
|
-
byCategory.set(category, existing);
|
|
42
|
-
}
|
|
43
|
-
// Create subgraphs for each category
|
|
44
|
-
for (const [category, pages] of byCategory) {
|
|
45
|
-
const categoryId = category.replace(/[^a-zA-Z0-9]/g, '_');
|
|
46
|
-
const categoryLabel = category === 'root' ? 'Root Pages' : `/${category}`;
|
|
47
|
-
lines.push('');
|
|
48
|
-
lines.push(` subgraph ${categoryId}["${categoryLabel}"]`);
|
|
49
|
-
lines.push(' direction TB');
|
|
50
|
-
for (const page of pages) {
|
|
51
|
-
const nodeId = `P${nodeCounter++}`;
|
|
52
|
-
nodeIds.set(page.path, nodeId);
|
|
53
|
-
// Shorter label - just the last part of the path
|
|
54
|
-
const pathParts = page.path.split('/').filter(Boolean);
|
|
55
|
-
const shortLabel = pathParts.length > 1 ? pathParts.slice(1).join('/') : page.path;
|
|
56
|
-
const authTag = page.authentication.required ? ' AUTH' : '';
|
|
57
|
-
lines.push(` ${nodeId}["${shortLabel}${authTag}"]`);
|
|
58
|
-
}
|
|
59
|
-
lines.push(' end');
|
|
60
|
-
}
|
|
61
|
-
// Add edges for linked pages (limit to prevent clutter)
|
|
62
|
-
let edgeCount = 0;
|
|
63
|
-
const maxEdges = 30;
|
|
64
|
-
lines.push('');
|
|
65
|
-
lines.push(' %% Navigation Links');
|
|
66
|
-
for (const page of result.pages) {
|
|
67
|
-
if (edgeCount >= maxEdges)
|
|
68
|
-
break;
|
|
69
|
-
const sourceId = nodeIds.get(page.path);
|
|
70
|
-
for (const linkedPath of page.linkedPages.slice(0, 2)) {
|
|
71
|
-
if (edgeCount >= maxEdges)
|
|
72
|
-
break;
|
|
73
|
-
const targetId = nodeIds.get(linkedPath);
|
|
74
|
-
if (sourceId && targetId && sourceId !== targetId) {
|
|
75
|
-
lines.push(` ${sourceId} --> ${targetId}`);
|
|
76
|
-
edgeCount++;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
// Add styling
|
|
81
|
-
lines.push('');
|
|
82
|
-
lines.push(' %% Styling');
|
|
83
|
-
lines.push(' classDef authRequired fill:#fee2e2,stroke:#ef4444,color:#991b1b');
|
|
84
|
-
lines.push(' classDef public fill:#dcfce7,stroke:#22c55e,color:#166534');
|
|
85
|
-
for (const page of result.pages) {
|
|
86
|
-
const nodeId = nodeIds.get(page.path);
|
|
87
|
-
if (nodeId) {
|
|
88
|
-
if (page.authentication.required) {
|
|
89
|
-
lines.push(` class ${nodeId} authRequired`);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
lines.push(` class ${nodeId} public`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return {
|
|
97
|
-
type: 'flowchart',
|
|
98
|
-
title: `${result.repository} - Page Navigation`,
|
|
99
|
-
content: lines.join('\n'),
|
|
100
|
-
relatedFiles: result.pages.map((p) => p.filePath),
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Generate data flow diagram
|
|
105
|
-
*/
|
|
106
|
-
generateDataFlowDiagram(result) {
|
|
107
|
-
const lines = ['flowchart LR', ' %% Data Flow Diagram'];
|
|
108
|
-
const nodeIds = new Map();
|
|
109
|
-
let nodeCounter = 0;
|
|
110
|
-
const getNodeId = (node) => {
|
|
111
|
-
const key = `${node.type}:${node.name}`;
|
|
112
|
-
if (!nodeIds.has(key)) {
|
|
113
|
-
const prefix = node.type.charAt(0).toUpperCase();
|
|
114
|
-
nodeIds.set(key, `${prefix}${nodeCounter++}`);
|
|
115
|
-
}
|
|
116
|
-
return nodeIds.get(key) ?? `N${nodeCounter++}`;
|
|
117
|
-
};
|
|
118
|
-
const _getNodeShape = (type, name) => {
|
|
119
|
-
// Different shapes based on type and content
|
|
120
|
-
if (name.includes('GraphQL') || name.includes('API')) {
|
|
121
|
-
return ['((', '))'];
|
|
122
|
-
}
|
|
123
|
-
switch (type) {
|
|
124
|
-
case 'api':
|
|
125
|
-
return ['((', '))'];
|
|
126
|
-
case 'cache':
|
|
127
|
-
return ['[(', ')]'];
|
|
128
|
-
case 'context':
|
|
129
|
-
return ['{{', '}}'];
|
|
130
|
-
case 'store':
|
|
131
|
-
return ['[/', '/]'];
|
|
132
|
-
default:
|
|
133
|
-
return ['[', ']'];
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
const cleanLabel = (name) => {
|
|
137
|
-
// Remove emojis for mermaid compatibility, keep meaningful text
|
|
138
|
-
return name
|
|
139
|
-
.replace(/[\u{1F4E1}\u{270F}\u{FE0F}\u{1F504}\u{1F4E6}]/gu, '')
|
|
140
|
-
.trim()
|
|
141
|
-
.substring(0, 40); // Limit length
|
|
142
|
-
};
|
|
143
|
-
// Group flows by type for better organization
|
|
144
|
-
const queryFlows = result.dataFlows.filter((f) => f.name.includes('📡') || f.operations.some((o) => o.includes('Query')));
|
|
145
|
-
const mutationFlows = result.dataFlows.filter((f) => f.name.includes('✏️') || f.operations.some((o) => o.includes('Mutation')));
|
|
146
|
-
const contextFlows = result.dataFlows.filter((f) => f.name.includes('🔄') ||
|
|
147
|
-
f.source.type === 'context' ||
|
|
148
|
-
f.operations.some((o) => o.includes('Context')));
|
|
149
|
-
// Create nodes and edges for queries
|
|
150
|
-
if (queryFlows.length > 0) {
|
|
151
|
-
lines.push('');
|
|
152
|
-
lines.push(' subgraph Queries[📡 Queries]');
|
|
153
|
-
lines.push(' direction TB');
|
|
154
|
-
for (const flow of queryFlows.slice(0, 20)) {
|
|
155
|
-
const sourceId = getNodeId(flow.source);
|
|
156
|
-
const targetId = getNodeId(flow.target);
|
|
157
|
-
const sourceName = cleanLabel(flow.source.name);
|
|
158
|
-
const targetName = cleanLabel(flow.target.name);
|
|
159
|
-
lines.push(` ${sourceId}(("${sourceName}"))`);
|
|
160
|
-
lines.push(` ${targetId}["${targetName}"]`);
|
|
161
|
-
lines.push(` ${sourceId} --> ${targetId}`);
|
|
162
|
-
}
|
|
163
|
-
lines.push(' end');
|
|
164
|
-
}
|
|
165
|
-
// Create nodes and edges for mutations
|
|
166
|
-
if (mutationFlows.length > 0) {
|
|
167
|
-
lines.push('');
|
|
168
|
-
lines.push(' subgraph Mutations[✏️ Mutations]');
|
|
169
|
-
lines.push(' direction TB');
|
|
170
|
-
for (const flow of mutationFlows.slice(0, 20)) {
|
|
171
|
-
const sourceId = getNodeId(flow.source);
|
|
172
|
-
const targetId = getNodeId(flow.target);
|
|
173
|
-
const sourceName = cleanLabel(flow.source.name);
|
|
174
|
-
const targetName = cleanLabel(flow.target.name);
|
|
175
|
-
lines.push(` ${sourceId}["${sourceName}"]`);
|
|
176
|
-
lines.push(` ${targetId}(("${targetName}"))`);
|
|
177
|
-
lines.push(` ${sourceId} --> ${targetId}`);
|
|
178
|
-
}
|
|
179
|
-
lines.push(' end');
|
|
180
|
-
}
|
|
181
|
-
// Create nodes and edges for context
|
|
182
|
-
if (contextFlows.length > 0) {
|
|
183
|
-
lines.push('');
|
|
184
|
-
lines.push(' subgraph Context[🔄 Context]');
|
|
185
|
-
lines.push(' direction TB');
|
|
186
|
-
for (const flow of contextFlows.slice(0, 15)) {
|
|
187
|
-
const sourceId = getNodeId(flow.source);
|
|
188
|
-
const targetId = getNodeId(flow.target);
|
|
189
|
-
const sourceName = cleanLabel(flow.source.name);
|
|
190
|
-
const targetName = cleanLabel(flow.target.name);
|
|
191
|
-
lines.push(` ${sourceId}{{"${sourceName}"}}`);
|
|
192
|
-
lines.push(` ${targetId}["${targetName}"]`);
|
|
193
|
-
lines.push(` ${sourceId} -.-> ${targetId}`);
|
|
194
|
-
}
|
|
195
|
-
lines.push(' end');
|
|
196
|
-
}
|
|
197
|
-
// Style definitions
|
|
198
|
-
lines.push('');
|
|
199
|
-
lines.push(' %% Styling');
|
|
200
|
-
lines.push(' classDef query fill:#dbeafe,stroke:#3b82f6,color:#1e40af');
|
|
201
|
-
lines.push(' classDef mutation fill:#fce7f3,stroke:#ec4899,color:#9d174d');
|
|
202
|
-
lines.push(' classDef context fill:#d1fae5,stroke:#10b981,color:#065f46');
|
|
203
|
-
return {
|
|
204
|
-
type: 'flowchart',
|
|
205
|
-
title: `${result.repository} - Data Flow`,
|
|
206
|
-
content: lines.join('\n'),
|
|
207
|
-
relatedFiles: result.dataFlows.map((f) => f.source.name),
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Generate component hierarchy diagram
|
|
212
|
-
*/
|
|
213
|
-
generateComponentDiagram(result) {
|
|
214
|
-
const lines = ['flowchart TB', ' %% Component Hierarchy'];
|
|
215
|
-
// Group by type
|
|
216
|
-
const byType = new Map();
|
|
217
|
-
for (const comp of result.components) {
|
|
218
|
-
const existing = byType.get(comp.type) || [];
|
|
219
|
-
existing.push(comp);
|
|
220
|
-
byType.set(comp.type, existing);
|
|
221
|
-
}
|
|
222
|
-
// Create subgraphs for each type
|
|
223
|
-
for (const [type, components] of byType) {
|
|
224
|
-
lines.push(` subgraph ${type.charAt(0).toUpperCase() + type.slice(1)}s`);
|
|
225
|
-
for (const comp of components.slice(0, 20)) {
|
|
226
|
-
// Limit to 20 per type
|
|
227
|
-
const nodeId = comp.name.replace(/[^a-zA-Z0-9]/g, '_');
|
|
228
|
-
lines.push(` ${nodeId}["${comp.name}"]`);
|
|
229
|
-
}
|
|
230
|
-
lines.push(' end');
|
|
231
|
-
}
|
|
232
|
-
// Add dependency edges (limited to prevent clutter)
|
|
233
|
-
let edgeCount = 0;
|
|
234
|
-
const maxEdges = 50;
|
|
235
|
-
for (const comp of result.components) {
|
|
236
|
-
if (edgeCount >= maxEdges)
|
|
237
|
-
break;
|
|
238
|
-
const sourceId = comp.name.replace(/[^a-zA-Z0-9]/g, '_');
|
|
239
|
-
for (const dep of comp.dependencies.slice(0, 3)) {
|
|
240
|
-
if (edgeCount >= maxEdges)
|
|
241
|
-
break;
|
|
242
|
-
const targetId = dep.replace(/[^a-zA-Z0-9]/g, '_');
|
|
243
|
-
lines.push(` ${sourceId} --> ${targetId}`);
|
|
244
|
-
edgeCount++;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
return {
|
|
248
|
-
type: 'flowchart',
|
|
249
|
-
title: `${result.repository} - Component Hierarchy`,
|
|
250
|
-
content: lines.join('\n'),
|
|
251
|
-
relatedFiles: result.components.map((c) => c.filePath),
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Generate GraphQL operations diagram
|
|
256
|
-
*/
|
|
257
|
-
generateGraphQLDiagram(result) {
|
|
258
|
-
const lines = ['flowchart LR', ' %% GraphQL Operations'];
|
|
259
|
-
// Group by type
|
|
260
|
-
const queries = result.graphqlOperations.filter((op) => op.type === 'query');
|
|
261
|
-
const mutations = result.graphqlOperations.filter((op) => op.type === 'mutation');
|
|
262
|
-
const fragments = result.graphqlOperations.filter((op) => op.type === 'fragment');
|
|
263
|
-
// Add API node
|
|
264
|
-
lines.push(' API[("GraphQL API")]');
|
|
265
|
-
// Add queries
|
|
266
|
-
if (queries.length > 0) {
|
|
267
|
-
lines.push(' subgraph Queries');
|
|
268
|
-
for (const query of queries.slice(0, 15)) {
|
|
269
|
-
const nodeId = `Q_${query.name.replace(/[^a-zA-Z0-9]/g, '_')}`;
|
|
270
|
-
lines.push(` ${nodeId}["${query.name}"]`);
|
|
271
|
-
lines.push(` ${nodeId} --> API`);
|
|
272
|
-
}
|
|
273
|
-
lines.push(' end');
|
|
274
|
-
}
|
|
275
|
-
// Add mutations
|
|
276
|
-
if (mutations.length > 0) {
|
|
277
|
-
lines.push(' subgraph Mutations');
|
|
278
|
-
for (const mutation of mutations.slice(0, 15)) {
|
|
279
|
-
const nodeId = `M_${mutation.name.replace(/[^a-zA-Z0-9]/g, '_')}`;
|
|
280
|
-
lines.push(` ${nodeId}["${mutation.name}"]`);
|
|
281
|
-
lines.push(` ${nodeId} --> API`);
|
|
282
|
-
}
|
|
283
|
-
lines.push(' end');
|
|
284
|
-
}
|
|
285
|
-
// Add fragments
|
|
286
|
-
if (fragments.length > 0) {
|
|
287
|
-
lines.push(' subgraph Fragments');
|
|
288
|
-
for (const fragment of fragments.slice(0, 10)) {
|
|
289
|
-
const nodeId = `F_${fragment.name.replace(/[^a-zA-Z0-9]/g, '_')}`;
|
|
290
|
-
lines.push(` ${nodeId}[/"${fragment.name}"/]`);
|
|
291
|
-
}
|
|
292
|
-
lines.push(' end');
|
|
293
|
-
}
|
|
294
|
-
return {
|
|
295
|
-
type: 'flowchart',
|
|
296
|
-
title: `${result.repository} - GraphQL Operations`,
|
|
297
|
-
content: lines.join('\n'),
|
|
298
|
-
relatedFiles: result.graphqlOperations.map((op) => op.filePath),
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Generate cross-repository diagram
|
|
303
|
-
*/
|
|
304
|
-
generateCrossRepoDiagram(results, crossRepoLinks) {
|
|
305
|
-
const lines = ['flowchart TB', ' %% Cross-Repository Architecture'];
|
|
306
|
-
// Add repository subgraphs
|
|
307
|
-
for (const result of results) {
|
|
308
|
-
const repoId = result.repository.replace(/[^a-zA-Z0-9]/g, '_');
|
|
309
|
-
lines.push(` subgraph ${repoId}["${result.repository}"]`);
|
|
310
|
-
// Add summary nodes
|
|
311
|
-
lines.push(` ${repoId}_pages["📄 ${result.pages.length} Pages"]`);
|
|
312
|
-
lines.push(` ${repoId}_gql["🔷 ${result.graphqlOperations.length} GraphQL Ops"]`);
|
|
313
|
-
lines.push(` ${repoId}_comp["🧩 ${result.components.length} Components"]`);
|
|
314
|
-
lines.push(' end');
|
|
315
|
-
}
|
|
316
|
-
// Add cross-repo links
|
|
317
|
-
for (const link of crossRepoLinks) {
|
|
318
|
-
const sourceRepo = link.sourceRepo.replace(/[^a-zA-Z0-9]/g, '_');
|
|
319
|
-
const targetRepo = link.targetRepo.replace(/[^a-zA-Z0-9]/g, '_');
|
|
320
|
-
let linkStyle = '-->';
|
|
321
|
-
if (link.linkType === 'api-call') {
|
|
322
|
-
linkStyle = '==>';
|
|
323
|
-
}
|
|
324
|
-
else if (link.linkType === 'graphql-operation') {
|
|
325
|
-
linkStyle = '-..->';
|
|
326
|
-
}
|
|
327
|
-
lines.push(` ${sourceRepo}_gql ${linkStyle}|"${link.linkType}"| ${targetRepo}_gql`);
|
|
328
|
-
}
|
|
329
|
-
return {
|
|
330
|
-
type: 'flowchart',
|
|
331
|
-
title: 'Cross-Repository Architecture',
|
|
332
|
-
content: lines.join('\n'),
|
|
333
|
-
relatedFiles: results.map((r) => r.repository),
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Generate sequence diagram for a specific flow
|
|
338
|
-
*/
|
|
339
|
-
generateSequenceDiagram(flow) {
|
|
340
|
-
const lines = ['sequenceDiagram', ` %% ${flow.name}`];
|
|
341
|
-
// Add participants
|
|
342
|
-
const participants = [flow.source, ...flow.via, flow.target];
|
|
343
|
-
for (const p of participants) {
|
|
344
|
-
lines.push(` participant ${p.name}`);
|
|
345
|
-
}
|
|
346
|
-
// Add interactions
|
|
347
|
-
let current = flow.source;
|
|
348
|
-
for (let i = 0; i < flow.via.length; i++) {
|
|
349
|
-
const next = flow.via[i];
|
|
350
|
-
const op = flow.operations[i] || 'data';
|
|
351
|
-
lines.push(` ${current.name}->>+${next.name}: ${op}`);
|
|
352
|
-
current = next;
|
|
353
|
-
}
|
|
354
|
-
const lastOp = flow.operations[flow.operations.length - 1] || 'data';
|
|
355
|
-
lines.push(` ${current.name}->>+${flow.target.name}: ${lastOp}`);
|
|
356
|
-
lines.push(` ${flow.target.name}-->>-${flow.source.name}: response`);
|
|
357
|
-
return {
|
|
358
|
-
type: 'sequence',
|
|
359
|
-
title: flow.name,
|
|
360
|
-
content: lines.join('\n'),
|
|
361
|
-
relatedFiles: [],
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { DocumentationReport } from '../types.js';
|
|
2
|
-
import type { EnvironmentDetectionResult } from '../utils/env-detector.js';
|
|
3
|
-
import type { RailsAnalysisResult } from '../analyzers/rails/index.js';
|
|
4
|
-
export interface PageMapOptions {
|
|
5
|
-
envResult?: EnvironmentDetectionResult | null;
|
|
6
|
-
railsAnalysis?: RailsAnalysisResult | null;
|
|
7
|
-
activeTab?: 'pages' | 'rails' | 'api';
|
|
8
|
-
staticMode?: boolean;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Interactive page map generator
|
|
12
|
-
*/
|
|
13
|
-
export declare class PageMapGenerator {
|
|
14
|
-
private graphqlOps;
|
|
15
|
-
private apiCalls;
|
|
16
|
-
private components;
|
|
17
|
-
generatePageMapHtml(report: DocumentationReport, options?: PageMapOptions): string;
|
|
18
|
-
private buildHierarchy;
|
|
19
|
-
private renderPageMapHtml;
|
|
20
|
-
private buildTreeHtml;
|
|
21
|
-
private getPageType;
|
|
22
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rails Map Generator
|
|
3
|
-
* Rails分析結果をインタラクティブなHTMLページとして生成する
|
|
4
|
-
*/
|
|
5
|
-
import { type RailsAnalysisResult } from '../analyzers/rails/index.js';
|
|
6
|
-
export interface RailsMapOptions {
|
|
7
|
-
title?: string;
|
|
8
|
-
outputPath?: string;
|
|
9
|
-
}
|
|
10
|
-
export declare class RailsMapGenerator {
|
|
11
|
-
private rootPath?;
|
|
12
|
-
private result;
|
|
13
|
-
constructor(rootPath?: string | undefined);
|
|
14
|
-
generate(options?: RailsMapOptions): Promise<string>;
|
|
15
|
-
generateFromResult(analysisResult: RailsAnalysisResult, title?: string): string;
|
|
16
|
-
private generateHTML;
|
|
17
|
-
private generateNamespaceList;
|
|
18
|
-
private generateMethodFilters;
|
|
19
|
-
private generateRoutesView;
|
|
20
|
-
private highlightParams;
|
|
21
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { DocGeneratorConfig } from '../types.js';
|
|
2
|
-
export interface DocServerOptions {
|
|
3
|
-
noCache?: boolean;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Documentation server with live reload
|
|
7
|
-
* ライブリロード機能付きドキュメントサーバー
|
|
8
|
-
*/
|
|
9
|
-
export declare class DocServer {
|
|
10
|
-
private config;
|
|
11
|
-
private port;
|
|
12
|
-
private app;
|
|
13
|
-
private server;
|
|
14
|
-
private io;
|
|
15
|
-
private engine;
|
|
16
|
-
private currentReport;
|
|
17
|
-
private envResult;
|
|
18
|
-
private railsAnalysis;
|
|
19
|
-
constructor(config: DocGeneratorConfig, port?: number, options?: DocServerOptions);
|
|
20
|
-
private setupRoutes;
|
|
21
|
-
private setupSocketIO;
|
|
22
|
-
private renderPage;
|
|
23
|
-
private getGraphQLData;
|
|
24
|
-
private getApiCallsData;
|
|
25
|
-
private getHtmlTemplate;
|
|
26
|
-
start(openBrowser?: boolean): Promise<void>;
|
|
27
|
-
private regenerate;
|
|
28
|
-
private watchForChanges;
|
|
29
|
-
stop(): void;
|
|
30
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment detection utilities
|
|
3
|
-
* 環境検出ユーティリティ
|
|
4
|
-
*/
|
|
5
|
-
export type EnvironmentType = 'nextjs' | 'react' | 'rails' | 'generic';
|
|
6
|
-
export interface DetectedEnvironment {
|
|
7
|
-
type: EnvironmentType;
|
|
8
|
-
detected: boolean;
|
|
9
|
-
version?: string;
|
|
10
|
-
path: string;
|
|
11
|
-
features: string[];
|
|
12
|
-
}
|
|
13
|
-
export interface EnvironmentDetectionResult {
|
|
14
|
-
environments: DetectedEnvironment[];
|
|
15
|
-
hasNextjs: boolean;
|
|
16
|
-
hasReact: boolean;
|
|
17
|
-
hasRails: boolean;
|
|
18
|
-
primary: EnvironmentType;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Detect all environments in the given directory
|
|
22
|
-
* 指定されたディレクトリ内のすべての環境を検出
|
|
23
|
-
*/
|
|
24
|
-
export declare function detectEnvironments(rootPath: string): Promise<EnvironmentDetectionResult>;
|
|
25
|
-
/**
|
|
26
|
-
* Get analyzer types for detected environments
|
|
27
|
-
*/
|
|
28
|
-
export declare function getAnalyzersForEnvironments(envResult: EnvironmentDetectionResult): {
|
|
29
|
-
frontend: string[];
|
|
30
|
-
backend: string[];
|
|
31
|
-
};
|