@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.
Files changed (157) hide show
  1. package/README.ko.md +4 -4
  2. package/README.md +653 -653
  3. package/package.json +1 -1
  4. package/src/bundler/build.ts +91 -91
  5. package/src/bundler/css.ts +302 -302
  6. package/src/client/Link.tsx +227 -227
  7. package/src/client/globals.ts +44 -44
  8. package/src/client/hooks.ts +267 -267
  9. package/src/client/index.ts +5 -5
  10. package/src/client/island.ts +8 -8
  11. package/src/client/router.ts +435 -435
  12. package/src/client/runtime.ts +23 -23
  13. package/src/client/serialize.ts +404 -404
  14. package/src/client/window-state.ts +101 -101
  15. package/src/config/mandu.ts +9 -0
  16. package/src/config/validate.ts +12 -0
  17. package/src/config/watcher.ts +311 -311
  18. package/src/constants.ts +40 -40
  19. package/src/content/content-layer.ts +314 -314
  20. package/src/content/content.test.ts +433 -433
  21. package/src/content/data-store.ts +245 -245
  22. package/src/content/digest.ts +133 -133
  23. package/src/content/index.ts +164 -164
  24. package/src/content/loader-context.ts +172 -172
  25. package/src/content/loaders/api.ts +216 -216
  26. package/src/content/loaders/file.ts +169 -169
  27. package/src/content/loaders/glob.ts +252 -252
  28. package/src/content/loaders/index.ts +34 -34
  29. package/src/content/loaders/types.ts +137 -137
  30. package/src/content/meta-store.ts +209 -209
  31. package/src/content/types.ts +282 -282
  32. package/src/content/watcher.ts +135 -135
  33. package/src/contract/client-safe.test.ts +42 -42
  34. package/src/contract/client-safe.ts +114 -114
  35. package/src/contract/client.ts +16 -16
  36. package/src/contract/define.ts +459 -459
  37. package/src/contract/handler.ts +10 -10
  38. package/src/contract/normalize.test.ts +276 -276
  39. package/src/contract/normalize.ts +404 -404
  40. package/src/contract/registry.test.ts +206 -206
  41. package/src/contract/registry.ts +568 -568
  42. package/src/contract/schema.ts +48 -48
  43. package/src/contract/types.ts +58 -58
  44. package/src/contract/validator.ts +32 -32
  45. package/src/devtools/ai/context-builder.ts +375 -375
  46. package/src/devtools/ai/index.ts +25 -25
  47. package/src/devtools/ai/mcp-connector.ts +465 -465
  48. package/src/devtools/client/catchers/error-catcher.ts +327 -327
  49. package/src/devtools/client/catchers/index.ts +18 -18
  50. package/src/devtools/client/catchers/network-proxy.ts +363 -363
  51. package/src/devtools/client/components/index.ts +39 -39
  52. package/src/devtools/client/components/kitchen-root.tsx +362 -362
  53. package/src/devtools/client/components/mandu-character.tsx +241 -241
  54. package/src/devtools/client/components/overlay.tsx +368 -368
  55. package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
  56. package/src/devtools/client/components/panel/guard-panel.tsx +244 -244
  57. package/src/devtools/client/components/panel/index.ts +32 -32
  58. package/src/devtools/client/components/panel/islands-panel.tsx +304 -304
  59. package/src/devtools/client/components/panel/network-panel.tsx +292 -292
  60. package/src/devtools/client/components/panel/panel-container.tsx +259 -259
  61. package/src/devtools/client/filters/context-filters.ts +282 -282
  62. package/src/devtools/client/filters/index.ts +16 -16
  63. package/src/devtools/client/index.ts +63 -63
  64. package/src/devtools/client/persistence.ts +335 -335
  65. package/src/devtools/client/state-manager.ts +478 -478
  66. package/src/devtools/design-tokens.ts +263 -263
  67. package/src/devtools/hook/create-hook.ts +207 -207
  68. package/src/devtools/hook/index.ts +13 -13
  69. package/src/devtools/index.ts +439 -439
  70. package/src/devtools/init.ts +266 -266
  71. package/src/devtools/protocol.ts +237 -237
  72. package/src/devtools/server/index.ts +17 -17
  73. package/src/devtools/server/source-context.ts +444 -444
  74. package/src/devtools/types.ts +319 -319
  75. package/src/devtools/worker/index.ts +25 -25
  76. package/src/devtools/worker/redaction-worker.ts +222 -222
  77. package/src/devtools/worker/worker-manager.ts +409 -409
  78. package/src/error/domains.ts +265 -265
  79. package/src/error/result.ts +46 -46
  80. package/src/error/types.ts +6 -6
  81. package/src/errors/extractor.ts +409 -409
  82. package/src/errors/index.ts +19 -19
  83. package/src/filling/auth.ts +308 -308
  84. package/src/filling/context.ts +24 -1
  85. package/src/filling/deps.ts +238 -238
  86. package/src/filling/index.ts +4 -0
  87. package/src/filling/sse-catchup.test.ts +56 -0
  88. package/src/filling/sse-catchup.ts +67 -0
  89. package/src/filling/sse.test.ts +168 -0
  90. package/src/filling/sse.ts +162 -0
  91. package/src/generator/index.ts +3 -3
  92. package/src/guard/analyzer.ts +360 -360
  93. package/src/guard/ast-analyzer.ts +806 -806
  94. package/src/guard/contract-guard.ts +9 -9
  95. package/src/guard/file-type.test.ts +24 -24
  96. package/src/guard/presets/atomic.ts +70 -70
  97. package/src/guard/presets/clean.ts +77 -77
  98. package/src/guard/presets/fsd.ts +79 -79
  99. package/src/guard/presets/hexagonal.ts +68 -68
  100. package/src/guard/presets/index.ts +291 -291
  101. package/src/guard/reporter.ts +445 -445
  102. package/src/guard/rules.ts +12 -12
  103. package/src/guard/statistics.ts +578 -578
  104. package/src/guard/suggestions.ts +358 -358
  105. package/src/guard/types.ts +348 -348
  106. package/src/guard/validator.ts +834 -834
  107. package/src/guard/watcher.ts +404 -404
  108. package/src/index.ts +6 -1
  109. package/src/intent/index.ts +310 -310
  110. package/src/island/index.ts +304 -304
  111. package/src/logging/index.ts +22 -22
  112. package/src/logging/transports.ts +365 -365
  113. package/src/plugins/index.ts +38 -38
  114. package/src/plugins/registry.ts +377 -377
  115. package/src/plugins/types.ts +363 -363
  116. package/src/report/index.ts +1 -1
  117. package/src/router/fs-patterns.ts +387 -387
  118. package/src/router/fs-scanner.ts +497 -497
  119. package/src/runtime/boundary.tsx +232 -232
  120. package/src/runtime/compose.ts +222 -222
  121. package/src/runtime/escape.ts +44 -0
  122. package/src/runtime/lifecycle.ts +381 -381
  123. package/src/runtime/logger.test.ts +345 -345
  124. package/src/runtime/logger.ts +677 -677
  125. package/src/runtime/router.test.ts +476 -476
  126. package/src/runtime/router.ts +105 -105
  127. package/src/runtime/security.ts +155 -155
  128. package/src/runtime/server.ts +257 -0
  129. package/src/runtime/session-key.ts +328 -328
  130. package/src/runtime/ssr.ts +16 -21
  131. package/src/runtime/streaming-ssr.ts +24 -33
  132. package/src/runtime/trace.ts +144 -144
  133. package/src/seo/index.ts +214 -214
  134. package/src/seo/integration/ssr.ts +307 -307
  135. package/src/seo/render/basic.ts +427 -427
  136. package/src/seo/render/index.ts +143 -143
  137. package/src/seo/render/jsonld.ts +539 -539
  138. package/src/seo/render/opengraph.ts +191 -191
  139. package/src/seo/render/robots.ts +116 -116
  140. package/src/seo/render/sitemap.ts +137 -137
  141. package/src/seo/render/twitter.ts +126 -126
  142. package/src/seo/resolve/index.ts +353 -353
  143. package/src/seo/resolve/opengraph.ts +143 -143
  144. package/src/seo/resolve/robots.ts +73 -73
  145. package/src/seo/resolve/title.ts +94 -94
  146. package/src/seo/resolve/twitter.ts +73 -73
  147. package/src/seo/resolve/url.ts +97 -97
  148. package/src/seo/routes/index.ts +290 -290
  149. package/src/seo/types.ts +575 -575
  150. package/src/slot/validator.ts +39 -39
  151. package/src/spec/index.ts +3 -3
  152. package/src/spec/load.ts +76 -76
  153. package/src/spec/lock.ts +56 -56
  154. package/src/utils/bun.ts +8 -8
  155. package/src/utils/lru-cache.ts +75 -75
  156. package/src/utils/safe-io.ts +188 -188
  157. package/src/utils/string-safe.ts +298 -298
