metadatafy 1.0.1 → 1.0.2

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.
@@ -1380,5 +1380,3 @@ exports.splitPascalCase = splitPascalCase;
1380
1380
  exports.splitSnakeCase = splitSnakeCase;
1381
1381
  exports.toAllCases = toAllCases;
1382
1382
  exports.validateConfig = validateConfig;
1383
- //# sourceMappingURL=chunk-EDHWKZRG.cjs.map
1384
- //# sourceMappingURL=chunk-EDHWKZRG.cjs.map
@@ -1325,5 +1325,3 @@ var SupabaseApiSender = class extends ApiSender {
1325
1325
  };
1326
1326
 
1327
1327
  export { ApiSender, CallGraphBuilder, DEFAULT_EXCLUDE_PATTERNS, DEFAULT_FILE_TYPE_MAPPING, DEFAULT_INCLUDE_PATTERNS, DependencyResolver, ExportExtractor, FileWriter, ImportExtractor, KOREAN_KEYWORD_MAP, KeywordExtractor, ProjectAnalyzer, PropsExtractor, SQLParser, SupabaseApiSender, TypeScriptParser, createDefaultConfig, extendKoreanMap, extractAcronyms, findKoreanKeywords, generateId, splitCamelCase, splitIntoWords, splitKebabCase, splitPascalCase, splitSnakeCase, toAllCases, validateConfig };
1328
- //# sourceMappingURL=chunk-ECKCIPM5.js.map
1329
- //# sourceMappingURL=chunk-ECKCIPM5.js.map
package/dist/cli.cjs CHANGED
@@ -1474,5 +1474,3 @@ main().catch((error) => {
1474
1474
  console.error("Fatal error:", error);
1475
1475
  process.exit(1);
1476
1476
  });
1477
- //# sourceMappingURL=cli.cjs.map
1478
- //# sourceMappingURL=cli.cjs.map
package/dist/cli.js CHANGED
@@ -1446,5 +1446,3 @@ main().catch((error) => {
1446
1446
  console.error("Fatal error:", error);
1447
1447
  process.exit(1);
1448
1448
  });
1449
- //# sourceMappingURL=cli.js.map
1450
- //# sourceMappingURL=cli.js.map
package/dist/index.cjs CHANGED
@@ -1,120 +1,118 @@
1
1
  'use strict';
2
2
 
3
- var chunkEDHWKZRG_cjs = require('./chunk-EDHWKZRG.cjs');
3
+ var chunk5CZ4N6Q2_cjs = require('./chunk-5CZ4N6Q2.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "ApiSender", {
8
8
  enumerable: true,
9
- get: function () { return chunkEDHWKZRG_cjs.ApiSender; }
9
+ get: function () { return chunk5CZ4N6Q2_cjs.ApiSender; }
10
10
  });
11
11
  Object.defineProperty(exports, "CallGraphBuilder", {
12
12
  enumerable: true,
13
- get: function () { return chunkEDHWKZRG_cjs.CallGraphBuilder; }
13
+ get: function () { return chunk5CZ4N6Q2_cjs.CallGraphBuilder; }
14
14
  });
15
15
  Object.defineProperty(exports, "DEFAULT_EXCLUDE_PATTERNS", {
16
16
  enumerable: true,
17
- get: function () { return chunkEDHWKZRG_cjs.DEFAULT_EXCLUDE_PATTERNS; }
17
+ get: function () { return chunk5CZ4N6Q2_cjs.DEFAULT_EXCLUDE_PATTERNS; }
18
18
  });
19
19
  Object.defineProperty(exports, "DEFAULT_FILE_TYPE_MAPPING", {
20
20
  enumerable: true,
21
- get: function () { return chunkEDHWKZRG_cjs.DEFAULT_FILE_TYPE_MAPPING; }
21
+ get: function () { return chunk5CZ4N6Q2_cjs.DEFAULT_FILE_TYPE_MAPPING; }
22
22
  });
