@wtdlee/repomap 0.1.0

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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +527 -0
  3. package/dist/analyzers/base-analyzer.d.ts +46 -0
  4. package/dist/analyzers/base-analyzer.d.ts.map +1 -0
  5. package/dist/analyzers/base-analyzer.js +48 -0
  6. package/dist/analyzers/base-analyzer.js.map +1 -0
  7. package/dist/analyzers/dataflow-analyzer.d.ts +30 -0
  8. package/dist/analyzers/dataflow-analyzer.d.ts.map +1 -0
  9. package/dist/analyzers/dataflow-analyzer.js +426 -0
  10. package/dist/analyzers/dataflow-analyzer.js.map +1 -0
  11. package/dist/analyzers/graphql-analyzer.d.ts +23 -0
  12. package/dist/analyzers/graphql-analyzer.d.ts.map +1 -0
  13. package/dist/analyzers/graphql-analyzer.js +387 -0
  14. package/dist/analyzers/graphql-analyzer.js.map +1 -0
  15. package/dist/analyzers/index.d.ts +6 -0
  16. package/dist/analyzers/index.d.ts.map +1 -0
  17. package/dist/analyzers/index.js +6 -0
  18. package/dist/analyzers/index.js.map +1 -0
  19. package/dist/analyzers/pages-analyzer.d.ts +85 -0
  20. package/dist/analyzers/pages-analyzer.d.ts.map +1 -0
  21. package/dist/analyzers/pages-analyzer.js +1696 -0
  22. package/dist/analyzers/pages-analyzer.js.map +1 -0
  23. package/dist/analyzers/rails/index.d.ts +47 -0
  24. package/dist/analyzers/rails/index.d.ts.map +1 -0
  25. package/dist/analyzers/rails/index.js +146 -0
  26. package/dist/analyzers/rails/index.js.map +1 -0
  27. package/dist/analyzers/rails/rails-controller-analyzer.d.ts +83 -0
  28. package/dist/analyzers/rails/rails-controller-analyzer.d.ts.map +1 -0
  29. package/dist/analyzers/rails/rails-controller-analyzer.js +479 -0
  30. package/dist/analyzers/rails/rails-controller-analyzer.js.map +1 -0
  31. package/dist/analyzers/rails/rails-grpc-analyzer.d.ts +45 -0
  32. package/dist/analyzers/rails/rails-grpc-analyzer.d.ts.map +1 -0
  33. package/dist/analyzers/rails/rails-grpc-analyzer.js +263 -0
  34. package/dist/analyzers/rails/rails-grpc-analyzer.js.map +1 -0
  35. package/dist/analyzers/rails/rails-model-analyzer.d.ts +89 -0
  36. package/dist/analyzers/rails/rails-model-analyzer.d.ts.map +1 -0
  37. package/dist/analyzers/rails/rails-model-analyzer.js +494 -0
  38. package/dist/analyzers/rails/rails-model-analyzer.js.map +1 -0
  39. package/dist/analyzers/rails/rails-react-analyzer.d.ts +42 -0
  40. package/dist/analyzers/rails/rails-react-analyzer.d.ts.map +1 -0
  41. package/dist/analyzers/rails/rails-react-analyzer.js +530 -0
  42. package/dist/analyzers/rails/rails-react-analyzer.js.map +1 -0
  43. package/dist/analyzers/rails/rails-routes-analyzer.d.ts +63 -0
  44. package/dist/analyzers/rails/rails-routes-analyzer.d.ts.map +1 -0
  45. package/dist/analyzers/rails/rails-routes-analyzer.js +541 -0
  46. package/dist/analyzers/rails/rails-routes-analyzer.js.map +1 -0
  47. package/dist/analyzers/rails/rails-view-analyzer.d.ts +50 -0
  48. package/dist/analyzers/rails/rails-view-analyzer.d.ts.map +1 -0
  49. package/dist/analyzers/rails/rails-view-analyzer.js +387 -0
  50. package/dist/analyzers/rails/rails-view-analyzer.js.map +1 -0
  51. package/dist/analyzers/rails/ruby-parser.d.ts +64 -0
  52. package/dist/analyzers/rails/ruby-parser.d.ts.map +1 -0
  53. package/dist/analyzers/rails/ruby-parser.js +213 -0
  54. package/dist/analyzers/rails/ruby-parser.js.map +1 -0
  55. package/dist/analyzers/rest-api-analyzer.d.ts +66 -0
  56. package/dist/analyzers/rest-api-analyzer.d.ts.map +1 -0
  57. package/dist/analyzers/rest-api-analyzer.js +480 -0
  58. package/dist/analyzers/rest-api-analyzer.js.map +1 -0
  59. package/dist/cli.d.ts +3 -0
  60. package/dist/cli.d.ts.map +1 -0
  61. package/dist/cli.js +550 -0
  62. package/dist/cli.js.map +1 -0
  63. package/dist/core/cache.d.ts +48 -0
  64. package/dist/core/cache.d.ts.map +1 -0
  65. package/dist/core/cache.js +152 -0
  66. package/dist/core/cache.js.map +1 -0
  67. package/dist/core/engine.d.ts +47 -0
  68. package/dist/core/engine.d.ts.map +1 -0
  69. package/dist/core/engine.js +320 -0
  70. package/dist/core/engine.js.map +1 -0
  71. package/dist/core/index.d.ts +3 -0
  72. package/dist/core/index.d.ts.map +1 -0
  73. package/dist/core/index.js +3 -0
  74. package/dist/core/index.js.map +1 -0
  75. package/dist/generators/assets/common.css +187 -0
  76. package/dist/generators/assets/docs.css +363 -0
  77. package/dist/generators/assets/page-map.css +305 -0
  78. package/dist/generators/assets/rails-map.css +473 -0
  79. package/dist/generators/index.d.ts +4 -0
  80. package/dist/generators/index.d.ts.map +1 -0
  81. package/dist/generators/index.js +4 -0
  82. package/dist/generators/index.js.map +1 -0
  83. package/dist/generators/markdown-generator.d.ts +26 -0
  84. package/dist/generators/markdown-generator.d.ts.map +1 -0
  85. package/dist/generators/markdown-generator.js +783 -0
  86. package/dist/generators/markdown-generator.js.map +1 -0
  87. package/dist/generators/mermaid-generator.d.ts +36 -0
  88. package/dist/generators/mermaid-generator.d.ts.map +1 -0
  89. package/dist/generators/mermaid-generator.js +365 -0
  90. package/dist/generators/mermaid-generator.js.map +1 -0
  91. package/dist/generators/page-map-generator.d.ts +23 -0
  92. package/dist/generators/page-map-generator.d.ts.map +1 -0
  93. package/dist/generators/page-map-generator.js +3563 -0
  94. package/dist/generators/page-map-generator.js.map +1 -0
  95. package/dist/generators/rails-map-generator.d.ts +22 -0
  96. package/dist/generators/rails-map-generator.d.ts.map +1 -0
  97. package/dist/generators/rails-map-generator.js +909 -0
  98. package/dist/generators/rails-map-generator.js.map +1 -0
  99. package/dist/index.d.ts +11 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +12 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/server/doc-server.d.ts +31 -0
  104. package/dist/server/doc-server.d.ts.map +1 -0
  105. package/dist/server/doc-server.js +1233 -0
  106. package/dist/server/doc-server.js.map +1 -0
  107. package/dist/server/index.d.ts +2 -0
  108. package/dist/server/index.d.ts.map +1 -0
  109. package/dist/server/index.js +2 -0
  110. package/dist/server/index.js.map +1 -0
  111. package/dist/types.d.ts +294 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +6 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/utils/env-detector.d.ts +32 -0
  116. package/dist/utils/env-detector.d.ts.map +1 -0
  117. package/dist/utils/env-detector.js +189 -0
  118. package/dist/utils/env-detector.js.map +1 -0
  119. package/dist/utils/parallel.d.ts +24 -0
  120. package/dist/utils/parallel.d.ts.map +1 -0
  121. package/dist/utils/parallel.js +71 -0
  122. package/dist/utils/parallel.js.map +1 -0
  123. package/package.json +131 -0