@@ -199,15 +199,15 @@ export async function checkContractSlotConsistency(
199
199
  /**
200
200
  * Run all contract-related guard checks
201
201
  */
202
- export async function runContractGuardCheck(
203
- manifest: RoutesManifest,
204
- rootDir: string
205
- ): Promise<ContractViolation[]> {
206
- const violations: ContractViolation[] = [];
207
-
208
- // Check missing contracts (warning level)
209
- const missingContracts = await checkMissingContract(manifest, rootDir);
210
- violations.push(...missingContracts);
202
+ export async function runContractGuardCheck(
203
+ manifest: RoutesManifest,
204
+ rootDir: string
205
+ ): Promise<ContractViolation[]> {
206
+ const violations: ContractViolation[] = [];
207
+
208
+ // Check missing contracts (warning level)
209
+ const missingContracts = await checkMissingContract(manifest, rootDir);
210
+ violations.push(...missingContracts);
211
211
 
212
212
  // Check contract file exists
213
213
  const notFoundContracts = await checkContractFileExists(manifest, rootDir);
@@ -1,24 +1,24 @@
1
- import { describe, it, expect } from "vitest";
2
- import { validateFileAnalysis } from "./validator";
3
- import { fsdPreset } from "./presets/fsd";
4
- import type { FileAnalysis, GuardConfig } from "./types";
5
-
6
- describe("TypeScript-only rule", () => {
7
- const layers = fsdPreset.layers;
8
- const config: GuardConfig = {
9
- preset: "fsd",
10
- severity: { fileType: "error" },
11
- };
12
-
13
- it("should flag .jsx files", () => {
14
- const analysis: FileAnalysis = {
15
- filePath: "src/pages/home.jsx",
16
- layer: "pages",
17
- imports: [],
18
- analyzedAt: Date.now(),
19
- };
20
-
21
- const violations = validateFileAnalysis(analysis, layers, config);
22
- expect(violations.some((v) => v.type === "file-type")).toBe(true);
23
- });
24
- });
1
+ import { describe, it, expect } from "vitest";
2
+ import { validateFileAnalysis } from "./validator";
3
+ import { fsdPreset } from "./presets/fsd";
4
+ import type { FileAnalysis, GuardConfig } from "./types";
5
+
6
+ describe("TypeScript-only rule", () => {
7
+ const layers = fsdPreset.layers;
8
+ const config: GuardConfig = {
9
+ preset: "fsd",
10
+ severity: { fileType: "error" },
11
+ };
12
+
13
+ it("should flag .jsx files", () => {
14
+ const analysis: FileAnalysis = {
15
+ filePath: "src/pages/home.jsx",
16
+ layer: "pages",
17
+ imports: [],
18
+ analyzedAt: Date.now(),
19
+ };
20
+
21
+ const violations = validateFileAnalysis(analysis, layers, config);
22
+ expect(violations.some((v) => v.type === "file-type")).toBe(true);
23
+ });
24
+ });
@@ -1,70 +1,70 @@
1
- /**
2
- * Atomic Design Preset
3
- *
4
- * UI 컴포넌트 아키텍처
5
- *
6
- * @see https://bradfrost.com/blog/post/atomic-web-design/
7
- */
8
-
9
- import type { PresetDefinition } from "../types";
10
-
11
- /**
12
- * Atomic Design 레이어 계층 구조 (복잡 → 단순)
13
- */
14
- export const ATOMIC_HIERARCHY = [
15
- "pages",
16
- "templates",
17
- "organisms",
18
- "molecules",
19
- "atoms",
20
- ] as const;
21
-
22
- /**
23
- * Atomic Design 프리셋 정의
24
- */
25
- export const atomicPreset: PresetDefinition = {
26
- name: "atomic",
27
- description: "Atomic Design - UI 컴포넌트 아키텍처",
28
-
29
- hierarchy: [...ATOMIC_HIERARCHY],
30
-
31
- layers: [
32
- {
33
- name: "pages",
34
- pattern: "src/components/pages/**",
35
- canImport: ["templates", "organisms", "molecules", "atoms"],
36
- description: "페이지 컴포넌트 (특정 콘텐츠가 있는 템플릿)",
37
- },
38
- {
39
- name: "templates",
40
- pattern: "src/components/templates/**",
41
- canImport: ["organisms", "molecules", "atoms"],
42
- description: "페이지 템플릿 (레이아웃 구조)",
43
- },
44
- {
45
- name: "organisms",
46
- pattern: "src/components/organisms/**",
47
- canImport: ["molecules", "atoms"],
48
- description: "복잡한 UI 블록 (Header, Footer, Form)",
49
- },
50
- {
51
- name: "molecules",
52
- pattern: "src/components/molecules/**",
53
- canImport: ["atoms"],
54
- description: "조합된 컴포넌트 (SearchInput, Card)",
55
- },
56
- {
57
- name: "atoms",
58
- pattern: "src/components/atoms/**",
59
- canImport: [],
60
- description: "기본 요소 (Button, Input, Text)",
61
- },
62
- ],
63
-
64
- defaultSeverity: {
65
- layerViolation: "error",
66
- circularDependency: "warn",
67
- crossSliceDependency: "info",
68
- deepNesting: "info",
69
- },
70
- };
1
+ /**
2
+ * Atomic Design Preset
3
+ *
4
+ * UI 컴포넌트 아키텍처
5
+ *
6
+ * @see https://bradfrost.com/blog/post/atomic-web-design/
7
+ */
8
+
9
+ import type { PresetDefinition } from "../types";
10
+
11
+ /**
12
+ * Atomic Design 레이어 계층 구조 (복잡 → 단순)
13
+ */
14
+ export const ATOMIC_HIERARCHY = [
15
+ "pages",
16
+ "templates",
17
+ "organisms",
18
+ "molecules",
19
+ "atoms",
20
+ ] as const;
21
+
22
+ /**
23
+ * Atomic Design 프리셋 정의
24
+ */
25
+ export const atomicPreset: PresetDefinition = {
26
+ name: "atomic",
27
+ description: "Atomic Design - UI 컴포넌트 아키텍처",
28
+
29
+ hierarchy: [...ATOMIC_HIERARCHY],
30
+
31
+ layers: [
32
+ {
33
+ name: "pages",
34
+ pattern: "src/components/pages/**",
35
+ canImport: ["templates", "organisms", "molecules", "atoms"],
36
+ description: "페이지 컴포넌트 (특정 콘텐츠가 있는 템플릿)",
37
+ },
38
+ {
39
+ name: "templates",
40
+ pattern: "src/components/templates/**",
41
+ canImport: ["organisms", "molecules", "atoms"],
42
+ description: "페이지 템플릿 (레이아웃 구조)",
43
+ },
44
+ {
45
+ name: "organisms",
46
+ pattern: "src/components/organisms/**",
47
+ canImport: ["molecules", "atoms"],
48
+ description: "복잡한 UI 블록 (Header, Footer, Form)",
49
+ },
50
+ {
51
+ name: "molecules",
52
+ pattern: "src/components/molecules/**",
53
+ canImport: ["atoms"],
54
+ description: "조합된 컴포넌트 (SearchInput, Card)",
55
+ },
56
+ {
57
+ name: "atoms",
58
+ pattern: "src/components/atoms/**",
59
+ canImport: [],
60
+ description: "기본 요소 (Button, Input, Text)",
61
+ },
62
+ ],
63
+
64
+ defaultSeverity: {
65
+ layerViolation: "error",
66
+ circularDependency: "warn",
67
+ crossSliceDependency: "info",
68
+ deepNesting: "info",
69
+ },
70
+ };
@@ -1,77 +1,77 @@
1
- /**
2
- * Clean Architecture Preset
3
- *
4
- * 백엔드 권장 아키텍처
5
- */
6
-
7
- import type { PresetDefinition } from "../types";
8
-
9
- /**
10
- * Clean Architecture 레이어 계층 구조
11
- *
12
- * 의존성: 외부 → 내부 (domain이 핵심)
13
- */
14
- export const CLEAN_HIERARCHY = [
15
- "api",
16
- "infra",
17
- "application",
18
- "domain",
19
- "core",
20
- "shared",
21
- ] as const;
22
-
23
- /**
24
- * Clean Architecture 프리셋 정의
25
- */
26
- export const cleanPreset: PresetDefinition = {
27
- name: "clean",
28
- description: "Clean Architecture - 백엔드 권장 아키텍처",
29
-
30
- hierarchy: [...CLEAN_HIERARCHY],
31
-
32
- layers: [
33
- {
34
- name: "api",
35
- pattern: "src/**/api/**",
36
- canImport: ["application", "core", "shared"],
37
- description: "Controllers, Routes, DTOs",
38
- },
39
- {
40
- name: "infra",
41
- pattern: "src/**/infra/**",
42
- canImport: ["application", "domain", "core", "shared"],
43
- description: "Repositories 구현, 외부 API 클라이언트",
44
- },
45
- {
46
- name: "application",
47
- pattern: "src/**/application/**",
48
- canImport: ["domain", "core", "shared"],
49
- description: "Use Cases, Application Services",
50
- },
51
- {
52
- name: "domain",
53
- pattern: "src/**/domain/**",
54
- canImport: ["shared"],
55
- description: "Entities, Value Objects, Domain Services",
56
- },
57
- {
58
- name: "core",
59
- pattern: "src/core/**",
60
- canImport: ["shared"],
61
- description: "공통 핵심 (auth, config, errors)",
62
- },
63
- {
64
- name: "shared",
65
- pattern: "src/shared/**",
66
- canImport: [],
67
- description: "공유 유틸리티, 타입",
68
- },
69
- ],
70
-
71
- defaultSeverity: {
72
- layerViolation: "error",
73
- circularDependency: "error",
74
- crossSliceDependency: "warn",
75
- deepNesting: "info",
76
- },
77
- };
1
+ /**
2
+ * Clean Architecture Preset
3
+ *
4
+ * 백엔드 권장 아키텍처
5
+ */
6
+
7
+ import type { PresetDefinition } from "../types";
8
+
9
+ /**
10
+ * Clean Architecture 레이어 계층 구조
11
+ *
12
+ * 의존성: 외부 → 내부 (domain이 핵심)
13
+ */
14
+ export const CLEAN_HIERARCHY = [
15
+ "api",
16
+ "infra",
17
+ "application",
18
+ "domain",
19
+ "core",
20
+ "shared",
21
+ ] as const;
22
+
23
+ /**
24
+ * Clean Architecture 프리셋 정의
25
+ */
26
+ export const cleanPreset: PresetDefinition = {
27
+ name: "clean",
28
+ description: "Clean Architecture - 백엔드 권장 아키텍처",
29
+
30
+ hierarchy: [...CLEAN_HIERARCHY],
31
+
32
+ layers: [
33
+ {
34
+ name: "api",
35
+ pattern: "src/**/api/**",
36
+ canImport: ["application", "core", "shared"],
37
+ description: "Controllers, Routes, DTOs",
38
+ },
39
+ {
40
+ name: "infra",
41
+ pattern: "src/**/infra/**",
42
+ canImport: ["application", "domain", "core", "shared"],
43
+ description: "Repositories 구현, 외부 API 클라이언트",
44
+ },
45
+ {
46
+ name: "application",
47
+ pattern: "src/**/application/**",
48
+ canImport: ["domain", "core", "shared"],
49
+ description: "Use Cases, Application Services",
50
+ },
51
+ {
52
+ name: "domain",
53
+ pattern: "src/**/domain/**",
54
+ canImport: ["shared"],
55
+ description: "Entities, Value Objects, Domain Services",
56
+ },
57
+ {
58
+ name: "core",
59
+ pattern: "src/core/**",
60
+ canImport: ["shared"],
61
+ description: "공통 핵심 (auth, config, errors)",
62
+ },
63
+ {
64
+ name: "shared",
65
+ pattern: "src/shared/**",
66
+ canImport: [],
67
+ description: "공유 유틸리티, 타입",
68
+ },
69
+ ],
70
+
71
+ defaultSeverity: {
72
+ layerViolation: "error",
73
+ circularDependency: "error",
74
+ crossSliceDependency: "warn",
75
+ deepNesting: "info",
76
+ },
77
+ };
@@ -1,79 +1,79 @@
1
- /**
2
- * FSD (Feature-Sliced Design) Preset
3
- *
4
- * 프론트엔드 권장 아키텍처
5
- *
6
- * @see https://feature-sliced.design/
7
- */
8
-
9
- import type { PresetDefinition } from "../types";
10
-
11
- /**
12
- * FSD 레이어 계층 구조 (상위 → 하위)
13
- *
14
- * app → pages → widgets → features → entities → shared
15
- */
16
- export const FSD_HIERARCHY = [
17
- "app",
18
- "pages",
19
- "widgets",
20
- "features",
21
- "entities",
22
- "shared",
23
- ] as const;
24
-
25
- /**
26
- * FSD 프리셋 정의
27
- */
28
- export const fsdPreset: PresetDefinition = {
29
- name: "fsd",
30
- description: "Feature-Sliced Design - 프론트엔드 권장 아키텍처",
31
-
32
- hierarchy: [...FSD_HIERARCHY],
33
-
34
- layers: [
35
- {
36
- name: "app",
37
- pattern: "src/app/**",
38
- canImport: ["pages", "widgets", "features", "entities", "shared"],
39
- description: "앱 진입점, 프로바이더, 글로벌 스타일",
40
- },
41
- {
42
- name: "pages",
43
- pattern: "src/pages/**",
44
- canImport: ["widgets", "features", "entities", "shared"],
45
- description: "페이지 컴포넌트, 라우팅",
46
- },
47
- {
48
- name: "widgets",
49
- pattern: "src/widgets/**",
50
- canImport: ["features", "entities", "shared"],
51
- description: "독립적인 UI 블록 (Header, Sidebar 등)",
52
- },
53
- {
54
- name: "features",
55
- pattern: "src/features/**",
56
- canImport: ["entities", "shared"],
57
- description: "비즈니스 기능 (로그인, 결제 등)",
58
- },
59
- {
60
- name: "entities",
61
- pattern: "src/entities/**",
62
- canImport: ["shared"],
63
- description: "비즈니스 엔티티 (User, Product 등)",
64
- },
65
- {
66
- name: "shared",
67
- pattern: "src/shared/**",
68
- canImport: [],
69
- description: "공유 유틸, UI 컴포넌트, 라이브러리",
70
- },
71
- ],
72
-
73
- defaultSeverity: {
74
- layerViolation: "error",
75
- circularDependency: "warn",
76
- crossSliceDependency: "warn",
77
- deepNesting: "info",
78
- },
79
- };
1
+ /**
2
+ * FSD (Feature-Sliced Design) Preset
3
+ *
4
+ * 프론트엔드 권장 아키텍처
5
+ *
6
+ * @see https://feature-sliced.design/
7
+ */
8
+
9
+ import type { PresetDefinition } from "../types";
10
+
11
+ /**
12
+ * FSD 레이어 계층 구조 (상위 → 하위)
13
+ *
14
+ * app → pages → widgets → features → entities → shared
15
+ */
16
+ export const FSD_HIERARCHY = [
17
+ "app",
18
+ "pages",
19
+ "widgets",
20
+ "features",
21
+ "entities",
22
+ "shared",
23
+ ] as const;
24
+
25
+ /**
26
+ * FSD 프리셋 정의
27
+ */
28
+ export const fsdPreset: PresetDefinition = {
29
+ name: "fsd",
30
+ description: "Feature-Sliced Design - 프론트엔드 권장 아키텍처",
31
+
32
+ hierarchy: [...FSD_HIERARCHY],
33
+
34
+ layers: [
35
+ {
36
+ name: "app",
37
+ pattern: "src/app/**",
38
+ canImport: ["pages", "widgets", "features", "entities", "shared"],
39
+ description: "앱 진입점, 프로바이더, 글로벌 스타일",
40
+ },
41
+ {
42
+ name: "pages",
43
+ pattern: "src/pages/**",
44
+ canImport: ["widgets", "features", "entities", "shared"],
45
+ description: "페이지 컴포넌트, 라우팅",
46
+ },
47
+ {
48
+ name: "widgets",
49
+ pattern: "src/widgets/**",
50
+ canImport: ["features", "entities", "shared"],
51
+ description: "독립적인 UI 블록 (Header, Sidebar 등)",
52
+ },
53
+ {
54
+ name: "features",
55
+ pattern: "src/features/**",
56
+ canImport: ["entities", "shared"],
57
+ description: "비즈니스 기능 (로그인, 결제 등)",
58
+ },
59
+ {
60
+ name: "entities",
61
+ pattern: "src/entities/**",
62
+ canImport: ["shared"],
63
+ description: "비즈니스 엔티티 (User, Product 등)",
64
+ },
65
+ {
66
+ name: "shared",
67
+ pattern: "src/shared/**",
68
+ canImport: [],
69
+ description: "공유 유틸, UI 컴포넌트, 라이브러리",
70
+ },
71
+ ],
72
+
73
+ defaultSeverity: {
74
+ layerViolation: "error",
75
+ circularDependency: "warn",
76
+ crossSliceDependency: "warn",
77
+ deepNesting: "info",
78
+ },
79
+ };
@@ -1,68 +1,68 @@
1
- /**
2
- * Hexagonal Architecture Preset
3
- *
4
- * 포트와 어댑터 패턴
5
- */
6
-
7
- import type { PresetDefinition } from "../types";
8
-
9
- /**
10
- * Hexagonal Architecture 레이어 계층 구조
11
- */
12
- export const HEXAGONAL_HIERARCHY = [
13
- "adapters/in",
14
- "adapters/out",
15
- "application",
16
- "ports",
17
- "domain",
18
- ] as const;
19
-
20
- /**
21
- * Hexagonal Architecture 프리셋 정의
22
- */
23
- export const hexagonalPreset: PresetDefinition = {
24
- name: "hexagonal",
25
- description: "Hexagonal Architecture - 포트와 어댑터 패턴",
26
-
27
- hierarchy: [...HEXAGONAL_HIERARCHY],
28
-
29
- layers: [
30
- {
31
- name: "adapters/in",
32
- pattern: "src/adapters/in/**",
33
- canImport: ["application", "ports"],
34
- description: "Driving Adapters (Controllers, CLI, GraphQL)",
35
- },
36
- {
37
- name: "adapters/out",
38
- pattern: "src/adapters/out/**",
39
- canImport: ["application", "ports"],
40
- description: "Driven Adapters (Repositories, External APIs)",
41
- },
42
- {
43
- name: "application",
44
- pattern: "src/application/**",
45
- canImport: ["domain", "ports"],
46
- description: "Use Cases, Application Services",
47
- },
48
- {
49
- name: "ports",
50
- pattern: "src/ports/**",
51
- canImport: ["domain"],
52
- description: "Port Interfaces (입출력 계약)",
53
- },
54
- {
55
- name: "domain",
56
- pattern: "src/domain/**",
57
- canImport: [],
58
- description: "Pure Business Logic (외부 의존 없음)",
59
- },
60
- ],
61
-
62
- defaultSeverity: {
63
- layerViolation: "error",
64
- circularDependency: "error",
65
- crossSliceDependency: "warn",
66
- deepNesting: "info",
67
- },
68
- };
1
+ /**
2
+ * Hexagonal Architecture Preset
3
+ *
4
+ * 포트와 어댑터 패턴
5
+ */
6
+
7
+ import type { PresetDefinition } from "../types";
8
+
9
+ /**
10
+ * Hexagonal Architecture 레이어 계층 구조
11
+ */
12
+ export const HEXAGONAL_HIERARCHY = [
13
+ "adapters/in",
14
+ "adapters/out",
15
+ "application",
16
+ "ports",
17
+ "domain",
18
+ ] as const;
19
+
20
+ /**
21
+ * Hexagonal Architecture 프리셋 정의
22
+ */
23
+ export const hexagonalPreset: PresetDefinition = {
24
+ name: "hexagonal",
25
+ description: "Hexagonal Architecture - 포트와 어댑터 패턴",
26
+
27
+ hierarchy: [...HEXAGONAL_HIERARCHY],
28
+
29
+ layers: [
30
+ {
31
+ name: "adapters/in",
32
+ pattern: "src/adapters/in/**",
33
+ canImport: ["application", "ports"],
34
+ description: "Driving Adapters (Controllers, CLI, GraphQL)",
35
+ },
36
+ {
37
+ name: "adapters/out",
38
+ pattern: "src/adapters/out/**",
39
+ canImport: ["application", "ports"],
40
+ description: "Driven Adapters (Repositories, External APIs)",
41
+ },
42
+ {
43
+ name: "application",
44
+ pattern: "src/application/**",
45
+ canImport: ["domain", "ports"],
46
+ description: "Use Cases, Application Services",
47
+ },
48
+ {
49
+ name: "ports",
50
+ pattern: "src/ports/**",
51
+ canImport: ["domain"],
52
+ description: "Port Interfaces (입출력 계약)",
53
+ },
54
+ {
55
+ name: "domain",
56
+ pattern: "src/domain/**",
57
+ canImport: [],
58
+ description: "Pure Business Logic (외부 의존 없음)",
59
+ },
60
+ ],
61
+
62
+ defaultSeverity: {
63
+ layerViolation: "error",
64
+ circularDependency: "error",
65
+ crossSliceDependency: "warn",
66
+ deepNesting: "info",
67
+ },
68
+ };