23
23
  Object.defineProperty(exports, "DEFAULT_INCLUDE_PATTERNS", {
24
24
  enumerable: true,
25
- get: function () { return chunkEDHWKZRG_cjs.DEFAULT_INCLUDE_PATTERNS; }
25
+ get: function () { return chunk5CZ4N6Q2_cjs.DEFAULT_INCLUDE_PATTERNS; }
26
26
  });
27
27
  Object.defineProperty(exports, "DependencyResolver", {
28
28
  enumerable: true,
29
- get: function () { return chunkEDHWKZRG_cjs.DependencyResolver; }
29
+ get: function () { return chunk5CZ4N6Q2_cjs.DependencyResolver; }
30
30
  });
31
31
  Object.defineProperty(exports, "ExportExtractor", {
32
32
  enumerable: true,
33
- get: function () { return chunkEDHWKZRG_cjs.ExportExtractor; }
33
+ get: function () { return chunk5CZ4N6Q2_cjs.ExportExtractor; }
34
34
  });
35
35
  Object.defineProperty(exports, "FileWriter", {
36
36
  enumerable: true,
37
- get: function () { return chunkEDHWKZRG_cjs.FileWriter; }
37
+ get: function () { return chunk5CZ4N6Q2_cjs.FileWriter; }
38
38
  });
39
39
  Object.defineProperty(exports, "ImportExtractor", {
40
40
  enumerable: true,
41
- get: function () { return chunkEDHWKZRG_cjs.ImportExtractor; }
41
+ get: function () { return chunk5CZ4N6Q2_cjs.ImportExtractor; }
42
42
  });
43
43
  Object.defineProperty(exports, "KOREAN_KEYWORD_MAP", {
44
44
  enumerable: true,
45
- get: function () { return chunkEDHWKZRG_cjs.KOREAN_KEYWORD_MAP; }
45
+ get: function () { return chunk5CZ4N6Q2_cjs.KOREAN_KEYWORD_MAP; }
46
46
  });
47
47
  Object.defineProperty(exports, "KeywordExtractor", {
48
48
  enumerable: true,
49
- get: function () { return chunkEDHWKZRG_cjs.KeywordExtractor; }
49
+ get: function () { return chunk5CZ4N6Q2_cjs.KeywordExtractor; }
50
50
  });
51
51
  Object.defineProperty(exports, "ProjectAnalyzer", {
52
52
  enumerable: true,
53
- get: function () { return chunkEDHWKZRG_cjs.ProjectAnalyzer; }
53
+ get: function () { return chunk5CZ4N6Q2_cjs.ProjectAnalyzer; }
54
54
  });
55
55
  Object.defineProperty(exports, "PropsExtractor", {
56
56
  enumerable: true,
57
- get: function () { return chunkEDHWKZRG_cjs.PropsExtractor; }
57
+ get: function () { return chunk5CZ4N6Q2_cjs.PropsExtractor; }
58
58
  });
59
59
  Object.defineProperty(exports, "SQLParser", {
60
60
  enumerable: true,
61
- get: function () { return chunkEDHWKZRG_cjs.SQLParser; }
61
+ get: function () { return chunk5CZ4N6Q2_cjs.SQLParser; }
62
62
  });
63
63
  Object.defineProperty(exports, "SupabaseApiSender", {
64
64
  enumerable: true,
65
- get: function () { return chunkEDHWKZRG_cjs.SupabaseApiSender; }
65
+ get: function () { return chunk5CZ4N6Q2_cjs.SupabaseApiSender; }
66
66
  });
67
67
  Object.defineProperty(exports, "TypeScriptParser", {
68
68
  enumerable: true,
69
- get: function () { return chunkEDHWKZRG_cjs.TypeScriptParser; }
69
+ get: function () { return chunk5CZ4N6Q2_cjs.TypeScriptParser; }
70
70
  });
