metadatafy 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-BT3J264A.cjs +2 -0
- package/dist/chunk-WUEHYY36.js +2 -0
- package/dist/cli.cjs +8 -1452
- package/dist/cli.js +8 -1424
- package/dist/index.cjs +1 -120
- package/dist/index.js +1 -3
- package/dist/next.cjs +3 -111
- package/dist/next.js +3 -86
- package/dist/vite.cjs +3 -91
- package/dist/vite.js +3 -66
- package/package.json +1 -1
- package/dist/chunk-ECKCIPM5.js +0 -1329
- package/dist/chunk-ECKCIPM5.js.map +0 -1
- package/dist/chunk-EDHWKZRG.cjs +0 -1384
- package/dist/chunk-EDHWKZRG.cjs.map +0 -1
- package/dist/cli.cjs.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/next.cjs.map +0 -1
- package/dist/next.js.map +0 -1
- package/dist/vite.cjs.map +0 -1
- package/dist/vite.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/config.ts","../src/core/parsers/typescript-parser.ts","../src/core/parsers/sql-parser.ts","../src/core/extractors/import-extractor.ts","../src/core/extractors/export-extractor.ts","../src/core/extractors/props-extractor.ts","../src/utils/naming-utils.ts","../src/utils/korean-mapper.ts","../src/core/extractors/keyword-extractor.ts","../src/core/resolvers/dependency-resolver.ts","../src/core/resolvers/call-graph-builder.ts","../src/utils/id-utils.ts","../src/core/analyzer.ts","../src/core/output/file-writer.ts","../src/core/output/api-sender.ts"],"names":["ts","path","exports","path2","fs","crypto","glob","path3","fs2","basename","dirname","path4","fs3","resolve"],"mappings":"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","file":"chunk-EDHWKZRG.cjs","sourcesContent":["import type { PluginConfig, FileType } from './types';\n\n/**\n * 기본 파일 타입 매핑 (glob 패턴 -> FileType)\n */\nexport const DEFAULT_FILE_TYPE_MAPPING: Record<string, FileType> = {\n // Next.js App Router\n 'app/**/page.tsx': 'route',\n 'app/**/page.ts': 'route',\n 'app/**/layout.tsx': 'route',\n 'app/**/layout.ts': 'route',\n 'app/**/route.tsx': 'api',\n 'app/**/route.ts': 'api',\n 'app/api/**/*.ts': 'api',\n 'app/api/**/*.tsx': 'api',\n\n // Pages Router (레거시)\n 'pages/**/*.tsx': 'route',\n 'pages/**/*.ts': 'route',\n 'pages/api/**/*.ts': 'api',\n\n // Components\n 'components/**/*.tsx': 'component',\n 'components/**/*.ts': 'component',\n 'src/components/**/*.tsx': 'component',\n 'src/components/**/*.ts': 'component',\n\n // Hooks\n 'hooks/**/*.ts': 'hook',\n 'hooks/**/*.tsx': 'hook',\n 'src/hooks/**/*.ts': 'hook',\n 'src/hooks/**/*.tsx': 'hook',\n\n // Services\n 'services/**/*.ts': 'service',\n 'src/services/**/*.ts': 'service',\n\n // Utilities\n 'lib/**/*.ts': 'utility',\n 'src/lib/**/*.ts': 'utility',\n 'utils/**/*.ts': 'utility',\n 'src/utils/**/*.ts': 'utility',\n\n // Database\n 'supabase/migrations/*.sql': 'table',\n 'prisma/migrations/**/*.sql': 'table',\n};\n\n/**\n * 기본 포함 패턴\n */\nexport const DEFAULT_INCLUDE_PATTERNS = [\n 'app/**/*.{ts,tsx}',\n 'pages/**/*.{ts,tsx}',\n 'components/**/*.{ts,tsx}',\n 'hooks/**/*.{ts,tsx}',\n 'services/**/*.ts',\n 'lib/**/*.ts',\n 'utils/**/*.ts',\n 'src/**/*.{ts,tsx}',\n 'supabase/migrations/*.sql',\n];\n\n/**\n * 기본 제외 패턴\n */\nexport const DEFAULT_EXCLUDE_PATTERNS = [\n '**/node_modules/**',\n '**/.next/**',\n '**/dist/**',\n '**/*.test.{ts,tsx}',\n '**/*.spec.{ts,tsx}',\n '**/__tests__/**',\n '**/*.d.ts',\n '**/coverage/**',\n];\n\n/**\n * 기본 설정으로 PluginConfig 생성\n */\nexport function createDefaultConfig(\n overrides: Partial<PluginConfig> = {}\n): PluginConfig {\n return {\n projectId: overrides.projectId || 'default',\n include: overrides.include || DEFAULT_INCLUDE_PATTERNS,\n exclude: overrides.exclude || DEFAULT_EXCLUDE_PATTERNS,\n fileTypeMapping: {\n ...DEFAULT_FILE_TYPE_MAPPING,\n ...overrides.fileTypeMapping,\n },\n output: {\n file: {\n enabled: true,\n path: 'project-metadata.json',\n ...overrides.output?.file,\n },\n api: {\n enabled: false,\n endpoint: '',\n ...overrides.output?.api,\n },\n },\n koreanKeywords: overrides.koreanKeywords,\n mode: overrides.mode || 'production',\n verbose: overrides.verbose || false,\n };\n}\n\n/**\n * 설정 유효성 검증\n */\nexport function validateConfig(config: PluginConfig): string[] {\n const errors: string[] = [];\n\n if (!config.projectId) {\n errors.push('projectId is required');\n }\n\n if (config.output.api?.enabled && !config.output.api.endpoint) {\n errors.push('API endpoint is required when api output is enabled');\n }\n\n if (config.include.length === 0) {\n errors.push('At least one include pattern is required');\n }\n\n return errors;\n}\n\n/**\n * glob 패턴을 정규식으로 변환\n */\nexport function globToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '{{GLOBSTAR}}')\n .replace(/\\*/g, '[^/]*')\n .replace(/{{GLOBSTAR}}/g, '.*')\n .replace(/\\{([^}]+)\\}/g, (_, group) => {\n const alternatives = group.split(',').map((s: string) => s.trim());\n return `(${alternatives.join('|')})`;\n });\n return new RegExp(`^${escaped}$`);\n}\n","import ts from 'typescript';\n\n/**\n * TypeScript AST 파서\n */\nexport class TypeScriptParser {\n private compilerOptions: ts.CompilerOptions;\n\n constructor() {\n this.compilerOptions = {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n jsx: ts.JsxEmit.React,\n esModuleInterop: true,\n allowSyntheticDefaultImports: true,\n strict: false,\n };\n }\n\n /**\n * 소스 코드를 AST로 파싱\n */\n parse(content: string, filePath: string): ts.SourceFile {\n return ts.createSourceFile(\n filePath,\n content,\n this.compilerOptions.target!,\n true,\n this.getScriptKind(filePath)\n );\n }\n\n /**\n * 파일 확장자에 따른 ScriptKind 결정\n */\n private getScriptKind(filePath: string): ts.ScriptKind {\n const ext = filePath.toLowerCase();\n if (ext.endsWith('.tsx')) return ts.ScriptKind.TSX;\n if (ext.endsWith('.ts')) return ts.ScriptKind.TS;\n if (ext.endsWith('.jsx')) return ts.ScriptKind.JSX;\n if (ext.endsWith('.js')) return ts.ScriptKind.JS;\n return ts.ScriptKind.Unknown;\n }\n\n /**\n * AST 노드 순회\n */\n traverse(node: ts.Node, visitor: (node: ts.Node) => void | boolean): void {\n const shouldContinue = visitor(node);\n if (shouldContinue === false) return;\n\n ts.forEachChild(node, (child) => this.traverse(child, visitor));\n }\n\n /**\n * 특정 조건을 만족하는 노드 수집\n */\n findNodes<T extends ts.Node>(\n sourceFile: ts.SourceFile,\n predicate: (node: ts.Node) => node is T\n ): T[] {\n const results: T[] = [];\n\n this.traverse(sourceFile, (node) => {\n if (predicate(node)) {\n results.push(node);\n }\n });\n\n return results;\n }\n\n /**\n * 노드의 텍스트 추출\n */\n getNodeText(node: ts.Node, sourceFile: ts.SourceFile): string {\n return node.getText(sourceFile);\n }\n\n /**\n * JSDoc 코멘트 추출\n */\n getJSDocComment(node: ts.Node): string | undefined {\n const jsDocNodes = ts.getJSDocCommentsAndTags(node);\n if (jsDocNodes.length === 0) return undefined;\n\n return jsDocNodes\n .filter(ts.isJSDoc)\n .map((doc) => doc.comment)\n .filter(Boolean)\n .join('\\n');\n }\n}\n\nexport const typescriptParser = new TypeScriptParser();\n","import * as path from 'path';\nimport type { ParsedFile, TableColumn } from '../types';\n\ninterface ParsedTable {\n name: string;\n columns: TableColumn[];\n}\n\n/**\n * SQL 마이그레이션 파일 파서\n */\nexport class SQLParser {\n /**\n * SQL 파일 파싱\n */\n parse(content: string, relativePath: string): ParsedFile {\n const tables = this.extractTables(content);\n const tableName = tables[0]?.name || this.extractNameFromPath(relativePath);\n\n return {\n path: relativePath,\n type: 'table',\n name: tableName,\n imports: [],\n exports: tables.map((t) => ({\n name: t.name,\n isDefault: false,\n isTypeOnly: false,\n kind: 'variable' as const,\n })),\n metadata: {\n tableName,\n columns: tables[0]?.columns || [],\n },\n };\n }\n\n /**\n * CREATE TABLE 문에서 테이블 정보 추출\n */\n private extractTables(content: string): ParsedTable[] {\n const tables: ParsedTable[] = [];\n\n // CREATE TABLE 문 파싱\n const createTableRegex =\n /CREATE\\s+TABLE\\s+(?:IF\\s+NOT\\s+EXISTS\\s+)?[\"']?(\\w+)[\"']?\\s*\\(([\\s\\S]*?)\\);/gi;\n\n let match;\n while ((match = createTableRegex.exec(content)) !== null) {\n const tableName = match[1];\n const columnsBlock = match[2];\n const columns = this.parseColumns(columnsBlock);\n\n tables.push({ name: tableName, columns });\n }\n\n // ALTER TABLE로 추가된 컬럼도 처리\n const alterTableRegex =\n /ALTER\\s+TABLE\\s+[\"']?(\\w+)[\"']?\\s+ADD\\s+(?:COLUMN\\s+)?[\"']?(\\w+)[\"']?\\s+(\\w+)/gi;\n\n while ((match = alterTableRegex.exec(content)) !== null) {\n const tableName = match[1];\n const columnName = match[2];\n const columnType = match[3];\n\n let table = tables.find((t) => t.name === tableName);\n if (!table) {\n table = { name: tableName, columns: [] };\n tables.push(table);\n }\n\n table.columns.push({\n name: columnName,\n type: columnType,\n nullable: true,\n isPrimaryKey: false,\n isForeignKey: false,\n });\n }\n\n return tables;\n }\n\n /**\n * 컬럼 정의 파싱\n */\n private parseColumns(columnsBlock: string): TableColumn[] {\n const columns: TableColumn[] = [];\n\n // 컬럼 정의 라인 분리 (CONSTRAINT는 제외)\n const lines = columnsBlock\n .split(',')\n .map((line) => line.trim())\n .filter(\n (line) =>\n line &&\n !line.toUpperCase().startsWith('CONSTRAINT') &&\n !line.toUpperCase().startsWith('PRIMARY KEY') &&\n !line.toUpperCase().startsWith('FOREIGN KEY') &&\n !line.toUpperCase().startsWith('UNIQUE') &&\n !line.toUpperCase().startsWith('CHECK')\n );\n\n for (const line of lines) {\n const column = this.parseColumnDefinition(line);\n if (column) {\n columns.push(column);\n }\n }\n\n return columns;\n }\n\n /**\n * 단일 컬럼 정의 파싱\n */\n private parseColumnDefinition(line: string): TableColumn | null {\n const match = line.match(/^[\"']?(\\w+)[\"']?\\s+(\\w+(?:\\([^)]+\\))?)/i);\n if (!match) return null;\n\n const [, name, type] = match;\n const upperLine = line.toUpperCase();\n\n return {\n name,\n type: type.toUpperCase(),\n nullable: !upperLine.includes('NOT NULL'),\n isPrimaryKey: upperLine.includes('PRIMARY KEY'),\n isForeignKey: upperLine.includes('REFERENCES'),\n references: this.extractReference(line),\n };\n }\n\n /**\n * REFERENCES 절에서 참조 정보 추출\n */\n private extractReference(\n line: string\n ): TableColumn['references'] | undefined {\n const match = line.match(\n /REFERENCES\\s+[\"']?(\\w+)[\"']?\\s*\\([\"']?(\\w+)[\"']?\\)/i\n );\n if (!match) return undefined;\n\n return {\n table: match[1],\n column: match[2],\n };\n }\n\n /**\n * 파일 경로에서 테이블 이름 추출\n */\n private extractNameFromPath(filePath: string): string {\n const filename = path.basename(filePath);\n // 마이그레이션 파일명에서 테이블명 추출\n // 예: 20240101_create_users_table.sql -> users\n const match = filename.match(/create_(\\w+)_table/i);\n return match ? match[1] : filename.replace('.sql', '');\n }\n}\n\nexport const sqlParser = new SQLParser();\n","import ts from 'typescript';\nimport type { ImportInfo } from '../types';\n\n/**\n * import 문에서 정보를 추출하는 클래스\n */\nexport class ImportExtractor {\n /**\n * SourceFile에서 모든 import 정보 추출\n */\n extract(sourceFile: ts.SourceFile): ImportInfo[] {\n const imports: ImportInfo[] = [];\n\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isImportDeclaration(node)) {\n const importInfo = this.parseImportDeclaration(node);\n if (importInfo) {\n imports.push(importInfo);\n }\n }\n });\n\n return imports;\n }\n\n /**\n * ImportDeclaration 노드를 ImportInfo로 변환\n */\n private parseImportDeclaration(\n node: ts.ImportDeclaration\n ): ImportInfo | null {\n const moduleSpecifier = node.moduleSpecifier;\n if (!ts.isStringLiteral(moduleSpecifier)) {\n return null;\n }\n\n const source = moduleSpecifier.text;\n const specifiers: string[] = [];\n let isDefault = false;\n const isTypeOnly = node.importClause?.isTypeOnly || false;\n\n const importClause = node.importClause;\n if (!importClause) {\n // side-effect import: import 'module'\n return {\n source,\n specifiers: [],\n isDefault: false,\n isTypeOnly: false,\n };\n }\n\n // default import: import Something from 'module'\n if (importClause.name) {\n specifiers.push(importClause.name.text);\n isDefault = true;\n }\n\n // named imports: import { a, b } from 'module'\n const namedBindings = importClause.namedBindings;\n if (namedBindings) {\n if (ts.isNamespaceImport(namedBindings)) {\n // namespace import: import * as ns from 'module'\n specifiers.push(`* as ${namedBindings.name.text}`);\n } else if (ts.isNamedImports(namedBindings)) {\n for (const element of namedBindings.elements) {\n const name = element.name.text;\n const propertyName = element.propertyName?.text;\n\n if (propertyName) {\n specifiers.push(`${propertyName} as ${name}`);\n } else {\n specifiers.push(name);\n }\n }\n }\n }\n\n return {\n source,\n specifiers,\n isDefault,\n isTypeOnly,\n };\n }\n}\n\nexport const importExtractor = new ImportExtractor();\n","import ts from 'typescript';\nimport type { ExportInfo } from '../types';\n\n/**\n * export 문에서 정보를 추출하는 클래스\n */\nexport class ExportExtractor {\n /**\n * SourceFile에서 모든 export 정보 추출\n */\n extract(sourceFile: ts.SourceFile): ExportInfo[] {\n const exports: ExportInfo[] = [];\n\n ts.forEachChild(sourceFile, (node) => {\n const exportInfos = this.extractFromNode(node, sourceFile);\n exports.push(...exportInfos);\n });\n\n return exports;\n }\n\n /**\n * 노드에서 export 정보 추출\n */\n private extractFromNode(\n node: ts.Node,\n sourceFile: ts.SourceFile\n ): ExportInfo[] {\n const results: ExportInfo[] = [];\n\n // export function\n if (ts.isFunctionDeclaration(node) && this.hasExportModifier(node)) {\n results.push({\n name: node.name?.text || 'anonymous',\n isDefault: this.hasDefaultModifier(node),\n isTypeOnly: false,\n kind: 'function',\n });\n }\n\n // export class\n if (ts.isClassDeclaration(node) && this.hasExportModifier(node)) {\n results.push({\n name: node.name?.text || 'anonymous',\n isDefault: this.hasDefaultModifier(node),\n isTypeOnly: false,\n kind: 'class',\n });\n }\n\n // export const/let/var\n if (ts.isVariableStatement(node) && this.hasExportModifier(node)) {\n for (const declaration of node.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) {\n results.push({\n name: declaration.name.text,\n isDefault: false,\n isTypeOnly: false,\n kind: 'variable',\n });\n }\n }\n }\n\n // export type\n if (ts.isTypeAliasDeclaration(node) && this.hasExportModifier(node)) {\n results.push({\n name: node.name.text,\n isDefault: false,\n isTypeOnly: true,\n kind: 'type',\n });\n }\n\n // export interface\n if (ts.isInterfaceDeclaration(node) && this.hasExportModifier(node)) {\n results.push({\n name: node.name.text,\n isDefault: false,\n isTypeOnly: true,\n kind: 'interface',\n });\n }\n\n // export default expression\n if (ts.isExportAssignment(node) && !node.isExportEquals) {\n const name = this.getExportDefaultName(node, sourceFile);\n results.push({\n name,\n isDefault: true,\n isTypeOnly: false,\n kind: 'variable',\n });\n }\n\n // export { name } re-export\n if (ts.isExportDeclaration(node)) {\n const exportClause = node.exportClause;\n if (exportClause && ts.isNamedExports(exportClause)) {\n for (const element of exportClause.elements) {\n results.push({\n name: element.name.text,\n isDefault: false,\n isTypeOnly: node.isTypeOnly,\n kind: 'variable',\n });\n }\n }\n }\n\n return results;\n }\n\n /**\n * export 키워드가 있는지 확인\n */\n private hasExportModifier(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) || false;\n }\n\n /**\n * default 키워드가 있는지 확인\n */\n private hasDefaultModifier(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword) || false;\n }\n\n /**\n * export default의 이름 추출\n */\n private getExportDefaultName(\n node: ts.ExportAssignment,\n _sourceFile: ts.SourceFile\n ): string {\n const expr = node.expression;\n\n if (ts.isIdentifier(expr)) {\n return expr.text;\n }\n\n if (ts.isArrowFunction(expr) || ts.isFunctionExpression(expr)) {\n return 'default';\n }\n\n // export default memo(Component) 패턴\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\n const firstArg = expr.arguments[0];\n if (firstArg && ts.isIdentifier(firstArg)) {\n return firstArg.text;\n }\n }\n\n return 'default';\n }\n}\n\nexport const exportExtractor = new ExportExtractor();\n","import ts from 'typescript';\nimport type { PropInfo } from '../types';\n\n/**\n * React 컴포넌트의 Props 정보를 추출하는 클래스\n */\nexport class PropsExtractor {\n /**\n * SourceFile에서 Props 정보 추출\n */\n extract(sourceFile: ts.SourceFile): PropInfo[] {\n const props: PropInfo[] = [];\n\n // Props 타입/인터페이스 찾기\n const propsType = this.findPropsType(sourceFile);\n if (propsType) {\n props.push(...this.extractFromTypeNode(propsType, sourceFile));\n }\n\n // 함수 매개변수에서 직접 추출 (destructuring 패턴)\n const componentFunction = this.findComponentFunction(sourceFile);\n if (componentFunction) {\n props.push(\n ...this.extractFromFunctionParams(componentFunction, sourceFile)\n );\n }\n\n return this.deduplicateProps(props);\n }\n\n /**\n * Props 타입 정의 찾기\n */\n private findPropsType(\n sourceFile: ts.SourceFile\n ): ts.TypeNode | ts.InterfaceDeclaration | undefined {\n let propsType: ts.TypeNode | ts.InterfaceDeclaration | undefined;\n\n ts.forEachChild(sourceFile, (node) => {\n // interface ComponentProps { ... }\n if (\n ts.isInterfaceDeclaration(node) &&\n node.name.text.endsWith('Props')\n ) {\n propsType = node;\n }\n\n // type ComponentProps = { ... }\n if (\n ts.isTypeAliasDeclaration(node) &&\n node.name.text.endsWith('Props')\n ) {\n propsType = node.type;\n }\n });\n\n return propsType;\n }\n\n /**\n * 컴포넌트 함수 찾기\n */\n private findComponentFunction(\n sourceFile: ts.SourceFile\n ): ts.FunctionLikeDeclaration | undefined {\n let component: ts.FunctionLikeDeclaration | undefined;\n\n ts.forEachChild(sourceFile, (node) => {\n // export default function Component() / export function Component()\n if (ts.isFunctionDeclaration(node) && this.isExported(node)) {\n component = node;\n }\n\n // const Component = () => {}\n if (ts.isVariableStatement(node) && this.isExported(node)) {\n for (const decl of node.declarationList.declarations) {\n if (\n decl.initializer &&\n (ts.isArrowFunction(decl.initializer) ||\n ts.isFunctionExpression(decl.initializer))\n ) {\n component = decl.initializer;\n }\n }\n }\n });\n\n return component;\n }\n\n /**\n * 타입 노드에서 Props 추출\n */\n private extractFromTypeNode(\n typeNode: ts.TypeNode | ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile\n ): PropInfo[] {\n const props: PropInfo[] = [];\n\n // InterfaceDeclaration\n if (ts.isInterfaceDeclaration(typeNode)) {\n for (const member of typeNode.members) {\n const propInfo = this.extractMemberProp(member, sourceFile);\n if (propInfo) {\n props.push(propInfo);\n }\n }\n return props;\n }\n\n // TypeLiteral: { prop: type }\n if (ts.isTypeLiteralNode(typeNode)) {\n for (const member of typeNode.members) {\n const propInfo = this.extractMemberProp(member, sourceFile);\n if (propInfo) {\n props.push(propInfo);\n }\n }\n }\n\n // IntersectionType: PropsA & PropsB\n if (ts.isIntersectionTypeNode(typeNode)) {\n for (const type of typeNode.types) {\n props.push(...this.extractFromTypeNode(type, sourceFile));\n }\n }\n\n return props;\n }\n\n /**\n * 타입 멤버에서 PropInfo 추출\n */\n private extractMemberProp(\n member: ts.TypeElement,\n sourceFile: ts.SourceFile\n ): PropInfo | null {\n if (!ts.isPropertySignature(member)) {\n return null;\n }\n\n const name = member.name;\n if (!ts.isIdentifier(name) && !ts.isStringLiteral(name)) {\n return null;\n }\n\n const propName = ts.isIdentifier(name) ? name.text : name.text;\n const required = !member.questionToken;\n const type = member.type ? member.type.getText(sourceFile) : 'any';\n\n return {\n name: propName,\n type,\n required,\n };\n }\n\n /**\n * 함수 매개변수에서 Props 추출\n */\n private extractFromFunctionParams(\n func: ts.FunctionLikeDeclaration,\n sourceFile: ts.SourceFile\n ): PropInfo[] {\n const props: PropInfo[] = [];\n const firstParam = func.parameters[0];\n\n if (!firstParam) return props;\n\n // Destructuring: function Component({ prop1, prop2 })\n if (ts.isObjectBindingPattern(firstParam.name)) {\n for (const element of firstParam.name.elements) {\n if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {\n props.push({\n name: element.name.text,\n type: 'unknown',\n required: !element.initializer,\n defaultValue: element.initializer?.getText(sourceFile),\n });\n }\n }\n }\n\n return props;\n }\n\n /**\n * export 키워드가 있는지 확인\n */\n private isExported(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) || false;\n }\n\n /**\n * 중복 Props 제거\n */\n private deduplicateProps(props: PropInfo[]): PropInfo[] {\n const seen = new Set<string>();\n return props.filter((prop) => {\n if (seen.has(prop.name)) return false;\n seen.add(prop.name);\n return true;\n });\n }\n}\n\nexport const propsExtractor = new PropsExtractor();\n","/**\n * camelCase를 분리\n * 예: \"attendanceCheck\" -> [\"attendance\", \"Check\"]\n */\nexport function splitCamelCase(str: string): string[] {\n return str\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .split(' ')\n .filter(Boolean);\n}\n\n/**\n * PascalCase를 분리\n * 예: \"AttendanceCheckModal\" -> [\"Attendance\", \"Check\", \"Modal\"]\n */\nexport function splitPascalCase(str: string): string[] {\n return str\n .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .split(' ')\n .filter(Boolean);\n}\n\n/**\n * snake_case를 분리\n * 예: \"attendance_check\" -> [\"attendance\", \"check\"]\n */\nexport function splitSnakeCase(str: string): string[] {\n return str.split('_').filter(Boolean);\n}\n\n/**\n * kebab-case를 분리\n * 예: \"attendance-check\" -> [\"attendance\", \"check\"]\n */\nexport function splitKebabCase(str: string): string[] {\n return str.split('-').filter(Boolean);\n}\n\n/**\n * 모든 케이스를 처리하여 단어 분리\n */\nexport function splitIntoWords(str: string): string[] {\n const words = new Set<string>();\n\n // snake_case와 kebab-case 먼저 처리\n const parts = str.split(/[-_]/);\n\n for (const part of parts) {\n // 각 부분에서 camelCase/PascalCase 분리\n const camelSplit = splitCamelCase(part);\n camelSplit.forEach((w) => words.add(w.toLowerCase()));\n }\n\n return [...words];\n}\n\n/**\n * 연속된 대문자(약어) 추출\n * 예: \"XMLHTTPRequest\" -> [\"XML\", \"HTTP\"]\n */\nexport function extractAcronyms(str: string): string[] {\n const acronyms: string[] = [];\n const matches = str.match(/[A-Z]{2,}/g);\n if (matches) {\n acronyms.push(...matches);\n }\n return acronyms;\n}\n\n/**\n * 문자열을 여러 형식으로 변환\n */\nexport function toAllCases(str: string): {\n camel: string;\n pascal: string;\n snake: string;\n kebab: string;\n} {\n const words = splitIntoWords(str);\n\n return {\n camel: words\n .map((w, i) =>\n i === 0\n ? w.toLowerCase()\n : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()\n )\n .join(''),\n pascal: words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(''),\n snake: words.map((w) => w.toLowerCase()).join('_'),\n kebab: words.map((w) => w.toLowerCase()).join('-'),\n };\n}\n","/**\n * 기본 영한 키워드 매핑\n */\nexport const KOREAN_KEYWORD_MAP: Record<string, string[]> = {\n // 공통 동작\n create: ['생성', '만들기', '추가'],\n read: ['읽기', '조회'],\n update: ['수정', '업데이트', '변경'],\n delete: ['삭제', '제거'],\n list: ['목록', '리스트'],\n search: ['검색', '찾기'],\n filter: ['필터', '필터링'],\n sort: ['정렬'],\n submit: ['제출', '전송'],\n cancel: ['취소'],\n confirm: ['확인'],\n save: ['저장'],\n load: ['로드', '불러오기'],\n fetch: ['가져오기', '불러오기'],\n\n // UI 요소\n button: ['버튼'],\n modal: ['모달', '팝업'],\n dialog: ['다이얼로그', '대화상자'],\n form: ['폼', '양식'],\n input: ['입력', '인풋'],\n select: ['선택', '셀렉트', '드롭다운'],\n checkbox: ['체크박스', '체크'],\n table: ['테이블', '표'],\n card: ['카드'],\n tab: ['탭'],\n menu: ['메뉴'],\n header: ['헤더', '머리글'],\n footer: ['푸터', '바닥글'],\n sidebar: ['사이드바'],\n navbar: ['네비게이션', '네비바'],\n\n // 인증/사용자\n auth: ['인증', '로그인'],\n login: ['로그인'],\n logout: ['로그아웃'],\n register: ['회원가입', '가입'],\n signup: ['회원가입', '가입'],\n user: ['사용자', '유저', '회원'],\n profile: ['프로필'],\n password: ['비밀번호', '암호'],\n permission: ['권한'],\n\n // 비즈니스\n attendance: ['출석', '출결'],\n check: ['체크', '확인'],\n schedule: ['스케줄', '일정'],\n calendar: ['캘린더', '달력'],\n notification: ['알림', '통지'],\n message: ['메시지', '알림'],\n setting: ['설정'],\n settings: ['설정'],\n payment: ['결제', '지불'],\n order: ['주문'],\n product: ['상품', '제품'],\n cart: ['장바구니'],\n checkout: ['결제', '체크아웃'],\n invoice: ['송장', '청구서'],\n report: ['리포트', '보고서'],\n dashboard: ['대시보드'],\n analytics: ['분석', '통계'],\n statistics: ['통계'],\n\n // 상태\n status: ['상태'],\n pending: ['대기중', '대기'],\n active: ['활성', '활성화'],\n inactive: ['비활성', '비활성화'],\n completed: ['완료'],\n error: ['에러', '오류'],\n success: ['성공'],\n loading: ['로딩', '로드중'],\n\n // 기타\n date: ['날짜'],\n time: ['시간'],\n image: ['이미지', '사진'],\n file: ['파일'],\n upload: ['업로드', '올리기'],\n download: ['다운로드', '내려받기'],\n export: ['내보내기', '익스포트'],\n import: ['가져오기', '임포트'],\n api: ['API', '에이피아이'],\n service: ['서비스'],\n hook: ['훅'],\n component: ['컴포넌트'],\n page: ['페이지'],\n route: ['라우트', '경로'],\n};\n\n/**\n * 영어 키워드에 대응하는 한글 키워드 찾기\n */\nexport function findKoreanKeywords(englishKeyword: string): string[] {\n const lower = englishKeyword.toLowerCase();\n\n // 정확한 매칭\n if (KOREAN_KEYWORD_MAP[lower]) {\n return KOREAN_KEYWORD_MAP[lower];\n }\n\n // 부분 매칭\n const results: string[] = [];\n for (const [key, values] of Object.entries(KOREAN_KEYWORD_MAP)) {\n if (lower.includes(key) || key.includes(lower)) {\n results.push(...values);\n }\n }\n\n return [...new Set(results)];\n}\n\n/**\n * 한글 키워드 매핑 확장\n */\nexport function extendKoreanMap(\n customMap: Record<string, string[]>\n): Record<string, string[]> {\n return {\n ...KOREAN_KEYWORD_MAP,\n ...customMap,\n };\n}\n","import {\n splitCamelCase,\n splitPascalCase,\n splitSnakeCase,\n extractAcronyms,\n} from '../../utils/naming-utils';\nimport { findKoreanKeywords } from '../../utils/korean-mapper';\n\n/**\n * 검색용 키워드를 추출하는 클래스\n */\nexport class KeywordExtractor {\n private customKoreanMap: Record<string, string[]>;\n\n constructor(customKoreanMap?: Record<string, string[]>) {\n this.customKoreanMap = customKoreanMap || {};\n }\n\n /**\n * 다양한 소스에서 키워드 추출\n */\n extract(\n name: string,\n path: string,\n exports: string[] = [],\n props: string[] = []\n ): string[] {\n const keywords = new Set<string>();\n\n // 1. 이름에서 키워드 추출\n this.extractFromName(name, keywords);\n\n // 2. 경로에서 키워드 추출\n this.extractFromPath(path, keywords);\n\n // 3. export 이름에서 추출\n for (const exportName of exports) {\n this.extractFromName(exportName, keywords);\n }\n\n // 4. props 이름에서 추출\n for (const propName of props) {\n this.extractFromName(propName, keywords);\n }\n\n // 5. 한글 키워드 추가\n const allEnglishKeywords = [...keywords];\n for (const keyword of allEnglishKeywords) {\n const koreanKeywords = this.findKorean(keyword);\n koreanKeywords.forEach((k) => keywords.add(k));\n }\n\n // 1글자 키워드 제외\n return [...keywords].filter((k) => k.length > 1);\n }\n\n /**\n * 이름에서 키워드 추출\n */\n private extractFromName(name: string, keywords: Set<string>): void {\n // 원본 이름 (소문자)\n keywords.add(name.toLowerCase());\n\n // CamelCase/PascalCase 분리\n const camelParts = splitCamelCase(name);\n camelParts.forEach((part) => keywords.add(part.toLowerCase()));\n\n const pascalParts = splitPascalCase(name);\n pascalParts.forEach((part) => keywords.add(part.toLowerCase()));\n\n // snake_case 분리\n const snakeParts = splitSnakeCase(name);\n snakeParts.forEach((part) => keywords.add(part.toLowerCase()));\n\n // 약어 처리\n const acronyms = extractAcronyms(name);\n acronyms.forEach((acr) => keywords.add(acr.toLowerCase()));\n }\n\n /**\n * 경로에서 키워드 추출\n */\n private extractFromPath(path: string, keywords: Set<string>): void {\n // 제외할 디렉토리 이름\n const excludeNames = new Set([\n 'src',\n 'app',\n 'components',\n 'hooks',\n 'services',\n 'lib',\n 'utils',\n 'pages',\n 'api',\n ]);\n\n const segments = path\n .replace(/\\.[^/.]+$/, '') // 확장자 제거\n .split('/')\n .filter((s) => !excludeNames.has(s));\n\n for (const segment of segments) {\n this.extractFromName(segment, keywords);\n }\n }\n\n /**\n * 영어 키워드에 대응하는 한글 키워드 찾기\n */\n private findKorean(englishKeyword: string): string[] {\n // 사용자 정의 매핑 먼저 확인\n const customMatch = this.customKoreanMap[englishKeyword.toLowerCase()];\n if (customMatch) {\n return customMatch;\n }\n\n // 기본 매핑에서 찾기\n return findKoreanKeywords(englishKeyword);\n }\n}\n\nexport const keywordExtractor = new KeywordExtractor();\n","import * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * import 경로를 실제 파일 경로로 해석하는 클래스\n */\nexport class DependencyResolver {\n private aliasMap: Map<string, string>;\n private extensions: string[];\n\n constructor(\n aliasMap: Record<string, string> = {},\n extensions = ['.ts', '.tsx', '.js', '.jsx']\n ) {\n this.aliasMap = new Map(Object.entries(aliasMap));\n this.extensions = extensions;\n }\n\n /**\n * import 경로를 실제 파일 경로로 해석\n */\n resolve(\n importSource: string,\n importerPath: string,\n rootDir: string\n ): string | null {\n // 외부 패키지 (node_modules)\n if (this.isExternalPackage(importSource)) {\n return null;\n }\n\n // alias 처리\n const aliasResolved = this.resolveAlias(importSource);\n\n let targetPath: string;\n\n if (aliasResolved.startsWith('./') || aliasResolved.startsWith('../')) {\n // 상대 경로\n const importerDir = path.dirname(path.resolve(rootDir, importerPath));\n targetPath = path.resolve(importerDir, aliasResolved);\n } else if (aliasResolved !== importSource) {\n // alias가 해석된 경우\n targetPath = path.resolve(rootDir, aliasResolved);\n } else {\n // 해석 불가\n return null;\n }\n\n // 확장자 및 index 파일 처리\n const resolvedPath = this.resolveWithExtensions(targetPath);\n\n if (resolvedPath) {\n return path.relative(rootDir, resolvedPath);\n }\n\n return null;\n }\n\n /**\n * 외부 패키지인지 확인\n */\n private isExternalPackage(source: string): boolean {\n if (source.startsWith('./') || source.startsWith('../')) {\n return false;\n }\n\n // alias 체크\n for (const alias of this.aliasMap.keys()) {\n if (source.startsWith(alias)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * alias 해석\n */\n private resolveAlias(source: string): string {\n for (const [alias, target] of this.aliasMap.entries()) {\n if (source === alias) {\n return target;\n }\n if (source.startsWith(alias + '/')) {\n return source.replace(alias, target);\n }\n }\n return source;\n }\n\n /**\n * 확장자를 추가하여 파일 경로 해석\n */\n private resolveWithExtensions(targetPath: string): string | null {\n // 정확한 경로 체크\n if (fs.existsSync(targetPath)) {\n try {\n const stat = fs.statSync(targetPath);\n if (stat.isFile()) {\n return targetPath;\n }\n if (stat.isDirectory()) {\n return this.findIndexFile(targetPath);\n }\n } catch {\n // 무시\n }\n }\n\n // 확장자 추가해서 체크\n for (const ext of this.extensions) {\n const withExt = targetPath + ext;\n if (fs.existsSync(withExt)) {\n return withExt;\n }\n }\n\n // 디렉토리로 간주하고 index 파일 찾기\n return this.findIndexFile(targetPath);\n }\n\n /**\n * 디렉토리에서 index 파일 찾기\n */\n private findIndexFile(dirPath: string): string | null {\n for (const ext of this.extensions) {\n const indexPath = path.join(dirPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n return indexPath;\n }\n }\n return null;\n }\n}\n","import type { ParsedFile, CallGraphEntry } from '../types';\nimport { DependencyResolver } from './dependency-resolver';\n\n/**\n * 파일 간 호출 관계 그래프를 구축하는 클래스\n */\nexport class CallGraphBuilder {\n private resolver: DependencyResolver;\n\n constructor(aliasMap?: Record<string, string>) {\n const defaultAliases: Record<string, string> = {\n '@': 'src',\n '@/': 'src/',\n '~': 'src',\n '~/': 'src/',\n };\n\n this.resolver = new DependencyResolver({\n ...defaultAliases,\n ...aliasMap,\n });\n }\n\n /**\n * 파싱된 파일들로부터 호출 그래프 구축\n */\n build(\n parsedFiles: ParsedFile[],\n rootDir: string\n ): Map<string, CallGraphEntry> {\n const graph = new Map<string, CallGraphEntry>();\n\n // 모든 파일 경로를 Set으로 관리\n const filePathSet = new Set(parsedFiles.map((f) => f.path));\n\n // 1. 각 파일의 calls 계산\n for (const file of parsedFiles) {\n const calls = this.resolveCalls(file, rootDir, filePathSet);\n\n graph.set(file.path, {\n calls,\n calledBy: [],\n });\n }\n\n // 2. calledBy 역방향 관계 계산\n for (const [filePath, entry] of graph.entries()) {\n for (const calledPath of entry.calls) {\n const calledEntry = graph.get(calledPath);\n if (calledEntry) {\n calledEntry.calledBy.push(filePath);\n }\n }\n }\n\n return graph;\n }\n\n /**\n * 파일이 호출하는 다른 파일들을 해석\n */\n private resolveCalls(\n file: ParsedFile,\n rootDir: string,\n validPaths: Set<string>\n ): string[] {\n const calls: string[] = [];\n\n for (const imp of file.imports) {\n // 타입만 import하는 경우 제외\n if (imp.isTypeOnly) continue;\n\n const resolvedPath = this.resolver.resolve(\n imp.source,\n file.path,\n rootDir\n );\n\n // 프로젝트 내부 파일만 포함\n if (resolvedPath && validPaths.has(resolvedPath)) {\n calls.push(resolvedPath);\n }\n }\n\n // 중복 제거\n return [...new Set(calls)];\n }\n}\n","import * as crypto from 'crypto';\n\n/**\n * 프로젝트 ID와 파일 경로로 고유 ID 생성\n */\nexport function generateId(projectId: string, filePath: string): string {\n const input = `${projectId}:${filePath}`;\n return crypto.createHash('sha256').update(input).digest('hex').slice(0, 16);\n}\n","import { glob } from 'glob';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport type {\n PluginConfig,\n AnalysisResult,\n CodeIndexItem,\n ParsedFile,\n FileType,\n CallGraphEntry,\n ExportInfo,\n} from './types';\nimport { TypeScriptParser } from './parsers/typescript-parser';\nimport { SQLParser } from './parsers/sql-parser';\nimport { ImportExtractor } from './extractors/import-extractor';\nimport { ExportExtractor } from './extractors/export-extractor';\nimport { PropsExtractor } from './extractors/props-extractor';\nimport { KeywordExtractor } from './extractors/keyword-extractor';\nimport { CallGraphBuilder } from './resolvers/call-graph-builder';\nimport { globToRegex } from './config';\nimport { generateId } from '../utils/id-utils';\n\n/**\n * 프로젝트 분석기 - 메인 오케스트레이터\n */\nexport class ProjectAnalyzer {\n private config: PluginConfig;\n private tsParser: TypeScriptParser;\n private sqlParser: SQLParser;\n private importExtractor: ImportExtractor;\n private exportExtractor: ExportExtractor;\n private propsExtractor: PropsExtractor;\n private keywordExtractor: KeywordExtractor;\n private callGraphBuilder: CallGraphBuilder;\n\n constructor(config: PluginConfig) {\n this.config = config;\n this.tsParser = new TypeScriptParser();\n this.sqlParser = new SQLParser();\n this.importExtractor = new ImportExtractor();\n this.exportExtractor = new ExportExtractor();\n this.propsExtractor = new PropsExtractor();\n this.keywordExtractor = new KeywordExtractor(config.koreanKeywords);\n this.callGraphBuilder = new CallGraphBuilder();\n }\n\n /**\n * 프로젝트 분석 실행\n */\n async analyze(rootDir: string): Promise<AnalysisResult> {\n const startTime = Date.now();\n const parseErrors: string[] = [];\n\n // 1. 대상 파일 수집\n const files = await this.collectFiles(rootDir);\n\n if (this.config.verbose) {\n console.log(`[metadata-plugin] Found ${files.length} files to analyze`);\n }\n\n // 2. 각 파일 파싱\n const parsedFiles: ParsedFile[] = [];\n\n for (const filePath of files) {\n try {\n const parsed = await this.parseFile(filePath, rootDir);\n if (parsed) {\n parsedFiles.push(parsed);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n parseErrors.push(`${filePath}: ${errorMessage}`);\n }\n }\n\n // 3. 의존성 그래프 구축\n const callGraph = this.callGraphBuilder.build(parsedFiles, rootDir);\n\n // 4. CodeIndexItem 생성\n const items: CodeIndexItem[] = parsedFiles.map((parsed) =>\n this.createIndexItem(parsed, callGraph)\n );\n\n // 5. 통계 계산\n const stats = this.calculateStats(items, parseErrors);\n\n if (this.config.verbose) {\n console.log(\n `[metadata-plugin] Analysis completed in ${Date.now() - startTime}ms`\n );\n console.log(`[metadata-plugin] Processed ${items.length} items`);\n }\n\n return {\n items,\n stats,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * 대상 파일 수집\n */\n private async collectFiles(rootDir: string): Promise<string[]> {\n const allFiles: string[] = [];\n\n for (const pattern of this.config.include) {\n const matches = await glob(pattern, {\n cwd: rootDir,\n ignore: this.config.exclude,\n absolute: true,\n });\n allFiles.push(...matches);\n }\n\n // 중복 제거\n return [...new Set(allFiles)];\n }\n\n /**\n * 단일 파일 파싱\n */\n private async parseFile(\n filePath: string,\n rootDir: string\n ): Promise<ParsedFile | null> {\n const relativePath = path.relative(rootDir, filePath);\n const fileType = this.determineFileType(relativePath);\n\n if (!fileType) {\n return null;\n }\n\n const content = await fs.readFile(filePath, 'utf-8');\n const ext = path.extname(filePath);\n\n // SQL 파일 처리\n if (ext === '.sql') {\n return this.sqlParser.parse(content, relativePath);\n }\n\n // TypeScript/JavaScript 파일 처리\n const sourceFile = this.tsParser.parse(content, filePath);\n\n const imports = this.importExtractor.extract(sourceFile);\n const exports = this.exportExtractor.extract(sourceFile);\n const props =\n fileType === 'component'\n ? this.propsExtractor.extract(sourceFile)\n : undefined;\n\n return {\n path: relativePath,\n type: fileType,\n name: this.extractName(relativePath, exports),\n imports,\n exports,\n props,\n };\n }\n\n /**\n * 파일 타입 결정\n */\n private determineFileType(relativePath: string): FileType | null {\n // 정렬: 더 구체적인 패턴이 먼저 매칭되도록\n const sortedPatterns = Object.entries(this.config.fileTypeMapping).sort(\n ([a], [b]) => b.length - a.length\n );\n\n for (const [pattern, type] of sortedPatterns) {\n const regex = globToRegex(pattern);\n if (regex.test(relativePath)) {\n return type;\n }\n }\n return null;\n }\n\n /**\n * 파일/컴포넌트 이름 추출\n */\n private extractName(relativePath: string, exports: ExportInfo[]): string {\n // default export의 이름 사용\n const defaultExport = exports.find((e) => e.isDefault);\n if (defaultExport && defaultExport.name !== 'default') {\n return defaultExport.name;\n }\n\n // 파일명에서 추출\n const basename = path.basename(relativePath, path.extname(relativePath));\n\n // index, page, layout 파일인 경우 상위 폴더명 사용\n if (['index', 'page', 'layout', 'route'].includes(basename)) {\n const dirname = path.dirname(relativePath);\n const parentName = path.basename(dirname);\n return parentName !== '.' ? parentName : basename;\n }\n\n return basename;\n }\n\n /**\n * CodeIndexItem 생성\n */\n private createIndexItem(\n parsed: ParsedFile,\n callGraph: Map<string, CallGraphEntry>\n ): CodeIndexItem {\n const graphEntry = callGraph.get(parsed.path) || {\n calls: [],\n calledBy: [],\n };\n\n const keywords = this.keywordExtractor.extract(\n parsed.name,\n parsed.path,\n parsed.exports.map((e) => e.name),\n parsed.props?.map((p) => p.name)\n );\n\n const searchText = this.buildSearchText(parsed, keywords);\n\n return {\n id: generateId(this.config.projectId, parsed.path),\n projectId: this.config.projectId,\n type: parsed.type,\n name: parsed.name,\n path: parsed.path,\n keywords,\n searchText,\n calls: graphEntry.calls,\n calledBy: graphEntry.calledBy,\n metadata: {\n exports: parsed.exports.map((e) => e.name),\n props: parsed.props?.map((p) => p.name),\n ...parsed.metadata,\n },\n };\n }\n\n /**\n * 검색용 텍스트 생성\n */\n private buildSearchText(parsed: ParsedFile, keywords: string[]): string {\n const parts = [\n parsed.name,\n parsed.path,\n ...keywords,\n ...parsed.exports.map((e) => e.name),\n ...(parsed.props?.map((p) => p.name) || []),\n ];\n return parts.join(' ').toLowerCase();\n }\n\n /**\n * 분석 통계 계산\n */\n private calculateStats(\n items: CodeIndexItem[],\n parseErrors: string[]\n ): AnalysisResult['stats'] {\n const byType: Record<FileType, number> = {\n route: 0,\n component: 0,\n hook: 0,\n service: 0,\n api: 0,\n table: 0,\n utility: 0,\n };\n\n for (const item of items) {\n byType[item.type]++;\n }\n\n return {\n totalFiles: items.length,\n byType,\n parseErrors,\n };\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { AnalysisResult, PluginConfig } from '../types';\n\n/**\n * 분석 결과를 JSON 파일로 출력하는 클래스\n */\nexport class FileWriter {\n private config: PluginConfig;\n\n constructor(config: PluginConfig) {\n this.config = config;\n }\n\n /**\n * 분석 결과를 파일로 저장\n */\n async write(result: AnalysisResult, outputPath: string): Promise<void> {\n // 출력 디렉토리 생성\n const dir = path.dirname(outputPath);\n await fs.mkdir(dir, { recursive: true });\n\n // JSON 파일 작성\n const output = this.formatOutput(result);\n await fs.writeFile(outputPath, output, 'utf-8');\n }\n\n /**\n * 출력 형식 생성\n */\n private formatOutput(result: AnalysisResult): string {\n const output = {\n version: '1.0.0',\n projectId: this.config.projectId,\n generatedAt: result.timestamp,\n stats: result.stats,\n items: result.items,\n };\n\n // 프로덕션에서는 minify, 개발에서는 pretty print\n if (this.config.mode === 'production') {\n return JSON.stringify(output);\n }\n\n return JSON.stringify(output, null, 2);\n }\n}\n","import type { AnalysisResult, PluginConfig } from '../types';\n\ninterface ApiSenderOptions {\n maxRetries?: number;\n retryDelay?: number;\n}\n\n/**\n * 분석 결과를 API로 전송하는 클래스\n */\nexport class ApiSender {\n protected config: PluginConfig;\n private maxRetries: number;\n private retryDelay: number;\n\n constructor(config: PluginConfig, options: ApiSenderOptions = {}) {\n this.config = config;\n this.maxRetries = options.maxRetries ?? 3;\n this.retryDelay = options.retryDelay ?? 1000;\n }\n\n /**\n * 분석 결과를 API로 전송\n */\n async send(result: AnalysisResult): Promise<void> {\n const apiConfig = this.config.output.api;\n if (!apiConfig?.enabled || !apiConfig.endpoint) {\n return;\n }\n\n const payload = {\n projectId: this.config.projectId,\n timestamp: result.timestamp,\n items: result.items,\n stats: result.stats,\n };\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n await this.sendRequest(\n apiConfig.endpoint,\n payload,\n apiConfig.headers\n );\n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (this.config.verbose) {\n console.warn(\n `[metadata-plugin] API send attempt ${attempt + 1} failed:`,\n lastError.message\n );\n }\n\n // 마지막 시도가 아니면 대기 후 재시도\n if (attempt < this.maxRetries - 1) {\n await this.delay(this.retryDelay * (attempt + 1));\n }\n }\n }\n\n throw new Error(\n `Failed to send metadata after ${this.maxRetries} attempts: ${lastError?.message}`\n );\n }\n\n /**\n * HTTP POST 요청\n */\n private async sendRequest(\n endpoint: string,\n payload: unknown,\n headers?: Record<string, string>\n ): Promise<void> {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`API request failed: ${response.status} ${errorText}`);\n }\n }\n\n /**\n * 지연 함수\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Supabase 특화 API Sender\n */\nexport class SupabaseApiSender extends ApiSender {\n /**\n * Supabase upsert 형식으로 전송\n */\n async send(result: AnalysisResult): Promise<void> {\n const apiConfig = this.config.output.api;\n if (!apiConfig?.enabled || !apiConfig.endpoint) {\n return;\n }\n\n // Supabase upsert를 위한 데이터 변환\n const records = result.items.map((item) => ({\n id: item.id,\n project_id: item.projectId,\n type: item.type,\n name: item.name,\n path: item.path,\n keywords: item.keywords,\n search_text: item.searchText,\n calls: item.calls,\n called_by: item.calledBy,\n metadata: item.metadata,\n updated_at: result.timestamp,\n }));\n\n // 배치로 전송 (Supabase는 1000개 제한)\n const batchSize = 500;\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n\n const response = await fetch(apiConfig.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Prefer: 'resolution=merge-duplicates',\n ...apiConfig.headers,\n },\n body: JSON.stringify(batch),\n });\n\n if (!response.ok) {\n throw new Error(`Supabase upsert failed: ${response.status}`);\n }\n }\n }\n}\n"]}
|
package/dist/cli.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/parsers/typescript-parser.ts","../src/core/parsers/sql-parser.ts","../src/core/extractors/import-extractor.ts","../src/core/extractors/export-extractor.ts","../src/core/extractors/props-extractor.ts","../src/utils/naming-utils.ts","../src/utils/korean-mapper.ts","../src/core/extractors/keyword-extractor.ts","../src/core/resolvers/dependency-resolver.ts","../src/core/resolvers/call-graph-builder.ts","../src/core/config.ts","../src/utils/id-utils.ts","../src/core/analyzer.ts","../src/core/output/file-writer.ts","../src/core/output/api-sender.ts","../src/cli.ts"],"names":["ts","path","exports","path2","fs","crypto","glob","path3","fs2","basename","dirname","path4","fs3","resolve","parseArgs","path5","fs4"],"mappings":"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","file":"cli.cjs","sourcesContent":["import ts from 'typescript';\n\n/**\n * TypeScript AST 파서\n */\nexport class TypeScriptParser {\n private compilerOptions: ts.CompilerOptions;\n\n constructor() {\n this.compilerOptions = {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n jsx: ts.JsxEmit.React,\n esModuleInterop: true,\n allowSyntheticDefaultImports: true,\n strict: false,\n };\n }\n\n /**\n * 소스 코드를 AST로 파싱\n */\n parse(content: string, filePath: string): ts.SourceFile {\n return ts.createSourceFile(\n filePath,\n content,\n this.compilerOptions.target!,\n true,\n this.getScriptKind(filePath)\n );\n }\n\n /**\n * 파일 확장자에 따른 ScriptKind 결정\n */\n private getScriptKind(filePath: string): ts.ScriptKind {\n const ext = filePath.toLowerCase();\n if (ext.endsWith('.tsx')) return ts.ScriptKind.TSX;\n if (ext.endsWith('.ts')) return ts.ScriptKind.TS;\n if (ext.endsWith('.jsx')) return ts.ScriptKind.JSX;\n if (ext.endsWith('.js')) return ts.ScriptKind.JS;\n return ts.ScriptKind.Unknown;\n }\n\n /**\n * AST 노드 순회\n */\n traverse(node: ts.Node, visitor: (node: ts.Node) => void | boolean): void {\n const shouldContinue = visitor(node);\n if (shouldContinue === false) return;\n\n ts.forEachChild(node, (child) => this.traverse(child, visitor));\n }\n\n /**\n * 특정 조건을 만족하는 노드 수집\n */\n findNodes<T extends ts.Node>(\n sourceFile: ts.SourceFile,\n predicate: (node: ts.Node) => node is T\n ): T[] {\n const results: T[] = [];\n\n this.traverse(sourceFile, (node) => {\n if (predicate(node)) {\n results.push(node);\n }\n });\n\n return results;\n }\n\n /**\n * 노드의 텍스트 추출\n */\n getNodeText(node: ts.Node, sourceFile: ts.SourceFile): string {\n return node.getText(sourceFile);\n }\n\n /**\n * JSDoc 코멘트 추출\n */\n getJSDocComment(node: ts.Node): string | undefined {\n const jsDocNodes = ts.getJSDocCommentsAndTags(node);\n if (jsDocNodes.length === 0) return undefined;\n\n return jsDocNodes\n .filter(ts.isJSDoc)\n .map((doc) => doc.comment)\n .filter(Boolean)\n .join('\\n');\n }\n}\n\nexport const typescriptParser = new TypeScriptParser();\n","import * as path from 'path';\nimport type { ParsedFile, TableColumn } from '../types';\n\ninterface ParsedTable {\n name: string;\n columns: TableColumn[];\n}\n\n/**\n * SQL 마이그레이션 파일 파서\n */\nexport class SQLParser {\n /**\n * SQL 파일 파싱\n */\n parse(content: string, relativePath: string): ParsedFile {\n const tables = this.extractTables(content);\n const tableName = tables[0]?.name || this.extractNameFromPath(relativePath);\n\n return {\n path: relativePath,\n type: 'table',\n name: tableName,\n imports: [],\n exports: tables.map((t) => ({\n name: t.name,\n isDefault: false,\n isTypeOnly: false,\n kind: 'variable' as const,\n })),\n metadata: {\n tableName,\n columns: tables[0]?.columns || [],\n },\n };\n }\n\n /**\n * CREATE TABLE 문에서 테이블 정보 추출\n */\n private extractTables(content: string): ParsedTable[] {\n const tables: ParsedTable[] = [];\n\n // CREATE TABLE 문 파싱\n const createTableRegex =\n /CREATE\\s+TABLE\\s+(?:IF\\s+NOT\\s+EXISTS\\s+)?[\"']?(\\w+)[\"']?\\s*\\(([\\s\\S]*?)\\);/gi;\n\n let match;\n while ((match = createTableRegex.exec(content)) !== null) {\n const tableName = match[1];\n const columnsBlock = match[2];\n const columns = this.parseColumns(columnsBlock);\n\n tables.push({ name: tableName, columns });\n }\n\n // ALTER TABLE로 추가된 컬럼도 처리\n const alterTableRegex =\n /ALTER\\s+TABLE\\s+[\"']?(\\w+)[\"']?\\s+ADD\\s+(?:COLUMN\\s+)?[\"']?(\\w+)[\"']?\\s+(\\w+)/gi;\n\n while ((match = alterTableRegex.exec(content)) !== null) {\n const tableName = match[1];\n const columnName = match[2];\n const columnType = match[3];\n\n let table = tables.find((t) => t.name === tableName);\n if (!table) {\n table = { name: tableName, columns: [] };\n tables.push(table);\n }\n\n table.columns.push({\n name: columnName,\n type: columnType,\n nullable: true,\n isPrimaryKey: false,\n isForeignKey: false,\n });\n }\n\n return tables;\n }\n\n /**\n * 컬럼 정의 파싱\n */\n private parseColumns(columnsBlock: string): TableColumn[] {\n const columns: TableColumn[] = [];\n\n // 컬럼 정의 라인 분리 (CONSTRAINT는 제외)\n const lines = columnsBlock\n .split(',')\n .map((line) => line.trim())\n .filter(\n (line) =>\n line &&\n !line.toUpperCase().startsWith('CONSTRAINT') &&\n !line.toUpperCase().startsWith('PRIMARY KEY') &&\n !line.toUpperCase().startsWith('FOREIGN KEY') &&\n !line.toUpperCase().startsWith('UNIQUE') &&\n !line.toUpperCase().startsWith('CHECK')\n );\n\n for (const line of lines) {\n const column = this.parseColumnDefinition(line);\n if (column) {\n columns.push(column);\n }\n }\n\n return columns;\n }\n\n /**\n * 단일 컬럼 정의 파싱\n */\n private parseColumnDefinition(line: string): TableColumn | null {\n const match = line.match(/^[\"']?(\\w+)[\"']?\\s+(\\w+(?:\\([^)]+\\))?)/i);\n if (!match) return null;\n\n const [, name, type] = match;\n const upperLine = line.toUpperCase();\n\n return {\n name,\n type: type.toUpperCase(),\n nullable: !upperLine.includes('NOT NULL'),\n isPrimaryKey: upperLine.includes('PRIMARY KEY'),\n isForeignKey: upperLine.includes('REFERENCES'),\n references: this.extractReference(line),\n };\n }\n\n /**\n * REFERENCES 절에서 참조 정보 추출\n */\n private extractReference(\n line: string\n ): TableColumn['references'] | undefined {\n const match = line.match(\n /REFERENCES\\s+[\"']?(\\w+)[\"']?\\s*\\([\"']?(\\w+)[\"']?\\)/i\n );\n if (!match) return undefined;\n\n return {\n table: match[1],\n column: match[2],\n };\n }\n\n /**\n * 파일 경로에서 테이블 이름 추출\n */\n private extractNameFromPath(filePath: string): string {\n const filename = path.basename(filePath);\n // 마이그레이션 파일명에서 테이블명 추출\n // 예: 20240101_create_users_table.sql -> users\n const match = filename.match(/create_(\\w+)_table/i);\n return match ? match[1] : filename.replace('.sql', '');\n }\n}\n\nexport const sqlParser = new SQLParser();\n","import ts from 'typescript';\nimport type { ImportInfo } from '../types';\n\n/**\n * import 문에서 정보를 추출하는 클래스\n */\nexport class ImportExtractor {\n /**\n * SourceFile에서 모든 import 정보 추출\n */\n extract(sourceFile: ts.SourceFile): ImportInfo[] {\n const imports: ImportInfo[] = [];\n\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isImportDeclaration(node)) {\n const importInfo = this.parseImportDeclaration(node);\n if (importInfo) {\n imports.push(importInfo);\n }\n }\n });\n\n return imports;\n }\n\n /**\n * ImportDeclaration 노드를 ImportInfo로 변환\n */\n private parseImportDeclaration(\n node: ts.ImportDeclaration\n ): ImportInfo | null {\n const moduleSpecifier = node.moduleSpecifier;\n if (!ts.isStringLiteral(moduleSpecifier)) {\n return null;\n }\n\n const source = moduleSpecifier.text;\n const specifiers: string[] = [];\n let isDefault = false;\n const isTypeOnly = node.importClause?.isTypeOnly || false;\n\n const importClause = node.importClause;\n if (!importClause) {\n // side-effect import: import 'module'\n return {\n source,\n specifiers: [],\n isDefault: false,\n isTypeOnly: false,\n };\n }\n\n // default import: import Something from 'module'\n if (importClause.name) {\n specifiers.push(importClause.name.text);\n isDefault = true;\n }\n\n // named imports: import { a, b } from 'module'\n const namedBindings = importClause.namedBindings;\n if (namedBindings) {\n if (ts.isNamespaceImport(namedBindings)) {\n // namespace import: import * as ns from 'module'\n specifiers.push(`* as ${namedBindings.name.text}`);\n } else if (ts.isNamedImports(namedBindings)) {\n for (const element of namedBindings.elements) {\n const name = element.name.text;\n const propertyName = element.propertyName?.text;\n\n if (propertyName) {\n specifiers.push(`${propertyName} as ${name}`);\n } else {\n specifiers.push(name);\n }\n }\n }\n }\n\n return {\n source,\n specifiers,\n isDefault,\n isTypeOnly,\n };\n }\n}\n\nexport const importExtractor = new ImportExtractor();\n","import ts from 'typescript';\nimport type { ExportInfo } from '../types';\n\n/**\n * export 문에서 정보를 추출하는 클래스\n */\nexport class ExportExtractor {\n /**\n * SourceFile에서 모든 export 정보 추출\n */\n extract(sourceFile: ts.SourceFile): ExportInfo[] {\n const exports: ExportInfo[] = [];\n\n ts.forEachChild(sourceFile, (node) => {\n const exportInfos = this.extractFromNode(node, sourceFile);\n exports.push(...exportInfos);\n });\n\n return exports;\n }\n\n /**\n * 노드에서 export 정보 추출\n */\n private extractFromNode(\n node: ts.Node,\n sourceFile: ts.SourceFile\n ): ExportInfo[] {\n const results: ExportInfo[] = [];\n\n // export function\n if (ts.isFunctionDeclaration(node) && this.hasExportModifier(node)) {\n results.push({\n name: node.name?.text || 'anonymous',\n isDefault: this.hasDefaultModifier(node),\n isTypeOnly: false,\n kind: 'function',\n });\n }\n\n // export class\n if (ts.isClassDeclaration(node) && this.hasExportModifier(node)) {\n results.push({\n name: node.name?.text || 'anonymous',\n isDefault: this.hasDefaultModifier(node),\n isTypeOnly: false,\n kind: 'class',\n });\n }\n\n // export const/let/var\n if (ts.isVariableStatement(node) && this.hasExportModifier(node)) {\n for (const declaration of node.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) {\n results.push({\n name: declaration.name.text,\n isDefault: false,\n isTypeOnly: false,\n kind: 'variable',\n });\n }\n }\n }\n\n // export type\n if (ts.isTypeAliasDeclaration(node) && this.hasExportModifier(node)) {\n results.push({\n name: node.name.text,\n isDefault: false,\n isTypeOnly: true,\n kind: 'type',\n });\n }\n\n // export interface\n if (ts.isInterfaceDeclaration(node) && this.hasExportModifier(node)) {\n results.push({\n name: node.name.text,\n isDefault: false,\n isTypeOnly: true,\n kind: 'interface',\n });\n }\n\n // export default expression\n if (ts.isExportAssignment(node) && !node.isExportEquals) {\n const name = this.getExportDefaultName(node, sourceFile);\n results.push({\n name,\n isDefault: true,\n isTypeOnly: false,\n kind: 'variable',\n });\n }\n\n // export { name } re-export\n if (ts.isExportDeclaration(node)) {\n const exportClause = node.exportClause;\n if (exportClause && ts.isNamedExports(exportClause)) {\n for (const element of exportClause.elements) {\n results.push({\n name: element.name.text,\n isDefault: false,\n isTypeOnly: node.isTypeOnly,\n kind: 'variable',\n });\n }\n }\n }\n\n return results;\n }\n\n /**\n * export 키워드가 있는지 확인\n */\n private hasExportModifier(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) || false;\n }\n\n /**\n * default 키워드가 있는지 확인\n */\n private hasDefaultModifier(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword) || false;\n }\n\n /**\n * export default의 이름 추출\n */\n private getExportDefaultName(\n node: ts.ExportAssignment,\n _sourceFile: ts.SourceFile\n ): string {\n const expr = node.expression;\n\n if (ts.isIdentifier(expr)) {\n return expr.text;\n }\n\n if (ts.isArrowFunction(expr) || ts.isFunctionExpression(expr)) {\n return 'default';\n }\n\n // export default memo(Component) 패턴\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\n const firstArg = expr.arguments[0];\n if (firstArg && ts.isIdentifier(firstArg)) {\n return firstArg.text;\n }\n }\n\n return 'default';\n }\n}\n\nexport const exportExtractor = new ExportExtractor();\n","import ts from 'typescript';\nimport type { PropInfo } from '../types';\n\n/**\n * React 컴포넌트의 Props 정보를 추출하는 클래스\n */\nexport class PropsExtractor {\n /**\n * SourceFile에서 Props 정보 추출\n */\n extract(sourceFile: ts.SourceFile): PropInfo[] {\n const props: PropInfo[] = [];\n\n // Props 타입/인터페이스 찾기\n const propsType = this.findPropsType(sourceFile);\n if (propsType) {\n props.push(...this.extractFromTypeNode(propsType, sourceFile));\n }\n\n // 함수 매개변수에서 직접 추출 (destructuring 패턴)\n const componentFunction = this.findComponentFunction(sourceFile);\n if (componentFunction) {\n props.push(\n ...this.extractFromFunctionParams(componentFunction, sourceFile)\n );\n }\n\n return this.deduplicateProps(props);\n }\n\n /**\n * Props 타입 정의 찾기\n */\n private findPropsType(\n sourceFile: ts.SourceFile\n ): ts.TypeNode | ts.InterfaceDeclaration | undefined {\n let propsType: ts.TypeNode | ts.InterfaceDeclaration | undefined;\n\n ts.forEachChild(sourceFile, (node) => {\n // interface ComponentProps { ... }\n if (\n ts.isInterfaceDeclaration(node) &&\n node.name.text.endsWith('Props')\n ) {\n propsType = node;\n }\n\n // type ComponentProps = { ... }\n if (\n ts.isTypeAliasDeclaration(node) &&\n node.name.text.endsWith('Props')\n ) {\n propsType = node.type;\n }\n });\n\n return propsType;\n }\n\n /**\n * 컴포넌트 함수 찾기\n */\n private findComponentFunction(\n sourceFile: ts.SourceFile\n ): ts.FunctionLikeDeclaration | undefined {\n let component: ts.FunctionLikeDeclaration | undefined;\n\n ts.forEachChild(sourceFile, (node) => {\n // export default function Component() / export function Component()\n if (ts.isFunctionDeclaration(node) && this.isExported(node)) {\n component = node;\n }\n\n // const Component = () => {}\n if (ts.isVariableStatement(node) && this.isExported(node)) {\n for (const decl of node.declarationList.declarations) {\n if (\n decl.initializer &&\n (ts.isArrowFunction(decl.initializer) ||\n ts.isFunctionExpression(decl.initializer))\n ) {\n component = decl.initializer;\n }\n }\n }\n });\n\n return component;\n }\n\n /**\n * 타입 노드에서 Props 추출\n */\n private extractFromTypeNode(\n typeNode: ts.TypeNode | ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile\n ): PropInfo[] {\n const props: PropInfo[] = [];\n\n // InterfaceDeclaration\n if (ts.isInterfaceDeclaration(typeNode)) {\n for (const member of typeNode.members) {\n const propInfo = this.extractMemberProp(member, sourceFile);\n if (propInfo) {\n props.push(propInfo);\n }\n }\n return props;\n }\n\n // TypeLiteral: { prop: type }\n if (ts.isTypeLiteralNode(typeNode)) {\n for (const member of typeNode.members) {\n const propInfo = this.extractMemberProp(member, sourceFile);\n if (propInfo) {\n props.push(propInfo);\n }\n }\n }\n\n // IntersectionType: PropsA & PropsB\n if (ts.isIntersectionTypeNode(typeNode)) {\n for (const type of typeNode.types) {\n props.push(...this.extractFromTypeNode(type, sourceFile));\n }\n }\n\n return props;\n }\n\n /**\n * 타입 멤버에서 PropInfo 추출\n */\n private extractMemberProp(\n member: ts.TypeElement,\n sourceFile: ts.SourceFile\n ): PropInfo | null {\n if (!ts.isPropertySignature(member)) {\n return null;\n }\n\n const name = member.name;\n if (!ts.isIdentifier(name) && !ts.isStringLiteral(name)) {\n return null;\n }\n\n const propName = ts.isIdentifier(name) ? name.text : name.text;\n const required = !member.questionToken;\n const type = member.type ? member.type.getText(sourceFile) : 'any';\n\n return {\n name: propName,\n type,\n required,\n };\n }\n\n /**\n * 함수 매개변수에서 Props 추출\n */\n private extractFromFunctionParams(\n func: ts.FunctionLikeDeclaration,\n sourceFile: ts.SourceFile\n ): PropInfo[] {\n const props: PropInfo[] = [];\n const firstParam = func.parameters[0];\n\n if (!firstParam) return props;\n\n // Destructuring: function Component({ prop1, prop2 })\n if (ts.isObjectBindingPattern(firstParam.name)) {\n for (const element of firstParam.name.elements) {\n if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {\n props.push({\n name: element.name.text,\n type: 'unknown',\n required: !element.initializer,\n defaultValue: element.initializer?.getText(sourceFile),\n });\n }\n }\n }\n\n return props;\n }\n\n /**\n * export 키워드가 있는지 확인\n */\n private isExported(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n return modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) || false;\n }\n\n /**\n * 중복 Props 제거\n */\n private deduplicateProps(props: PropInfo[]): PropInfo[] {\n const seen = new Set<string>();\n return props.filter((prop) => {\n if (seen.has(prop.name)) return false;\n seen.add(prop.name);\n return true;\n });\n }\n}\n\nexport const propsExtractor = new PropsExtractor();\n","/**\n * camelCase를 분리\n * 예: \"attendanceCheck\" -> [\"attendance\", \"Check\"]\n */\nexport function splitCamelCase(str: string): string[] {\n return str\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .split(' ')\n .filter(Boolean);\n}\n\n/**\n * PascalCase를 분리\n * 예: \"AttendanceCheckModal\" -> [\"Attendance\", \"Check\", \"Modal\"]\n */\nexport function splitPascalCase(str: string): string[] {\n return str\n .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .split(' ')\n .filter(Boolean);\n}\n\n/**\n * snake_case를 분리\n * 예: \"attendance_check\" -> [\"attendance\", \"check\"]\n */\nexport function splitSnakeCase(str: string): string[] {\n return str.split('_').filter(Boolean);\n}\n\n/**\n * kebab-case를 분리\n * 예: \"attendance-check\" -> [\"attendance\", \"check\"]\n */\nexport function splitKebabCase(str: string): string[] {\n return str.split('-').filter(Boolean);\n}\n\n/**\n * 모든 케이스를 처리하여 단어 분리\n */\nexport function splitIntoWords(str: string): string[] {\n const words = new Set<string>();\n\n // snake_case와 kebab-case 먼저 처리\n const parts = str.split(/[-_]/);\n\n for (const part of parts) {\n // 각 부분에서 camelCase/PascalCase 분리\n const camelSplit = splitCamelCase(part);\n camelSplit.forEach((w) => words.add(w.toLowerCase()));\n }\n\n return [...words];\n}\n\n/**\n * 연속된 대문자(약어) 추출\n * 예: \"XMLHTTPRequest\" -> [\"XML\", \"HTTP\"]\n */\nexport function extractAcronyms(str: string): string[] {\n const acronyms: string[] = [];\n const matches = str.match(/[A-Z]{2,}/g);\n if (matches) {\n acronyms.push(...matches);\n }\n return acronyms;\n}\n\n/**\n * 문자열을 여러 형식으로 변환\n */\nexport function toAllCases(str: string): {\n camel: string;\n pascal: string;\n snake: string;\n kebab: string;\n} {\n const words = splitIntoWords(str);\n\n return {\n camel: words\n .map((w, i) =>\n i === 0\n ? w.toLowerCase()\n : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()\n )\n .join(''),\n pascal: words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(''),\n snake: words.map((w) => w.toLowerCase()).join('_'),\n kebab: words.map((w) => w.toLowerCase()).join('-'),\n };\n}\n","/**\n * 기본 영한 키워드 매핑\n */\nexport const KOREAN_KEYWORD_MAP: Record<string, string[]> = {\n // 공통 동작\n create: ['생성', '만들기', '추가'],\n read: ['읽기', '조회'],\n update: ['수정', '업데이트', '변경'],\n delete: ['삭제', '제거'],\n list: ['목록', '리스트'],\n search: ['검색', '찾기'],\n filter: ['필터', '필터링'],\n sort: ['정렬'],\n submit: ['제출', '전송'],\n cancel: ['취소'],\n confirm: ['확인'],\n save: ['저장'],\n load: ['로드', '불러오기'],\n fetch: ['가져오기', '불러오기'],\n\n // UI 요소\n button: ['버튼'],\n modal: ['모달', '팝업'],\n dialog: ['다이얼로그', '대화상자'],\n form: ['폼', '양식'],\n input: ['입력', '인풋'],\n select: ['선택', '셀렉트', '드롭다운'],\n checkbox: ['체크박스', '체크'],\n table: ['테이블', '표'],\n card: ['카드'],\n tab: ['탭'],\n menu: ['메뉴'],\n header: ['헤더', '머리글'],\n footer: ['푸터', '바닥글'],\n sidebar: ['사이드바'],\n navbar: ['네비게이션', '네비바'],\n\n // 인증/사용자\n auth: ['인증', '로그인'],\n login: ['로그인'],\n logout: ['로그아웃'],\n register: ['회원가입', '가입'],\n signup: ['회원가입', '가입'],\n user: ['사용자', '유저', '회원'],\n profile: ['프로필'],\n password: ['비밀번호', '암호'],\n permission: ['권한'],\n\n // 비즈니스\n attendance: ['출석', '출결'],\n check: ['체크', '확인'],\n schedule: ['스케줄', '일정'],\n calendar: ['캘린더', '달력'],\n notification: ['알림', '통지'],\n message: ['메시지', '알림'],\n setting: ['설정'],\n settings: ['설정'],\n payment: ['결제', '지불'],\n order: ['주문'],\n product: ['상품', '제품'],\n cart: ['장바구니'],\n checkout: ['결제', '체크아웃'],\n invoice: ['송장', '청구서'],\n report: ['리포트', '보고서'],\n dashboard: ['대시보드'],\n analytics: ['분석', '통계'],\n statistics: ['통계'],\n\n // 상태\n status: ['상태'],\n pending: ['대기중', '대기'],\n active: ['활성', '활성화'],\n inactive: ['비활성', '비활성화'],\n completed: ['완료'],\n error: ['에러', '오류'],\n success: ['성공'],\n loading: ['로딩', '로드중'],\n\n // 기타\n date: ['날짜'],\n time: ['시간'],\n image: ['이미지', '사진'],\n file: ['파일'],\n upload: ['업로드', '올리기'],\n download: ['다운로드', '내려받기'],\n export: ['내보내기', '익스포트'],\n import: ['가져오기', '임포트'],\n api: ['API', '에이피아이'],\n service: ['서비스'],\n hook: ['훅'],\n component: ['컴포넌트'],\n page: ['페이지'],\n route: ['라우트', '경로'],\n};\n\n/**\n * 영어 키워드에 대응하는 한글 키워드 찾기\n */\nexport function findKoreanKeywords(englishKeyword: string): string[] {\n const lower = englishKeyword.toLowerCase();\n\n // 정확한 매칭\n if (KOREAN_KEYWORD_MAP[lower]) {\n return KOREAN_KEYWORD_MAP[lower];\n }\n\n // 부분 매칭\n const results: string[] = [];\n for (const [key, values] of Object.entries(KOREAN_KEYWORD_MAP)) {\n if (lower.includes(key) || key.includes(lower)) {\n results.push(...values);\n }\n }\n\n return [...new Set(results)];\n}\n\n/**\n * 한글 키워드 매핑 확장\n */\nexport function extendKoreanMap(\n customMap: Record<string, string[]>\n): Record<string, string[]> {\n return {\n ...KOREAN_KEYWORD_MAP,\n ...customMap,\n };\n}\n","import {\n splitCamelCase,\n splitPascalCase,\n splitSnakeCase,\n extractAcronyms,\n} from '../../utils/naming-utils';\nimport { findKoreanKeywords } from '../../utils/korean-mapper';\n\n/**\n * 검색용 키워드를 추출하는 클래스\n */\nexport class KeywordExtractor {\n private customKoreanMap: Record<string, string[]>;\n\n constructor(customKoreanMap?: Record<string, string[]>) {\n this.customKoreanMap = customKoreanMap || {};\n }\n\n /**\n * 다양한 소스에서 키워드 추출\n */\n extract(\n name: string,\n path: string,\n exports: string[] = [],\n props: string[] = []\n ): string[] {\n const keywords = new Set<string>();\n\n // 1. 이름에서 키워드 추출\n this.extractFromName(name, keywords);\n\n // 2. 경로에서 키워드 추출\n this.extractFromPath(path, keywords);\n\n // 3. export 이름에서 추출\n for (const exportName of exports) {\n this.extractFromName(exportName, keywords);\n }\n\n // 4. props 이름에서 추출\n for (const propName of props) {\n this.extractFromName(propName, keywords);\n }\n\n // 5. 한글 키워드 추가\n const allEnglishKeywords = [...keywords];\n for (const keyword of allEnglishKeywords) {\n const koreanKeywords = this.findKorean(keyword);\n koreanKeywords.forEach((k) => keywords.add(k));\n }\n\n // 1글자 키워드 제외\n return [...keywords].filter((k) => k.length > 1);\n }\n\n /**\n * 이름에서 키워드 추출\n */\n private extractFromName(name: string, keywords: Set<string>): void {\n // 원본 이름 (소문자)\n keywords.add(name.toLowerCase());\n\n // CamelCase/PascalCase 분리\n const camelParts = splitCamelCase(name);\n camelParts.forEach((part) => keywords.add(part.toLowerCase()));\n\n const pascalParts = splitPascalCase(name);\n pascalParts.forEach((part) => keywords.add(part.toLowerCase()));\n\n // snake_case 분리\n const snakeParts = splitSnakeCase(name);\n snakeParts.forEach((part) => keywords.add(part.toLowerCase()));\n\n // 약어 처리\n const acronyms = extractAcronyms(name);\n acronyms.forEach((acr) => keywords.add(acr.toLowerCase()));\n }\n\n /**\n * 경로에서 키워드 추출\n */\n private extractFromPath(path: string, keywords: Set<string>): void {\n // 제외할 디렉토리 이름\n const excludeNames = new Set([\n 'src',\n 'app',\n 'components',\n 'hooks',\n 'services',\n 'lib',\n 'utils',\n 'pages',\n 'api',\n ]);\n\n const segments = path\n .replace(/\\.[^/.]+$/, '') // 확장자 제거\n .split('/')\n .filter((s) => !excludeNames.has(s));\n\n for (const segment of segments) {\n this.extractFromName(segment, keywords);\n }\n }\n\n /**\n * 영어 키워드에 대응하는 한글 키워드 찾기\n */\n private findKorean(englishKeyword: string): string[] {\n // 사용자 정의 매핑 먼저 확인\n const customMatch = this.customKoreanMap[englishKeyword.toLowerCase()];\n if (customMatch) {\n return customMatch;\n }\n\n // 기본 매핑에서 찾기\n return findKoreanKeywords(englishKeyword);\n }\n}\n\nexport const keywordExtractor = new KeywordExtractor();\n","import * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * import 경로를 실제 파일 경로로 해석하는 클래스\n */\nexport class DependencyResolver {\n private aliasMap: Map<string, string>;\n private extensions: string[];\n\n constructor(\n aliasMap: Record<string, string> = {},\n extensions = ['.ts', '.tsx', '.js', '.jsx']\n ) {\n this.aliasMap = new Map(Object.entries(aliasMap));\n this.extensions = extensions;\n }\n\n /**\n * import 경로를 실제 파일 경로로 해석\n */\n resolve(\n importSource: string,\n importerPath: string,\n rootDir: string\n ): string | null {\n // 외부 패키지 (node_modules)\n if (this.isExternalPackage(importSource)) {\n return null;\n }\n\n // alias 처리\n const aliasResolved = this.resolveAlias(importSource);\n\n let targetPath: string;\n\n if (aliasResolved.startsWith('./') || aliasResolved.startsWith('../')) {\n // 상대 경로\n const importerDir = path.dirname(path.resolve(rootDir, importerPath));\n targetPath = path.resolve(importerDir, aliasResolved);\n } else if (aliasResolved !== importSource) {\n // alias가 해석된 경우\n targetPath = path.resolve(rootDir, aliasResolved);\n } else {\n // 해석 불가\n return null;\n }\n\n // 확장자 및 index 파일 처리\n const resolvedPath = this.resolveWithExtensions(targetPath);\n\n if (resolvedPath) {\n return path.relative(rootDir, resolvedPath);\n }\n\n return null;\n }\n\n /**\n * 외부 패키지인지 확인\n */\n private isExternalPackage(source: string): boolean {\n if (source.startsWith('./') || source.startsWith('../')) {\n return false;\n }\n\n // alias 체크\n for (const alias of this.aliasMap.keys()) {\n if (source.startsWith(alias)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * alias 해석\n */\n private resolveAlias(source: string): string {\n for (const [alias, target] of this.aliasMap.entries()) {\n if (source === alias) {\n return target;\n }\n if (source.startsWith(alias + '/')) {\n return source.replace(alias, target);\n }\n }\n return source;\n }\n\n /**\n * 확장자를 추가하여 파일 경로 해석\n */\n private resolveWithExtensions(targetPath: string): string | null {\n // 정확한 경로 체크\n if (fs.existsSync(targetPath)) {\n try {\n const stat = fs.statSync(targetPath);\n if (stat.isFile()) {\n return targetPath;\n }\n if (stat.isDirectory()) {\n return this.findIndexFile(targetPath);\n }\n } catch {\n // 무시\n }\n }\n\n // 확장자 추가해서 체크\n for (const ext of this.extensions) {\n const withExt = targetPath + ext;\n if (fs.existsSync(withExt)) {\n return withExt;\n }\n }\n\n // 디렉토리로 간주하고 index 파일 찾기\n return this.findIndexFile(targetPath);\n }\n\n /**\n * 디렉토리에서 index 파일 찾기\n */\n private findIndexFile(dirPath: string): string | null {\n for (const ext of this.extensions) {\n const indexPath = path.join(dirPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n return indexPath;\n }\n }\n return null;\n }\n}\n","import type { ParsedFile, CallGraphEntry } from '../types';\nimport { DependencyResolver } from './dependency-resolver';\n\n/**\n * 파일 간 호출 관계 그래프를 구축하는 클래스\n */\nexport class CallGraphBuilder {\n private resolver: DependencyResolver;\n\n constructor(aliasMap?: Record<string, string>) {\n const defaultAliases: Record<string, string> = {\n '@': 'src',\n '@/': 'src/',\n '~': 'src',\n '~/': 'src/',\n };\n\n this.resolver = new DependencyResolver({\n ...defaultAliases,\n ...aliasMap,\n });\n }\n\n /**\n * 파싱된 파일들로부터 호출 그래프 구축\n */\n build(\n parsedFiles: ParsedFile[],\n rootDir: string\n ): Map<string, CallGraphEntry> {\n const graph = new Map<string, CallGraphEntry>();\n\n // 모든 파일 경로를 Set으로 관리\n const filePathSet = new Set(parsedFiles.map((f) => f.path));\n\n // 1. 각 파일의 calls 계산\n for (const file of parsedFiles) {\n const calls = this.resolveCalls(file, rootDir, filePathSet);\n\n graph.set(file.path, {\n calls,\n calledBy: [],\n });\n }\n\n // 2. calledBy 역방향 관계 계산\n for (const [filePath, entry] of graph.entries()) {\n for (const calledPath of entry.calls) {\n const calledEntry = graph.get(calledPath);\n if (calledEntry) {\n calledEntry.calledBy.push(filePath);\n }\n }\n }\n\n return graph;\n }\n\n /**\n * 파일이 호출하는 다른 파일들을 해석\n */\n private resolveCalls(\n file: ParsedFile,\n rootDir: string,\n validPaths: Set<string>\n ): string[] {\n const calls: string[] = [];\n\n for (const imp of file.imports) {\n // 타입만 import하는 경우 제외\n if (imp.isTypeOnly) continue;\n\n const resolvedPath = this.resolver.resolve(\n imp.source,\n file.path,\n rootDir\n );\n\n // 프로젝트 내부 파일만 포함\n if (resolvedPath && validPaths.has(resolvedPath)) {\n calls.push(resolvedPath);\n }\n }\n\n // 중복 제거\n return [...new Set(calls)];\n }\n}\n","import type { PluginConfig, FileType } from './types';\n\n/**\n * 기본 파일 타입 매핑 (glob 패턴 -> FileType)\n */\nexport const DEFAULT_FILE_TYPE_MAPPING: Record<string, FileType> = {\n // Next.js App Router\n 'app/**/page.tsx': 'route',\n 'app/**/page.ts': 'route',\n 'app/**/layout.tsx': 'route',\n 'app/**/layout.ts': 'route',\n 'app/**/route.tsx': 'api',\n 'app/**/route.ts': 'api',\n 'app/api/**/*.ts': 'api',\n 'app/api/**/*.tsx': 'api',\n\n // Pages Router (레거시)\n 'pages/**/*.tsx': 'route',\n 'pages/**/*.ts': 'route',\n 'pages/api/**/*.ts': 'api',\n\n // Components\n 'components/**/*.tsx': 'component',\n 'components/**/*.ts': 'component',\n 'src/components/**/*.tsx': 'component',\n 'src/components/**/*.ts': 'component',\n\n // Hooks\n 'hooks/**/*.ts': 'hook',\n 'hooks/**/*.tsx': 'hook',\n 'src/hooks/**/*.ts': 'hook',\n 'src/hooks/**/*.tsx': 'hook',\n\n // Services\n 'services/**/*.ts': 'service',\n 'src/services/**/*.ts': 'service',\n\n // Utilities\n 'lib/**/*.ts': 'utility',\n 'src/lib/**/*.ts': 'utility',\n 'utils/**/*.ts': 'utility',\n 'src/utils/**/*.ts': 'utility',\n\n // Database\n 'supabase/migrations/*.sql': 'table',\n 'prisma/migrations/**/*.sql': 'table',\n};\n\n/**\n * 기본 포함 패턴\n */\nexport const DEFAULT_INCLUDE_PATTERNS = [\n 'app/**/*.{ts,tsx}',\n 'pages/**/*.{ts,tsx}',\n 'components/**/*.{ts,tsx}',\n 'hooks/**/*.{ts,tsx}',\n 'services/**/*.ts',\n 'lib/**/*.ts',\n 'utils/**/*.ts',\n 'src/**/*.{ts,tsx}',\n 'supabase/migrations/*.sql',\n];\n\n/**\n * 기본 제외 패턴\n */\nexport const DEFAULT_EXCLUDE_PATTERNS = [\n '**/node_modules/**',\n '**/.next/**',\n '**/dist/**',\n '**/*.test.{ts,tsx}',\n '**/*.spec.{ts,tsx}',\n '**/__tests__/**',\n '**/*.d.ts',\n '**/coverage/**',\n];\n\n/**\n * 기본 설정으로 PluginConfig 생성\n */\nexport function createDefaultConfig(\n overrides: Partial<PluginConfig> = {}\n): PluginConfig {\n return {\n projectId: overrides.projectId || 'default',\n include: overrides.include || DEFAULT_INCLUDE_PATTERNS,\n exclude: overrides.exclude || DEFAULT_EXCLUDE_PATTERNS,\n fileTypeMapping: {\n ...DEFAULT_FILE_TYPE_MAPPING,\n ...overrides.fileTypeMapping,\n },\n output: {\n file: {\n enabled: true,\n path: 'project-metadata.json',\n ...overrides.output?.file,\n },\n api: {\n enabled: false,\n endpoint: '',\n ...overrides.output?.api,\n },\n },\n koreanKeywords: overrides.koreanKeywords,\n mode: overrides.mode || 'production',\n verbose: overrides.verbose || false,\n };\n}\n\n/**\n * 설정 유효성 검증\n */\nexport function validateConfig(config: PluginConfig): string[] {\n const errors: string[] = [];\n\n if (!config.projectId) {\n errors.push('projectId is required');\n }\n\n if (config.output.api?.enabled && !config.output.api.endpoint) {\n errors.push('API endpoint is required when api output is enabled');\n }\n\n if (config.include.length === 0) {\n errors.push('At least one include pattern is required');\n }\n\n return errors;\n}\n\n/**\n * glob 패턴을 정규식으로 변환\n */\nexport function globToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '{{GLOBSTAR}}')\n .replace(/\\*/g, '[^/]*')\n .replace(/{{GLOBSTAR}}/g, '.*')\n .replace(/\\{([^}]+)\\}/g, (_, group) => {\n const alternatives = group.split(',').map((s: string) => s.trim());\n return `(${alternatives.join('|')})`;\n });\n return new RegExp(`^${escaped}$`);\n}\n","import * as crypto from 'crypto';\n\n/**\n * 프로젝트 ID와 파일 경로로 고유 ID 생성\n */\nexport function generateId(projectId: string, filePath: string): string {\n const input = `${projectId}:${filePath}`;\n return crypto.createHash('sha256').update(input).digest('hex').slice(0, 16);\n}\n","import { glob } from 'glob';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport type {\n PluginConfig,\n AnalysisResult,\n CodeIndexItem,\n ParsedFile,\n FileType,\n CallGraphEntry,\n ExportInfo,\n} from './types';\nimport { TypeScriptParser } from './parsers/typescript-parser';\nimport { SQLParser } from './parsers/sql-parser';\nimport { ImportExtractor } from './extractors/import-extractor';\nimport { ExportExtractor } from './extractors/export-extractor';\nimport { PropsExtractor } from './extractors/props-extractor';\nimport { KeywordExtractor } from './extractors/keyword-extractor';\nimport { CallGraphBuilder } from './resolvers/call-graph-builder';\nimport { globToRegex } from './config';\nimport { generateId } from '../utils/id-utils';\n\n/**\n * 프로젝트 분석기 - 메인 오케스트레이터\n */\nexport class ProjectAnalyzer {\n private config: PluginConfig;\n private tsParser: TypeScriptParser;\n private sqlParser: SQLParser;\n private importExtractor: ImportExtractor;\n private exportExtractor: ExportExtractor;\n private propsExtractor: PropsExtractor;\n private keywordExtractor: KeywordExtractor;\n private callGraphBuilder: CallGraphBuilder;\n\n constructor(config: PluginConfig) {\n this.config = config;\n this.tsParser = new TypeScriptParser();\n this.sqlParser = new SQLParser();\n this.importExtractor = new ImportExtractor();\n this.exportExtractor = new ExportExtractor();\n this.propsExtractor = new PropsExtractor();\n this.keywordExtractor = new KeywordExtractor(config.koreanKeywords);\n this.callGraphBuilder = new CallGraphBuilder();\n }\n\n /**\n * 프로젝트 분석 실행\n */\n async analyze(rootDir: string): Promise<AnalysisResult> {\n const startTime = Date.now();\n const parseErrors: string[] = [];\n\n // 1. 대상 파일 수집\n const files = await this.collectFiles(rootDir);\n\n if (this.config.verbose) {\n console.log(`[metadata-plugin] Found ${files.length} files to analyze`);\n }\n\n // 2. 각 파일 파싱\n const parsedFiles: ParsedFile[] = [];\n\n for (const filePath of files) {\n try {\n const parsed = await this.parseFile(filePath, rootDir);\n if (parsed) {\n parsedFiles.push(parsed);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n parseErrors.push(`${filePath}: ${errorMessage}`);\n }\n }\n\n // 3. 의존성 그래프 구축\n const callGraph = this.callGraphBuilder.build(parsedFiles, rootDir);\n\n // 4. CodeIndexItem 생성\n const items: CodeIndexItem[] = parsedFiles.map((parsed) =>\n this.createIndexItem(parsed, callGraph)\n );\n\n // 5. 통계 계산\n const stats = this.calculateStats(items, parseErrors);\n\n if (this.config.verbose) {\n console.log(\n `[metadata-plugin] Analysis completed in ${Date.now() - startTime}ms`\n );\n console.log(`[metadata-plugin] Processed ${items.length} items`);\n }\n\n return {\n items,\n stats,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * 대상 파일 수집\n */\n private async collectFiles(rootDir: string): Promise<string[]> {\n const allFiles: string[] = [];\n\n for (const pattern of this.config.include) {\n const matches = await glob(pattern, {\n cwd: rootDir,\n ignore: this.config.exclude,\n absolute: true,\n });\n allFiles.push(...matches);\n }\n\n // 중복 제거\n return [...new Set(allFiles)];\n }\n\n /**\n * 단일 파일 파싱\n */\n private async parseFile(\n filePath: string,\n rootDir: string\n ): Promise<ParsedFile | null> {\n const relativePath = path.relative(rootDir, filePath);\n const fileType = this.determineFileType(relativePath);\n\n if (!fileType) {\n return null;\n }\n\n const content = await fs.readFile(filePath, 'utf-8');\n const ext = path.extname(filePath);\n\n // SQL 파일 처리\n if (ext === '.sql') {\n return this.sqlParser.parse(content, relativePath);\n }\n\n // TypeScript/JavaScript 파일 처리\n const sourceFile = this.tsParser.parse(content, filePath);\n\n const imports = this.importExtractor.extract(sourceFile);\n const exports = this.exportExtractor.extract(sourceFile);\n const props =\n fileType === 'component'\n ? this.propsExtractor.extract(sourceFile)\n : undefined;\n\n return {\n path: relativePath,\n type: fileType,\n name: this.extractName(relativePath, exports),\n imports,\n exports,\n props,\n };\n }\n\n /**\n * 파일 타입 결정\n */\n private determineFileType(relativePath: string): FileType | null {\n // 정렬: 더 구체적인 패턴이 먼저 매칭되도록\n const sortedPatterns = Object.entries(this.config.fileTypeMapping).sort(\n ([a], [b]) => b.length - a.length\n );\n\n for (const [pattern, type] of sortedPatterns) {\n const regex = globToRegex(pattern);\n if (regex.test(relativePath)) {\n return type;\n }\n }\n return null;\n }\n\n /**\n * 파일/컴포넌트 이름 추출\n */\n private extractName(relativePath: string, exports: ExportInfo[]): string {\n // default export의 이름 사용\n const defaultExport = exports.find((e) => e.isDefault);\n if (defaultExport && defaultExport.name !== 'default') {\n return defaultExport.name;\n }\n\n // 파일명에서 추출\n const basename = path.basename(relativePath, path.extname(relativePath));\n\n // index, page, layout 파일인 경우 상위 폴더명 사용\n if (['index', 'page', 'layout', 'route'].includes(basename)) {\n const dirname = path.dirname(relativePath);\n const parentName = path.basename(dirname);\n return parentName !== '.' ? parentName : basename;\n }\n\n return basename;\n }\n\n /**\n * CodeIndexItem 생성\n */\n private createIndexItem(\n parsed: ParsedFile,\n callGraph: Map<string, CallGraphEntry>\n ): CodeIndexItem {\n const graphEntry = callGraph.get(parsed.path) || {\n calls: [],\n calledBy: [],\n };\n\n const keywords = this.keywordExtractor.extract(\n parsed.name,\n parsed.path,\n parsed.exports.map((e) => e.name),\n parsed.props?.map((p) => p.name)\n );\n\n const searchText = this.buildSearchText(parsed, keywords);\n\n return {\n id: generateId(this.config.projectId, parsed.path),\n projectId: this.config.projectId,\n type: parsed.type,\n name: parsed.name,\n path: parsed.path,\n keywords,\n searchText,\n calls: graphEntry.calls,\n calledBy: graphEntry.calledBy,\n metadata: {\n exports: parsed.exports.map((e) => e.name),\n props: parsed.props?.map((p) => p.name),\n ...parsed.metadata,\n },\n };\n }\n\n /**\n * 검색용 텍스트 생성\n */\n private buildSearchText(parsed: ParsedFile, keywords: string[]): string {\n const parts = [\n parsed.name,\n parsed.path,\n ...keywords,\n ...parsed.exports.map((e) => e.name),\n ...(parsed.props?.map((p) => p.name) || []),\n ];\n return parts.join(' ').toLowerCase();\n }\n\n /**\n * 분석 통계 계산\n */\n private calculateStats(\n items: CodeIndexItem[],\n parseErrors: string[]\n ): AnalysisResult['stats'] {\n const byType: Record<FileType, number> = {\n route: 0,\n component: 0,\n hook: 0,\n service: 0,\n api: 0,\n table: 0,\n utility: 0,\n };\n\n for (const item of items) {\n byType[item.type]++;\n }\n\n return {\n totalFiles: items.length,\n byType,\n parseErrors,\n };\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { AnalysisResult, PluginConfig } from '../types';\n\n/**\n * 분석 결과를 JSON 파일로 출력하는 클래스\n */\nexport class FileWriter {\n private config: PluginConfig;\n\n constructor(config: PluginConfig) {\n this.config = config;\n }\n\n /**\n * 분석 결과를 파일로 저장\n */\n async write(result: AnalysisResult, outputPath: string): Promise<void> {\n // 출력 디렉토리 생성\n const dir = path.dirname(outputPath);\n await fs.mkdir(dir, { recursive: true });\n\n // JSON 파일 작성\n const output = this.formatOutput(result);\n await fs.writeFile(outputPath, output, 'utf-8');\n }\n\n /**\n * 출력 형식 생성\n */\n private formatOutput(result: AnalysisResult): string {\n const output = {\n version: '1.0.0',\n projectId: this.config.projectId,\n generatedAt: result.timestamp,\n stats: result.stats,\n items: result.items,\n };\n\n // 프로덕션에서는 minify, 개발에서는 pretty print\n if (this.config.mode === 'production') {\n return JSON.stringify(output);\n }\n\n return JSON.stringify(output, null, 2);\n }\n}\n","import type { AnalysisResult, PluginConfig } from '../types';\n\ninterface ApiSenderOptions {\n maxRetries?: number;\n retryDelay?: number;\n}\n\n/**\n * 분석 결과를 API로 전송하는 클래스\n */\nexport class ApiSender {\n protected config: PluginConfig;\n private maxRetries: number;\n private retryDelay: number;\n\n constructor(config: PluginConfig, options: ApiSenderOptions = {}) {\n this.config = config;\n this.maxRetries = options.maxRetries ?? 3;\n this.retryDelay = options.retryDelay ?? 1000;\n }\n\n /**\n * 분석 결과를 API로 전송\n */\n async send(result: AnalysisResult): Promise<void> {\n const apiConfig = this.config.output.api;\n if (!apiConfig?.enabled || !apiConfig.endpoint) {\n return;\n }\n\n const payload = {\n projectId: this.config.projectId,\n timestamp: result.timestamp,\n items: result.items,\n stats: result.stats,\n };\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n await this.sendRequest(\n apiConfig.endpoint,\n payload,\n apiConfig.headers\n );\n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (this.config.verbose) {\n console.warn(\n `[metadata-plugin] API send attempt ${attempt + 1} failed:`,\n lastError.message\n );\n }\n\n // 마지막 시도가 아니면 대기 후 재시도\n if (attempt < this.maxRetries - 1) {\n await this.delay(this.retryDelay * (attempt + 1));\n }\n }\n }\n\n throw new Error(\n `Failed to send metadata after ${this.maxRetries} attempts: ${lastError?.message}`\n );\n }\n\n /**\n * HTTP POST 요청\n */\n private async sendRequest(\n endpoint: string,\n payload: unknown,\n headers?: Record<string, string>\n ): Promise<void> {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`API request failed: ${response.status} ${errorText}`);\n }\n }\n\n /**\n * 지연 함수\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Supabase 특화 API Sender\n */\nexport class SupabaseApiSender extends ApiSender {\n /**\n * Supabase upsert 형식으로 전송\n */\n async send(result: AnalysisResult): Promise<void> {\n const apiConfig = this.config.output.api;\n if (!apiConfig?.enabled || !apiConfig.endpoint) {\n return;\n }\n\n // Supabase upsert를 위한 데이터 변환\n const records = result.items.map((item) => ({\n id: item.id,\n project_id: item.projectId,\n type: item.type,\n name: item.name,\n path: item.path,\n keywords: item.keywords,\n search_text: item.searchText,\n calls: item.calls,\n called_by: item.calledBy,\n metadata: item.metadata,\n updated_at: result.timestamp,\n }));\n\n // 배치로 전송 (Supabase는 1000개 제한)\n const batchSize = 500;\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n\n const response = await fetch(apiConfig.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Prefer: 'resolution=merge-duplicates',\n ...apiConfig.headers,\n },\n body: JSON.stringify(batch),\n });\n\n if (!response.ok) {\n throw new Error(`Supabase upsert failed: ${response.status}`);\n }\n }\n }\n}\n","import { parseArgs } from 'node:util';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { ProjectAnalyzer } from './core/analyzer';\nimport { createDefaultConfig } from './core/config';\nimport { FileWriter } from './core/output/file-writer';\nimport { ApiSender } from './core/output/api-sender';\nimport type { PluginConfig } from './core/types';\n\nconst VERSION = '1.0.1';\n\nconst HELP_TEXT = `\nmetadatafy - 프로젝트 메타데이터 추출 도구\n\nUsage:\n metadatafy <command> [options]\n\nCommands:\n analyze 프로젝트를 분석하고 메타데이터 생성\n init 설정 파일 생성\n\nOptions:\n -h, --help 도움말 표시\n -v, --version 버전 표시\n\nExamples:\n metadatafy analyze\n metadatafy analyze --project-id my-project --output ./metadata.json\n metadatafy init\n`;\n\nconst ANALYZE_HELP = `\nUsage: metadatafy analyze [options]\n\nOptions:\n -p, --project-id <id> 프로젝트 ID (기본값: 폴더명)\n -o, --output <path> 출력 파일 경로 (기본값: project-metadata.json)\n -c, --config <path> 설정 파일 경로\n --verbose 상세 로그 출력\n -h, --help 도움말 표시\n`;\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === '-h' || args[0] === '--help') {\n console.log(HELP_TEXT);\n process.exit(0);\n }\n\n if (args[0] === '-v' || args[0] === '--version') {\n console.log(VERSION);\n process.exit(0);\n }\n\n const command = args[0];\n\n switch (command) {\n case 'analyze':\n await runAnalyze(args.slice(1));\n break;\n case 'init':\n await runInit();\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log(HELP_TEXT);\n process.exit(1);\n }\n}\n\nasync function runAnalyze(args: string[]) {\n const { values } = parseArgs({\n args,\n options: {\n 'project-id': { type: 'string', short: 'p' },\n output: { type: 'string', short: 'o' },\n config: { type: 'string', short: 'c' },\n verbose: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n },\n });\n\n if (values.help) {\n console.log(ANALYZE_HELP);\n process.exit(0);\n }\n\n const rootDir = process.cwd();\n const projectId = values['project-id'] || path.basename(rootDir);\n const outputPath = values.output || 'project-metadata.json';\n const verbose = values.verbose || false;\n\n // 설정 파일 로드\n let configFromFile: Partial<PluginConfig> = {};\n if (values.config) {\n try {\n const configContent = await fs.readFile(values.config, 'utf-8');\n configFromFile = JSON.parse(configContent);\n } catch (error) {\n console.error(`Failed to load config file: ${values.config}`);\n process.exit(1);\n }\n } else {\n // 기본 설정 파일 찾기\n const defaultConfigPath = path.join(rootDir, 'metadata.config.json');\n try {\n const configContent = await fs.readFile(defaultConfigPath, 'utf-8');\n configFromFile = JSON.parse(configContent);\n if (verbose) {\n console.log(`Loaded config from ${defaultConfigPath}`);\n }\n } catch {\n // 설정 파일이 없으면 무시\n }\n }\n\n const config = createDefaultConfig({\n ...configFromFile,\n projectId,\n verbose,\n output: {\n file: {\n enabled: true,\n path: outputPath,\n },\n ...configFromFile.output,\n },\n });\n\n console.log(`\\n📦 Analyzing project: ${projectId}`);\n console.log(`📁 Root directory: ${rootDir}\\n`);\n\n const analyzer = new ProjectAnalyzer(config);\n const fileWriter = new FileWriter(config);\n\n try {\n const startTime = Date.now();\n const result = await analyzer.analyze(rootDir);\n const duration = Date.now() - startTime;\n\n // 파일 출력\n const fullOutputPath = path.resolve(rootDir, outputPath);\n await fileWriter.write(result, fullOutputPath);\n\n // API 전송 (설정된 경우)\n if (config.output.api?.enabled && config.output.api.endpoint) {\n const apiSender = new ApiSender(config);\n await apiSender.send(result);\n console.log(`☁️ Sent to API: ${config.output.api.endpoint}`);\n }\n\n // 결과 출력\n console.log(`✅ Analysis completed in ${duration}ms\\n`);\n console.log(`📊 Results:`);\n console.log(` Total files: ${result.stats.totalFiles}`);\n console.log(` - Routes: ${result.stats.byType.route}`);\n console.log(` - Components: ${result.stats.byType.component}`);\n console.log(` - Hooks: ${result.stats.byType.hook}`);\n console.log(` - Services: ${result.stats.byType.service}`);\n console.log(` - APIs: ${result.stats.byType.api}`);\n console.log(` - Tables: ${result.stats.byType.table}`);\n console.log(` - Utilities: ${result.stats.byType.utility}`);\n console.log(`\\n📄 Output: ${fullOutputPath}`);\n\n if (result.stats.parseErrors.length > 0) {\n console.log(`\\n⚠️ Parse errors (${result.stats.parseErrors.length}):`);\n result.stats.parseErrors.slice(0, 5).forEach((err) => {\n console.log(` - ${err}`);\n });\n if (result.stats.parseErrors.length > 5) {\n console.log(` ... and ${result.stats.parseErrors.length - 5} more`);\n }\n }\n\n console.log('');\n } catch (error) {\n console.error('❌ Analysis failed:', error);\n process.exit(1);\n }\n}\n\nasync function runInit() {\n const rootDir = process.cwd();\n const configPath = path.join(rootDir, 'metadata.config.json');\n\n // 이미 존재하는지 확인\n try {\n await fs.access(configPath);\n console.log(`⚠️ Config file already exists: ${configPath}`);\n process.exit(1);\n } catch {\n // 파일이 없으면 계속 진행\n }\n\n const defaultConfig = {\n projectId: path.basename(rootDir),\n include: [\n 'app/**/*.{ts,tsx}',\n 'pages/**/*.{ts,tsx}',\n 'components/**/*.{ts,tsx}',\n 'hooks/**/*.{ts,tsx}',\n 'services/**/*.ts',\n 'lib/**/*.ts',\n 'src/**/*.{ts,tsx}',\n ],\n exclude: [\n '**/node_modules/**',\n '**/.next/**',\n '**/dist/**',\n '**/*.test.{ts,tsx}',\n '**/*.spec.{ts,tsx}',\n ],\n output: {\n file: {\n enabled: true,\n path: 'project-metadata.json',\n },\n api: {\n enabled: false,\n endpoint: '',\n },\n },\n koreanKeywords: {},\n verbose: false,\n };\n\n await fs.writeFile(configPath, JSON.stringify(defaultConfig, null, 2));\n console.log(`✅ Created config file: ${configPath}`);\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n"]}
|