@mandujs/core 0.13.0 β 0.13.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.
- package/README.ko.md +4 -4
- package/README.md +653 -653
- package/package.json +1 -1
- package/src/bundler/build.ts +91 -91
- package/src/bundler/css.ts +302 -302
- package/src/client/Link.tsx +227 -227
- package/src/client/globals.ts +44 -44
- package/src/client/hooks.ts +267 -267
- package/src/client/index.ts +5 -5
- package/src/client/island.ts +8 -8
- package/src/client/router.ts +435 -435
- package/src/client/runtime.ts +23 -23
- package/src/client/serialize.ts +404 -404
- package/src/client/window-state.ts +101 -101
- package/src/config/mandu.ts +9 -0
- package/src/config/validate.ts +12 -0
- package/src/config/watcher.ts +311 -311
- package/src/constants.ts +40 -40
- package/src/content/content-layer.ts +314 -314
- package/src/content/content.test.ts +433 -433
- package/src/content/data-store.ts +245 -245
- package/src/content/digest.ts +133 -133
- package/src/content/index.ts +164 -164
- package/src/content/loader-context.ts +172 -172
- package/src/content/loaders/api.ts +216 -216
- package/src/content/loaders/file.ts +169 -169
- package/src/content/loaders/glob.ts +252 -252
- package/src/content/loaders/index.ts +34 -34
- package/src/content/loaders/types.ts +137 -137
- package/src/content/meta-store.ts +209 -209
- package/src/content/types.ts +282 -282
- package/src/content/watcher.ts +135 -135
- package/src/contract/client-safe.test.ts +42 -42
- package/src/contract/client-safe.ts +114 -114
- package/src/contract/client.ts +16 -16
- package/src/contract/define.ts +459 -459
- package/src/contract/handler.ts +10 -10
- package/src/contract/normalize.test.ts +276 -276
- package/src/contract/normalize.ts +404 -404
- package/src/contract/registry.test.ts +206 -206
- package/src/contract/registry.ts +568 -568
- package/src/contract/schema.ts +48 -48
- package/src/contract/types.ts +58 -58
- package/src/contract/validator.ts +32 -32
- package/src/devtools/ai/context-builder.ts +375 -375
- package/src/devtools/ai/index.ts +25 -25
- package/src/devtools/ai/mcp-connector.ts +465 -465
- package/src/devtools/client/catchers/error-catcher.ts +327 -327
- package/src/devtools/client/catchers/index.ts +18 -18
- package/src/devtools/client/catchers/network-proxy.ts +363 -363
- package/src/devtools/client/components/index.ts +39 -39
- package/src/devtools/client/components/kitchen-root.tsx +362 -362
- package/src/devtools/client/components/mandu-character.tsx +241 -241
- package/src/devtools/client/components/overlay.tsx +368 -368
- package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
- package/src/devtools/client/components/panel/guard-panel.tsx +244 -244
- package/src/devtools/client/components/panel/index.ts +32 -32
- package/src/devtools/client/components/panel/islands-panel.tsx +304 -304
- package/src/devtools/client/components/panel/network-panel.tsx +292 -292
- package/src/devtools/client/components/panel/panel-container.tsx +259 -259
- package/src/devtools/client/filters/context-filters.ts +282 -282
- package/src/devtools/client/filters/index.ts +16 -16
- package/src/devtools/client/index.ts +63 -63
- package/src/devtools/client/persistence.ts +335 -335
- package/src/devtools/client/state-manager.ts +478 -478
- package/src/devtools/design-tokens.ts +263 -263
- package/src/devtools/hook/create-hook.ts +207 -207
- package/src/devtools/hook/index.ts +13 -13
- package/src/devtools/index.ts +439 -439
- package/src/devtools/init.ts +266 -266
- package/src/devtools/protocol.ts +237 -237
- package/src/devtools/server/index.ts +17 -17
- package/src/devtools/server/source-context.ts +444 -444
- package/src/devtools/types.ts +319 -319
- package/src/devtools/worker/index.ts +25 -25
- package/src/devtools/worker/redaction-worker.ts +222 -222
- package/src/devtools/worker/worker-manager.ts +409 -409
- package/src/error/domains.ts +265 -265
- package/src/error/result.ts +46 -46
- package/src/error/types.ts +6 -6
- package/src/errors/extractor.ts +409 -409
- package/src/errors/index.ts +19 -19
- package/src/filling/auth.ts +308 -308
- package/src/filling/context.ts +24 -1
- package/src/filling/deps.ts +238 -238
- package/src/filling/index.ts +4 -0
- package/src/filling/sse-catchup.test.ts +56 -0
- package/src/filling/sse-catchup.ts +67 -0
- package/src/filling/sse.test.ts +168 -0
- package/src/filling/sse.ts +162 -0
- package/src/generator/index.ts +3 -3
- package/src/guard/analyzer.ts +360 -360
- package/src/guard/ast-analyzer.ts +806 -806
- package/src/guard/contract-guard.ts +9 -9
- package/src/guard/file-type.test.ts +24 -24
- package/src/guard/presets/atomic.ts +70 -70
- package/src/guard/presets/clean.ts +77 -77
- package/src/guard/presets/fsd.ts +79 -79
- package/src/guard/presets/hexagonal.ts +68 -68
- package/src/guard/presets/index.ts +291 -291
- package/src/guard/reporter.ts +445 -445
- package/src/guard/rules.ts +12 -12
- package/src/guard/statistics.ts +578 -578
- package/src/guard/suggestions.ts +358 -358
- package/src/guard/types.ts +348 -348
- package/src/guard/validator.ts +834 -834
- package/src/guard/watcher.ts +404 -404
- package/src/index.ts +6 -1
- package/src/intent/index.ts +310 -310
- package/src/island/index.ts +304 -304
- package/src/logging/index.ts +22 -22
- package/src/logging/transports.ts +365 -365
- package/src/plugins/index.ts +38 -38
- package/src/plugins/registry.ts +377 -377
- package/src/plugins/types.ts +363 -363
- package/src/report/index.ts +1 -1
- package/src/router/fs-patterns.ts +387 -387
- package/src/router/fs-scanner.ts +497 -497
- package/src/runtime/boundary.tsx +232 -232
- package/src/runtime/compose.ts +222 -222
- package/src/runtime/escape.ts +44 -0
- package/src/runtime/lifecycle.ts +381 -381
- package/src/runtime/logger.test.ts +345 -345
- package/src/runtime/logger.ts +677 -677
- package/src/runtime/router.test.ts +476 -476
- package/src/runtime/router.ts +105 -105
- package/src/runtime/security.ts +155 -155
- package/src/runtime/server.ts +257 -0
- package/src/runtime/session-key.ts +328 -328
- package/src/runtime/ssr.ts +16 -21
- package/src/runtime/streaming-ssr.ts +24 -33
- package/src/runtime/trace.ts +144 -144
- package/src/seo/index.ts +214 -214
- package/src/seo/integration/ssr.ts +307 -307
- package/src/seo/render/basic.ts +427 -427
- package/src/seo/render/index.ts +143 -143
- package/src/seo/render/jsonld.ts +539 -539
- package/src/seo/render/opengraph.ts +191 -191
- package/src/seo/render/robots.ts +116 -116
- package/src/seo/render/sitemap.ts +137 -137
- package/src/seo/render/twitter.ts +126 -126
- package/src/seo/resolve/index.ts +353 -353
- package/src/seo/resolve/opengraph.ts +143 -143
- package/src/seo/resolve/robots.ts +73 -73
- package/src/seo/resolve/title.ts +94 -94
- package/src/seo/resolve/twitter.ts +73 -73
- package/src/seo/resolve/url.ts +97 -97
- package/src/seo/routes/index.ts +290 -290
- package/src/seo/types.ts +575 -575
- package/src/slot/validator.ts +39 -39
- package/src/spec/index.ts +3 -3
- package/src/spec/load.ts +76 -76
- package/src/spec/lock.ts +56 -56
- package/src/utils/bun.ts +8 -8
- package/src/utils/lru-cache.ts +75 -75
- package/src/utils/safe-io.ts +188 -188
- package/src/utils/string-safe.ts +298 -298
package/src/guard/types.ts
CHANGED
|
@@ -1,348 +1,348 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mandu Guard Types
|
|
3
|
-
*
|
|
4
|
-
* μ€μκ° μν€ν
μ² κ°μ μμ€ν
νμ
μ μ
|
|
5
|
-
*
|
|
6
|
-
* @module guard/types
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { TIMEOUTS } from "../constants";
|
|
10
|
-
|
|
11
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
12
|
-
// Configuration Types
|
|
13
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* ν리μ
μ΄λ¦
|
|
17
|
-
*/
|
|
18
|
-
export type GuardPreset =
|
|
19
|
-
| "fsd" // Feature-Sliced Design
|
|
20
|
-
| "clean" // Clean Architecture
|
|
21
|
-
| "hexagonal" // Hexagonal Architecture
|
|
22
|
-
| "atomic" // Atomic Design
|
|
23
|
-
| "cqrs" // CQRS (Command Query Responsibility Segregation)
|
|
24
|
-
| "mandu"; // Mandu κΆμ₯ (FSD + Clean μ‘°ν©)
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* μ¬κ°λ λ 벨
|
|
28
|
-
*/
|
|
29
|
-
export type Severity = "error" | "warn" | "info";
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* μ¬κ°λ μ€μ
|
|
33
|
-
*/
|
|
34
|
-
export interface SeverityConfig {
|
|
35
|
-
/** λ μ΄μ΄ μλ° */
|
|
36
|
-
layerViolation?: Severity;
|
|
37
|
-
/** μν μμ‘΄ */
|
|
38
|
-
circularDependency?: Severity;
|
|
39
|
-
/** κΉμ μ€μ²© */
|
|
40
|
-
deepNesting?: Severity;
|
|
41
|
-
/** κ°μ λ μ΄μ΄ λ΄ μ¬λΌμ΄μ€ κ° μμ‘΄ */
|
|
42
|
-
crossSliceDependency?: Severity;
|
|
43
|
-
/** νμΌ νμ
μλ° (.js/.jsx κΈμ§ λ±) */
|
|
44
|
-
fileType?: Severity;
|
|
45
|
-
/** shared νμ μΈκ·Έλ¨ΌνΈ μλ° */
|
|
46
|
-
invalidSharedSegment?: Severity;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* FS Routes Guard μ€μ
|
|
51
|
-
*/
|
|
52
|
-
export interface FSRoutesGuardConfig {
|
|
53
|
-
/** page.tsxμμ λ€λ₯Έ page import κΈμ§ */
|
|
54
|
-
noPageToPage?: boolean;
|
|
55
|
-
/** page.tsxκ° import κ°λ₯ν λ μ΄μ΄ */
|
|
56
|
-
pageCanImport?: string[];
|
|
57
|
-
/** layout.tsxκ° import κ°λ₯ν λ μ΄μ΄ */
|
|
58
|
-
layoutCanImport?: string[];
|
|
59
|
-
/** route.tsκ° import κ°λ₯ν λ μ΄μ΄ */
|
|
60
|
-
routeCanImport?: string[];
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Guard μ€μ
|
|
65
|
-
*/
|
|
66
|
-
export interface GuardConfig {
|
|
67
|
-
/** ν리μ
μ΄λ¦ */
|
|
68
|
-
preset?: GuardPreset;
|
|
69
|
-
|
|
70
|
-
/** μ€μκ° κ°μ μ¬λΆ (κΈ°λ³Έκ°: true) */
|
|
71
|
-
realtime?: boolean;
|
|
72
|
-
|
|
73
|
-
/** κ°μ λμ λλ ν 리 (κΈ°λ³Έκ°: "src") */
|
|
74
|
-
srcDir?: string;
|
|
75
|
-
|
|
76
|
-
/** μ μΈ ν¨ν΄ (glob) */
|
|
77
|
-
exclude?: string[];
|
|
78
|
-
|
|
79
|
-
/** 무μν import ν¨ν΄ */
|
|
80
|
-
ignoreImports?: string[];
|
|
81
|
-
|
|
82
|
-
/** 컀μ€ν
λ μ΄μ΄ μ μ */
|
|
83
|
-
layers?: LayerDefinition[];
|
|
84
|
-
|
|
85
|
-
/** ν리μ
μ€λ²λΌμ΄λ */
|
|
86
|
-
override?: {
|
|
87
|
-
layers?: Record<string, Partial<LayerDefinition>>;
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
/** μ¬κ°λ μ€μ */
|
|
91
|
-
severity?: SeverityConfig;
|
|
92
|
-
|
|
93
|
-
/** FS Routes ν΅ν© */
|
|
94
|
-
fsRoutes?: FSRoutesGuardConfig;
|
|
95
|
-
|
|
96
|
-
/** μ€μκ° μΆλ ₯ νμ */
|
|
97
|
-
realtimeOutput?: "console" | "agent" | "json";
|
|
98
|
-
|
|
99
|
-
/** μΊμ μ¬μ© μ¬λΆ (κΈ°λ³Έκ°: true) */
|
|
100
|
-
cache?: boolean;
|
|
101
|
-
|
|
102
|
-
/** μ¦λΆ λΆμ (κΈ°λ³Έκ°: true) */
|
|
103
|
-
incremental?: boolean;
|
|
104
|
-
|
|
105
|
-
/** λλ°μ΄μ€ μκ° (ms, κΈ°λ³Έκ°: 100) */
|
|
106
|
-
debounceMs?: number;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
110
|
-
// Layer Types
|
|
111
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* λ μ΄μ΄ μ μ
|
|
115
|
-
*/
|
|
116
|
-
export interface LayerDefinition {
|
|
117
|
-
/** λ μ΄μ΄ μ΄λ¦ */
|
|
118
|
-
name: string;
|
|
119
|
-
|
|
120
|
-
/** νμΌ ν¨ν΄ (glob) */
|
|
121
|
-
pattern: string;
|
|
122
|
-
|
|
123
|
-
/** import κ°λ₯ν λ μ΄μ΄ λͺ©λ‘ */
|
|
124
|
-
canImport: string[];
|
|
125
|
-
|
|
126
|
-
/** λ μ΄μ΄ μ€λͺ
*/
|
|
127
|
-
description?: string;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* ν΄μλ λ μ΄μ΄ κ·μΉ
|
|
132
|
-
*/
|
|
133
|
-
export interface LayerRule {
|
|
134
|
-
/** μμ€ λ μ΄μ΄ */
|
|
135
|
-
from: string;
|
|
136
|
-
/** νκ² λ μ΄μ΄ */
|
|
137
|
-
to: string;
|
|
138
|
-
/** νμ© μ¬λΆ */
|
|
139
|
-
allowed: boolean;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
143
|
-
// Analysis Types
|
|
144
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Import μ 보
|
|
148
|
-
*/
|
|
149
|
-
export interface ImportInfo {
|
|
150
|
-
/** import λ¬Έ μ 체 */
|
|
151
|
-
statement: string;
|
|
152
|
-
/** import κ²½λ‘ */
|
|
153
|
-
path: string;
|
|
154
|
-
/** λΌμΈ λ²νΈ */
|
|
155
|
-
line: number;
|
|
156
|
-
/** μ»¬λΌ λ²νΈ */
|
|
157
|
-
column: number;
|
|
158
|
-
/** import μ ν */
|
|
159
|
-
type: "static" | "dynamic" | "require";
|
|
160
|
-
/** named imports */
|
|
161
|
-
namedImports?: string[];
|
|
162
|
-
/** default import */
|
|
163
|
-
defaultImport?: string;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* νμΌ λΆμ κ²°κ³Ό
|
|
168
|
-
*/
|
|
169
|
-
export interface FileAnalysis {
|
|
170
|
-
/** νμΌ κ²½λ‘ */
|
|
171
|
-
filePath: string;
|
|
172
|
-
/** λΆμ κΈ°μ€ λ£¨νΈ λλ ν 리 */
|
|
173
|
-
rootDir?: string;
|
|
174
|
-
/** νμΌμ΄ μν λ μ΄μ΄ */
|
|
175
|
-
layer: string | null;
|
|
176
|
-
/** μ¬λΌμ΄μ€ μ΄λ¦ (FSDμ κ²½μ°) */
|
|
177
|
-
slice?: string;
|
|
178
|
-
/** import λͺ©λ‘ */
|
|
179
|
-
imports: ImportInfo[];
|
|
180
|
-
/** λΆμ μκ° */
|
|
181
|
-
analyzedAt: number;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
185
|
-
// Violation Types
|
|
186
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* μλ° μ ν
|
|
190
|
-
*/
|
|
191
|
-
export type ViolationType =
|
|
192
|
-
| "layer-violation" // λ μ΄μ΄ μμ‘΄ μλ°
|
|
193
|
-
| "circular-dependency" // μν μμ‘΄
|
|
194
|
-
| "cross-slice" // κ°μ λ μ΄μ΄ λ΄ μ¬λΌμ΄μ€ κ° μμ‘΄
|
|
195
|
-
| "deep-nesting" // κΉμ μ€μ²© import
|
|
196
|
-
| "file-type" // νμΌ νμ
μλ°
|
|
197
|
-
| "invalid-shared-segment"; // shared μΈκ·Έλ¨ΌνΈ μλ°
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* μν€ν
μ² μλ°
|
|
201
|
-
*/
|
|
202
|
-
export interface Violation {
|
|
203
|
-
/** μλ° μ ν */
|
|
204
|
-
type: ViolationType;
|
|
205
|
-
|
|
206
|
-
/** μλ° νμΌ κ²½λ‘ */
|
|
207
|
-
filePath: string;
|
|
208
|
-
|
|
209
|
-
/** λΌμΈ λ²νΈ */
|
|
210
|
-
line: number;
|
|
211
|
-
|
|
212
|
-
/** μ»¬λΌ λ²νΈ */
|
|
213
|
-
column: number;
|
|
214
|
-
|
|
215
|
-
/** μλ° import λ¬Έ */
|
|
216
|
-
importStatement: string;
|
|
217
|
-
|
|
218
|
-
/** import κ²½λ‘ */
|
|
219
|
-
importPath: string;
|
|
220
|
-
|
|
221
|
-
/** μμ€ λ μ΄μ΄ */
|
|
222
|
-
fromLayer: string;
|
|
223
|
-
|
|
224
|
-
/** νκ² λ μ΄μ΄ */
|
|
225
|
-
toLayer: string;
|
|
226
|
-
|
|
227
|
-
/** κ·μΉ μ΄λ¦ */
|
|
228
|
-
ruleName: string;
|
|
229
|
-
|
|
230
|
-
/** κ·μΉ μ€λͺ
*/
|
|
231
|
-
ruleDescription: string;
|
|
232
|
-
|
|
233
|
-
/** μ¬κ°λ */
|
|
234
|
-
severity: Severity;
|
|
235
|
-
|
|
236
|
-
/** νμ©λ λ μ΄μ΄ λͺ©λ‘ */
|
|
237
|
-
allowedLayers: string[];
|
|
238
|
-
|
|
239
|
-
/** ν΄κ²° μ μ */
|
|
240
|
-
suggestions: string[];
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* μλ° λ¦¬ν¬νΈ
|
|
245
|
-
*/
|
|
246
|
-
export interface ViolationReport {
|
|
247
|
-
/** μ΄ μλ° μ */
|
|
248
|
-
totalViolations: number;
|
|
249
|
-
|
|
250
|
-
/** μ¬κ°λλ³ μΉ΄μ΄νΈ */
|
|
251
|
-
bySeverity: Record<Severity, number>;
|
|
252
|
-
|
|
253
|
-
/** νμ
λ³ μΉ΄μ΄νΈ */
|
|
254
|
-
byType: Record<ViolationType, number>;
|
|
255
|
-
|
|
256
|
-
/** μλ° λͺ©λ‘ */
|
|
257
|
-
violations: Violation[];
|
|
258
|
-
|
|
259
|
-
/** λΆμλ νμΌ μ */
|
|
260
|
-
filesAnalyzed: number;
|
|
261
|
-
|
|
262
|
-
/** λΆμ μκ° (ms) */
|
|
263
|
-
analysisTime: number;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
267
|
-
// Watcher Types
|
|
268
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Guard Watcher μ΄λ²€νΈ
|
|
272
|
-
*/
|
|
273
|
-
export type WatcherEvent = "add" | "change" | "unlink";
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Guard Watcher μ½λ°±
|
|
277
|
-
*/
|
|
278
|
-
export type WatcherCallback = (event: WatcherEvent, filePath: string) => void;
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* Guard Watcher μΈν°νμ΄μ€
|
|
282
|
-
*/
|
|
283
|
-
export interface GuardWatcher {
|
|
284
|
-
/** κ°μ μμ */
|
|
285
|
-
start(): void;
|
|
286
|
-
/** κ°μ μ€μ§ */
|
|
287
|
-
close(): void;
|
|
288
|
-
/** μ 체 κ²μ¬ */
|
|
289
|
-
scanAll(): Promise<ViolationReport>;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
293
|
-
// Preset Types
|
|
294
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* ν리μ
μ μ
|
|
298
|
-
*/
|
|
299
|
-
export interface PresetDefinition {
|
|
300
|
-
/** ν리μ
μ΄λ¦ */
|
|
301
|
-
name: GuardPreset;
|
|
302
|
-
/** μ€λͺ
*/
|
|
303
|
-
description: string;
|
|
304
|
-
/** λ μ΄μ΄ μ μ */
|
|
305
|
-
layers: LayerDefinition[];
|
|
306
|
-
/** λ μ΄μ΄ κ³μΈ΅ ꡬ쑰 (μμ β νμ) */
|
|
307
|
-
hierarchy: string[];
|
|
308
|
-
/** κΈ°λ³Έ μ¬κ°λ μ€μ */
|
|
309
|
-
defaultSeverity?: SeverityConfig;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
313
|
-
// Constants
|
|
314
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* κΈ°λ³Έ Guard μ€μ
|
|
318
|
-
*/
|
|
319
|
-
export const DEFAULT_GUARD_CONFIG: Required<Omit<GuardConfig, "preset" | "layers" | "override" | "fsRoutes">> = {
|
|
320
|
-
realtime: true,
|
|
321
|
-
srcDir: "src",
|
|
322
|
-
exclude: [
|
|
323
|
-
"**/*.test.ts",
|
|
324
|
-
"**/*.test.tsx",
|
|
325
|
-
"**/*.spec.ts",
|
|
326
|
-
"**/*.spec.tsx",
|
|
327
|
-
"**/*.stories.tsx",
|
|
328
|
-
"**/node_modules/**",
|
|
329
|
-
],
|
|
330
|
-
ignoreImports: [],
|
|
331
|
-
severity: {
|
|
332
|
-
layerViolation: "error",
|
|
333
|
-
circularDependency: "warn",
|
|
334
|
-
deepNesting: "info",
|
|
335
|
-
crossSliceDependency: "warn",
|
|
336
|
-
fileType: "error",
|
|
337
|
-
invalidSharedSegment: "error",
|
|
338
|
-
},
|
|
339
|
-
realtimeOutput: "console",
|
|
340
|
-
cache: true,
|
|
341
|
-
incremental: true,
|
|
342
|
-
debounceMs: TIMEOUTS.WATCHER_DEBOUNCE,
|
|
343
|
-
};
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* κ°μ λμ νμΌ νμ₯μ
|
|
347
|
-
*/
|
|
348
|
-
export const WATCH_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
|
|
1
|
+
/**
|
|
2
|
+
* Mandu Guard Types
|
|
3
|
+
*
|
|
4
|
+
* μ€μκ° μν€ν
μ² κ°μ μμ€ν
νμ
μ μ
|
|
5
|
+
*
|
|
6
|
+
* @module guard/types
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { TIMEOUTS } from "../constants";
|
|
10
|
+
|
|
11
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
12
|
+
// Configuration Types
|
|
13
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* ν리μ
μ΄λ¦
|
|
17
|
+
*/
|
|
18
|
+
export type GuardPreset =
|
|
19
|
+
| "fsd" // Feature-Sliced Design
|
|
20
|
+
| "clean" // Clean Architecture
|
|
21
|
+
| "hexagonal" // Hexagonal Architecture
|
|
22
|
+
| "atomic" // Atomic Design
|
|
23
|
+
| "cqrs" // CQRS (Command Query Responsibility Segregation)
|
|
24
|
+
| "mandu"; // Mandu κΆμ₯ (FSD + Clean μ‘°ν©)
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* μ¬κ°λ λ 벨
|
|
28
|
+
*/
|
|
29
|
+
export type Severity = "error" | "warn" | "info";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* μ¬κ°λ μ€μ
|
|
33
|
+
*/
|
|
34
|
+
export interface SeverityConfig {
|
|
35
|
+
/** λ μ΄μ΄ μλ° */
|
|
36
|
+
layerViolation?: Severity;
|
|
37
|
+
/** μν μμ‘΄ */
|
|
38
|
+
circularDependency?: Severity;
|
|
39
|
+
/** κΉμ μ€μ²© */
|
|
40
|
+
deepNesting?: Severity;
|
|
41
|
+
/** κ°μ λ μ΄μ΄ λ΄ μ¬λΌμ΄μ€ κ° μμ‘΄ */
|
|
42
|
+
crossSliceDependency?: Severity;
|
|
43
|
+
/** νμΌ νμ
μλ° (.js/.jsx κΈμ§ λ±) */
|
|
44
|
+
fileType?: Severity;
|
|
45
|
+
/** shared νμ μΈκ·Έλ¨ΌνΈ μλ° */
|
|
46
|
+
invalidSharedSegment?: Severity;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* FS Routes Guard μ€μ
|
|
51
|
+
*/
|
|
52
|
+
export interface FSRoutesGuardConfig {
|
|
53
|
+
/** page.tsxμμ λ€λ₯Έ page import κΈμ§ */
|
|
54
|
+
noPageToPage?: boolean;
|
|
55
|
+
/** page.tsxκ° import κ°λ₯ν λ μ΄μ΄ */
|
|
56
|
+
pageCanImport?: string[];
|
|
57
|
+
/** layout.tsxκ° import κ°λ₯ν λ μ΄μ΄ */
|
|
58
|
+
layoutCanImport?: string[];
|
|
59
|
+
/** route.tsκ° import κ°λ₯ν λ μ΄μ΄ */
|
|
60
|
+
routeCanImport?: string[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Guard μ€μ
|
|
65
|
+
*/
|
|
66
|
+
export interface GuardConfig {
|
|
67
|
+
/** ν리μ
μ΄λ¦ */
|
|
68
|
+
preset?: GuardPreset;
|
|
69
|
+
|
|
70
|
+
/** μ€μκ° κ°μ μ¬λΆ (κΈ°λ³Έκ°: true) */
|
|
71
|
+
realtime?: boolean;
|
|
72
|
+
|
|
73
|
+
/** κ°μ λμ λλ ν 리 (κΈ°λ³Έκ°: "src") */
|
|
74
|
+
srcDir?: string;
|
|
75
|
+
|
|
76
|
+
/** μ μΈ ν¨ν΄ (glob) */
|
|
77
|
+
exclude?: string[];
|
|
78
|
+
|
|
79
|
+
/** 무μν import ν¨ν΄ */
|
|
80
|
+
ignoreImports?: string[];
|
|
81
|
+
|
|
82
|
+
/** 컀μ€ν
λ μ΄μ΄ μ μ */
|
|
83
|
+
layers?: LayerDefinition[];
|
|
84
|
+
|
|
85
|
+
/** ν리μ
μ€λ²λΌμ΄λ */
|
|
86
|
+
override?: {
|
|
87
|
+
layers?: Record<string, Partial<LayerDefinition>>;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/** μ¬κ°λ μ€μ */
|
|
91
|
+
severity?: SeverityConfig;
|
|
92
|
+
|
|
93
|
+
/** FS Routes ν΅ν© */
|
|
94
|
+
fsRoutes?: FSRoutesGuardConfig;
|
|
95
|
+
|
|
96
|
+
/** μ€μκ° μΆλ ₯ νμ */
|
|
97
|
+
realtimeOutput?: "console" | "agent" | "json";
|
|
98
|
+
|
|
99
|
+
/** μΊμ μ¬μ© μ¬λΆ (κΈ°λ³Έκ°: true) */
|
|
100
|
+
cache?: boolean;
|
|
101
|
+
|
|
102
|
+
/** μ¦λΆ λΆμ (κΈ°λ³Έκ°: true) */
|
|
103
|
+
incremental?: boolean;
|
|
104
|
+
|
|
105
|
+
/** λλ°μ΄μ€ μκ° (ms, κΈ°λ³Έκ°: 100) */
|
|
106
|
+
debounceMs?: number;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
110
|
+
// Layer Types
|
|
111
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* λ μ΄μ΄ μ μ
|
|
115
|
+
*/
|
|
116
|
+
export interface LayerDefinition {
|
|
117
|
+
/** λ μ΄μ΄ μ΄λ¦ */
|
|
118
|
+
name: string;
|
|
119
|
+
|
|
120
|
+
/** νμΌ ν¨ν΄ (glob) */
|
|
121
|
+
pattern: string;
|
|
122
|
+
|
|
123
|
+
/** import κ°λ₯ν λ μ΄μ΄ λͺ©λ‘ */
|
|
124
|
+
canImport: string[];
|
|
125
|
+
|
|
126
|
+
/** λ μ΄μ΄ μ€λͺ
*/
|
|
127
|
+
description?: string;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* ν΄μλ λ μ΄μ΄ κ·μΉ
|
|
132
|
+
*/
|
|
133
|
+
export interface LayerRule {
|
|
134
|
+
/** μμ€ λ μ΄μ΄ */
|
|
135
|
+
from: string;
|
|
136
|
+
/** νκ² λ μ΄μ΄ */
|
|
137
|
+
to: string;
|
|
138
|
+
/** νμ© μ¬λΆ */
|
|
139
|
+
allowed: boolean;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
143
|
+
// Analysis Types
|
|
144
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Import μ 보
|
|
148
|
+
*/
|
|
149
|
+
export interface ImportInfo {
|
|
150
|
+
/** import λ¬Έ μ 체 */
|
|
151
|
+
statement: string;
|
|
152
|
+
/** import κ²½λ‘ */
|
|
153
|
+
path: string;
|
|
154
|
+
/** λΌμΈ λ²νΈ */
|
|
155
|
+
line: number;
|
|
156
|
+
/** μ»¬λΌ λ²νΈ */
|
|
157
|
+
column: number;
|
|
158
|
+
/** import μ ν */
|
|
159
|
+
type: "static" | "dynamic" | "require";
|
|
160
|
+
/** named imports */
|
|
161
|
+
namedImports?: string[];
|
|
162
|
+
/** default import */
|
|
163
|
+
defaultImport?: string;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* νμΌ λΆμ κ²°κ³Ό
|
|
168
|
+
*/
|
|
169
|
+
export interface FileAnalysis {
|
|
170
|
+
/** νμΌ κ²½λ‘ */
|
|
171
|
+
filePath: string;
|
|
172
|
+
/** λΆμ κΈ°μ€ λ£¨νΈ λλ ν 리 */
|
|
173
|
+
rootDir?: string;
|
|
174
|
+
/** νμΌμ΄ μν λ μ΄μ΄ */
|
|
175
|
+
layer: string | null;
|
|
176
|
+
/** μ¬λΌμ΄μ€ μ΄λ¦ (FSDμ κ²½μ°) */
|
|
177
|
+
slice?: string;
|
|
178
|
+
/** import λͺ©λ‘ */
|
|
179
|
+
imports: ImportInfo[];
|
|
180
|
+
/** λΆμ μκ° */
|
|
181
|
+
analyzedAt: number;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
185
|
+
// Violation Types
|
|
186
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* μλ° μ ν
|
|
190
|
+
*/
|
|
191
|
+
export type ViolationType =
|
|
192
|
+
| "layer-violation" // λ μ΄μ΄ μμ‘΄ μλ°
|
|
193
|
+
| "circular-dependency" // μν μμ‘΄
|
|
194
|
+
| "cross-slice" // κ°μ λ μ΄μ΄ λ΄ μ¬λΌμ΄μ€ κ° μμ‘΄
|
|
195
|
+
| "deep-nesting" // κΉμ μ€μ²© import
|
|
196
|
+
| "file-type" // νμΌ νμ
μλ°
|
|
197
|
+
| "invalid-shared-segment"; // shared μΈκ·Έλ¨ΌνΈ μλ°
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* μν€ν
μ² μλ°
|
|
201
|
+
*/
|
|
202
|
+
export interface Violation {
|
|
203
|
+
/** μλ° μ ν */
|
|
204
|
+
type: ViolationType;
|
|
205
|
+
|
|
206
|
+
/** μλ° νμΌ κ²½λ‘ */
|
|
207
|
+
filePath: string;
|
|
208
|
+
|
|
209
|
+
/** λΌμΈ λ²νΈ */
|
|
210
|
+
line: number;
|
|
211
|
+
|
|
212
|
+
/** μ»¬λΌ λ²νΈ */
|
|
213
|
+
column: number;
|
|
214
|
+
|
|
215
|
+
/** μλ° import λ¬Έ */
|
|
216
|
+
importStatement: string;
|
|
217
|
+
|
|
218
|
+
/** import κ²½λ‘ */
|
|
219
|
+
importPath: string;
|
|
220
|
+
|
|
221
|
+
/** μμ€ λ μ΄μ΄ */
|
|
222
|
+
fromLayer: string;
|
|
223
|
+
|
|
224
|
+
/** νκ² λ μ΄μ΄ */
|
|
225
|
+
toLayer: string;
|
|
226
|
+
|
|
227
|
+
/** κ·μΉ μ΄λ¦ */
|
|
228
|
+
ruleName: string;
|
|
229
|
+
|
|
230
|
+
/** κ·μΉ μ€λͺ
*/
|
|
231
|
+
ruleDescription: string;
|
|
232
|
+
|
|
233
|
+
/** μ¬κ°λ */
|
|
234
|
+
severity: Severity;
|
|
235
|
+
|
|
236
|
+
/** νμ©λ λ μ΄μ΄ λͺ©λ‘ */
|
|
237
|
+
allowedLayers: string[];
|
|
238
|
+
|
|
239
|
+
/** ν΄κ²° μ μ */
|
|
240
|
+
suggestions: string[];
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* μλ° λ¦¬ν¬νΈ
|
|
245
|
+
*/
|
|
246
|
+
export interface ViolationReport {
|
|
247
|
+
/** μ΄ μλ° μ */
|
|
248
|
+
totalViolations: number;
|
|
249
|
+
|
|
250
|
+
/** μ¬κ°λλ³ μΉ΄μ΄νΈ */
|
|
251
|
+
bySeverity: Record<Severity, number>;
|
|
252
|
+
|
|
253
|
+
/** νμ
λ³ μΉ΄μ΄νΈ */
|
|
254
|
+
byType: Record<ViolationType, number>;
|
|
255
|
+
|
|
256
|
+
/** μλ° λͺ©λ‘ */
|
|
257
|
+
violations: Violation[];
|
|
258
|
+
|
|
259
|
+
/** λΆμλ νμΌ μ */
|
|
260
|
+
filesAnalyzed: number;
|
|
261
|
+
|
|
262
|
+
/** λΆμ μκ° (ms) */
|
|
263
|
+
analysisTime: number;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
267
|
+
// Watcher Types
|
|
268
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Guard Watcher μ΄λ²€νΈ
|
|
272
|
+
*/
|
|
273
|
+
export type WatcherEvent = "add" | "change" | "unlink";
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Guard Watcher μ½λ°±
|
|
277
|
+
*/
|
|
278
|
+
export type WatcherCallback = (event: WatcherEvent, filePath: string) => void;
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Guard Watcher μΈν°νμ΄μ€
|
|
282
|
+
*/
|
|
283
|
+
export interface GuardWatcher {
|
|
284
|
+
/** κ°μ μμ */
|
|
285
|
+
start(): void;
|
|
286
|
+
/** κ°μ μ€μ§ */
|
|
287
|
+
close(): void;
|
|
288
|
+
/** μ 체 κ²μ¬ */
|
|
289
|
+
scanAll(): Promise<ViolationReport>;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
293
|
+
// Preset Types
|
|
294
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* ν리μ
μ μ
|
|
298
|
+
*/
|
|
299
|
+
export interface PresetDefinition {
|
|
300
|
+
/** ν리μ
μ΄λ¦ */
|
|
301
|
+
name: GuardPreset;
|
|
302
|
+
/** μ€λͺ
*/
|
|
303
|
+
description: string;
|
|
304
|
+
/** λ μ΄μ΄ μ μ */
|
|
305
|
+
layers: LayerDefinition[];
|
|
306
|
+
/** λ μ΄μ΄ κ³μΈ΅ ꡬ쑰 (μμ β νμ) */
|
|
307
|
+
hierarchy: string[];
|
|
308
|
+
/** κΈ°λ³Έ μ¬κ°λ μ€μ */
|
|
309
|
+
defaultSeverity?: SeverityConfig;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
313
|
+
// Constants
|
|
314
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* κΈ°λ³Έ Guard μ€μ
|
|
318
|
+
*/
|
|
319
|
+
export const DEFAULT_GUARD_CONFIG: Required<Omit<GuardConfig, "preset" | "layers" | "override" | "fsRoutes">> = {
|
|
320
|
+
realtime: true,
|
|
321
|
+
srcDir: "src",
|
|
322
|
+
exclude: [
|
|
323
|
+
"**/*.test.ts",
|
|
324
|
+
"**/*.test.tsx",
|
|
325
|
+
"**/*.spec.ts",
|
|
326
|
+
"**/*.spec.tsx",
|
|
327
|
+
"**/*.stories.tsx",
|
|
328
|
+
"**/node_modules/**",
|
|
329
|
+
],
|
|
330
|
+
ignoreImports: [],
|
|
331
|
+
severity: {
|
|
332
|
+
layerViolation: "error",
|
|
333
|
+
circularDependency: "warn",
|
|
334
|
+
deepNesting: "info",
|
|
335
|
+
crossSliceDependency: "warn",
|
|
336
|
+
fileType: "error",
|
|
337
|
+
invalidSharedSegment: "error",
|
|
338
|
+
},
|
|
339
|
+
realtimeOutput: "console",
|
|
340
|
+
cache: true,
|
|
341
|
+
incremental: true,
|
|
342
|
+
debounceMs: TIMEOUTS.WATCHER_DEBOUNCE,
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* κ°μ λμ νμΌ νμ₯μ
|
|
347
|
+
*/
|
|
348
|
+
export const WATCH_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
|