71
71
  Object.defineProperty(exports, "createDefaultConfig", {
72
72
  enumerable: true,
73
- get: function () { return chunkEDHWKZRG_cjs.createDefaultConfig; }
73
+ get: function () { return chunk5CZ4N6Q2_cjs.createDefaultConfig; }
74
74
  });
75
75
  Object.defineProperty(exports, "extendKoreanMap", {
76
76
  enumerable: true,
77
- get: function () { return chunkEDHWKZRG_cjs.extendKoreanMap; }
77
+ get: function () { return chunk5CZ4N6Q2_cjs.extendKoreanMap; }
78
78
  });
79
79
  Object.defineProperty(exports, "extractAcronyms", {
80
80
  enumerable: true,
81
- get: function () { return chunkEDHWKZRG_cjs.extractAcronyms; }
81
+ get: function () { return chunk5CZ4N6Q2_cjs.extractAcronyms; }
82
82
  });
83
83
  Object.defineProperty(exports, "findKoreanKeywords", {
84
84
  enumerable: true,
85
- get: function () { return chunkEDHWKZRG_cjs.findKoreanKeywords; }
85
+ get: function () { return chunk5CZ4N6Q2_cjs.findKoreanKeywords; }
86
86
  });
87
87
  Object.defineProperty(exports, "generateId", {
88
88
  enumerable: true,
89
- get: function () { return chunkEDHWKZRG_cjs.generateId; }
89
+ get: function () { return chunk5CZ4N6Q2_cjs.generateId; }
90
90
  });
91
91
  Object.defineProperty(exports, "splitCamelCase", {
92
92
  enumerable: true,
93
- get: function () { return chunkEDHWKZRG_cjs.splitCamelCase; }
93
+ get: function () { return chunk5CZ4N6Q2_cjs.splitCamelCase; }
94
94
  });
95
95
  Object.defineProperty(exports, "splitIntoWords", {
96
96
  enumerable: true,
97
- get: function () { return chunkEDHWKZRG_cjs.splitIntoWords; }
97
+ get: function () { return chunk5CZ4N6Q2_cjs.splitIntoWords; }
98
98
  });
99
99
  Object.defineProperty(exports, "splitKebabCase", {
100
100
  enumerable: true,
101
- get: function () { return chunkEDHWKZRG_cjs.splitKebabCase; }
101
+ get: function () { return chunk5CZ4N6Q2_cjs.splitKebabCase; }
102
102
  });
103
103
  Object.defineProperty(exports, "splitPascalCase", {
104
104
  enumerable: true,
105
- get: function () { return chunkEDHWKZRG_cjs.splitPascalCase; }
105
+ get: function () { return chunk5CZ4N6Q2_cjs.splitPascalCase; }
106
106
  });
107
107
  Object.defineProperty(exports, "splitSnakeCase", {
108
108
  enumerable: true,
109
- get: function () { return chunkEDHWKZRG_cjs.splitSnakeCase; }
109
+ get: function () { return chunk5CZ4N6Q2_cjs.splitSnakeCase; }
110
110
  });
111
111
  Object.defineProperty(exports, "toAllCases", {
112
112
  enumerable: true,
113
- get: function () { return chunkEDHWKZRG_cjs.toAllCases; }
113
+ get: function () { return chunk5CZ4N6Q2_cjs.toAllCases; }
114
114
  });
115
115
  Object.defineProperty(exports, "validateConfig", {
116
116
  enumerable: true,
117
- get: function () { return chunkEDHWKZRG_cjs.validateConfig; }
117
+ get: function () { return chunk5CZ4N6Q2_cjs.validateConfig; }
118
118
  });
