@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.
- package/LICENSE +21 -0
- package/README.md +527 -0
- package/dist/analyzers/base-analyzer.d.ts +46 -0
- package/dist/analyzers/base-analyzer.d.ts.map +1 -0
- package/dist/analyzers/base-analyzer.js +48 -0
- package/dist/analyzers/base-analyzer.js.map +1 -0
- package/dist/analyzers/dataflow-analyzer.d.ts +30 -0
- package/dist/analyzers/dataflow-analyzer.d.ts.map +1 -0
- package/dist/analyzers/dataflow-analyzer.js +426 -0
- package/dist/analyzers/dataflow-analyzer.js.map +1 -0
- package/dist/analyzers/graphql-analyzer.d.ts +23 -0
- package/dist/analyzers/graphql-analyzer.d.ts.map +1 -0
- package/dist/analyzers/graphql-analyzer.js +387 -0
- package/dist/analyzers/graphql-analyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +6 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +6 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/pages-analyzer.d.ts +85 -0
- package/dist/analyzers/pages-analyzer.d.ts.map +1 -0
- package/dist/analyzers/pages-analyzer.js +1696 -0
- package/dist/analyzers/pages-analyzer.js.map +1 -0
- package/dist/analyzers/rails/index.d.ts +47 -0
- package/dist/analyzers/rails/index.d.ts.map +1 -0
- package/dist/analyzers/rails/index.js +146 -0
- package/dist/analyzers/rails/index.js.map +1 -0
- package/dist/analyzers/rails/rails-controller-analyzer.d.ts +83 -0
- package/dist/analyzers/rails/rails-controller-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-controller-analyzer.js +479 -0
- package/dist/analyzers/rails/rails-controller-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-grpc-analyzer.d.ts +45 -0
- package/dist/analyzers/rails/rails-grpc-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-grpc-analyzer.js +263 -0
- package/dist/analyzers/rails/rails-grpc-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-model-analyzer.d.ts +89 -0
- package/dist/analyzers/rails/rails-model-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-model-analyzer.js +494 -0
- package/dist/analyzers/rails/rails-model-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-react-analyzer.d.ts +42 -0
- package/dist/analyzers/rails/rails-react-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-react-analyzer.js +530 -0
- package/dist/analyzers/rails/rails-react-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-routes-analyzer.d.ts +63 -0
- package/dist/analyzers/rails/rails-routes-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-routes-analyzer.js +541 -0
- package/dist/analyzers/rails/rails-routes-analyzer.js.map +1 -0
- package/dist/analyzers/rails/rails-view-analyzer.d.ts +50 -0
- package/dist/analyzers/rails/rails-view-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rails/rails-view-analyzer.js +387 -0
- package/dist/analyzers/rails/rails-view-analyzer.js.map +1 -0
- package/dist/analyzers/rails/ruby-parser.d.ts +64 -0
- package/dist/analyzers/rails/ruby-parser.d.ts.map +1 -0
- package/dist/analyzers/rails/ruby-parser.js +213 -0
- package/dist/analyzers/rails/ruby-parser.js.map +1 -0
- package/dist/analyzers/rest-api-analyzer.d.ts +66 -0
- package/dist/analyzers/rest-api-analyzer.d.ts.map +1 -0
- package/dist/analyzers/rest-api-analyzer.js +480 -0
- package/dist/analyzers/rest-api-analyzer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +550 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/cache.d.ts +48 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +152 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/engine.d.ts +47 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +320 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/generators/assets/common.css +187 -0
- package/dist/generators/assets/docs.css +363 -0
- package/dist/generators/assets/page-map.css +305 -0
- package/dist/generators/assets/rails-map.css +473 -0
- package/dist/generators/index.d.ts +4 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +4 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/markdown-generator.d.ts +26 -0
- package/dist/generators/markdown-generator.d.ts.map +1 -0
- package/dist/generators/markdown-generator.js +783 -0
- package/dist/generators/markdown-generator.js.map +1 -0
- package/dist/generators/mermaid-generator.d.ts +36 -0
- package/dist/generators/mermaid-generator.d.ts.map +1 -0
- package/dist/generators/mermaid-generator.js +365 -0
- package/dist/generators/mermaid-generator.js.map +1 -0
- package/dist/generators/page-map-generator.d.ts +23 -0
- package/dist/generators/page-map-generator.d.ts.map +1 -0
- package/dist/generators/page-map-generator.js +3563 -0
- package/dist/generators/page-map-generator.js.map +1 -0
- package/dist/generators/rails-map-generator.d.ts +22 -0
- package/dist/generators/rails-map-generator.d.ts.map +1 -0
- package/dist/generators/rails-map-generator.js +909 -0
- package/dist/generators/rails-map-generator.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/server/doc-server.d.ts +31 -0
- package/dist/server/doc-server.d.ts.map +1 -0
- package/dist/server/doc-server.js +1233 -0
- package/dist/server/doc-server.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -0
- package/dist/types.d.ts +294 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/env-detector.d.ts +32 -0
- package/dist/utils/env-detector.d.ts.map +1 -0
- package/dist/utils/env-detector.js +189 -0
- package/dist/utils/env-detector.js.map +1 -0
- package/dist/utils/parallel.d.ts +24 -0
- package/dist/utils/parallel.d.ts.map +1 -0
- package/dist/utils/parallel.js +71 -0
- package/dist/utils/parallel.js.map +1 -0
- package/package.json +131 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { Project, SyntaxKind } from 'ts-morph';
|
|
2
|
+
import fg from 'fast-glob';
|
|
3
|
+
import * as fs from 'fs/promises';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { parse as parseGraphQL } from 'graphql';
|
|
6
|
+
import { BaseAnalyzer } from './base-analyzer.js';
|
|
7
|
+
import { parallelMapSafe } from '../utils/parallel.js';
|
|
8
|
+
/**
|
|
9
|
+
* Analyzer for GraphQL operations
|
|
10
|
+
* GraphQL操作の分析器
|
|
11
|
+
*/
|
|
12
|
+
export class GraphQLAnalyzer extends BaseAnalyzer {
|
|
13
|
+
project;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
super(config);
|
|
16
|
+
this.project = new Project({
|
|
17
|
+
tsConfigFilePath: this.resolvePath('tsconfig.json'),
|
|
18
|
+
skipAddingFilesFromTsConfig: true,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
getName() {
|
|
22
|
+
return 'GraphQLAnalyzer';
|
|
23
|
+
}
|
|
24
|
+
async analyze() {
|
|
25
|
+
this.log('Starting GraphQL analysis...');
|
|
26
|
+
const operations = [];
|
|
27
|
+
// Analyze .graphql files
|
|
28
|
+
const graphqlOperations = await this.analyzeGraphQLFiles();
|
|
29
|
+
operations.push(...graphqlOperations);
|
|
30
|
+
// Analyze gql`` template literals in TypeScript files
|
|
31
|
+
const inlineOperations = await this.analyzeInlineGraphQL();
|
|
32
|
+
operations.push(...inlineOperations);
|
|
33
|
+
// Find where each operation is used
|
|
34
|
+
await this.findOperationUsage(operations);
|
|
35
|
+
this.log(`Found ${operations.length} GraphQL operations`);
|
|
36
|
+
return { graphqlOperations: operations };
|
|
37
|
+
}
|
|
38
|
+
async analyzeGraphQLFiles() {
|
|
39
|
+
const graphqlFiles = await fg(['**/*.graphql'], {
|
|
40
|
+
cwd: this.basePath,
|
|
41
|
+
ignore: ['**/node_modules/**', '**/.next/**'],
|
|
42
|
+
absolute: true,
|
|
43
|
+
});
|
|
44
|
+
// Process files in parallel
|
|
45
|
+
const results = await parallelMapSafe(graphqlFiles, async (filePath) => {
|
|
46
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
47
|
+
const document = parseGraphQL(content);
|
|
48
|
+
return this.extractOperationsFromDocument(document, path.relative(this.basePath, filePath));
|
|
49
|
+
});
|
|
50
|
+
return results.flat();
|
|
51
|
+
}
|
|
52
|
+
async analyzeInlineGraphQL() {
|
|
53
|
+
const operations = [];
|
|
54
|
+
const tsFiles = await fg(['**/*.ts', '**/*.tsx'], {
|
|
55
|
+
cwd: this.basePath,
|
|
56
|
+
ignore: [
|
|
57
|
+
'**/node_modules/**',
|
|
58
|
+
'**/.next/**',
|
|
59
|
+
'**/__tests__/**',
|
|
60
|
+
'**/*.test.*',
|
|
61
|
+
'**/*.spec.*',
|
|
62
|
+
],
|
|
63
|
+
absolute: true,
|
|
64
|
+
});
|
|
65
|
+
for (const filePath of tsFiles) {
|
|
66
|
+
try {
|
|
67
|
+
const sourceFile = this.project.addSourceFileAtPath(filePath);
|
|
68
|
+
const relativePath = path.relative(this.basePath, filePath);
|
|
69
|
+
// Check if file imports gql from any GraphQL-related source
|
|
70
|
+
// Supports: @apollo/client, graphql-tag, graphql.macro, __generated__/gql, gql-masked, etc.
|
|
71
|
+
const hasGqlImport = sourceFile.getImportDeclarations().some((imp) => {
|
|
72
|
+
const spec = imp.getModuleSpecifierValue();
|
|
73
|
+
const namedImports = imp.getNamedImports().map((n) => n.getName());
|
|
74
|
+
const defaultImport = imp.getDefaultImport()?.getText();
|
|
75
|
+
// Check if gql is imported from GraphQL-related modules
|
|
76
|
+
return ((namedImports.includes('gql') ||
|
|
77
|
+
namedImports.includes('graphql') ||
|
|
78
|
+
defaultImport === 'gql') &&
|
|
79
|
+
(spec.includes('graphql') ||
|
|
80
|
+
spec.includes('apollo') ||
|
|
81
|
+
spec.includes('gql') ||
|
|
82
|
+
spec.includes('__generated__')));
|
|
83
|
+
});
|
|
84
|
+
// Find gql`` or graphql`` template literals
|
|
85
|
+
const taggedTemplates = sourceFile.getDescendantsOfKind(SyntaxKind.TaggedTemplateExpression);
|
|
86
|
+
for (const template of taggedTemplates) {
|
|
87
|
+
const tag = template.getTag().getText();
|
|
88
|
+
if (tag === 'gql' || tag === 'graphql') {
|
|
89
|
+
try {
|
|
90
|
+
const templateLiteral = template.getTemplate();
|
|
91
|
+
let content = '';
|
|
92
|
+
if (templateLiteral.isKind(SyntaxKind.NoSubstitutionTemplateLiteral)) {
|
|
93
|
+
content = templateLiteral.getLiteralValue();
|
|
94
|
+
}
|
|
95
|
+
else if (templateLiteral.isKind(SyntaxKind.TemplateExpression)) {
|
|
96
|
+
// Handle template with substitutions - extract text safely
|
|
97
|
+
const fullText = templateLiteral.getText();
|
|
98
|
+
// Remove template literal backticks and fragment interpolations
|
|
99
|
+
content = fullText
|
|
100
|
+
.slice(1, -1) // Remove outer backticks
|
|
101
|
+
.replace(/\$\{[^}]*\}/g, ''); // Remove ${...} entirely (usually fragment refs)
|
|
102
|
+
}
|
|
103
|
+
if (content && content.trim()) {
|
|
104
|
+
try {
|
|
105
|
+
// Try to parse the GraphQL
|
|
106
|
+
const document = parseGraphQL(content);
|
|
107
|
+
const fileOperations = this.extractOperationsFromDocument(document, relativePath);
|
|
108
|
+
operations.push(...fileOperations);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Skip unparseable GraphQL - this is expected for templates with complex interpolations
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Skip templates that can't be processed
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Find gql() function calls: gql(/* GraphQL */ `...`) or gql(`...`)
|
|
121
|
+
// Also supports typed-document-node codegen pattern: gql(/* GraphQL */ `...`)
|
|
122
|
+
const callExpressions = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);
|
|
123
|
+
for (const call of callExpressions) {
|
|
124
|
+
try {
|
|
125
|
+
const expression = call.getExpression();
|
|
126
|
+
const expressionText = expression.getText();
|
|
127
|
+
// Match gql() or graphql() function calls
|
|
128
|
+
if (expressionText === 'gql' || expressionText === 'graphql') {
|
|
129
|
+
const args = call.getArguments();
|
|
130
|
+
if (args.length > 0) {
|
|
131
|
+
const firstArg = args[0];
|
|
132
|
+
let content = '';
|
|
133
|
+
// Handle template literal argument (direct or with /* GraphQL */ comment)
|
|
134
|
+
if (firstArg.isKind(SyntaxKind.NoSubstitutionTemplateLiteral)) {
|
|
135
|
+
content = firstArg.getLiteralValue();
|
|
136
|
+
}
|
|
137
|
+
else if (firstArg.isKind(SyntaxKind.TemplateExpression)) {
|
|
138
|
+
const fullText = firstArg.getText();
|
|
139
|
+
content = fullText.slice(1, -1).replace(/\$\{[^}]*\}/g, ''); // Remove fragment refs
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Try to get text content (might be a variable or other expression)
|
|
143
|
+
const argText = firstArg.getText();
|
|
144
|
+
// Check if it's a template literal wrapped in comments (/* GraphQL */ `...`)
|
|
145
|
+
if (argText.includes('`')) {
|
|
146
|
+
// Handle /* GraphQL */ `query { ... }` pattern
|
|
147
|
+
const match = argText.match(/\/\*\s*GraphQL\s*\*\/\s*`([^`]*)`/);
|
|
148
|
+
if (match) {
|
|
149
|
+
content = match[1];
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Fallback: just extract template literal
|
|
153
|
+
const simpleMatch = argText.match(/`([^`]*)`/);
|
|
154
|
+
if (simpleMatch) {
|
|
155
|
+
content = simpleMatch[1];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (content && content.trim()) {
|
|
161
|
+
try {
|
|
162
|
+
const document = parseGraphQL(content);
|
|
163
|
+
const fileOperations = this.extractOperationsFromDocument(document, relativePath);
|
|
164
|
+
operations.push(...fileOperations);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Skip unparseable GraphQL
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Skip calls that can't be processed
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Find exported const queries with GraphQL-like naming patterns
|
|
178
|
+
// Supports: SCREAMING_CASE (e.g., SEARCH_COMPANIES) and PascalCase (e.g., Query, Mutation)
|
|
179
|
+
if (hasGqlImport) {
|
|
180
|
+
const variableDeclarations = sourceFile.getVariableDeclarations();
|
|
181
|
+
for (const varDecl of variableDeclarations) {
|
|
182
|
+
const name = varDecl.getName();
|
|
183
|
+
// Match GraphQL-like variable names
|
|
184
|
+
const isGraphQLLike = name.includes('QUERY') ||
|
|
185
|
+
name.includes('MUTATION') ||
|
|
186
|
+
name.includes('FRAGMENT') ||
|
|
187
|
+
name.includes('Query') ||
|
|
188
|
+
name.includes('Mutation') ||
|
|
189
|
+
name.includes('Subscription') ||
|
|
190
|
+
// SCREAMING_CASE constants ending in related words
|
|
191
|
+
/^[A-Z_]+_(QUERY|MUTATION|FRAGMENT|SUBSCRIPTION)$/.test(name) ||
|
|
192
|
+
// PascalCase Query suffix
|
|
193
|
+
/Query$|Mutation$|Fragment$|Subscription$/.test(name);
|
|
194
|
+
if (isGraphQLLike) {
|
|
195
|
+
const initializer = varDecl.getInitializer();
|
|
196
|
+
// Tagged template is handled above, but let's also handle
|
|
197
|
+
// cases where the initializer is a call expression
|
|
198
|
+
if (initializer && initializer.isKind(SyntaxKind.CallExpression)) {
|
|
199
|
+
// Already handled above in the call expression loop
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
this.warn(`Failed to analyze ${filePath}: ${error.message}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return operations;
|
|
210
|
+
}
|
|
211
|
+
extractOperationsFromDocument(document, filePath) {
|
|
212
|
+
const operations = [];
|
|
213
|
+
for (const definition of document.definitions) {
|
|
214
|
+
const operation = this.extractOperation(definition, filePath);
|
|
215
|
+
if (operation) {
|
|
216
|
+
operations.push(operation);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return operations;
|
|
220
|
+
}
|
|
221
|
+
extractOperation(definition, filePath) {
|
|
222
|
+
if (definition.kind === 'OperationDefinition') {
|
|
223
|
+
const name = definition.name?.value || 'anonymous';
|
|
224
|
+
const type = definition.operation;
|
|
225
|
+
const variables = this.extractVariables(definition);
|
|
226
|
+
const fragments = this.extractFragmentReferences(definition);
|
|
227
|
+
const fields = this.extractFields(definition);
|
|
228
|
+
return {
|
|
229
|
+
name,
|
|
230
|
+
type,
|
|
231
|
+
filePath,
|
|
232
|
+
usedIn: [],
|
|
233
|
+
variables,
|
|
234
|
+
returnType: this.inferReturnType(definition),
|
|
235
|
+
fragments,
|
|
236
|
+
fields,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
if (definition.kind === 'FragmentDefinition') {
|
|
240
|
+
return {
|
|
241
|
+
name: definition.name.value,
|
|
242
|
+
type: 'fragment',
|
|
243
|
+
filePath,
|
|
244
|
+
usedIn: [],
|
|
245
|
+
variables: [],
|
|
246
|
+
returnType: definition.typeCondition.name.value,
|
|
247
|
+
fragments: this.extractFragmentReferences(definition),
|
|
248
|
+
fields: this.extractFields(definition),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
254
|
+
extractFields(definition) {
|
|
255
|
+
const fields = [];
|
|
256
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
257
|
+
const extractFromSelectionSet = (selectionSet, depth = 0) => {
|
|
258
|
+
if (!selectionSet || !selectionSet.selections || depth > 5)
|
|
259
|
+
return [];
|
|
260
|
+
const result = [];
|
|
261
|
+
for (const selection of selectionSet.selections) {
|
|
262
|
+
if (selection.kind === 'Field') {
|
|
263
|
+
const field = {
|
|
264
|
+
name: selection.name.value,
|
|
265
|
+
};
|
|
266
|
+
// Extract arguments as part of type info
|
|
267
|
+
if (selection.arguments && selection.arguments.length > 0) {
|
|
268
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
269
|
+
const args = selection.arguments.map((arg) => arg.name.value).join(', ');
|
|
270
|
+
field.type = `(${args})`;
|
|
271
|
+
}
|
|
272
|
+
// Recursively extract nested fields
|
|
273
|
+
if (selection.selectionSet) {
|
|
274
|
+
field.fields = extractFromSelectionSet(selection.selectionSet, depth + 1);
|
|
275
|
+
}
|
|
276
|
+
result.push(field);
|
|
277
|
+
}
|
|
278
|
+
else if (selection.kind === 'FragmentSpread') {
|
|
279
|
+
result.push({ name: `...${selection.name.value}`, type: 'fragment' });
|
|
280
|
+
}
|
|
281
|
+
else if (selection.kind === 'InlineFragment') {
|
|
282
|
+
if (selection.selectionSet) {
|
|
283
|
+
const typeName = selection.typeCondition?.name?.value || 'inline';
|
|
284
|
+
result.push({
|
|
285
|
+
name: `... on ${typeName}`,
|
|
286
|
+
type: 'inline-fragment',
|
|
287
|
+
fields: extractFromSelectionSet(selection.selectionSet, depth + 1),
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return result;
|
|
293
|
+
};
|
|
294
|
+
if (definition.selectionSet) {
|
|
295
|
+
return extractFromSelectionSet(definition.selectionSet);
|
|
296
|
+
}
|
|
297
|
+
return fields;
|
|
298
|
+
}
|
|
299
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
300
|
+
extractVariables(definition) {
|
|
301
|
+
const variables = [];
|
|
302
|
+
if (definition.variableDefinitions) {
|
|
303
|
+
for (const varDef of definition.variableDefinitions) {
|
|
304
|
+
const name = varDef.variable.name.value;
|
|
305
|
+
const type = this.typeNodeToString(varDef.type);
|
|
306
|
+
const required = varDef.type.kind === 'NonNullType';
|
|
307
|
+
variables.push({ name, type, required });
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return variables;
|
|
311
|
+
}
|
|
312
|
+
typeNodeToString(typeNode) {
|
|
313
|
+
if (typeNode.kind === 'NonNullType') {
|
|
314
|
+
return `${this.typeNodeToString(typeNode.type)}!`;
|
|
315
|
+
}
|
|
316
|
+
if (typeNode.kind === 'ListType') {
|
|
317
|
+
return `[${this.typeNodeToString(typeNode.type)}]`;
|
|
318
|
+
}
|
|
319
|
+
if (typeNode.kind === 'NamedType') {
|
|
320
|
+
return typeNode.name.value;
|
|
321
|
+
}
|
|
322
|
+
return 'unknown';
|
|
323
|
+
}
|
|
324
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
325
|
+
extractFragmentReferences(definition) {
|
|
326
|
+
const fragments = [];
|
|
327
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
328
|
+
const visit = (node) => {
|
|
329
|
+
if (!node)
|
|
330
|
+
return;
|
|
331
|
+
if (node.kind === 'FragmentSpread') {
|
|
332
|
+
fragments.push(node.name.value);
|
|
333
|
+
}
|
|
334
|
+
if (node.selectionSet) {
|
|
335
|
+
for (const selection of node.selectionSet.selections) {
|
|
336
|
+
visit(selection);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
visit(definition);
|
|
341
|
+
return fragments;
|
|
342
|
+
}
|
|
343
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
344
|
+
inferReturnType(definition) {
|
|
345
|
+
if (definition.selectionSet && definition.selectionSet.selections.length > 0) {
|
|
346
|
+
const firstSelection = definition.selectionSet.selections[0];
|
|
347
|
+
if (firstSelection.kind === 'Field') {
|
|
348
|
+
return firstSelection.name.value;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return 'unknown';
|
|
352
|
+
}
|
|
353
|
+
async findOperationUsage(operations) {
|
|
354
|
+
const tsFiles = await fg(['**/*.ts', '**/*.tsx'], {
|
|
355
|
+
cwd: this.basePath,
|
|
356
|
+
ignore: ['**/node_modules/**', '**/.next/**'],
|
|
357
|
+
absolute: true,
|
|
358
|
+
});
|
|
359
|
+
const operationNames = new Map();
|
|
360
|
+
for (const op of operations) {
|
|
361
|
+
operationNames.set(op.name, op);
|
|
362
|
+
}
|
|
363
|
+
for (const filePath of tsFiles) {
|
|
364
|
+
try {
|
|
365
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
366
|
+
const relativePath = path.relative(this.basePath, filePath);
|
|
367
|
+
for (const [name, operation] of operationNames) {
|
|
368
|
+
// Check if the operation is used in this file
|
|
369
|
+
if (content.includes(`useQuery<${name}`) ||
|
|
370
|
+
content.includes(`useMutation<${name}`) ||
|
|
371
|
+
content.includes(`useLazyQuery<${name}`) ||
|
|
372
|
+
content.includes(`${name}Query`) ||
|
|
373
|
+
content.includes(`${name}Mutation`) ||
|
|
374
|
+
content.includes(`${name}Variables`)) {
|
|
375
|
+
if (!operation.usedIn.includes(relativePath)) {
|
|
376
|
+
operation.usedIn.push(relativePath);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
// Skip unreadable files
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=graphql-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/graphql-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { BaseAnalyzer } from './base-analyzer.js';
|
|
2
|
+
import type { AnalysisResult, RepositoryConfig } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Analyzer for Next.js pages
|
|
5
|
+
* Next.jsページの分析器
|
|
6
|
+
*/
|
|
7
|
+
export declare class PagesAnalyzer extends BaseAnalyzer {
|
|
8
|
+
private project;
|
|
9
|
+
private codegenMap;
|
|
10
|
+
constructor(config: RepositoryConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Extract GraphQL operation name from a gql template literal or function call
|
|
13
|
+
* Handles multiple patterns:
|
|
14
|
+
* - gql`query Name { ... }`
|
|
15
|
+
* - gql(/* GraphQL */ `query Name { ... }`)
|
|
16
|
+
* - graphql(`query Name { ... }`)
|
|
17
|
+
*/
|
|
18
|
+
private extractOperationNameFromGql;
|
|
19
|
+
/**
|
|
20
|
+
* Find and extract operation name from a variable declaration in source file
|
|
21
|
+
* Handles cases like: const Query = gql(comment `query ActualName...`)
|
|
22
|
+
*/
|
|
23
|
+
private findOperationNameFromVariable;
|
|
24
|
+
getName(): string;
|
|
25
|
+
analyze(): Promise<Partial<AnalysisResult>>;
|
|
26
|
+
private analyzePageFile;
|
|
27
|
+
/**
|
|
28
|
+
* Detect the pages root directory from a file path
|
|
29
|
+
* e.g., /project/src/pages/users/index.tsx -> /project/src/pages
|
|
30
|
+
*/
|
|
31
|
+
private detectPagesRoot;
|
|
32
|
+
private filePathToRoutePath;
|
|
33
|
+
private extractRouteParams;
|
|
34
|
+
private findPageComponent;
|
|
35
|
+
private extractLayout;
|
|
36
|
+
private extractAuthRequirement;
|
|
37
|
+
private extractRolesFromCondition;
|
|
38
|
+
private extractPermissions;
|
|
39
|
+
private extractDataFetching;
|
|
40
|
+
private symbolTraceCache;
|
|
41
|
+
/**
|
|
42
|
+
* Analyze an imported component file for GraphQL queries with full symbol tracing
|
|
43
|
+
* 임포트된 컴포넌트를 재귀적으로 완전 추적
|
|
44
|
+
*/
|
|
45
|
+
private analyzeImportedComponent;
|
|
46
|
+
/**
|
|
47
|
+
* Analyze a custom hook file for GraphQL queries with recursive tracing
|
|
48
|
+
*/
|
|
49
|
+
private analyzeCustomHook;
|
|
50
|
+
private globalContextQueries;
|
|
51
|
+
/**
|
|
52
|
+
* Find page files from multiple possible locations
|
|
53
|
+
* Next.js, React, Rails+React 구조 모두 지원
|
|
54
|
+
*/
|
|
55
|
+
private findPageFiles;
|
|
56
|
+
/**
|
|
57
|
+
* Analyze _app.tsx for global providers that use GraphQL
|
|
58
|
+
* _app.tsx에서 전역 Context Provider의 GraphQL 분석
|
|
59
|
+
*/
|
|
60
|
+
private analyzeAppFile;
|
|
61
|
+
/**
|
|
62
|
+
* Load codegen mapping from __generated__ folders (optional)
|
|
63
|
+
* 코드젠 폴더가 있으면 Document → Operation name 매핑 로드
|
|
64
|
+
*/
|
|
65
|
+
private loadCodegenMapping;
|
|
66
|
+
/**
|
|
67
|
+
* Resolve Document name to operation name using codegen map
|
|
68
|
+
*/
|
|
69
|
+
private resolveDocumentName;
|
|
70
|
+
/**
|
|
71
|
+
* Follow re-export in index file to find the actual component file
|
|
72
|
+
*/
|
|
73
|
+
private followReExport;
|
|
74
|
+
/**
|
|
75
|
+
* Check if a name looks like a React component (PascalCase with common suffixes)
|
|
76
|
+
*/
|
|
77
|
+
private isComponentName;
|
|
78
|
+
private extractNavigation;
|
|
79
|
+
/**
|
|
80
|
+
* Extract multi-step flow information (wizard, stepper, onboarding)
|
|
81
|
+
*/
|
|
82
|
+
private extractSteps;
|
|
83
|
+
private extractLinkedPages;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=pages-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/pages-analyzer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EACV,cAAc,EAKd,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,UAAU,CAAuE;gBAE7E,MAAM,EAAE,gBAAgB;IAQpC;;;;;;OAMG;IACH,OAAO,CAAC,2BAA2B;IAwBnC;;;OAGG;IACH,OAAO,CAAC,6BAA6B;IAwErC,OAAO,IAAI,MAAM;IAIX,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YA0CnC,eAAe;IAqC7B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,iBAAiB;IA4EzB,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,sBAAsB;IA+E9B,OAAO,CAAC,yBAAyB;IAkCjC,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,mBAAmB;IA4R3B,OAAO,CAAC,gBAAgB,CAAyC;IAEjE;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAyPhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsLzB,OAAO,CAAC,oBAAoB,CAA0B;IAEtD;;;OAGG;YACW,aAAa;IA2H3B;;;OAGG;YACW,cAAc;IAiE5B;;;OAGG;YACW,kBAAkB;IAqFhC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAwFtB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2FvB,OAAO,CAAC,iBAAiB;IA0EzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAwJpB,OAAO,CAAC,kBAAkB;CAyD3B"}
|