@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.
Files changed (69) hide show
  1. package/dist/analyzers/index.d.ts +69 -5
  2. package/dist/analyzers/index.js +1 -5
  3. package/dist/chunk-3PWXDB7B.js +153 -0
  4. package/dist/{generators/page-map-generator.js → chunk-3YFXZAP7.js} +322 -358
  5. package/dist/chunk-6F4PWJZI.js +1 -0
  6. package/dist/{generators/rails-map-generator.js → chunk-E4WRODSI.js} +86 -94
  7. package/dist/chunk-GNBMJMET.js +2519 -0
  8. package/dist/{server/doc-server.js → chunk-M6YNU536.js} +702 -290
  9. package/dist/chunk-OWM6WNLE.js +2610 -0
  10. package/dist/chunk-SSU6QFTX.js +1058 -0
  11. package/dist/cli.d.ts +0 -1
  12. package/dist/cli.js +348 -452
  13. package/dist/dataflow-analyzer-BfAiqVUp.d.ts +180 -0
  14. package/dist/env-detector-EEMVUEIA.js +1 -0
  15. package/dist/generators/index.d.ts +431 -3
  16. package/dist/generators/index.js +2 -3
  17. package/dist/index.d.ts +53 -10
  18. package/dist/index.js +8 -11
  19. package/dist/page-map-generator-6MJGPBVA.js +1 -0
  20. package/dist/rails-UWSDRS33.js +1 -0
  21. package/dist/rails-map-generator-D2URLMVJ.js +2 -0
  22. package/dist/server/index.d.ts +33 -1
  23. package/dist/server/index.js +7 -1
  24. package/dist/types.d.ts +39 -37
  25. package/dist/types.js +1 -5
  26. package/package.json +5 -3
  27. package/dist/analyzers/base-analyzer.d.ts +0 -45
  28. package/dist/analyzers/base-analyzer.js +0 -47
  29. package/dist/analyzers/dataflow-analyzer.d.ts +0 -29
  30. package/dist/analyzers/dataflow-analyzer.js +0 -425
  31. package/dist/analyzers/graphql-analyzer.d.ts +0 -22
  32. package/dist/analyzers/graphql-analyzer.js +0 -386
  33. package/dist/analyzers/pages-analyzer.d.ts +0 -84
  34. package/dist/analyzers/pages-analyzer.js +0 -1695
  35. package/dist/analyzers/rails/index.d.ts +0 -46
  36. package/dist/analyzers/rails/index.js +0 -145
  37. package/dist/analyzers/rails/rails-controller-analyzer.d.ts +0 -82
  38. package/dist/analyzers/rails/rails-controller-analyzer.js +0 -478
  39. package/dist/analyzers/rails/rails-grpc-analyzer.d.ts +0 -44
  40. package/dist/analyzers/rails/rails-grpc-analyzer.js +0 -262
  41. package/dist/analyzers/rails/rails-model-analyzer.d.ts +0 -88
  42. package/dist/analyzers/rails/rails-model-analyzer.js +0 -493
  43. package/dist/analyzers/rails/rails-react-analyzer.d.ts +0 -41
  44. package/dist/analyzers/rails/rails-react-analyzer.js +0 -529
  45. package/dist/analyzers/rails/rails-routes-analyzer.d.ts +0 -62
  46. package/dist/analyzers/rails/rails-routes-analyzer.js +0 -540
  47. package/dist/analyzers/rails/rails-view-analyzer.d.ts +0 -49
  48. package/dist/analyzers/rails/rails-view-analyzer.js +0 -386
  49. package/dist/analyzers/rails/ruby-parser.d.ts +0 -63
  50. package/dist/analyzers/rails/ruby-parser.js +0 -212
  51. package/dist/analyzers/rest-api-analyzer.d.ts +0 -65
  52. package/dist/analyzers/rest-api-analyzer.js +0 -479
  53. package/dist/core/cache.d.ts +0 -47
  54. package/dist/core/cache.js +0 -151
  55. package/dist/core/engine.d.ts +0 -46
  56. package/dist/core/engine.js +0 -319
  57. package/dist/core/index.d.ts +0 -2
  58. package/dist/core/index.js +0 -2
  59. package/dist/generators/markdown-generator.d.ts +0 -25
  60. package/dist/generators/markdown-generator.js +0 -782
  61. package/dist/generators/mermaid-generator.d.ts +0 -35
  62. package/dist/generators/mermaid-generator.js +0 -364
  63. package/dist/generators/page-map-generator.d.ts +0 -22
  64. package/dist/generators/rails-map-generator.d.ts +0 -21
  65. package/dist/server/doc-server.d.ts +0 -30
  66. package/dist/utils/env-detector.d.ts +0 -31
  67. package/dist/utils/env-detector.js +0 -188
  68. package/dist/utils/parallel.d.ts +0 -23
  69. 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
- };