119
- //# sourceMappingURL=index.cjs.map
120
- //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,3 +1 @@
1
- export { ApiSender, CallGraphBuilder, DEFAULT_EXCLUDE_PATTERNS, DEFAULT_FILE_TYPE_MAPPING, DEFAULT_INCLUDE_PATTERNS, DependencyResolver, ExportExtractor, FileWriter, ImportExtractor, KOREAN_KEYWORD_MAP, KeywordExtractor, ProjectAnalyzer, PropsExtractor, SQLParser, SupabaseApiSender, TypeScriptParser, createDefaultConfig, extendKoreanMap, extractAcronyms, findKoreanKeywords, generateId, splitCamelCase, splitIntoWords, splitKebabCase, splitPascalCase, splitSnakeCase, toAllCases, validateConfig } from './chunk-ECKCIPM5.js';
2
- //# sourceMappingURL=index.js.map
3
- //# sourceMappingURL=index.js.map
1
+ export { ApiSender, CallGraphBuilder, DEFAULT_EXCLUDE_PATTERNS, DEFAULT_FILE_TYPE_MAPPING, DEFAULT_INCLUDE_PATTERNS, DependencyResolver, ExportExtractor, FileWriter, ImportExtractor, KOREAN_KEYWORD_MAP, KeywordExtractor, ProjectAnalyzer, PropsExtractor, SQLParser, SupabaseApiSender, TypeScriptParser, createDefaultConfig, extendKoreanMap, extractAcronyms, findKoreanKeywords, generateId, splitCamelCase, splitIntoWords, splitKebabCase, splitPascalCase, splitSnakeCase, toAllCases, validateConfig } from './chunk-QXJYOL3O.js';
package/dist/next.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkEDHWKZRG_cjs = require('./chunk-EDHWKZRG.cjs');
5
+ var chunk5CZ4N6Q2_cjs = require('./chunk-5CZ4N6Q2.cjs');
6
6
  var path = require('path');
7
7
 