@@ -0,0 +1,479 @@
1
+ /**
2
+ * Rails Controller Analyzer using tree-sitter
3
+ * tree-sitterを使用してコントローラファイルを解析する
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import { glob } from 'glob';
8
+ import { parseRubyFile, findNodes, getClassName, getSuperclass, getMethodName, getMethodParameters, getChildrenByType, } from './ruby-parser.js';
9
+ export class RailsControllerAnalyzer {
10
+ rootPath;
11
+ controllersDir;
12
+ controllers = [];
13
+ errors = [];
14
+ constructor(rootPath) {
15
+ this.rootPath = rootPath;
16
+ this.controllersDir = path.join(rootPath, 'app', 'controllers');
17
+ }
18
+ async analyze() {
19
+ if (!fs.existsSync(this.controllersDir)) {
20
+ return {
21
+ controllers: [],
22
+ totalActions: 0,
23
+ namespaces: [],
24
+ concerns: [],
25
+ errors: [`Controllers directory not found at ${this.controllersDir}`],
26
+ };
27
+ }
28
+ const controllerFiles = await glob('**/*_controller.rb', {
29
+ cwd: this.controllersDir,
30
+ ignore: ['concerns/**'],
31
+ });
32
+ for (const file of controllerFiles) {
33
+ const fullPath = path.join(this.controllersDir, file);
34
+ try {
35
+ const controller = await this.parseControllerFile(fullPath, file);
36
+ if (controller) {
37
+ this.controllers.push(controller);
38
+ }
39
+ }
40
+ catch (error) {
41
+ this.errors.push(`Error parsing ${file}: ${error}`);
42
+ }
43
+ }
44
+ const namespaces = [
45
+ ...new Set(this.controllers.filter((c) => c.namespace).map((c) => c.namespace)),
46
+ ];
47
+ const concerns = [...new Set(this.controllers.flatMap((c) => c.concerns))];
48
+ const totalActions = this.controllers.reduce((sum, c) => sum + c.actions.length, 0);
49
+ return {
50
+ controllers: this.controllers,
51
+ totalActions,
52
+ namespaces,
53
+ concerns,
54
+ errors: this.errors,
55
+ };
56
+ }
57
+ async parseControllerFile(filePath, relativePath) {
58
+ const tree = await parseRubyFile(filePath);
59
+ const rootNode = tree.rootNode;
60
+ // Extract namespace from path
61
+ const pathParts = relativePath.replace(/_controller\.rb$/, '').split('/');
62
+ const namespace = pathParts.length > 1 ? pathParts.slice(0, -1).join('/') : undefined;
63
+ const controllerName = pathParts[pathParts.length - 1];
64
+ // Find class definition
65
+ const classNodes = findNodes(rootNode, 'class');
66
+ if (classNodes.length === 0)
67
+ return null;
68
+ const classNode = classNodes[0];
69
+ const className = getClassName(classNode);
70
+ const parentClass = getSuperclass(classNode);
71
+ if (!className)
72
+ return null;
73
+ const controller = {
74
+ name: controllerName,
75
+ filePath: relativePath,
76
+ className,
77
+ parentClass: parentClass || 'ApplicationController',
78
+ namespace,
79
+ actions: [],
80
+ beforeActions: [],
81
+ afterActions: [],
82
+ aroundActions: [],
83
+ skipBeforeActions: [],
84
+ concerns: [],
85
+ helpers: [],
86
+ rescueFrom: [],
87
+ line: classNode.startPosition.row + 1,
88
+ };
89
+ // Find all method calls for filters, concerns, etc.
90
+ const calls = findNodes(classNode, 'call');
91
+ for (const call of calls) {
92
+ const methodNode = call.childForFieldName('method');
93
+ if (!methodNode)
94
+ continue;
95
+ const methodName = methodNode.text;
96
+ const line = call.startPosition.row + 1;
97
+ switch (methodName) {
98
+ case 'before_action':
99
+ case 'before_filter': // Legacy
100
+ this.parseFilter(call, controller.beforeActions, line);
101
+ break;
102
+ case 'after_action':
103
+ case 'after_filter':
104
+ this.parseFilter(call, controller.afterActions, line);
105
+ break;
106
+ case 'around_action':
107
+ case 'around_filter':
108
+ this.parseFilter(call, controller.aroundActions, line);
109
+ break;
110
+ case 'skip_before_action':
111
+ case 'skip_before_filter':
112
+ this.parseFilter(call, controller.skipBeforeActions, line);
113
+ break;
114
+ case 'include':
115
+ this.parseInclude(call, controller.concerns);
116
+ break;
117
+ case 'helper':
118
+ this.parseHelper(call, controller.helpers);
119
+ break;
120
+ case 'layout':
121
+ controller.layoutInfo = this.parseLayout(call);
122
+ break;
123
+ case 'rescue_from':
124
+ this.parseRescueFrom(call, controller.rescueFrom, line);
125
+ break;
126
+ }
127
+ }
128
+ // Find all method definitions
129
+ const _methods = findNodes(classNode, 'method');
130
+ let currentVisibility = 'public';
131
+ // Track visibility changes through identifiers
132
+ const bodyStatement = classNode.childForFieldName('body');
133
+ if (bodyStatement) {
134
+ for (let i = 0; i < bodyStatement.childCount; i++) {
135
+ const child = bodyStatement.child(i);
136
+ if (!child)
137
+ continue;
138
+ if (child.type === 'identifier') {
139
+ const text = child.text;
140
+ if (text === 'private')
141
+ currentVisibility = 'private';
142
+ else if (text === 'protected')
143
+ currentVisibility = 'protected';
144
+ else if (text === 'public')
145
+ currentVisibility = 'public';
146
+ }
147
+ else if (child.type === 'method') {
148
+ const action = this.parseMethod(child, currentVisibility);
149
+ if (action) {
150
+ controller.actions.push(action);
151
+ }
152
+ }
153
+ }
154
+ }
155
+ return controller;
156
+ }
157
+ parseFilter(call, filters, line) {
158
+ const args = this.getCallArguments(call);
159
+ if (args.length === 0)
160
+ return;
161
+ // First argument is the filter name (symbol)
162
+ const nameArg = args[0];
163
+ const filterName = nameArg.text.replace(/^:/, '');
164
+ const filter = {
165
+ name: filterName,
166
+ line,
167
+ };
168
+ // Parse options
169
+ for (const arg of args.slice(1)) {
170
+ if (arg.type === 'hash') {
171
+ const pairs = getChildrenByType(arg, 'pair');
172
+ for (const pair of pairs) {
173
+ const key = pair.child(0)?.text?.replace(/^:/, '');
174
+ const value = pair.child(2);
175
+ if (!key || !value)
176
+ continue;
177
+ switch (key) {
178
+ case 'only':
179
+ filter.only = this.extractArrayValues(value);
180
+ break;
181
+ case 'except':
182
+ filter.except = this.extractArrayValues(value);
183
+ break;
184
+ case 'if':
185
+ filter.if = value.text;
186
+ break;
187
+ case 'unless':
188
+ filter.unless = value.text;
189
+ break;
190
+ }
191
+ }
192
+ }
193
+ }
194
+ filters.push(filter);
195
+ }
196
+ parseInclude(call, concerns) {
197
+ const args = this.getCallArguments(call);
198
+ for (const arg of args) {
199
+ if (arg.type === 'constant' || arg.type === 'scope_resolution') {
200
+ concerns.push(arg.text);
201
+ }
202
+ }
203
+ }
204
+ parseHelper(call, helpers) {
205
+ const args = this.getCallArguments(call);
206
+ for (const arg of args) {
207
+ const value = arg.text.replace(/^:/, '');
208
+ helpers.push(value);
209
+ }
210
+ }
211
+ parseLayout(call) {
212
+ const args = this.getCallArguments(call);
213
+ if (args.length === 0)
214
+ return undefined;
215
+ const nameArg = args[0];
216
+ let layoutName = nameArg.text.replace(/^["']|["']$/g, '');
217
+ // Handle symbol
218
+ if (layoutName.startsWith(':')) {
219
+ layoutName = layoutName.substring(1);
220
+ }
221
+ // Handle proc/lambda (return false or dynamic)
222
+ if (nameArg.type === 'lambda' || nameArg.type === 'proc') {
223
+ layoutName = '(dynamic)';
224
+ }
225
+ const layout = { name: layoutName };
226
+ // Parse conditions
227
+ for (const arg of args.slice(1)) {
228
+ if (arg.type === 'hash') {
229
+ layout.conditions = arg.text;
230
+ }
231
+ }
232
+ return layout;
233
+ }
234
+ parseRescueFrom(call, rescues, line) {
235
+ const args = this.getCallArguments(call);
236
+ if (args.length === 0)
237
+ return;
238
+ const exception = args[0].text;
239
+ let handler = 'unknown';
240
+ // Look for with: option
241
+ for (const arg of args.slice(1)) {
242
+ if (arg.type === 'hash' || arg.type === 'pair') {
243
+ const pairs = arg.type === 'hash' ? getChildrenByType(arg, 'pair') : [arg];
244
+ for (const pair of pairs) {
245
+ const key = pair.child(0)?.text?.replace(/^:/, '');
246
+ const value = pair.child(2);
247
+ if (key === 'with' && value) {
248
+ handler = value.text.replace(/^:/, '');
249
+ }
250
+ }
251
+ }
252
+ }
253
+ rescues.push({ exception, handler, line });
254
+ }
255
+ parseMethod(methodNode, visibility) {
256
+ const name = getMethodName(methodNode);
257
+ if (!name)
258
+ return null;
259
+ // Skip singleton methods (def self.xxx)
260
+ if (methodNode.text.includes('def self.'))
261
+ return null;
262
+ const action = {
263
+ name,
264
+ line: methodNode.startPosition.row + 1,
265
+ visibility,
266
+ parameters: getMethodParameters(methodNode),
267
+ servicesCalled: [],
268
+ modelsCalled: [],
269
+ methodCalls: [],
270
+ instanceVarAssignments: [],
271
+ };
272
+ // Analyze method body
273
+ const bodyContent = methodNode.text;
274
+ // Extract instance variable assignments: @var = value
275
+ const ivarRegex = /@([a-z_][a-z0-9_]*)\s*=\s*([^\n]+)/gi;
276
+ let ivarMatch;
277
+ while ((ivarMatch = ivarRegex.exec(bodyContent)) !== null) {
278
+ const varName = ivarMatch[1];
279
+ const assignedValue = ivarMatch[2].trim().slice(0, 100); // Truncate long values
280
+ // Try to detect model type from assignment
281
+ let assignedType;
282
+ // Pattern: Model.find/where/new/create/etc
283
+ const modelMatch = assignedValue.match(/^([A-Z][a-zA-Z0-9]+)\.(find|find_by|find_by!|where|all|first|last|new|create|create!|build)/);
284
+ if (modelMatch) {
285
+ assignedType = modelMatch[1];
286
+ }
287
+ // Pattern: @parent.association (e.g., @company.users)
288
+ const assocMatch = assignedValue.match(/^@([a-z_]+)\.([a-z_]+)/);
289
+ if (assocMatch && !assignedType) {
290
+ assignedType = `${assocMatch[1]}.${assocMatch[2]}`;
291
+ }
292
+ // Pattern: current_user, current_company, etc.
293
+ const currentMatch = assignedValue.match(/^current_([a-z_]+)/);
294
+ if (currentMatch && !assignedType) {
295
+ assignedType = currentMatch[1].charAt(0).toUpperCase() + currentMatch[1].slice(1);
296
+ }
297
+ // Pattern: SomeService.call (service result)
298
+ const serviceMatch = assignedValue.match(/^([A-Z][a-zA-Z0-9]+Service)\.(call|new|perform)/);
299
+ if (serviceMatch && !assignedType) {
300
+ assignedType = `Service:${serviceMatch[1]}`;
301
+ }
302
+ if (action.instanceVarAssignments) {
303
+ action.instanceVarAssignments.push({
304
+ name: varName,
305
+ assignedType,
306
+ assignedValue: assignedValue.length > 60 ? assignedValue.slice(0, 57) + '...' : assignedValue,
307
+ });
308
+ }
309
+ }
310
+ // Check render types
311
+ if (bodyContent.includes('render json:') || bodyContent.includes('render :json')) {
312
+ action.rendersJson = true;
313
+ }
314
+ if (bodyContent.includes('render') && !action.rendersJson) {
315
+ action.rendersHtml = true;
316
+ }
317
+ // Extract redirects
318
+ const redirectMatch = bodyContent.match(/redirect_to\s+([^,\n]+)/);
319
+ if (redirectMatch) {
320
+ action.redirectsTo = redirectMatch[1].trim();
321
+ }
322
+ // Check respond_to formats
323
+ if (bodyContent.includes('respond_to')) {
324
+ const formats = [];
325
+ if (bodyContent.includes('format.html'))
326
+ formats.push('html');
327
+ if (bodyContent.includes('format.json'))
328
+ formats.push('json');
329
+ if (bodyContent.includes('format.xml'))
330
+ formats.push('xml');
331
+ if (bodyContent.includes('format.js'))
332
+ formats.push('js');
333
+ if (bodyContent.includes('format.csv'))
334
+ formats.push('csv');
335
+ if (bodyContent.includes('format.pdf'))
336
+ formats.push('pdf');
337
+ if (formats.length > 0) {
338
+ action.respondsTo = formats;
339
+ }
340
+ }
341
+ // Find service calls
342
+ const serviceCalls = findNodes(methodNode, 'call');
343
+ for (const call of serviceCalls) {
344
+ const receiver = call.childForFieldName('receiver');
345
+ const method = call.childForFieldName('method');
346
+ if (receiver && method) {
347
+ const receiverText = receiver.text;
348
+ const methodText = method.text;
349
+ // Service pattern: SomeService.call/new/perform
350
+ if (receiverText.endsWith('Service') &&
351
+ ['call', 'new', 'perform', 'execute'].includes(methodText)) {
352
+ if (!action.servicesCalled.includes(receiverText)) {
353
+ action.servicesCalled.push(receiverText);
354
+ }
355
+ }
356
+ // Model pattern: User.find/where/create etc.
357
+ const arMethods = [
358
+ 'find',
359
+ 'find_by',
360
+ 'find_by!',
361
+ 'where',
362
+ 'all',
363
+ 'first',
364
+ 'last',
365
+ 'create',
366
+ 'create!',
367
+ 'new',
368
+ 'update',
369
+ 'update!',
370
+ 'destroy',
371
+ 'delete',
372
+ ];
373
+ if (/^[A-Z][a-zA-Z]+$/.test(receiverText) && arMethods.includes(methodText)) {
374
+ if (!['Rails', 'ActiveRecord', 'ActionController', 'ApplicationRecord'].includes(receiverText)) {
375
+ if (!action.modelsCalled.includes(receiverText)) {
376
+ action.modelsCalled.push(receiverText);
377
+ }
378
+ }
379
+ }
380
+ // Track all method calls
381
+ action.methodCalls.push(`${receiverText}.${methodText}`);
382
+ }
383
+ else if (method && !receiver) {
384
+ // Method call without receiver
385
+ action.methodCalls.push(method.text);
386
+ }
387
+ }
388
+ return action;
389
+ }
390
+ getCallArguments(call) {
391
+ const args = call.childForFieldName('arguments');
392
+ if (!args) {
393
+ // Arguments might be direct children without parentheses
394
+ const results = [];
395
+ for (let i = 0; i < call.childCount; i++) {
396
+ const child = call.child(i);
397
+ if (child && !['identifier', '(', ')', ',', 'call'].includes(child.type)) {
398
+ // Skip the method name and receiver
399
+ if (child !== call.childForFieldName('method') &&
400
+ child !== call.childForFieldName('receiver')) {
401
+ results.push(child);
402
+ }
403
+ }
404
+ }
405
+ return results;
406
+ }
407
+ const results = [];
408
+ for (let i = 0; i < args.childCount; i++) {
409
+ const child = args.child(i);
410
+ if (child && child.type !== '(' && child.type !== ')' && child.type !== ',') {
411
+ results.push(child);
412
+ }
413
+ }
414
+ return results;
415
+ }
416
+ extractArrayValues(node) {
417
+ const values = [];
418
+ if (node.type === 'array') {
419
+ for (let i = 0; i < node.childCount; i++) {
420
+ const child = node.child(i);
421
+ if (child && child.type !== '[' && child.type !== ']' && child.type !== ',') {
422
+ values.push(child.text.replace(/^:/, ''));
423
+ }
424
+ }
425
+ }
426
+ else {
427
+ values.push(node.text.replace(/^:/, ''));
428
+ }
429
+ return values;
430
+ }
431
+ }
432
+ // Standalone execution for testing
433
+ async function main() {
434
+ const targetPath = process.argv[2] || process.cwd();
435
+ console.log(`Analyzing controllers in: ${targetPath}`);
436
+ const analyzer = new RailsControllerAnalyzer(targetPath);
437
+ const result = await analyzer.analyze();
438
+ console.log('\n=== Rails Controllers Analysis ===\n');
439
+ console.log(`Total controllers: ${result.controllers.length}`);
440
+ console.log(`Total actions: ${result.totalActions}`);
441
+ console.log(`Namespaces: ${result.namespaces.join(', ') || '(none)'}`);
442
+ console.log(`Shared concerns: ${result.concerns.length}`);
443
+ if (result.errors.length > 0) {
444
+ console.log(`\n--- Errors (${result.errors.length}) ---`);
445
+ for (const error of result.errors.slice(0, 5)) {
446
+ console.log(` ❌ ${error}`);
447
+ }
448
+ if (result.errors.length > 5) {
449
+ console.log(` ... and ${result.errors.length - 5} more`);
450
+ }
451
+ }
452
+ console.log('\n--- Sample Controllers (first 10) ---');
453
+ for (const controller of result.controllers.slice(0, 10)) {
454
+ console.log(`\n 📁 ${controller.className} (${controller.filePath})`);
455
+ console.log(` Parent: ${controller.parentClass}`);
456
+ console.log(` Actions (${controller.actions.length}): ${controller.actions
457
+ .map((a) => a.name)
458
+ .slice(0, 5)
459
+ .join(', ')}${controller.actions.length > 5 ? '...' : ''}`);
460
+ if (controller.beforeActions.length > 0) {
461
+ console.log(` Before: ${controller.beforeActions.map((f) => f.name).join(', ')}`);
462
+ }
463
+ if (controller.concerns.length > 0) {
464
+ console.log(` Concerns: ${controller.concerns.join(', ')}`);
465
+ }
466
+ }
467
+ // Summary of actions by visibility
468
+ const publicActions = result.controllers.flatMap((c) => c.actions.filter((a) => a.visibility === 'public'));
469
+ const privateActions = result.controllers.flatMap((c) => c.actions.filter((a) => a.visibility === 'private'));
470
+ console.log('\n--- Action Visibility Summary ---');
471
+ console.log(` Public: ${publicActions.length}`);
472
+ console.log(` Private: ${privateActions.length}`);
473
+ }
474
+ // Run if executed directly
475
+ const isMainModule = import.meta.url === `file://${process.argv[1]}`;
476
+ if (isMainModule) {
477
+ main().catch(console.error);
478
+ }
479
+ //# sourceMappingURL=rails-controller-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-controller-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/rails/rails-controller-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Rails gRPC Service Analyzer using tree-sitter
3
+ * tree-sitterを使用してgRPCサービスを解析する
4
+ */
5
+ export interface GrpcServiceInfo {
6
+ name: string;
7
+ filePath: string;
8
+ className: string;
9
+ parentClass: string;
10
+ namespace?: string;
11
+ protoService?: string;
12
+ rpcs: RpcMethodInfo[];
13
+ policies: string[];
14
+ serializers: string[];
15
+ concerns: string[];
16
+ line: number;
17
+ }
18
+ export interface RpcMethodInfo {
19
+ name: string;
20
+ requestType?: string;
21
+ responseType?: string;
22
+ streaming?: 'none' | 'server' | 'client' | 'bidirectional';
23
+ policyMethod?: string;
24
+ modelsUsed: string[];
25
+ servicesUsed: string[];
26
+ line: number;
27
+ }
28
+ export interface RailsGrpcResult {
29
+ services: GrpcServiceInfo[];
30
+ totalRpcs: number;
31
+ namespaces: string[];
32
+ errors: string[];
33
+ }
34
+ export declare class RailsGrpcAnalyzer {
35
+ private rootPath;
36
+ private grpcDir;
37
+ private services;
38
+ private errors;
39
+ constructor(rootPath: string);
40
+ analyze(): Promise<RailsGrpcResult>;
41
+ private parseServiceFile;
42
+ private parseRpcMethod;
43
+ private getCallArguments;
44
+ }
45
+ //# sourceMappingURL=rails-grpc-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-grpc-analyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/rails/rails-grpc-analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,iBAAiB;IAKhB,OAAO,CAAC,QAAQ;IAJ5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,MAAM,CAAgB;gBAEV,QAAQ,EAAE,MAAM;IAI9B,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;YAwC3B,gBAAgB;IA6G9B,OAAO,CAAC,cAAc;IA0DtB,OAAO,CAAC,gBAAgB;CA2BzB"}