@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,541 @@
1
+ /**
2
+ * Rails Routes Analyzer using tree-sitter
3
+ * tree-sitterを使用してroutes.rbを解析する
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import { parseRubyFile, findNodes, getChildByType, getChildrenByType, getCallArguments, } from './ruby-parser.js';
8
+ export class RailsRoutesAnalyzer {
9
+ rootPath;
10
+ routesDir;
11
+ routes = [];
12
+ namespaces = [];
13
+ resources = [];
14
+ mountedEngines = [];
15
+ drawnFiles = [];
16
+ errors = [];
17
+ constructor(rootPath) {
18
+ this.rootPath = rootPath;
19
+ this.routesDir = path.join(rootPath, 'config', 'routes');
20
+ }
21
+ async analyze() {
22
+ const mainRoutesFile = path.join(this.rootPath, 'config', 'routes.rb');
23
+ if (!fs.existsSync(mainRoutesFile)) {
24
+ return {
25
+ routes: [],
26
+ namespaces: [],
27
+ resources: [],
28
+ mountedEngines: [],
29
+ drawnFiles: [],
30
+ errors: [`routes.rb not found at ${mainRoutesFile}`],
31
+ };
32
+ }
33
+ try {
34
+ await this.parseRoutesFile(mainRoutesFile, []);
35
+ }
36
+ catch (error) {
37
+ this.errors.push(`Error parsing ${mainRoutesFile}: ${error}`);
38
+ }
39
+ return {
40
+ routes: this.routes,
41
+ namespaces: [...new Set(this.namespaces)],
42
+ resources: this.resources,
43
+ mountedEngines: this.mountedEngines,
44
+ drawnFiles: this.drawnFiles,
45
+ errors: this.errors,
46
+ };
47
+ }
48
+ async parseRoutesFile(filePath, currentNamespaces) {
49
+ const tree = await parseRubyFile(filePath);
50
+ const rootNode = tree.rootNode;
51
+ // Find all method calls
52
+ const calls = findNodes(rootNode, 'call');
53
+ for (const call of calls) {
54
+ const methodNode = call.childForFieldName('method');
55
+ if (!methodNode)
56
+ continue;
57
+ const methodName = methodNode.text;
58
+ const line = call.startPosition.row + 1;
59
+ switch (methodName) {
60
+ case 'get':
61
+ case 'post':
62
+ case 'put':
63
+ case 'patch':
64
+ case 'delete':
65
+ case 'match':
66
+ this.parseHttpRoute(call, methodName, currentNamespaces, line);
67
+ break;
68
+ case 'resources':
69
+ case 'resource':
70
+ await this.parseResources(call, currentNamespaces, line, methodName === 'resource');
71
+ break;
72
+ case 'namespace':
73
+ await this.parseNamespace(call, currentNamespaces, filePath);
74
+ break;
75
+ case 'mount':
76
+ this.parseMount(call, line);
77
+ break;
78
+ case 'draw':
79
+ await this.parseDraw(call, currentNamespaces);
80
+ break;
81
+ case 'devise_for':
82
+ this.parseDeviseFor(call, currentNamespaces, line);
83
+ break;
84
+ case 'root':
85
+ this.parseRoot(call, currentNamespaces, line);
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ parseHttpRoute(call, method, namespaces, line) {
91
+ const args = getCallArguments(call);
92
+ if (args.length === 0)
93
+ return;
94
+ // First argument is the path
95
+ const pathArg = args[0];
96
+ const routePath = this.extractStringValue(pathArg);
97
+ if (!routePath)
98
+ return;
99
+ // Find controller#action from 'to:' option or second argument
100
+ let controller = '';
101
+ let action = '';
102
+ // Look for hash/pair arguments
103
+ for (const arg of args) {
104
+ if (arg.type === 'hash' || arg.type === 'pair') {
105
+ const pairs = arg.type === 'hash' ? getChildrenByType(arg, 'pair') : [arg];
106
+ for (const pair of pairs) {
107
+ const key = pair.child(0)?.text?.replace(/^:/, '');
108
+ const value = pair.child(2);
109
+ if (key === 'to' && value) {
110
+ const toValue = this.extractStringValue(value);
111
+ if (toValue && toValue.includes('#')) {
112
+ [controller, action] = toValue.split('#');
113
+ }
114
+ }
115
+ }
116
+ }
117
+ else if (arg.type === 'string' || arg.type === 'string_content') {
118
+ const strValue = this.extractStringValue(arg);
119
+ if (strValue && strValue.includes('#') && !controller) {
120
+ [controller, action] = strValue.split('#');
121
+ }
122
+ }
123
+ }
124
+ // If no explicit controller#action, try to infer from path
125
+ if (!controller && !action) {
126
+ const pathParts = routePath.replace(/^\//, '').split('/');
127
+ controller = pathParts[0] || '';
128
+ action = pathParts[1] || 'index';
129
+ }
130
+ // Apply namespace prefix
131
+ if (namespaces.length > 0 && controller && !controller.includes('/')) {
132
+ controller = `${namespaces.join('/')}/${controller}`;
133
+ }
134
+ // Build full path with namespace
135
+ const fullPath = this.buildPath(namespaces, routePath);
136
+ this.routes.push({
137
+ method: method === 'match' ? 'ALL' : method.toUpperCase(),
138
+ path: fullPath,
139
+ controller,
140
+ action,
141
+ namespace: namespaces.join('/') || undefined,
142
+ line,
143
+ });
144
+ }
145
+ async parseResources(call, namespaces, line, singular) {
146
+ const args = getCallArguments(call);
147
+ if (args.length === 0)
148
+ return;
149
+ // First argument is the resource name (symbol)
150
+ const nameArg = args[0];
151
+ const resourceName = nameArg.text.replace(/^:/, '');
152
+ const resource = {
153
+ name: resourceName,
154
+ controller: namespaces.length > 0 ? `${namespaces.join('/')}/${resourceName}` : resourceName,
155
+ nested: [],
156
+ memberRoutes: [],
157
+ collectionRoutes: [],
158
+ line,
159
+ };
160
+ // Parse options (only:, except:, etc.)
161
+ for (const arg of args) {
162
+ if (arg.type === 'hash') {
163
+ const pairs = getChildrenByType(arg, 'pair');
164
+ for (const pair of pairs) {
165
+ const key = pair.child(0)?.text?.replace(/^:/, '');
166
+ const value = pair.child(2);
167
+ if (key === 'only' && value) {
168
+ resource.only = this.extractArrayValues(value);
169
+ }
170
+ else if (key === 'except' && value) {
171
+ resource.except = this.extractArrayValues(value);
172
+ }
173
+ }
174
+ }
175
+ }
176
+ // Generate RESTful routes
177
+ this.generateResourceRoutes(resource, namespaces, singular);
178
+ this.resources.push(resource);
179
+ // Parse nested block if exists
180
+ const block = call.childForFieldName('block');
181
+ if (block) {
182
+ // Look for member/collection blocks and nested resources
183
+ const nestedCalls = findNodes(block, 'call');
184
+ for (const nestedCall of nestedCalls) {
185
+ const nestedMethod = nestedCall.childForFieldName('method')?.text;
186
+ if (nestedMethod === 'member') {
187
+ // Parse member routes
188
+ const memberBlock = nestedCall.childForFieldName('block');
189
+ if (memberBlock) {
190
+ this.parseMemberCollectionRoutes(memberBlock, resource, namespaces, 'member');
191
+ }
192
+ }
193
+ else if (nestedMethod === 'collection') {
194
+ // Parse collection routes
195
+ const collectionBlock = nestedCall.childForFieldName('block');
196
+ if (collectionBlock) {
197
+ this.parseMemberCollectionRoutes(collectionBlock, resource, namespaces, 'collection');
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }
203
+ parseMemberCollectionRoutes(block, resource, namespaces, type) {
204
+ const calls = findNodes(block, 'call');
205
+ for (const call of calls) {
206
+ const methodNode = call.childForFieldName('method');
207
+ if (!methodNode)
208
+ continue;
209
+ const method = methodNode.text;
210
+ if (!['get', 'post', 'put', 'patch', 'delete'].includes(method))
211
+ continue;
212
+ const args = getCallArguments(call);
213
+ if (args.length === 0)
214
+ continue;
215
+ const actionName = args[0].text.replace(/^:/, '');
216
+ const basePath = type === 'member'
217
+ ? `/${resource.name}/:id/${actionName}`
218
+ : `/${resource.name}/${actionName}`;
219
+ const route = {
220
+ method: method.toUpperCase(),
221
+ path: this.buildPath(namespaces, basePath),
222
+ controller: resource.controller,
223
+ action: actionName,
224
+ namespace: namespaces.join('/') || undefined,
225
+ line: call.startPosition.row + 1,
226
+ };
227
+ if (type === 'member') {
228
+ resource.memberRoutes.push(route);
229
+ }
230
+ else {
231
+ resource.collectionRoutes.push(route);
232
+ }
233
+ this.routes.push(route);
234
+ }
235
+ }
236
+ async parseNamespace(call, currentNamespaces, _currentFile) {
237
+ const args = getCallArguments(call);
238
+ if (args.length === 0)
239
+ return;
240
+ const nsName = args[0].text.replace(/^:/, '');
241
+ this.namespaces.push(nsName);
242
+ const newNamespaces = [...currentNamespaces, nsName];
243
+ // Parse the namespace block
244
+ const block = call.childForFieldName('block');
245
+ if (block) {
246
+ // Look for draw calls or nested route definitions
247
+ const nestedCalls = findNodes(block, 'call');
248
+ for (const nestedCall of nestedCalls) {
249
+ const methodNode = nestedCall.childForFieldName('method');
250
+ if (!methodNode)
251
+ continue;
252
+ const methodName = methodNode.text;
253
+ const line = nestedCall.startPosition.row + 1;
254
+ switch (methodName) {
255
+ case 'get':
256
+ case 'post':
257
+ case 'put':
258
+ case 'patch':
259
+ case 'delete':
260
+ case 'match':
261
+ this.parseHttpRoute(nestedCall, methodName, newNamespaces, line);
262
+ break;
263
+ case 'resources':
264
+ case 'resource':
265
+ await this.parseResources(nestedCall, newNamespaces, line, methodName === 'resource');
266
+ break;
267
+ case 'draw':
268
+ await this.parseDraw(nestedCall, newNamespaces);
269
+ break;
270
+ }
271
+ }
272
+ }
273
+ }
274
+ parseMount(call, line) {
275
+ const args = getCallArguments(call);
276
+ if (args.length === 0)
277
+ return;
278
+ // First arg is the engine
279
+ const engineArg = args[0];
280
+ const engine = engineArg.text;
281
+ // Find mount path from 'at:' option or '=>' syntax
282
+ let mountPath = '/';
283
+ for (const arg of args) {
284
+ if (arg.type === 'hash' || arg.type === 'pair') {
285
+ const pairs = arg.type === 'hash' ? getChildrenByType(arg, 'pair') : [arg];
286
+ for (const pair of pairs) {
287
+ const key = pair.child(0)?.text?.replace(/^:/, '');
288
+ const value = pair.child(2);
289
+ if (key === 'at' && value) {
290
+ mountPath = this.extractStringValue(value) || mountPath;
291
+ }
292
+ }
293
+ }
294
+ else if (arg.type === 'string') {
295
+ // Could be the path in "mount Engine => '/path'" syntax
296
+ const strValue = this.extractStringValue(arg);
297
+ if (strValue && strValue.startsWith('/')) {
298
+ mountPath = strValue;
299
+ }
300
+ }
301
+ }
302
+ this.mountedEngines.push({
303
+ engine,
304
+ mountPath,
305
+ line,
306
+ });
307
+ }
308
+ async parseDraw(call, namespaces) {
309
+ const args = getCallArguments(call);
310
+ if (args.length === 0)
311
+ return;
312
+ const drawName = args[0].text.replace(/^:/, '');
313
+ const drawFile = path.join(this.routesDir, `${drawName}.rb`);
314
+ if (fs.existsSync(drawFile)) {
315
+ this.drawnFiles.push(drawFile);
316
+ try {
317
+ await this.parseRoutesFile(drawFile, namespaces);
318
+ }
319
+ catch (error) {
320
+ this.errors.push(`Error parsing drawn file ${drawFile}: ${error}`);
321
+ }
322
+ }
323
+ }
324
+ parseDeviseFor(call, namespaces, line) {
325
+ const args = getCallArguments(call);
326
+ if (args.length === 0)
327
+ return;
328
+ const resource = args[0].text.replace(/^:/, '');
329
+ // Generate standard Devise routes
330
+ const deviseRoutes = [
331
+ { method: 'GET', path: `/${resource}/sign_in`, action: 'new', controller: 'devise/sessions' },
332
+ {
333
+ method: 'POST',
334
+ path: `/${resource}/sign_in`,
335
+ action: 'create',
336
+ controller: 'devise/sessions',
337
+ },
338
+ {
339
+ method: 'DELETE',
340
+ path: `/${resource}/sign_out`,
341
+ action: 'destroy',
342
+ controller: 'devise/sessions',
343
+ },
344
+ {
345
+ method: 'GET',
346
+ path: `/${resource}/password/new`,
347
+ action: 'new',
348
+ controller: 'devise/passwords',
349
+ },
350
+ {
351
+ method: 'POST',
352
+ path: `/${resource}/password`,
353
+ action: 'create',
354
+ controller: 'devise/passwords',
355
+ },
356
+ {
357
+ method: 'GET',
358
+ path: `/${resource}/sign_up`,
359
+ action: 'new',
360
+ controller: 'devise/registrations',
361
+ },
362
+ {
363
+ method: 'POST',
364
+ path: `/${resource}`,
365
+ action: 'create',
366
+ controller: 'devise/registrations',
367
+ },
368
+ ];
369
+ for (const dr of deviseRoutes) {
370
+ this.routes.push({
371
+ method: dr.method,
372
+ path: this.buildPath(namespaces, dr.path),
373
+ controller: dr.controller,
374
+ action: dr.action,
375
+ namespace: namespaces.join('/') || undefined,
376
+ line,
377
+ authenticated: false,
378
+ });
379
+ }
380
+ }
381
+ parseRoot(call, namespaces, line) {
382
+ const args = getCallArguments(call);
383
+ let controller = '';
384
+ let action = 'index';
385
+ for (const arg of args) {
386
+ if (arg.type === 'string') {
387
+ const value = this.extractStringValue(arg);
388
+ if (value && value.includes('#')) {
389
+ [controller, action] = value.split('#');
390
+ }
391
+ }
392
+ else if (arg.type === 'hash' || arg.type === 'pair') {
393
+ const pairs = arg.type === 'hash' ? getChildrenByType(arg, 'pair') : [arg];
394
+ for (const pair of pairs) {
395
+ const key = pair.child(0)?.text?.replace(/^:/, '');
396
+ const value = pair.child(2);
397
+ if (key === 'to' && value) {
398
+ const toValue = this.extractStringValue(value);
399
+ if (toValue && toValue.includes('#')) {
400
+ [controller, action] = toValue.split('#');
401
+ }
402
+ }
403
+ }
404
+ }
405
+ }
406
+ if (controller) {
407
+ this.routes.push({
408
+ method: 'GET',
409
+ path: this.buildPath(namespaces, '/'),
410
+ controller,
411
+ action,
412
+ namespace: namespaces.join('/') || undefined,
413
+ line,
414
+ });
415
+ }
416
+ }
417
+ generateResourceRoutes(resource, namespaces, singular) {
418
+ const basePath = this.buildPath(namespaces, `/${resource.name}`);
419
+ const allActions = singular
420
+ ? ['show', 'new', 'create', 'edit', 'update', 'destroy']
421
+ : ['index', 'show', 'new', 'create', 'edit', 'update', 'destroy'];
422
+ const actions = resource.only ||
423
+ (resource.except
424
+ ? allActions.filter((a) => !resource.except.includes(a))
425
+ : allActions);
426
+ const restfulRoutes = [];
427
+ if (!singular) {
428
+ if (actions.includes('index')) {
429
+ restfulRoutes.push({ method: 'GET', path: basePath, action: 'index' });
430
+ }
431
+ }
432
+ if (actions.includes('new')) {
433
+ restfulRoutes.push({ method: 'GET', path: `${basePath}/new`, action: 'new' });
434
+ }
435
+ if (actions.includes('create')) {
436
+ restfulRoutes.push({ method: 'POST', path: basePath, action: 'create' });
437
+ }
438
+ const showPath = singular ? basePath : `${basePath}/:id`;
439
+ if (actions.includes('show')) {
440
+ restfulRoutes.push({ method: 'GET', path: showPath, action: 'show' });
441
+ }
442
+ if (actions.includes('edit')) {
443
+ restfulRoutes.push({ method: 'GET', path: `${showPath}/edit`, action: 'edit' });
444
+ }
445
+ if (actions.includes('update')) {
446
+ restfulRoutes.push({ method: 'PUT', path: showPath, action: 'update' });
447
+ restfulRoutes.push({ method: 'PATCH', path: showPath, action: 'update' });
448
+ }
449
+ if (actions.includes('destroy')) {
450
+ restfulRoutes.push({ method: 'DELETE', path: showPath, action: 'destroy' });
451
+ }
452
+ for (const route of restfulRoutes) {
453
+ this.routes.push({
454
+ method: route.method,
455
+ path: route.path,
456
+ controller: resource.controller,
457
+ action: route.action,
458
+ namespace: namespaces.join('/') || undefined,
459
+ line: resource.line,
460
+ });
461
+ }
462
+ }
463
+ buildPath(namespaces, routePath) {
464
+ if (routePath.startsWith('/')) {
465
+ return routePath;
466
+ }
467
+ const nsPath = namespaces.length > 0 ? `/${namespaces.join('/')}` : '';
468
+ return `${nsPath}/${routePath}`;
469
+ }
470
+ extractStringValue(node) {
471
+ if (node.type === 'string') {
472
+ // String has quotes, extract content
473
+ const content = getChildByType(node, 'string_content');
474
+ return content ? content.text : node.text.replace(/^["']|["']$/g, '');
475
+ }
476
+ if (node.type === 'string_content') {
477
+ return node.text;
478
+ }
479
+ if (node.type === 'simple_symbol' || node.type === 'symbol') {
480
+ return node.text.replace(/^:/, '');
481
+ }
482
+ return node.text.replace(/^["']|["']$/g, '');
483
+ }
484
+ extractArrayValues(node) {
485
+ const values = [];
486
+ if (node.type === 'array') {
487
+ for (let i = 0; i < node.childCount; i++) {
488
+ const child = node.child(i);
489
+ if (child && child.type !== '[' && child.type !== ']' && child.type !== ',') {
490
+ const value = this.extractStringValue(child);
491
+ if (value)
492
+ values.push(value);
493
+ }
494
+ }
495
+ }
496
+ else {
497
+ // Single value
498
+ const value = this.extractStringValue(node);
499
+ if (value)
500
+ values.push(value);
501
+ }
502
+ return values;
503
+ }
504
+ }
505
+ // Standalone execution for testing
506
+ async function main() {
507
+ const targetPath = process.argv[2] || process.cwd();
508
+ console.log(`Analyzing routes in: ${targetPath}`);
509
+ const analyzer = new RailsRoutesAnalyzer(targetPath);
510
+ const result = await analyzer.analyze();
511
+ console.log('\n=== Rails Routes Analysis ===\n');
512
+ console.log(`Total routes: ${result.routes.length}`);
513
+ console.log(`Namespaces: ${result.namespaces.join(', ') || '(none)'}`);
514
+ console.log(`Resources: ${result.resources.length}`);
515
+ console.log(`Mounted engines: ${result.mountedEngines.length}`);
516
+ console.log(`External route files: ${result.drawnFiles.length}`);
517
+ if (result.errors.length > 0) {
518
+ console.log(`\n--- Errors ---`);
519
+ for (const error of result.errors) {
520
+ console.log(` ❌ ${error}`);
521
+ }
522
+ }
523
+ console.log('\n--- Sample Routes (first 30) ---');
524
+ for (const route of result.routes.slice(0, 30)) {
525
+ console.log(` ${route.method.padEnd(7)} ${route.path.padEnd(50)} => ${route.controller}#${route.action}`);
526
+ }
527
+ console.log('\n--- Mounted Engines ---');
528
+ for (const engine of result.mountedEngines) {
529
+ console.log(` ${engine.engine} => ${engine.mountPath}`);
530
+ }
531
+ console.log('\n--- External Route Files ---');
532
+ for (const file of result.drawnFiles) {
533
+ console.log(` ${path.basename(file)}`);
534
+ }
535
+ }
536
+ // Run if executed directly
537
+ const isMainModule = import.meta.url === `file://${process.argv[1]}`;
538
+ if (isMainModule) {
539
+ main().catch(console.error);
540
+ }
541
+ //# sourceMappingURL=rails-routes-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-routes-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/rails/rails-routes-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export interface ReactComponentRef {
2
+ name: string;
3
+ propsVar?: string;
4
+ ssr?: boolean;
5
+ line?: number;
6
+ }
7
+ export interface RailsViewInfo {
8
+ name: string;
9
+ path: string;
10
+ controller: string;
11
+ action: string;
12
+ format: string;
13
+ template: 'haml' | 'erb' | 'yml' | 'other';
14
+ routePath?: string;
15
+ partials: string[];
16
+ helpers: string[];
17
+ instanceVars: string[];
18
+ reactComponents: ReactComponentRef[];
19
+ line?: number;
20
+ }
21
+ export interface RailsPageInfo {
22
+ route: string;
23
+ method: string;
24
+ controller: string;
25
+ action: string;
26
+ view?: RailsViewInfo;
27
+ apis: RailsApiCall[];
28
+ services: string[];
29
+ grpcCalls: string[];
30
+ modelAccess: string[];
31
+ }
32
+ export interface RailsApiCall {
33
+ type: 'grpc' | 'service' | 'http' | 'internal';
34
+ name: string;
35
+ method?: string;
36
+ source: string;
37
+ line?: number;
38
+ }
39
+ export interface RailsViewAnalysisResult {
40
+ views: RailsViewInfo[];
41
+ pages: RailsPageInfo[];
42
+ summary: {
43
+ totalViews: number;
44
+ totalPages: number;
45
+ byController: Record<string, number>;
46
+ byTemplate: Record<string, number>;
47
+ };
48
+ }
49
+ export declare function analyzeRailsViews(rootPath: string): Promise<RailsViewAnalysisResult>;
50
+ //# sourceMappingURL=rails-view-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-view-analyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/rails/rails-view-analyzer.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;CACH;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAmD1F"}