8
8
  function _interopNamespace(e) {
@@ -26,9 +26,9 @@ function _interopNamespace(e) {
26
26
  var path__namespace = /*#__PURE__*/_interopNamespace(path);
27
27
 
28
28
  function withMetadata(options = {}) {
29
- const pluginConfig = chunkEDHWKZRG_cjs.createDefaultConfig(options);
29
+ const pluginConfig = chunk5CZ4N6Q2_cjs.createDefaultConfig(options);
30
30
  const runOn = options.runOn || "build";
31
- const errors = chunkEDHWKZRG_cjs.validateConfig(pluginConfig);
31
+ const errors = chunk5CZ4N6Q2_cjs.validateConfig(pluginConfig);
32
32
  if (errors.length > 0) {
33
33
  throw new Error(
34
34
  `[metadata-plugin] Invalid config:
@@ -82,9 +82,9 @@ var MetadataWebpackPlugin = class {
82
82
  });
83
83
  }
84
84
  async runAnalysis(rootDir) {
85
- const analyzer = new chunkEDHWKZRG_cjs.ProjectAnalyzer(this.config);
86
- const fileWriter = new chunkEDHWKZRG_cjs.FileWriter(this.config);
87
- const apiSender = this.config.output.api?.enabled ? new chunkEDHWKZRG_cjs.ApiSender(this.config) : null;
85
+ const analyzer = new chunk5CZ4N6Q2_cjs.ProjectAnalyzer(this.config);
86
+ const fileWriter = new chunk5CZ4N6Q2_cjs.FileWriter(this.config);
87
+ const apiSender = this.config.output.api?.enabled ? new chunk5CZ4N6Q2_cjs.ApiSender(this.config) : null;
88
88
  if (this.config.verbose) {
89
89
  console.log("[metadata-plugin] Starting analysis...");
90
90
  }
@@ -107,5 +107,3 @@ var MetadataWebpackPlugin = class {
107
107
 
108
108
  exports.default = withMetadata;
109
109
  exports.withMetadata = withMetadata;
110
- //# sourceMappingURL=next.cjs.map
111
- //# sourceMappingURL=next.cjs.map
package/dist/next.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createDefaultConfig, validateConfig, ProjectAnalyzer, FileWriter, ApiSender } from './chunk-ECKCIPM5.js';
1
+ import { createDefaultConfig, validateConfig, ProjectAnalyzer, FileWriter, ApiSender } from './chunk-QXJYOL3O.js';
2
2
  import * as path from 'path';
3
3
 
4
4
  function withMetadata(options = {}) {
@@ -82,5 +82,3 @@ var MetadataWebpackPlugin = class {
82
82
  };
83
83
 
84
84
  export { withMetadata as default, withMetadata };
85
- //# sourceMappingURL=next.js.map
86
- //# sourceMappingURL=next.js.map
package/dist/vite.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkEDHWKZRG_cjs = require('./chunk-EDHWKZRG.cjs');
5
+ var chunk5CZ4N6Q2_cjs = require('./chunk-5CZ4N6Q2.cjs');
6
6
  var path = require('path');
7
7
 
8
8
  function _interopNamespace(e) {
@@ -26,18 +26,18 @@ function _interopNamespace(e) {
26
26
  var path__namespace = /*#__PURE__*/_interopNamespace(path);
27
27
 
28
28
  function metadataPlugin(options = {}) {
29
- const config = chunkEDHWKZRG_cjs.createDefaultConfig(options);
29
+ const config = chunk5CZ4N6Q2_cjs.createDefaultConfig(options);
30
30
  const runOn = options.runOn || "build";
31
31
  let viteConfig;
32
32
  let analysisResult = null;
33
- const analyzer = new chunkEDHWKZRG_cjs.ProjectAnalyzer(config);
34
- const fileWriter = new chunkEDHWKZRG_cjs.FileWriter(config);
35
- const apiSender = config.output.api?.enabled ? new chunkEDHWKZRG_cjs.ApiSender(config) : null;
33
+ const analyzer = new chunk5CZ4N6Q2_cjs.ProjectAnalyzer(config);
34
+ const fileWriter = new chunk5CZ4N6Q2_cjs.FileWriter(config);
35
+ const apiSender = config.output.api?.enabled ? new chunk5CZ4N6Q2_cjs.ApiSender(config) : null;
36
36
  return {
37
37
  name: "vite-metadata-plugin",
38
38
  configResolved(resolvedConfig) {
39
39
  viteConfig = resolvedConfig;
40
- const errors = chunkEDHWKZRG_cjs.validateConfig(config);
40
+ const errors = chunk5CZ4N6Q2_cjs.validateConfig(config);
41
41
  if (errors.length > 0) {
42
42
  throw new Error(
43
43
  `[metadata-plugin] Invalid config:
@@ -87,5 +87,3 @@ ${errors.join("\n")}`
87
87
 
88
88
  exports.default = metadataPlugin;
89
89
  exports.metadataPlugin = metadataPlugin;
90
- //# sourceMappingURL=vite.cjs.map
91
- //# sourceMappingURL=vite.cjs.map
package/dist/vite.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createDefaultConfig, ProjectAnalyzer, FileWriter, ApiSender, validateConfig } from './chunk-ECKCIPM5.js';
1
+ import { createDefaultConfig, ProjectAnalyzer, FileWriter, ApiSender, validateConfig } from './chunk-QXJYOL3O.js';
2
2
  import * as path from 'path';
3
3
 
4
4
  function metadataPlugin(options = {}) {
@@ -62,5 +62,3 @@ ${errors.join("\n")}`
62
62
  }
63
63
 
64
64
  export { metadataPlugin as default, metadataPlugin };
65
- //# sourceMappingURL=vite.js.map
66
- //# sourceMappingURL=vite.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metadatafy",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Build plugin for extracting project metadata for ticket analysis system",
5
5
  "type": "module",
6
6
  "exports": {
@@ -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","path3","fs2","basename","dirname","path4","resolve"],"mappings":"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","file":"chunk-ECKCIPM5.js","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"]}