metadatafy 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-ECKCIPM5.js +1329 -0
- package/dist/chunk-ECKCIPM5.js.map +1 -0
- package/dist/chunk-EDHWKZRG.cjs +1384 -0
- package/dist/chunk-EDHWKZRG.cjs.map +1 -0
- package/dist/cli.cjs +1478 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.js +1450 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +120 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +390 -0
- package/dist/index.d.ts +390 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/next.cjs +111 -0
- package/dist/next.cjs.map +1 -0
- package/dist/next.d.cts +19 -0
- package/dist/next.d.ts +19 -0
- package/dist/next.js +86 -0
- package/dist/next.js.map +1 -0
- package/dist/types-DlsgsNoY.d.cts +127 -0
- package/dist/types-DlsgsNoY.d.ts +127 -0
- package/dist/vite.cjs +91 -0
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.cts +19 -0
- package/dist/vite.d.ts +19 -0
- package/dist/vite.js +66 -0
- package/dist/vite.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 파일 타입 분류
|
|
3
|
+
*/
|
|
4
|
+
type FileType = 'route' | 'component' | 'hook' | 'service' | 'api' | 'table' | 'utility';
|
|
5
|
+
/**
|
|
6
|
+
* 코드 인덱스 아이템 - 분석된 파일의 메타데이터
|
|
7
|
+
*/
|
|
8
|
+
interface CodeIndexItem {
|
|
9
|
+
id: string;
|
|
10
|
+
projectId: string;
|
|
11
|
+
type: FileType;
|
|
12
|
+
name: string;
|
|
13
|
+
path: string;
|
|
14
|
+
keywords: string[];
|
|
15
|
+
searchText: string;
|
|
16
|
+
calls: string[];
|
|
17
|
+
calledBy: string[];
|
|
18
|
+
metadata: CodeMetadata;
|
|
19
|
+
}
|
|
20
|
+
interface CodeMetadata {
|
|
21
|
+
exports?: string[];
|
|
22
|
+
props?: string[];
|
|
23
|
+
routePath?: string;
|
|
24
|
+
httpMethods?: string[];
|
|
25
|
+
tableName?: string;
|
|
26
|
+
columns?: TableColumn[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* SQL 테이블 컬럼 정보
|
|
30
|
+
*/
|
|
31
|
+
interface TableColumn {
|
|
32
|
+
name: string;
|
|
33
|
+
type: string;
|
|
34
|
+
nullable: boolean;
|
|
35
|
+
isPrimaryKey: boolean;
|
|
36
|
+
isForeignKey: boolean;
|
|
37
|
+
references?: {
|
|
38
|
+
table: string;
|
|
39
|
+
column: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 파싱된 파일 정보
|
|
44
|
+
*/
|
|
45
|
+
interface ParsedFile {
|
|
46
|
+
path: string;
|
|
47
|
+
type: FileType;
|
|
48
|
+
name: string;
|
|
49
|
+
imports: ImportInfo[];
|
|
50
|
+
exports: ExportInfo[];
|
|
51
|
+
props?: PropInfo[];
|
|
52
|
+
metadata?: CodeMetadata;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* import 문 정보
|
|
56
|
+
*/
|
|
57
|
+
interface ImportInfo {
|
|
58
|
+
source: string;
|
|
59
|
+
specifiers: string[];
|
|
60
|
+
isDefault: boolean;
|
|
61
|
+
isTypeOnly: boolean;
|
|
62
|
+
resolvedPath?: string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* export 정보
|
|
66
|
+
*/
|
|
67
|
+
interface ExportInfo {
|
|
68
|
+
name: string;
|
|
69
|
+
isDefault: boolean;
|
|
70
|
+
isTypeOnly: boolean;
|
|
71
|
+
kind: 'function' | 'class' | 'variable' | 'type' | 'interface';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* React 컴포넌트 Props 정보
|
|
75
|
+
*/
|
|
76
|
+
interface PropInfo {
|
|
77
|
+
name: string;
|
|
78
|
+
type: string;
|
|
79
|
+
required: boolean;
|
|
80
|
+
defaultValue?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 플러그인 설정
|
|
84
|
+
*/
|
|
85
|
+
interface PluginConfig {
|
|
86
|
+
projectId: string;
|
|
87
|
+
include: string[];
|
|
88
|
+
exclude: string[];
|
|
89
|
+
fileTypeMapping: Record<string, FileType>;
|
|
90
|
+
output: OutputConfig;
|
|
91
|
+
koreanKeywords?: Record<string, string[]>;
|
|
92
|
+
mode: 'development' | 'production';
|
|
93
|
+
verbose?: boolean;
|
|
94
|
+
}
|
|
95
|
+
interface OutputConfig {
|
|
96
|
+
file?: {
|
|
97
|
+
enabled: boolean;
|
|
98
|
+
path: string;
|
|
99
|
+
};
|
|
100
|
+
api?: {
|
|
101
|
+
enabled: boolean;
|
|
102
|
+
endpoint: string;
|
|
103
|
+
headers?: Record<string, string>;
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 분석 결과
|
|
108
|
+
*/
|
|
109
|
+
interface AnalysisResult {
|
|
110
|
+
items: CodeIndexItem[];
|
|
111
|
+
stats: AnalysisStats;
|
|
112
|
+
timestamp: string;
|
|
113
|
+
}
|
|
114
|
+
interface AnalysisStats {
|
|
115
|
+
totalFiles: number;
|
|
116
|
+
byType: Record<FileType, number>;
|
|
117
|
+
parseErrors: string[];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 호출 그래프 엔트리
|
|
121
|
+
*/
|
|
122
|
+
interface CallGraphEntry {
|
|
123
|
+
calls: string[];
|
|
124
|
+
calledBy: string[];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export type { AnalysisResult as A, CallGraphEntry as C, ExportInfo as E, FileType as F, ImportInfo as I, OutputConfig as O, PluginConfig as P, TableColumn as T, ParsedFile as a, PropInfo as b, CodeIndexItem as c, CodeMetadata as d, AnalysisStats as e };
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 파일 타입 분류
|
|
3
|
+
*/
|
|
4
|
+
type FileType = 'route' | 'component' | 'hook' | 'service' | 'api' | 'table' | 'utility';
|
|
5
|
+
/**
|
|
6
|
+
* 코드 인덱스 아이템 - 분석된 파일의 메타데이터
|
|
7
|
+
*/
|
|
8
|
+
interface CodeIndexItem {
|
|
9
|
+
id: string;
|
|
10
|
+
projectId: string;
|
|
11
|
+
type: FileType;
|
|
12
|
+
name: string;
|
|
13
|
+
path: string;
|
|
14
|
+
keywords: string[];
|
|
15
|
+
searchText: string;
|
|
16
|
+
calls: string[];
|
|
17
|
+
calledBy: string[];
|
|
18
|
+
metadata: CodeMetadata;
|
|
19
|
+
}
|
|
20
|
+
interface CodeMetadata {
|
|
21
|
+
exports?: string[];
|
|
22
|
+
props?: string[];
|
|
23
|
+
routePath?: string;
|
|
24
|
+
httpMethods?: string[];
|
|
25
|
+
tableName?: string;
|
|
26
|
+
columns?: TableColumn[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* SQL 테이블 컬럼 정보
|
|
30
|
+
*/
|
|
31
|
+
interface TableColumn {
|
|
32
|
+
name: string;
|
|
33
|
+
type: string;
|
|
34
|
+
nullable: boolean;
|
|
35
|
+
isPrimaryKey: boolean;
|
|
36
|
+
isForeignKey: boolean;
|
|
37
|
+
references?: {
|
|
38
|
+
table: string;
|
|
39
|
+
column: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 파싱된 파일 정보
|
|
44
|
+
*/
|
|
45
|
+
interface ParsedFile {
|
|
46
|
+
path: string;
|
|
47
|
+
type: FileType;
|
|
48
|
+
name: string;
|
|
49
|
+
imports: ImportInfo[];
|
|
50
|
+
exports: ExportInfo[];
|
|
51
|
+
props?: PropInfo[];
|
|
52
|
+
metadata?: CodeMetadata;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* import 문 정보
|
|
56
|
+
*/
|
|
57
|
+
interface ImportInfo {
|
|
58
|
+
source: string;
|
|
59
|
+
specifiers: string[];
|
|
60
|
+
isDefault: boolean;
|
|
61
|
+
isTypeOnly: boolean;
|
|
62
|
+
resolvedPath?: string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* export 정보
|
|
66
|
+
*/
|
|
67
|
+
interface ExportInfo {
|
|
68
|
+
name: string;
|
|
69
|
+
isDefault: boolean;
|
|
70
|
+
isTypeOnly: boolean;
|
|
71
|
+
kind: 'function' | 'class' | 'variable' | 'type' | 'interface';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* React 컴포넌트 Props 정보
|
|
75
|
+
*/
|
|
76
|
+
interface PropInfo {
|
|
77
|
+
name: string;
|
|
78
|
+
type: string;
|
|
79
|
+
required: boolean;
|
|
80
|
+
defaultValue?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 플러그인 설정
|
|
84
|
+
*/
|
|
85
|
+
interface PluginConfig {
|
|
86
|
+
projectId: string;
|
|
87
|
+
include: string[];
|
|
88
|
+
exclude: string[];
|
|
89
|
+
fileTypeMapping: Record<string, FileType>;
|
|
90
|
+
output: OutputConfig;
|
|
91
|
+
koreanKeywords?: Record<string, string[]>;
|
|
92
|
+
mode: 'development' | 'production';
|
|
93
|
+
verbose?: boolean;
|
|
94
|
+
}
|
|
95
|
+
interface OutputConfig {
|
|
96
|
+
file?: {
|
|
97
|
+
enabled: boolean;
|
|
98
|
+
path: string;
|
|
99
|
+
};
|
|
100
|
+
api?: {
|
|
101
|
+
enabled: boolean;
|
|
102
|
+
endpoint: string;
|
|
103
|
+
headers?: Record<string, string>;
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 분석 결과
|
|
108
|
+
*/
|
|
109
|
+
interface AnalysisResult {
|
|
110
|
+
items: CodeIndexItem[];
|
|
111
|
+
stats: AnalysisStats;
|
|
112
|
+
timestamp: string;
|
|
113
|
+
}
|
|
114
|
+
interface AnalysisStats {
|
|
115
|
+
totalFiles: number;
|
|
116
|
+
byType: Record<FileType, number>;
|
|
117
|
+
parseErrors: string[];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 호출 그래프 엔트리
|
|
121
|
+
*/
|
|
122
|
+
interface CallGraphEntry {
|
|
123
|
+
calls: string[];
|
|
124
|
+
calledBy: string[];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export type { AnalysisResult as A, CallGraphEntry as C, ExportInfo as E, FileType as F, ImportInfo as I, OutputConfig as O, PluginConfig as P, TableColumn as T, ParsedFile as a, PropInfo as b, CodeIndexItem as c, CodeMetadata as d, AnalysisStats as e };
|
package/dist/vite.cjs
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var chunkEDHWKZRG_cjs = require('./chunk-EDHWKZRG.cjs');
|
|
6
|
+
var path = require('path');
|
|
7
|
+
|
|
8
|
+
function _interopNamespace(e) {
|
|
9
|
+
if (e && e.__esModule) return e;
|
|
10
|
+
var n = Object.create(null);
|
|
11
|
+
if (e) {
|
|
12
|
+
Object.keys(e).forEach(function (k) {
|
|
13
|
+
if (k !== 'default') {
|
|
14
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return e[k]; }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
n.default = e;
|
|
23
|
+
return Object.freeze(n);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
27
|
+
|
|
28
|
+
function metadataPlugin(options = {}) {
|
|
29
|
+
const config = chunkEDHWKZRG_cjs.createDefaultConfig(options);
|
|
30
|
+
const runOn = options.runOn || "build";
|
|
31
|
+
let viteConfig;
|
|
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;
|
|
36
|
+
return {
|
|
37
|
+
name: "vite-metadata-plugin",
|
|
38
|
+
configResolved(resolvedConfig) {
|
|
39
|
+
viteConfig = resolvedConfig;
|
|
40
|
+
const errors = chunkEDHWKZRG_cjs.validateConfig(config);
|
|
41
|
+
if (errors.length > 0) {
|
|
42
|
+
throw new Error(
|
|
43
|
+
`[metadata-plugin] Invalid config:
|
|
44
|
+
${errors.join("\n")}`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
async buildStart() {
|
|
49
|
+
const shouldRun = runOn === "both" || runOn === "build" && viteConfig.command === "build" || runOn === "serve" && viteConfig.command === "serve";
|
|
50
|
+
if (!shouldRun) return;
|
|
51
|
+
const rootDir = viteConfig.root;
|
|
52
|
+
if (config.verbose) {
|
|
53
|
+
console.log("[metadata-plugin] Starting analysis...");
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
analysisResult = await analyzer.analyze(rootDir);
|
|
57
|
+
if (config.output.file?.enabled) {
|
|
58
|
+
const outputPath = path__namespace.resolve(rootDir, config.output.file.path);
|
|
59
|
+
await fileWriter.write(analysisResult, outputPath);
|
|
60
|
+
if (config.verbose) {
|
|
61
|
+
console.log(`[metadata-plugin] Wrote metadata to ${outputPath}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (apiSender) {
|
|
65
|
+
await apiSender.send(analysisResult);
|
|
66
|
+
if (config.verbose) {
|
|
67
|
+
console.log("[metadata-plugin] Sent metadata to API");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
console.error("[metadata-plugin] Analysis failed:", error);
|
|
72
|
+
if (viteConfig.command === "build") {
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
generateBundle() {
|
|
78
|
+
if (!analysisResult) return;
|
|
79
|
+
this.emitFile({
|
|
80
|
+
type: "asset",
|
|
81
|
+
fileName: "metadata-stats.json",
|
|
82
|
+
source: JSON.stringify(analysisResult.stats, null, 2)
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
exports.default = metadataPlugin;
|
|
89
|
+
exports.metadataPlugin = metadataPlugin;
|
|
90
|
+
//# sourceMappingURL=vite.cjs.map
|
|
91
|
+
//# sourceMappingURL=vite.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/vite-adapter.ts"],"names":["createDefaultConfig","ProjectAnalyzer","FileWriter","ApiSender","validateConfig","path"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,SAAS,cAAA,CAAe,OAAA,GAA6B,EAAC,EAAW;AACtE,EAAA,MAAM,MAAA,GAASA,sCAAoB,OAAO,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,OAAA;AAE/B,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,cAAA,GAAwC,IAAA;AAE5C,EAAA,MAAM,QAAA,GAAW,IAAIC,iCAAA,CAAgB,MAAM,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,IAAIC,4BAAA,CAAW,MAAM,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,GAAA,EAAK,UAAU,IAAIC,2BAAA,CAAU,MAAM,CAAA,GAAI,IAAA;AAEvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,sBAAA;AAAA,IAEN,eAAe,cAAA,EAAgB;AAC7B,MAAA,UAAA,GAAa,cAAA;AAGb,MAAA,MAAM,MAAA,GAASC,iCAAe,MAAM,CAAA;AACpC,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA;AAAA,EAAsC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SACzD;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,UAAA,GAAa;AACjB,MAAA,MAAM,SAAA,GACJ,KAAA,KAAU,MAAA,IACT,KAAA,KAAU,OAAA,IAAW,UAAA,CAAW,OAAA,KAAY,OAAA,IAC5C,KAAA,KAAU,OAAA,IAAW,UAAA,CAAW,OAAA,KAAY,OAAA;AAE/C,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,UAAU,UAAA,CAAW,IAAA;AAE3B,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI;AACF,QAAA,cAAA,GAAiB,MAAM,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AAG/C,QAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AAC/B,UAAA,MAAM,aAAkBC,eAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAChE,UAAA,MAAM,UAAA,CAAW,KAAA,CAAM,cAAA,EAAgB,UAAU,CAAA;AAEjD,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,UAAU,CAAA,CAAE,CAAA;AAAA,UACjE;AAAA,QACF;AAGA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,SAAA,CAAU,KAAK,cAAc,CAAA;AAEnC,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAAA,UACtD;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,QAAA,IAAI,UAAA,CAAW,YAAY,OAAA,EAAS;AAClC,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,cAAA,GAAiB;AACf,MAAA,IAAI,CAAC,cAAA,EAAgB;AAGrB,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU,qBAAA;AAAA,QACV,QAAQ,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,KAAA,EAAO,MAAM,CAAC;AAAA,OACrD,CAAA;AAAA,IACH;AAAA,GACF;AACF","file":"vite.cjs","sourcesContent":["import type { Plugin, ResolvedConfig } from 'vite';\nimport * as path from 'path';\nimport type { PluginConfig, AnalysisResult } from '../core/types';\nimport { ProjectAnalyzer } from '../core/analyzer';\nimport { createDefaultConfig, validateConfig } from '../core/config';\nimport { FileWriter } from '../core/output/file-writer';\nimport { ApiSender } from '../core/output/api-sender';\n\nexport interface VitePluginOptions extends Partial<PluginConfig> {\n /**\n * 분석 실행 시점\n * - 'build': 프로덕션 빌드 시에만 (기본값)\n * - 'serve': 개발 서버 시작 시에만\n * - 'both': 둘 다\n */\n runOn?: 'build' | 'serve' | 'both';\n}\n\n/**\n * Vite 메타데이터 플러그인\n */\nexport function metadataPlugin(options: VitePluginOptions = {}): Plugin {\n const config = createDefaultConfig(options);\n const runOn = options.runOn || 'build';\n\n let viteConfig: ResolvedConfig;\n let analysisResult: AnalysisResult | null = null;\n\n const analyzer = new ProjectAnalyzer(config);\n const fileWriter = new FileWriter(config);\n const apiSender = config.output.api?.enabled ? new ApiSender(config) : null;\n\n return {\n name: 'vite-metadata-plugin',\n\n configResolved(resolvedConfig) {\n viteConfig = resolvedConfig;\n\n // 설정 검증\n const errors = validateConfig(config);\n if (errors.length > 0) {\n throw new Error(\n `[metadata-plugin] Invalid config:\\n${errors.join('\\n')}`\n );\n }\n },\n\n async buildStart() {\n const shouldRun =\n runOn === 'both' ||\n (runOn === 'build' && viteConfig.command === 'build') ||\n (runOn === 'serve' && viteConfig.command === 'serve');\n\n if (!shouldRun) return;\n\n const rootDir = viteConfig.root;\n\n if (config.verbose) {\n console.log('[metadata-plugin] Starting analysis...');\n }\n\n try {\n analysisResult = await analyzer.analyze(rootDir);\n\n // 파일 출력\n if (config.output.file?.enabled) {\n const outputPath = path.resolve(rootDir, config.output.file.path);\n await fileWriter.write(analysisResult, outputPath);\n\n if (config.verbose) {\n console.log(`[metadata-plugin] Wrote metadata to ${outputPath}`);\n }\n }\n\n // API 전송\n if (apiSender) {\n await apiSender.send(analysisResult);\n\n if (config.verbose) {\n console.log('[metadata-plugin] Sent metadata to API');\n }\n }\n } catch (error) {\n console.error('[metadata-plugin] Analysis failed:', error);\n if (viteConfig.command === 'build') {\n throw error;\n }\n }\n },\n\n generateBundle() {\n if (!analysisResult) return;\n\n // 빌드 결과에 통계 정보 추가\n this.emitFile({\n type: 'asset',\n fileName: 'metadata-stats.json',\n source: JSON.stringify(analysisResult.stats, null, 2),\n });\n },\n };\n}\n"]}
|
package/dist/vite.d.cts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Plugin } from 'vite';
|
|
2
|
+
import { P as PluginConfig } from './types-DlsgsNoY.cjs';
|
|
3
|
+
export { A as AnalysisResult, c as CodeIndexItem } from './types-DlsgsNoY.cjs';
|
|
4
|
+
|
|
5
|
+
interface VitePluginOptions extends Partial<PluginConfig> {
|
|
6
|
+
/**
|
|
7
|
+
* 분석 실행 시점
|
|
8
|
+
* - 'build': 프로덕션 빌드 시에만 (기본값)
|
|
9
|
+
* - 'serve': 개발 서버 시작 시에만
|
|
10
|
+
* - 'both': 둘 다
|
|
11
|
+
*/
|
|
12
|
+
runOn?: 'build' | 'serve' | 'both';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Vite 메타데이터 플러그인
|
|
16
|
+
*/
|
|
17
|
+
declare function metadataPlugin(options?: VitePluginOptions): Plugin;
|
|
18
|
+
|
|
19
|
+
export { PluginConfig, type VitePluginOptions, metadataPlugin as default, metadataPlugin };
|
package/dist/vite.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Plugin } from 'vite';
|
|
2
|
+
import { P as PluginConfig } from './types-DlsgsNoY.js';
|
|
3
|
+
export { A as AnalysisResult, c as CodeIndexItem } from './types-DlsgsNoY.js';
|
|
4
|
+
|
|
5
|
+
interface VitePluginOptions extends Partial<PluginConfig> {
|
|
6
|
+
/**
|
|
7
|
+
* 분석 실행 시점
|
|
8
|
+
* - 'build': 프로덕션 빌드 시에만 (기본값)
|
|
9
|
+
* - 'serve': 개발 서버 시작 시에만
|
|
10
|
+
* - 'both': 둘 다
|
|
11
|
+
*/
|
|
12
|
+
runOn?: 'build' | 'serve' | 'both';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Vite 메타데이터 플러그인
|
|
16
|
+
*/
|
|
17
|
+
declare function metadataPlugin(options?: VitePluginOptions): Plugin;
|
|
18
|
+
|
|
19
|
+
export { PluginConfig, type VitePluginOptions, metadataPlugin as default, metadataPlugin };
|
package/dist/vite.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createDefaultConfig, ProjectAnalyzer, FileWriter, ApiSender, validateConfig } from './chunk-ECKCIPM5.js';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
function metadataPlugin(options = {}) {
|
|
5
|
+
const config = createDefaultConfig(options);
|
|
6
|
+
const runOn = options.runOn || "build";
|
|
7
|
+
let viteConfig;
|
|
8
|
+
let analysisResult = null;
|
|
9
|
+
const analyzer = new ProjectAnalyzer(config);
|
|
10
|
+
const fileWriter = new FileWriter(config);
|
|
11
|
+
const apiSender = config.output.api?.enabled ? new ApiSender(config) : null;
|
|
12
|
+
return {
|
|
13
|
+
name: "vite-metadata-plugin",
|
|
14
|
+
configResolved(resolvedConfig) {
|
|
15
|
+
viteConfig = resolvedConfig;
|
|
16
|
+
const errors = validateConfig(config);
|
|
17
|
+
if (errors.length > 0) {
|
|
18
|
+
throw new Error(
|
|
19
|
+
`[metadata-plugin] Invalid config:
|
|
20
|
+
${errors.join("\n")}`
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
async buildStart() {
|
|
25
|
+
const shouldRun = runOn === "both" || runOn === "build" && viteConfig.command === "build" || runOn === "serve" && viteConfig.command === "serve";
|
|
26
|
+
if (!shouldRun) return;
|
|
27
|
+
const rootDir = viteConfig.root;
|
|
28
|
+
if (config.verbose) {
|
|
29
|
+
console.log("[metadata-plugin] Starting analysis...");
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
analysisResult = await analyzer.analyze(rootDir);
|
|
33
|
+
if (config.output.file?.enabled) {
|
|
34
|
+
const outputPath = path.resolve(rootDir, config.output.file.path);
|
|
35
|
+
await fileWriter.write(analysisResult, outputPath);
|
|
36
|
+
if (config.verbose) {
|
|
37
|
+
console.log(`[metadata-plugin] Wrote metadata to ${outputPath}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (apiSender) {
|
|
41
|
+
await apiSender.send(analysisResult);
|
|
42
|
+
if (config.verbose) {
|
|
43
|
+
console.log("[metadata-plugin] Sent metadata to API");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error("[metadata-plugin] Analysis failed:", error);
|
|
48
|
+
if (viteConfig.command === "build") {
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
generateBundle() {
|
|
54
|
+
if (!analysisResult) return;
|
|
55
|
+
this.emitFile({
|
|
56
|
+
type: "asset",
|
|
57
|
+
fileName: "metadata-stats.json",
|
|
58
|
+
source: JSON.stringify(analysisResult.stats, null, 2)
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { metadataPlugin as default, metadataPlugin };
|
|
65
|
+
//# sourceMappingURL=vite.js.map
|
|
66
|
+
//# sourceMappingURL=vite.js.map
|
package/dist/vite.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/vite-adapter.ts"],"names":[],"mappings":";;;AAqBO,SAAS,cAAA,CAAe,OAAA,GAA6B,EAAC,EAAW;AACtE,EAAA,MAAM,MAAA,GAAS,oBAAoB,OAAO,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,OAAA;AAE/B,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,cAAA,GAAwC,IAAA;AAE5C,EAAA,MAAM,QAAA,GAAW,IAAI,eAAA,CAAgB,MAAM,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,MAAM,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,GAAA,EAAK,UAAU,IAAI,SAAA,CAAU,MAAM,CAAA,GAAI,IAAA;AAEvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,sBAAA;AAAA,IAEN,eAAe,cAAA,EAAgB;AAC7B,MAAA,UAAA,GAAa,cAAA;AAGb,MAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA;AAAA,EAAsC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SACzD;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,UAAA,GAAa;AACjB,MAAA,MAAM,SAAA,GACJ,KAAA,KAAU,MAAA,IACT,KAAA,KAAU,OAAA,IAAW,UAAA,CAAW,OAAA,KAAY,OAAA,IAC5C,KAAA,KAAU,OAAA,IAAW,UAAA,CAAW,OAAA,KAAY,OAAA;AAE/C,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,UAAU,UAAA,CAAW,IAAA;AAE3B,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI;AACF,QAAA,cAAA,GAAiB,MAAM,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AAG/C,QAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AAC/B,UAAA,MAAM,aAAkB,IAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAChE,UAAA,MAAM,UAAA,CAAW,KAAA,CAAM,cAAA,EAAgB,UAAU,CAAA;AAEjD,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,UAAU,CAAA,CAAE,CAAA;AAAA,UACjE;AAAA,QACF;AAGA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,SAAA,CAAU,KAAK,cAAc,CAAA;AAEnC,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAAA,UACtD;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,QAAA,IAAI,UAAA,CAAW,YAAY,OAAA,EAAS;AAClC,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,cAAA,GAAiB;AACf,MAAA,IAAI,CAAC,cAAA,EAAgB;AAGrB,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU,qBAAA;AAAA,QACV,QAAQ,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,KAAA,EAAO,MAAM,CAAC;AAAA,OACrD,CAAA;AAAA,IACH;AAAA,GACF;AACF","file":"vite.js","sourcesContent":["import type { Plugin, ResolvedConfig } from 'vite';\nimport * as path from 'path';\nimport type { PluginConfig, AnalysisResult } from '../core/types';\nimport { ProjectAnalyzer } from '../core/analyzer';\nimport { createDefaultConfig, validateConfig } from '../core/config';\nimport { FileWriter } from '../core/output/file-writer';\nimport { ApiSender } from '../core/output/api-sender';\n\nexport interface VitePluginOptions extends Partial<PluginConfig> {\n /**\n * 분석 실행 시점\n * - 'build': 프로덕션 빌드 시에만 (기본값)\n * - 'serve': 개발 서버 시작 시에만\n * - 'both': 둘 다\n */\n runOn?: 'build' | 'serve' | 'both';\n}\n\n/**\n * Vite 메타데이터 플러그인\n */\nexport function metadataPlugin(options: VitePluginOptions = {}): Plugin {\n const config = createDefaultConfig(options);\n const runOn = options.runOn || 'build';\n\n let viteConfig: ResolvedConfig;\n let analysisResult: AnalysisResult | null = null;\n\n const analyzer = new ProjectAnalyzer(config);\n const fileWriter = new FileWriter(config);\n const apiSender = config.output.api?.enabled ? new ApiSender(config) : null;\n\n return {\n name: 'vite-metadata-plugin',\n\n configResolved(resolvedConfig) {\n viteConfig = resolvedConfig;\n\n // 설정 검증\n const errors = validateConfig(config);\n if (errors.length > 0) {\n throw new Error(\n `[metadata-plugin] Invalid config:\\n${errors.join('\\n')}`\n );\n }\n },\n\n async buildStart() {\n const shouldRun =\n runOn === 'both' ||\n (runOn === 'build' && viteConfig.command === 'build') ||\n (runOn === 'serve' && viteConfig.command === 'serve');\n\n if (!shouldRun) return;\n\n const rootDir = viteConfig.root;\n\n if (config.verbose) {\n console.log('[metadata-plugin] Starting analysis...');\n }\n\n try {\n analysisResult = await analyzer.analyze(rootDir);\n\n // 파일 출력\n if (config.output.file?.enabled) {\n const outputPath = path.resolve(rootDir, config.output.file.path);\n await fileWriter.write(analysisResult, outputPath);\n\n if (config.verbose) {\n console.log(`[metadata-plugin] Wrote metadata to ${outputPath}`);\n }\n }\n\n // API 전송\n if (apiSender) {\n await apiSender.send(analysisResult);\n\n if (config.verbose) {\n console.log('[metadata-plugin] Sent metadata to API');\n }\n }\n } catch (error) {\n console.error('[metadata-plugin] Analysis failed:', error);\n if (viteConfig.command === 'build') {\n throw error;\n }\n }\n },\n\n generateBundle() {\n if (!analysisResult) return;\n\n // 빌드 결과에 통계 정보 추가\n this.emitFile({\n type: 'asset',\n fileName: 'metadata-stats.json',\n source: JSON.stringify(analysisResult.stats, null, 2),\n });\n },\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "metadatafy",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Build plugin for extracting project metadata for ticket analysis system",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/index.js",
|
|
10
|
+
"require": "./dist/index.cjs"
|
|
11
|
+
},
|
|
12
|
+
"./vite": {
|
|
13
|
+
"types": "./dist/vite.d.ts",
|
|
14
|
+
"import": "./dist/vite.js",
|
|
15
|
+
"require": "./dist/vite.cjs"
|
|
16
|
+
},
|
|
17
|
+
"./next": {
|
|
18
|
+
"types": "./dist/next.d.ts",
|
|
19
|
+
"import": "./dist/next.js",
|
|
20
|
+
"require": "./dist/next.cjs"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"bin": {
|
|
24
|
+
"metadatafy": "./dist/cli.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsup",
|
|
31
|
+
"dev": "tsup --watch",
|
|
32
|
+
"test": "vitest",
|
|
33
|
+
"test:coverage": "vitest --coverage",
|
|
34
|
+
"lint": "eslint src/",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"prepublishOnly": "npm run build"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"next": ">=13.0.0",
|
|
40
|
+
"vite": ">=4.0.0"
|
|
41
|
+
},
|
|
42
|
+
"peerDependenciesMeta": {
|
|
43
|
+
"vite": {
|
|
44
|
+
"optional": true
|
|
45
|
+
},
|
|
46
|
+
"next": {
|
|
47
|
+
"optional": true
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"glob": "^10.0.0",
|
|
52
|
+
"typescript": "^5.0.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/node": "^20.0.0",
|
|
56
|
+
"@types/webpack": "^5.28.5",
|
|
57
|
+
"eslint": "^9.0.0",
|
|
58
|
+
"next": "^14.0.0",
|
|
59
|
+
"tsup": "^8.0.0",
|
|
60
|
+
"typescript": "^5.0.0",
|
|
61
|
+
"typescript-eslint": "^8.0.0",
|
|
62
|
+
"vite": "^5.0.0",
|
|
63
|
+
"vitest": "^1.0.0"
|
|
64
|
+
},
|
|
65
|
+
"keywords": [
|
|
66
|
+
"vite-plugin",
|
|
67
|
+
"next-plugin",
|
|
68
|
+
"metadata",
|
|
69
|
+
"code-analysis",
|
|
70
|
+
"ast"
|
|
71
|
+
],
|
|
72
|
+
"author": "Impackers",
|
|
73
|
+
"license": "MIT"
|
|
74
|
+
}
|