@tienne/gestalt 0.88.0 → 0.89.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/CLAUDE.md +6 -2
- package/README.ko.md +2 -1
- package/README.md +3 -1
- package/dist/package.json +2 -1
- package/dist/plugin/skills/_shared/proactive-routing.md +1 -0
- package/dist/plugin/skills/architecture/SKILL.md +913 -0
- package/dist/schemas/architecture-ir.schema.json +596 -0
- package/dist/src/architecture/canvas-geometry.d.ts +40 -0
- package/dist/src/architecture/canvas-geometry.d.ts.map +1 -0
- package/dist/src/architecture/canvas-geometry.js +212 -0
- package/dist/src/architecture/canvas-geometry.js.map +1 -0
- package/dist/src/architecture/codeowners.d.ts +16 -0
- package/dist/src/architecture/codeowners.d.ts.map +1 -0
- package/dist/src/architecture/codeowners.js +58 -0
- package/dist/src/architecture/codeowners.js.map +1 -0
- package/dist/src/architecture/compare-layout.d.ts +27 -0
- package/dist/src/architecture/compare-layout.d.ts.map +1 -0
- package/dist/src/architecture/compare-layout.js +72 -0
- package/dist/src/architecture/compare-layout.js.map +1 -0
- package/dist/src/architecture/dataflow-layout.d.ts +29 -0
- package/dist/src/architecture/dataflow-layout.d.ts.map +1 -0
- package/dist/src/architecture/dataflow-layout.js +229 -0
- package/dist/src/architecture/dataflow-layout.js.map +1 -0
- package/dist/src/architecture/doc-fresh.d.ts +31 -0
- package/dist/src/architecture/doc-fresh.d.ts.map +1 -0
- package/dist/src/architecture/doc-fresh.js +84 -0
- package/dist/src/architecture/doc-fresh.js.map +1 -0
- package/dist/src/architecture/doc-link.d.ts +84 -0
- package/dist/src/architecture/doc-link.d.ts.map +1 -0
- package/dist/src/architecture/doc-link.js +396 -0
- package/dist/src/architecture/doc-link.js.map +1 -0
- package/dist/src/architecture/doc-routes.d.ts +39 -0
- package/dist/src/architecture/doc-routes.d.ts.map +1 -0
- package/dist/src/architecture/doc-routes.js +123 -0
- package/dist/src/architecture/doc-routes.js.map +1 -0
- package/dist/src/architecture/doc-scan.d.ts +107 -0
- package/dist/src/architecture/doc-scan.d.ts.map +1 -0
- package/dist/src/architecture/doc-scan.js +617 -0
- package/dist/src/architecture/doc-scan.js.map +1 -0
- package/dist/src/architecture/doc-stale.d.ts +32 -0
- package/dist/src/architecture/doc-stale.d.ts.map +1 -0
- package/dist/src/architecture/doc-stale.js +60 -0
- package/dist/src/architecture/doc-stale.js.map +1 -0
- package/dist/src/architecture/drilldown.d.ts +51 -0
- package/dist/src/architecture/drilldown.d.ts.map +1 -0
- package/dist/src/architecture/drilldown.js +1160 -0
- package/dist/src/architecture/drilldown.js.map +1 -0
- package/dist/src/architecture/endpoint-match.d.ts +43 -0
- package/dist/src/architecture/endpoint-match.d.ts.map +1 -0
- package/dist/src/architecture/endpoint-match.js +133 -0
- package/dist/src/architecture/endpoint-match.js.map +1 -0
- package/dist/src/architecture/flow-layout.d.ts +79 -0
- package/dist/src/architecture/flow-layout.d.ts.map +1 -0
- package/dist/src/architecture/flow-layout.js +519 -0
- package/dist/src/architecture/flow-layout.js.map +1 -0
- package/dist/src/architecture/focus.d.ts +14 -0
- package/dist/src/architecture/focus.d.ts.map +1 -0
- package/dist/src/architecture/focus.js +107 -0
- package/dist/src/architecture/focus.js.map +1 -0
- package/dist/src/architecture/global-context.d.ts +23 -0
- package/dist/src/architecture/global-context.d.ts.map +1 -0
- package/dist/src/architecture/global-context.js +67 -0
- package/dist/src/architecture/global-context.js.map +1 -0
- package/dist/src/architecture/html-client.d.ts +35 -0
- package/dist/src/architecture/html-client.d.ts.map +1 -0
- package/dist/src/architecture/html-client.js +1852 -0
- package/dist/src/architecture/html-client.js.map +1 -0
- package/dist/src/architecture/html-renderer.d.ts +22 -0
- package/dist/src/architecture/html-renderer.d.ts.map +1 -0
- package/dist/src/architecture/html-renderer.js +1290 -0
- package/dist/src/architecture/html-renderer.js.map +1 -0
- package/dist/src/architecture/html-theme.d.ts +25 -0
- package/dist/src/architecture/html-theme.d.ts.map +1 -0
- package/dist/src/architecture/html-theme.js +681 -0
- package/dist/src/architecture/html-theme.js.map +1 -0
- package/dist/src/architecture/index.d.ts +9 -0
- package/dist/src/architecture/index.d.ts.map +1 -0
- package/dist/src/architecture/index.js +9 -0
- package/dist/src/architecture/index.js.map +1 -0
- package/dist/src/architecture/ir-schema.d.ts +1832 -0
- package/dist/src/architecture/ir-schema.d.ts.map +1 -0
- package/dist/src/architecture/ir-schema.js +343 -0
- package/dist/src/architecture/ir-schema.js.map +1 -0
- package/dist/src/architecture/kind-text.d.ts +21 -0
- package/dist/src/architecture/kind-text.d.ts.map +1 -0
- package/dist/src/architecture/kind-text.js +42 -0
- package/dist/src/architecture/kind-text.js.map +1 -0
- package/dist/src/architecture/layout.d.ts +227 -0
- package/dist/src/architecture/layout.d.ts.map +1 -0
- package/dist/src/architecture/layout.js +627 -0
- package/dist/src/architecture/layout.js.map +1 -0
- package/dist/src/architecture/mcp-tool-match.d.ts +49 -0
- package/dist/src/architecture/mcp-tool-match.d.ts.map +1 -0
- package/dist/src/architecture/mcp-tool-match.js +53 -0
- package/dist/src/architecture/mcp-tool-match.js.map +1 -0
- package/dist/src/architecture/merge.d.ts +54 -0
- package/dist/src/architecture/merge.d.ts.map +1 -0
- package/dist/src/architecture/merge.js +681 -0
- package/dist/src/architecture/merge.js.map +1 -0
- package/dist/src/architecture/micro-app.d.ts +20 -0
- package/dist/src/architecture/micro-app.d.ts.map +1 -0
- package/dist/src/architecture/micro-app.js +41 -0
- package/dist/src/architecture/micro-app.js.map +1 -0
- package/dist/src/architecture/name-ref-match.d.ts +43 -0
- package/dist/src/architecture/name-ref-match.d.ts.map +1 -0
- package/dist/src/architecture/name-ref-match.js +127 -0
- package/dist/src/architecture/name-ref-match.js.map +1 -0
- package/dist/src/architecture/packs/data.d.ts +109 -0
- package/dist/src/architecture/packs/data.d.ts.map +1 -0
- package/dist/src/architecture/packs/data.js +64 -0
- package/dist/src/architecture/packs/data.js.map +1 -0
- package/dist/src/architecture/packs/generic.d.ts +47 -0
- package/dist/src/architecture/packs/generic.d.ts.map +1 -0
- package/dist/src/architecture/packs/generic.js +35 -0
- package/dist/src/architecture/packs/generic.js.map +1 -0
- package/dist/src/architecture/packs/harness.d.ts +96 -0
- package/dist/src/architecture/packs/harness.d.ts.map +1 -0
- package/dist/src/architecture/packs/harness.js +66 -0
- package/dist/src/architecture/packs/harness.js.map +1 -0
- package/dist/src/architecture/packs/index.d.ts +840 -0
- package/dist/src/architecture/packs/index.d.ts.map +1 -0
- package/dist/src/architecture/packs/index.js +87 -0
- package/dist/src/architecture/packs/index.js.map +1 -0
- package/dist/src/architecture/packs/infra.d.ts +91 -0
- package/dist/src/architecture/packs/infra.d.ts.map +1 -0
- package/dist/src/architecture/packs/infra.js +57 -0
- package/dist/src/architecture/packs/infra.js.map +1 -0
- package/dist/src/architecture/packs/knowledge.d.ts +72 -0
- package/dist/src/architecture/packs/knowledge.d.ts.map +1 -0
- package/dist/src/architecture/packs/knowledge.js +58 -0
- package/dist/src/architecture/packs/knowledge.js.map +1 -0
- package/dist/src/architecture/packs/process.d.ts +87 -0
- package/dist/src/architecture/packs/process.d.ts.map +1 -0
- package/dist/src/architecture/packs/process.js +52 -0
- package/dist/src/architecture/packs/process.js.map +1 -0
- package/dist/src/architecture/packs/render-classes.d.ts +11 -0
- package/dist/src/architecture/packs/render-classes.d.ts.map +1 -0
- package/dist/src/architecture/packs/render-classes.js +92 -0
- package/dist/src/architecture/packs/render-classes.js.map +1 -0
- package/dist/src/architecture/packs/types.d.ts +66 -0
- package/dist/src/architecture/packs/types.d.ts.map +1 -0
- package/dist/src/architecture/packs/types.js +18 -0
- package/dist/src/architecture/packs/types.js.map +1 -0
- package/dist/src/architecture/packs/web-product.d.ts +348 -0
- package/dist/src/architecture/packs/web-product.d.ts.map +1 -0
- package/dist/src/architecture/packs/web-product.js +226 -0
- package/dist/src/architecture/packs/web-product.js.map +1 -0
- package/dist/src/architecture/sequence-layout.d.ts +50 -0
- package/dist/src/architecture/sequence-layout.d.ts.map +1 -0
- package/dist/src/architecture/sequence-layout.js +140 -0
- package/dist/src/architecture/sequence-layout.js.map +1 -0
- package/dist/src/architecture/service-facts.d.ts +30 -0
- package/dist/src/architecture/service-facts.d.ts.map +1 -0
- package/dist/src/architecture/service-facts.js +88 -0
- package/dist/src/architecture/service-facts.js.map +1 -0
- package/dist/src/architecture/store.d.ts +50 -0
- package/dist/src/architecture/store.d.ts.map +1 -0
- package/dist/src/architecture/store.js +320 -0
- package/dist/src/architecture/store.js.map +1 -0
- package/dist/src/architecture/types.d.ts +400 -0
- package/dist/src/architecture/types.d.ts.map +1 -0
- package/dist/src/architecture/types.js +75 -0
- package/dist/src/architecture/types.js.map +1 -0
- package/dist/src/architecture/validator.d.ts +65 -0
- package/dist/src/architecture/validator.d.ts.map +1 -0
- package/dist/src/architecture/validator.js +1249 -0
- package/dist/src/architecture/validator.js.map +1 -0
- package/dist/src/core/errors.d.ts +4 -0
- package/dist/src/core/errors.d.ts.map +1 -1
- package/dist/src/core/errors.js +8 -0
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +317 -0
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +151 -0
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +7 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/architecture-passthrough.d.ts +9 -0
- package/dist/src/mcp/tools/architecture-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/architecture-passthrough.js +587 -0
- package/dist/src/mcp/tools/architecture-passthrough.js.map +1 -0
- package/dist/src/utils/claude-projects.d.ts +19 -0
- package/dist/src/utils/claude-projects.d.ts.map +1 -0
- package/dist/src/utils/claude-projects.js +157 -0
- package/dist/src/utils/claude-projects.js.map +1 -0
- package/dist/src/utils/read-only-tools.d.ts +19 -0
- package/dist/src/utils/read-only-tools.d.ts.map +1 -0
- package/dist/src/utils/read-only-tools.js +132 -0
- package/dist/src/utils/read-only-tools.js.map +1 -0
- package/package.json +2 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/mcp.json +1 -1
- package/plugin/skills/_shared/proactive-routing.md +1 -0
- package/plugin/skills/architecture/SKILL.md +913 -0
- package/schemas/architecture-ir.schema.json +596 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 웹 제품. 화면에서 API, 서버, DB로 가는 요청 길과 그 서빙 인프라, 배포 경로를 그린다.
|
|
3
|
+
* 색은 밝은 화면이 600 톤, 어두운 화면이 400 톤이다. 같은 색상환 자리라 테마를 바꿔도 같은 종류로 읽힌다.
|
|
4
|
+
* 열 순위는 두 뷰의 kind가 겹치지 않아 표 하나로 둘 다 덮는다. 뷰①은 service→feature→screen→gateway→endpoint→module→클라이언트→테이블,
|
|
5
|
+
* 뷰②는 workflow→build→artifact→배포처 순서로 왼쪽부터 놓인다. 인프라는 배포 경로에서 산출물이 떨어지는 버킷부터 CDN, 도메인 순으로
|
|
6
|
+
* 오른쪽에 붙는다. 요청 방향(도메인→CDN→버킷)과 반대라 그 선은 거꾸로 그린다
|
|
7
|
+
*/
|
|
8
|
+
export const WEB_PRODUCT_PACK = {
|
|
9
|
+
id: 'web-product',
|
|
10
|
+
title: '웹 제품',
|
|
11
|
+
description: '화면, API, 서버, 저장소와 서빙 인프라, 배포 경로',
|
|
12
|
+
drilldown: 'web-product',
|
|
13
|
+
matchers: ['http-endpoint'],
|
|
14
|
+
nodeKinds: {
|
|
15
|
+
// service는 웹과 앱을 함께 담으므로 "서비스"로 쓰고 어느 쪽인지는 플랫폼 칩이 따로 알린다
|
|
16
|
+
service: {
|
|
17
|
+
renderClass: 'service',
|
|
18
|
+
short: '서비스',
|
|
19
|
+
text: '서비스',
|
|
20
|
+
color: { light: '#2563eb', dark: '#60a5fa' },
|
|
21
|
+
icon: '<path d="M12 3.5l8.5 4.3L12 12 3.5 7.8z"/><path d="M3.5 12.2L12 16.5l8.5-4.3"/><path d="M3.5 16.4L12 20.7l8.5-4.3"/>',
|
|
22
|
+
lane: 'screen',
|
|
23
|
+
rank: 0,
|
|
24
|
+
},
|
|
25
|
+
micro_app: {
|
|
26
|
+
renderClass: 'client',
|
|
27
|
+
// 호스트 카드는 렌더러가 '호스트'로 바꿔 단다. 두 글자 폭이 같아야 카드 폭 계산이 하나로 맞는다
|
|
28
|
+
short: '리모트',
|
|
29
|
+
text: '마이크로 프론트엔드 앱',
|
|
30
|
+
color: { light: '#0369a1', dark: '#7dd3fc' },
|
|
31
|
+
icon: '<rect x="3.5" y="3.5" width="7" height="7" rx="1.5"/><rect x="13.5" y="3.5" width="7" height="7" rx="1.5"/><rect x="3.5" y="13.5" width="7" height="7" rx="1.5"/><path d="M17 13.5v7M13.5 17h7"/>',
|
|
32
|
+
lane: 'screen',
|
|
33
|
+
rank: 0,
|
|
34
|
+
// Module Federation 같은 마이크로 프론트엔드의 호스트나 리모트다. 서비스가 그 묶음이고 기능 영역과 화면은 페이지 코드가 있는 앱 밑에 둔다
|
|
35
|
+
parents: ['service'],
|
|
36
|
+
},
|
|
37
|
+
feature: {
|
|
38
|
+
renderClass: 'client',
|
|
39
|
+
short: '기능 영역',
|
|
40
|
+
text: '기능 영역',
|
|
41
|
+
color: { light: '#0891b2', dark: '#22d3ee' },
|
|
42
|
+
icon: '<path d="M3.5 7.5a2 2 0 0 1 2-2h3.6l2 2.2h7.4a2 2 0 0 1 2 2v7.8a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2z"/>',
|
|
43
|
+
lane: 'screen',
|
|
44
|
+
rank: 0,
|
|
45
|
+
parents: ['micro_app', 'service'],
|
|
46
|
+
},
|
|
47
|
+
screen: {
|
|
48
|
+
renderClass: 'client',
|
|
49
|
+
short: '화면',
|
|
50
|
+
text: '화면',
|
|
51
|
+
color: { light: '#4f46e5', dark: '#818cf8' },
|
|
52
|
+
icon: '<rect x="3" y="4.5" width="18" height="15" rx="2.5"/><path d="M3 9h18"/><path d="M6.5 6.8h.01M9 6.8h.01"/>',
|
|
53
|
+
lane: 'screen',
|
|
54
|
+
rank: 0,
|
|
55
|
+
parents: ['feature', 'micro_app', 'service'],
|
|
56
|
+
},
|
|
57
|
+
gateway: {
|
|
58
|
+
renderClass: 'gateway',
|
|
59
|
+
short: '게이트웨이',
|
|
60
|
+
text: '게이트웨이',
|
|
61
|
+
color: { light: '#475569', dark: '#94a3b8' },
|
|
62
|
+
icon: '<path d="M12 3l7.5 3v5.5c0 4.4-3.1 8-7.5 9.5-4.4-1.5-7.5-5.1-7.5-9.5V6z"/>',
|
|
63
|
+
lane: 'gateway',
|
|
64
|
+
rank: 1,
|
|
65
|
+
},
|
|
66
|
+
endpoint: {
|
|
67
|
+
renderClass: 'service',
|
|
68
|
+
short: 'API',
|
|
69
|
+
text: 'API',
|
|
70
|
+
color: { light: '#059669', dark: '#34d399' },
|
|
71
|
+
icon: '<path d="M8.5 7.5L4 12l4.5 4.5M15.5 7.5L20 12l-4.5 4.5M13.5 5.5l-3 13"/>',
|
|
72
|
+
lane: 'endpoint',
|
|
73
|
+
rank: 2,
|
|
74
|
+
// MCP 도구만 받는다. 스킬 없이 클라이언트가 바로 부르는 도구가 어느 서버 패키지 것인지 적는 자리다
|
|
75
|
+
parents: ['service'],
|
|
76
|
+
},
|
|
77
|
+
app_module: {
|
|
78
|
+
renderClass: 'service',
|
|
79
|
+
short: '서버',
|
|
80
|
+
text: '서버',
|
|
81
|
+
color: { light: '#7c3aed', dark: '#a78bfa' },
|
|
82
|
+
icon: '<rect x="3.5" y="4" width="17" height="7" rx="1.8"/><rect x="3.5" y="13" width="17" height="7" rx="1.8"/><path d="M7 7.5h.01M7 16.5h.01M11 7.5h6M11 16.5h6"/>',
|
|
83
|
+
lane: 'app_module',
|
|
84
|
+
rank: 3,
|
|
85
|
+
},
|
|
86
|
+
external_service: {
|
|
87
|
+
renderClass: 'external',
|
|
88
|
+
short: '클라이언트',
|
|
89
|
+
text: '호출 클라이언트',
|
|
90
|
+
color: { light: '#d97706', dark: '#fbbf24' },
|
|
91
|
+
icon: '<path d="M9 3v4.5M15 3v4.5"/><path d="M6.5 7.5h11v3.5a5.5 5.5 0 0 1-11 0z"/><path d="M12 16.5V21"/>',
|
|
92
|
+
lane: 'external_service',
|
|
93
|
+
rank: 4,
|
|
94
|
+
},
|
|
95
|
+
db_table: {
|
|
96
|
+
renderClass: 'store',
|
|
97
|
+
short: 'DB',
|
|
98
|
+
text: '테이블',
|
|
99
|
+
color: { light: '#dc2626', dark: '#f87171' },
|
|
100
|
+
icon: '<ellipse cx="12" cy="5.5" rx="7.5" ry="2.8"/><path d="M4.5 5.5v13c0 1.5 3.4 2.8 7.5 2.8s7.5-1.3 7.5-2.8v-13"/><path d="M4.5 12c0 1.5 3.4 2.8 7.5 2.8s7.5-1.3 7.5-2.8"/>',
|
|
101
|
+
lane: 'db_table',
|
|
102
|
+
rank: 5,
|
|
103
|
+
parents: ['datastore'],
|
|
104
|
+
},
|
|
105
|
+
datastore: {
|
|
106
|
+
renderClass: 'store',
|
|
107
|
+
short: '저장소',
|
|
108
|
+
text: '저장소 클러스터',
|
|
109
|
+
color: { light: '#be123c', dark: '#fb7185' },
|
|
110
|
+
icon: '<ellipse cx="12" cy="5" rx="7.5" ry="2.5"/><path d="M4.5 5v4.5c0 1.4 3.4 2.5 7.5 2.5s7.5-1.1 7.5-2.5V5"/><path d="M4.5 9.5V14c0 1.4 3.4 2.5 7.5 2.5s7.5-1.1 7.5-2.5V9.5"/><path d="M4.5 14v4.5c0 1.4 3.4 2.5 7.5 2.5s7.5-1.1 7.5-2.5V14"/>',
|
|
111
|
+
// 클러스터는 테이블과 같은 rank라 같은 레인에 둔다
|
|
112
|
+
lane: 'db_table',
|
|
113
|
+
rank: 5,
|
|
114
|
+
},
|
|
115
|
+
workflow: {
|
|
116
|
+
renderClass: 'step',
|
|
117
|
+
short: '트리거',
|
|
118
|
+
text: '워크플로',
|
|
119
|
+
color: { light: '#0284c7', dark: '#38bdf8' },
|
|
120
|
+
icon: '<path d="M13 2.5L4.5 13.5H11l-1 8 8.5-11H12z"/>',
|
|
121
|
+
lane: 'workflow',
|
|
122
|
+
rank: 0,
|
|
123
|
+
},
|
|
124
|
+
build: {
|
|
125
|
+
renderClass: 'step',
|
|
126
|
+
short: '빌드',
|
|
127
|
+
text: '빌드',
|
|
128
|
+
color: { light: '#0d9488', dark: '#2dd4bf' },
|
|
129
|
+
icon: '<path d="M14.5 6.2a4 4 0 0 0-5.3 5.3L3.5 17.2l3.3 3.3 5.7-5.7a4 4 0 0 0 5.3-5.3l-2.6 2.6-2.5-.2-.2-2.5z"/>',
|
|
130
|
+
lane: 'build',
|
|
131
|
+
rank: 1,
|
|
132
|
+
},
|
|
133
|
+
artifact: {
|
|
134
|
+
renderClass: 'document',
|
|
135
|
+
short: '산출물',
|
|
136
|
+
text: '산출물',
|
|
137
|
+
color: { light: '#9333ea', dark: '#c084fc' },
|
|
138
|
+
icon: '<path d="M12 2.8l8.5 4.7v9L12 21.2l-8.5-4.7v-9z"/><path d="M3.5 7.5L12 12l8.5-4.5M12 12v9.2"/>',
|
|
139
|
+
lane: 'artifact',
|
|
140
|
+
rank: 2,
|
|
141
|
+
},
|
|
142
|
+
deploy_target: {
|
|
143
|
+
renderClass: 'infra',
|
|
144
|
+
short: '배포 대상',
|
|
145
|
+
text: '배포 대상',
|
|
146
|
+
color: { light: '#ea580c', dark: '#fb923c' },
|
|
147
|
+
icon: '<path d="M7 18.5a4.5 4.5 0 0 1-.7-8.95A6 6 0 0 1 17.8 8.6a4.95 4.95 0 0 1-.8 9.9z"/><path d="M12 11v5M9.8 13.2L12 11l2.2 2.2"/>',
|
|
148
|
+
lane: 'deploy_target',
|
|
149
|
+
rank: 3,
|
|
150
|
+
},
|
|
151
|
+
domain: {
|
|
152
|
+
renderClass: 'infra',
|
|
153
|
+
short: '도메인',
|
|
154
|
+
text: '도메인',
|
|
155
|
+
color: { light: '#db2777', dark: '#f472b6' },
|
|
156
|
+
icon: '<path d="M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1"/><path d="M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1"/>',
|
|
157
|
+
lane: 'domain',
|
|
158
|
+
rank: 6,
|
|
159
|
+
},
|
|
160
|
+
cdn: {
|
|
161
|
+
renderClass: 'infra',
|
|
162
|
+
short: 'CDN',
|
|
163
|
+
text: 'CDN 배포',
|
|
164
|
+
color: { light: '#4338ca', dark: '#a5b4fc' },
|
|
165
|
+
icon: '<circle cx="12" cy="12" r="8.5"/><path d="M3.5 12h17M12 3.5c2.5 2.6 3.5 5.4 3.5 8.5s-1 5.9-3.5 8.5c-2.5-2.6-3.5-5.4-3.5-8.5s1-5.9 3.5-8.5z"/>',
|
|
166
|
+
lane: 'cdn',
|
|
167
|
+
rank: 5,
|
|
168
|
+
},
|
|
169
|
+
bucket: {
|
|
170
|
+
renderClass: 'store',
|
|
171
|
+
short: '버킷',
|
|
172
|
+
text: '스토리지 버킷',
|
|
173
|
+
color: { light: '#16a34a', dark: '#4ade80' },
|
|
174
|
+
icon: '<ellipse cx="12" cy="6.5" rx="8" ry="2.5"/><path d="M4 6.5l2 13a2 2 0 0 0 2 1.5h8a2 2 0 0 0 2-1.5l2-13"/>',
|
|
175
|
+
lane: 'bucket',
|
|
176
|
+
rank: 4,
|
|
177
|
+
},
|
|
178
|
+
cloud_account: {
|
|
179
|
+
renderClass: 'infra',
|
|
180
|
+
short: '계정',
|
|
181
|
+
text: '클라우드 계정',
|
|
182
|
+
color: { light: '#57534e', dark: '#a8a29e' },
|
|
183
|
+
icon: '<rect x="3.5" y="5" width="17" height="14" rx="2.5"/><circle cx="9" cy="11" r="2.2"/><path d="M5.8 16.2a3.5 3.5 0 0 1 6.4 0M14.5 10h3M14.5 13.5h3"/>',
|
|
184
|
+
lane: 'cloud_account',
|
|
185
|
+
rank: 7,
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
lanes: {
|
|
189
|
+
service: { title: '서비스', stacked: true },
|
|
190
|
+
host: { title: '호스트', stacked: true },
|
|
191
|
+
remote: { title: '리모트', stacked: true },
|
|
192
|
+
unit: { title: '기능 영역', stacked: true },
|
|
193
|
+
screen: { title: '화면', stacked: true },
|
|
194
|
+
gateway: { title: '게이트웨이' },
|
|
195
|
+
endpoint: { title: 'API' },
|
|
196
|
+
app_module: { title: '서버' },
|
|
197
|
+
external_service: { title: '클라이언트' },
|
|
198
|
+
external: { title: '외부 서비스' },
|
|
199
|
+
db_table: { title: 'DB' },
|
|
200
|
+
workflow: { title: '트리거' },
|
|
201
|
+
build: { title: '빌드' },
|
|
202
|
+
artifact: { title: '산출물' },
|
|
203
|
+
deploy_target: { title: '배포 대상' },
|
|
204
|
+
domain: { title: '도메인' },
|
|
205
|
+
cdn: { title: 'CDN' },
|
|
206
|
+
bucket: { title: '버킷' },
|
|
207
|
+
cloud_account: { title: '클라우드 계정' },
|
|
208
|
+
},
|
|
209
|
+
edgeKinds: {
|
|
210
|
+
calls: { text: '호출' },
|
|
211
|
+
handles: { text: '처리' },
|
|
212
|
+
uses: { text: '사용' },
|
|
213
|
+
reads_writes: { text: '읽기와 쓰기' },
|
|
214
|
+
routes: { text: '전달' },
|
|
215
|
+
navigates: { text: '화면 이동' },
|
|
216
|
+
triggers: { text: '실행' },
|
|
217
|
+
builds: { text: '빌드' },
|
|
218
|
+
produces: { text: '생성' },
|
|
219
|
+
deploys_to: { text: '배포' },
|
|
220
|
+
resolves_to: { text: '도메인 연결', backward: true },
|
|
221
|
+
origin: { text: '원본', backward: true },
|
|
222
|
+
serves: { text: '서빙' },
|
|
223
|
+
loads: { text: '런타임 로드' },
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=web-product.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-product.js","sourceRoot":"","sources":["../../../../src/architecture/packs/web-product.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type ArchitectureNode, type ArchitectureProjection, type SequenceBlockKind } from './types.js';
|
|
2
|
+
export interface SequenceHead {
|
|
3
|
+
id: string;
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
}
|
|
9
|
+
export interface SequenceMessageBox {
|
|
10
|
+
id: string;
|
|
11
|
+
/** 번호. 그린 메시지만 1부터 센다 */
|
|
12
|
+
n: number;
|
|
13
|
+
y: number;
|
|
14
|
+
x1: number;
|
|
15
|
+
x2: number;
|
|
16
|
+
self: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface SequenceBlockBox {
|
|
19
|
+
id: string;
|
|
20
|
+
kind: SequenceBlockKind;
|
|
21
|
+
label: string;
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
branches: {
|
|
27
|
+
y: number;
|
|
28
|
+
label: string;
|
|
29
|
+
}[];
|
|
30
|
+
}
|
|
31
|
+
export interface SequenceLayout {
|
|
32
|
+
width: number;
|
|
33
|
+
height: number;
|
|
34
|
+
heads: SequenceHead[];
|
|
35
|
+
lifelines: {
|
|
36
|
+
id: string;
|
|
37
|
+
x: number;
|
|
38
|
+
y1: number;
|
|
39
|
+
y2: number;
|
|
40
|
+
}[];
|
|
41
|
+
messages: SequenceMessageBox[];
|
|
42
|
+
blocks: SequenceBlockBox[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 그릴 메시지만 받아 좌표를 정한다. 같은 입력이면 같은 좌표가 나온다.
|
|
46
|
+
* 참여자는 participants 순서, 없으면 메시지에 처음 나온 순서다. 그려지지 않는 노드는 뺀다.
|
|
47
|
+
* whereOf가 돌려준 글자는 머리 카드 둘째 줄에 들어가므로 카드 크기에 넣어 잰다
|
|
48
|
+
*/
|
|
49
|
+
export declare function computeSequenceLayout(projection: ArchitectureProjection, drawn: ReadonlySet<string>, nodeById: ReadonlyMap<string, ArchitectureNode>, whereOf?: (id: string) => string | undefined): SequenceLayout;
|
|
50
|
+
//# sourceMappingURL=sequence-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence-layout.d.ts","sourceRoot":"","sources":["../../../src/architecture/sequence-layout.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAgBpB,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,sBAAsB,EAClC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAC1B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC/C,OAAO,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAA2B,GAC5D,cAAc,CAiHhB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { measureNode, textUnits } from './layout.js';
|
|
2
|
+
import { chipTextOverride, displayKindOf, } from './types.js';
|
|
3
|
+
// sequence는 열과 줄이 곧 의미라 elkjs를 안 쓴다. 열은 참여자, 줄은 메시지 순서다
|
|
4
|
+
const HEAD_GAP = 60;
|
|
5
|
+
const LABEL_PAD = 48;
|
|
6
|
+
const LABEL_CHAR = 7;
|
|
7
|
+
const FIRST_ROW = 40;
|
|
8
|
+
const ROW = 44;
|
|
9
|
+
const SELF_ROW = 60;
|
|
10
|
+
const SELF_W = 36;
|
|
11
|
+
const BLOCK_HEAD = 30;
|
|
12
|
+
const BLOCK_TAIL = 14;
|
|
13
|
+
const BRANCH_GAP = 24;
|
|
14
|
+
const BLOCK_SIDE = 64;
|
|
15
|
+
const TAIL = 32;
|
|
16
|
+
function labelWidth(text) {
|
|
17
|
+
return textUnits(text) * LABEL_CHAR;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 그릴 메시지만 받아 좌표를 정한다. 같은 입력이면 같은 좌표가 나온다.
|
|
21
|
+
* 참여자는 participants 순서, 없으면 메시지에 처음 나온 순서다. 그려지지 않는 노드는 뺀다.
|
|
22
|
+
* whereOf가 돌려준 글자는 머리 카드 둘째 줄에 들어가므로 카드 크기에 넣어 잰다
|
|
23
|
+
*/
|
|
24
|
+
export function computeSequenceLayout(projection, drawn, nodeById, whereOf = () => undefined) {
|
|
25
|
+
const messages = projection.messages.filter((m) => drawn.has(m.id));
|
|
26
|
+
const order = [];
|
|
27
|
+
const add = (id) => {
|
|
28
|
+
if (!order.includes(id) && nodeById.has(id))
|
|
29
|
+
order.push(id);
|
|
30
|
+
};
|
|
31
|
+
const used = new Set(messages.flatMap((m) => [m.from, m.to]));
|
|
32
|
+
for (const id of projection.participants ?? [])
|
|
33
|
+
if (used.has(id))
|
|
34
|
+
add(id);
|
|
35
|
+
for (const m of messages) {
|
|
36
|
+
add(m.from);
|
|
37
|
+
add(m.to);
|
|
38
|
+
}
|
|
39
|
+
const sizes = order.map((id) => {
|
|
40
|
+
const n = nodeById.get(id);
|
|
41
|
+
const chip = chipTextOverride(n);
|
|
42
|
+
const where = whereOf(id);
|
|
43
|
+
return measureNode(n.label, n.displayName, n.displayNameInferred, displayKindOf(n), {
|
|
44
|
+
...(chip !== undefined ? { chip } : {}),
|
|
45
|
+
...(where !== undefined ? { secondLine: where } : {}),
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
const col = new Map(order.map((id, i) => [id, i]));
|
|
49
|
+
// 이웃한 두 열 사이 거리는 두 카드 반폭 합과 그 사이만 잇는 메시지 글자 폭 중 큰 쪽이다
|
|
50
|
+
const gaps = order.slice(1).map((_, i) => {
|
|
51
|
+
const base = (sizes[i].width + sizes[i + 1].width) / 2 + HEAD_GAP;
|
|
52
|
+
const label = messages
|
|
53
|
+
.filter((m) => {
|
|
54
|
+
const a = col.get(m.from);
|
|
55
|
+
const b = col.get(m.to);
|
|
56
|
+
return Math.min(a, b) === i && Math.max(a, b) === i + 1;
|
|
57
|
+
})
|
|
58
|
+
.reduce((w, m) => Math.max(w, labelWidth(`${messages.indexOf(m) + 1}. ${m.label}`)), 0);
|
|
59
|
+
return Math.max(base, label + LABEL_PAD);
|
|
60
|
+
});
|
|
61
|
+
const centers = [];
|
|
62
|
+
order.forEach((_, i) => {
|
|
63
|
+
centers.push(i === 0 ? sizes[0].width / 2 : centers[i - 1] + gaps[i - 1]);
|
|
64
|
+
});
|
|
65
|
+
const headHeight = sizes.reduce((h, s) => Math.max(h, s.height), 0);
|
|
66
|
+
const heads = order.map((id, i) => ({
|
|
67
|
+
id,
|
|
68
|
+
x: round2(centers[i] - sizes[i].width / 2),
|
|
69
|
+
y: 0,
|
|
70
|
+
width: sizes[i].width,
|
|
71
|
+
height: sizes[i].height,
|
|
72
|
+
}));
|
|
73
|
+
const blockById = new Map((projection.blocks ?? []).map((b) => [b.id, b]));
|
|
74
|
+
const out = [];
|
|
75
|
+
const blocks = [];
|
|
76
|
+
let y = headHeight + FIRST_ROW;
|
|
77
|
+
let open;
|
|
78
|
+
let openBranch;
|
|
79
|
+
let span = [0, 0];
|
|
80
|
+
const closeBlock = () => {
|
|
81
|
+
if (!open)
|
|
82
|
+
return;
|
|
83
|
+
y += BLOCK_TAIL;
|
|
84
|
+
open.x = round2(span[0] - BLOCK_SIDE);
|
|
85
|
+
open.width = round2(span[1] - span[0] + BLOCK_SIDE * 2);
|
|
86
|
+
open.height = round2(y - open.y);
|
|
87
|
+
blocks.push(open);
|
|
88
|
+
open = undefined;
|
|
89
|
+
y += BLOCK_TAIL;
|
|
90
|
+
};
|
|
91
|
+
messages.forEach((m, i) => {
|
|
92
|
+
const x1 = centers[col.get(m.from)];
|
|
93
|
+
const x2 = centers[col.get(m.to)];
|
|
94
|
+
const self = m.from === m.to;
|
|
95
|
+
if (open && open.id !== m.block)
|
|
96
|
+
closeBlock();
|
|
97
|
+
if (!open && m.block !== undefined) {
|
|
98
|
+
const b = blockById.get(m.block);
|
|
99
|
+
open = { id: b.id, kind: b.kind, label: b.label, x: 0, y, width: 0, height: 0, branches: [] };
|
|
100
|
+
openBranch = m.branch;
|
|
101
|
+
span = [Math.min(x1, x2), Math.max(x1, x2)];
|
|
102
|
+
y += BLOCK_HEAD;
|
|
103
|
+
}
|
|
104
|
+
else if (open && m.branch !== openBranch) {
|
|
105
|
+
y += BRANCH_GAP / 2;
|
|
106
|
+
open.branches.push({ y, label: m.branch ?? '' });
|
|
107
|
+
y += BRANCH_GAP;
|
|
108
|
+
openBranch = m.branch;
|
|
109
|
+
}
|
|
110
|
+
if (open) {
|
|
111
|
+
span = [Math.min(span[0], x1, x2), Math.max(span[1], x1, x2 + (self ? SELF_W : 0))];
|
|
112
|
+
}
|
|
113
|
+
y += self ? SELF_ROW / 2 : ROW / 2;
|
|
114
|
+
out.push({ id: m.id, n: i + 1, y: round2(y), x1, x2, self });
|
|
115
|
+
y += self ? SELF_ROW / 2 : ROW / 2;
|
|
116
|
+
});
|
|
117
|
+
closeBlock();
|
|
118
|
+
const last = order.length - 1;
|
|
119
|
+
const right = Math.max(last >= 0 ? centers[last] + sizes[last].width / 2 : 0, ...blocks.map((b) => b.x + b.width), ...out.filter((m) => m.self).map((m) => m.x1 + SELF_W + LABEL_PAD));
|
|
120
|
+
const left = Math.min(0, ...blocks.map((b) => b.x));
|
|
121
|
+
const shift = -left;
|
|
122
|
+
const height = round2(y + TAIL);
|
|
123
|
+
return {
|
|
124
|
+
width: round2(right + shift),
|
|
125
|
+
height,
|
|
126
|
+
heads: heads.map((h) => ({ ...h, x: round2(h.x + shift) })),
|
|
127
|
+
lifelines: order.map((id, i) => ({
|
|
128
|
+
id,
|
|
129
|
+
x: round2(centers[i] + shift),
|
|
130
|
+
y1: sizes[i].height,
|
|
131
|
+
y2: round2(y),
|
|
132
|
+
})),
|
|
133
|
+
messages: out.map((m) => ({ ...m, x1: round2(m.x1 + shift), x2: round2(m.x2 + shift) })),
|
|
134
|
+
blocks: blocks.map((b) => ({ ...b, x: round2(b.x + shift) })),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function round2(v) {
|
|
138
|
+
return Math.round(v * 100) / 100;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=sequence-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence-layout.js","sourceRoot":"","sources":["../../../src/architecture/sequence-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,gBAAgB,EAChB,aAAa,GAId,MAAM,YAAY,CAAC;AAEpB,wDAAwD;AACxD,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,GAAG,GAAG,EAAE,CAAC;AACf,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,IAAI,GAAG,EAAE,CAAC;AAwChB,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkC,EAClC,KAA0B,EAC1B,QAA+C,EAC/C,UAA8C,GAAG,EAAE,CAAC,SAAS;IAE7D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,EAAU,EAAQ,EAAE;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,YAAY,IAAI,EAAE;QAAE,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1E,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QAC7B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE;YAClF,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,sDAAsD;IACtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QACpE,MAAM,KAAK,GAAG,QAAQ;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC;YACzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,GAAG,CAAC,CAAC;QAC5C,CAAC,EAAE,CAAC;QACJ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK;QACtB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM;KACzB,CAAC,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,IAAI,CAAC,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/B,IAAI,IAAkC,CAAC;IACvC,IAAI,UAA8B,CAAC;IACnC,IAAI,IAAI,GAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,CAAC,IAAI,UAAU,CAAC;QAChB,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,GAAG,SAAS,CAAC;QACjB,CAAC,IAAI,UAAU,CAAC;IAClB,CAAC,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAE,CAAE,CAAC;QACtC,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAE,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7B,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK;YAAE,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC;YAClC,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC9F,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;YACtB,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC,IAAI,UAAU,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC3C,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;YACjD,CAAC,IAAI,UAAU,CAAC;YAChB,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,UAAU,EAAE,CAAC;IAEb,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAE,GAAG,KAAK,CAAC,IAAI,CAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACvD,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EACnC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC,CACnE,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChC,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC5B,MAAM;QACN,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3D,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE;YACF,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC;YAC9B,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM;YACpB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;SACd,CAAC,CAAC;QACH,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ArchitectureEdge, type ArchitectureNode, type Platform, type WebHosting } from './types.js';
|
|
2
|
+
export interface ServiceDomain {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
environment?: string;
|
|
6
|
+
}
|
|
7
|
+
/** 서비스와 micro_app 카드, 패널이 그래프에서 끌어내 보여주는 사실 */
|
|
8
|
+
export interface ServiceFacts {
|
|
9
|
+
/** 웹, AOS, iOS 순서로 고정. 근거가 있는 것만 든다 */
|
|
10
|
+
platforms: Platform[];
|
|
11
|
+
/** 이 서비스를 서빙하는 버킷 id. 웹 판정의 근거다 */
|
|
12
|
+
servingBuckets: string[];
|
|
13
|
+
/** 이 서비스를 서빙하는 배포 대상(SSR 서버) id */
|
|
14
|
+
servingTargets: string[];
|
|
15
|
+
/** prod 서빙 노드로 정한 서빙 방식. 서빙 노드가 없으면 비운다 */
|
|
16
|
+
webHosting?: WebHosting;
|
|
17
|
+
/** 서빙 노드에서 CDN, 도메인을 거슬러 닿은 도메인. 환경 순서로 정렬한다 */
|
|
18
|
+
domains: ServiceDomain[];
|
|
19
|
+
/** environment가 prod인 첫 도메인 */
|
|
20
|
+
prodDomain?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 그릴 노드와 엣지만 받아 서비스와 micro_app마다 플랫폼과 도메인을 낸다.
|
|
24
|
+
* micro_app은 자기를 serves로 가리키는 버킷이나 서버로 따로 판정한다. 앱이 달린 서비스의 웹 칩과 도메인은 진입 앱(호스트) 것이다.
|
|
25
|
+
* 웹은 버킷이나 배포 대상이 serves로 서빙하거나 platformEvidence.web이 있을 때, android와 ios는 platforms에 있고 근거가 있을 때만 든다.
|
|
26
|
+
* 서빙 방식은 prod(또는 환경 없는) 서빙 노드로 정하고 그런 노드가 없을 때만 다른 환경을 본다.
|
|
27
|
+
* 배포 대상이 하나라도 서빙하면 SSR이다. SSR 앱도 정적 에셋은 버킷에 올리는 경우가 흔해서다
|
|
28
|
+
*/
|
|
29
|
+
export declare function computeServiceFacts(nodes: readonly ArchitectureNode[], edges: readonly ArchitectureEdge[]): Map<string, ServiceFacts>;
|
|
30
|
+
//# sourceMappingURL=service-facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-facts.d.ts","sourceRoot":"","sources":["../../../src/architecture/service-facts.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,mCAAmC;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mCAAmC;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gDAAgD;IAChD,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GACjC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAkE3B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { compareEnvironment } from './layout.js';
|
|
2
|
+
import { indexMicroApps } from './micro-app.js';
|
|
3
|
+
import { PLATFORMS, } from './types.js';
|
|
4
|
+
function compareStr(a, b) {
|
|
5
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 그릴 노드와 엣지만 받아 서비스와 micro_app마다 플랫폼과 도메인을 낸다.
|
|
9
|
+
* micro_app은 자기를 serves로 가리키는 버킷이나 서버로 따로 판정한다. 앱이 달린 서비스의 웹 칩과 도메인은 진입 앱(호스트) 것이다.
|
|
10
|
+
* 웹은 버킷이나 배포 대상이 serves로 서빙하거나 platformEvidence.web이 있을 때, android와 ios는 platforms에 있고 근거가 있을 때만 든다.
|
|
11
|
+
* 서빙 방식은 prod(또는 환경 없는) 서빙 노드로 정하고 그런 노드가 없을 때만 다른 환경을 본다.
|
|
12
|
+
* 배포 대상이 하나라도 서빙하면 SSR이다. SSR 앱도 정적 에셋은 버킷에 올리는 경우가 흔해서다
|
|
13
|
+
*/
|
|
14
|
+
export function computeServiceFacts(nodes, edges) {
|
|
15
|
+
const byId = new Map(nodes.map((n) => [n.id, n]));
|
|
16
|
+
const kindOf = (id) => byId.get(id)?.kind;
|
|
17
|
+
const incoming = (kind, to, fromKind) => edges
|
|
18
|
+
.filter((e) => e.kind === kind && e.to === to && kindOf(e.from) === fromKind)
|
|
19
|
+
.map((e) => e.from);
|
|
20
|
+
const out = new Map();
|
|
21
|
+
for (const n of [...nodes].sort((a, b) => compareStr(a.id, b.id))) {
|
|
22
|
+
if (n.kind !== 'service' && n.kind !== 'micro_app')
|
|
23
|
+
continue;
|
|
24
|
+
const buckets = [...new Set(incoming('serves', n.id, 'bucket'))].sort(compareStr);
|
|
25
|
+
const targets = [...new Set(incoming('serves', n.id, 'deploy_target'))].sort(compareStr);
|
|
26
|
+
const servers = [...buckets, ...targets];
|
|
27
|
+
const cdns = new Set(servers.flatMap((s) => incoming('origin', s, 'cdn')));
|
|
28
|
+
// SSR 서버는 CDN 없이 로드 밸런서로 도메인을 바로 받는 경우가 있다
|
|
29
|
+
const domainIds = new Set([...cdns, ...targets].flatMap((c) => incoming('resolves_to', c, 'domain')));
|
|
30
|
+
const domains = [...domainIds]
|
|
31
|
+
.map((id) => byId.get(id))
|
|
32
|
+
.map((d) => ({
|
|
33
|
+
id: d.id,
|
|
34
|
+
label: d.label,
|
|
35
|
+
...(d.environment !== undefined ? { environment: d.environment } : {}),
|
|
36
|
+
}))
|
|
37
|
+
.sort((a, b) => compareEnvironment(a.environment, b.environment) ||
|
|
38
|
+
compareStr(a.label, b.label) ||
|
|
39
|
+
compareStr(a.id, b.id));
|
|
40
|
+
const evidenced = (p) => (n.platformEvidence?.[p] ?? []).length > 0;
|
|
41
|
+
const listed = new Set(n.platforms ?? []);
|
|
42
|
+
const platforms = PLATFORMS.filter((p) => p === 'web' ? servers.length > 0 || evidenced('web') : listed.has(p) && evidenced(p));
|
|
43
|
+
const prod = domains.find((d) => d.environment === 'prod');
|
|
44
|
+
const hosting = webHostingOf(buckets, targets, byId);
|
|
45
|
+
out.set(n.id, {
|
|
46
|
+
platforms,
|
|
47
|
+
servingBuckets: buckets,
|
|
48
|
+
servingTargets: targets,
|
|
49
|
+
...(hosting !== undefined ? { webHosting: hosting } : {}),
|
|
50
|
+
domains,
|
|
51
|
+
...(prod !== undefined ? { prodDomain: prod.label } : {}),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const apps = indexMicroApps(nodes, edges);
|
|
55
|
+
for (const [service, entry] of apps.entryOf) {
|
|
56
|
+
const own = out.get(service);
|
|
57
|
+
const host = out.get(entry);
|
|
58
|
+
if (own === undefined || host === undefined)
|
|
59
|
+
continue;
|
|
60
|
+
const web = host.platforms.includes('web') || own.platforms.includes('web');
|
|
61
|
+
const { webHosting: _w, prodDomain: _p, ...rest } = own;
|
|
62
|
+
out.set(service, {
|
|
63
|
+
...rest,
|
|
64
|
+
platforms: PLATFORMS.filter((p) => (p === 'web' ? web : own.platforms.includes(p))),
|
|
65
|
+
servingBuckets: host.servingBuckets,
|
|
66
|
+
servingTargets: host.servingTargets,
|
|
67
|
+
...(host.webHosting !== undefined ? { webHosting: host.webHosting } : {}),
|
|
68
|
+
domains: host.domains,
|
|
69
|
+
...(host.prodDomain !== undefined ? { prodDomain: host.prodDomain } : {}),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function webHostingOf(buckets, targets, byId) {
|
|
75
|
+
const prodish = (id) => {
|
|
76
|
+
const env = byId.get(id)?.environment;
|
|
77
|
+
return env === undefined || env === 'prod';
|
|
78
|
+
};
|
|
79
|
+
const prodBuckets = buckets.filter(prodish);
|
|
80
|
+
const prodTargets = targets.filter(prodish);
|
|
81
|
+
const [b, t] = prodBuckets.length + prodTargets.length > 0 ? [prodBuckets, prodTargets] : [buckets, targets];
|
|
82
|
+
if (t.length > 0)
|
|
83
|
+
return 'ssr';
|
|
84
|
+
if (b.length > 0)
|
|
85
|
+
return 'static';
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=service-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-facts.js","sourceRoot":"","sources":["../../../src/architecture/service-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ArchitectureEdge, ArchitectureIr, ArchitectureNode, ArchitectureProjection, ArchitectureView, ContextSource, UnresolvedQuestion } from './types.js';
|
|
2
|
+
export interface PreviousRunSummary {
|
|
3
|
+
generatedAt: string;
|
|
4
|
+
nodeCount: number;
|
|
5
|
+
edgeCount: number;
|
|
6
|
+
unresolvedOpen: number;
|
|
7
|
+
sourcesUsed: ContextSource[];
|
|
8
|
+
}
|
|
9
|
+
/** `<repoRoot>/.gestalt/architecture/` 아래 뷰별 IR과 HTML을 읽고 쓴다 */
|
|
10
|
+
export declare class ArchitectureStore {
|
|
11
|
+
private readonly dir;
|
|
12
|
+
constructor(repoRoot: string);
|
|
13
|
+
irPath(view: ArchitectureView): string;
|
|
14
|
+
htmlPath(view: ArchitectureView, audience: 'private' | 'shared'): string;
|
|
15
|
+
/** 없으면 null. 깨졌거나 스키마에 안 맞으면 `.corrupt-*`로 옮기고 null */
|
|
16
|
+
load(view: ArchitectureView): ArchitectureIr | null;
|
|
17
|
+
/** private 근거의 excerpt는 디스크에 남기지 않는다. 저장한 경로를 돌려준다 */
|
|
18
|
+
save(ir: ArchitectureIr): string;
|
|
19
|
+
viewPath(view: ArchitectureView, projectionId: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* 투영 하나를 `views/<그림>.<투영 id>.json`에 따로 쌓는다. 질문 하나로 그림을 다시 열거나 남에게 넘길 때
|
|
22
|
+
* 전체 IR 없이 읽히게 투영이 가리키는 노드와 엣지, 그 메시지에 걸린 질문만 함께 담는다.
|
|
23
|
+
* 이번 IR에 없는 같은 그림의 옛 파일은 지운다. 저장한 경로를 돌려준다
|
|
24
|
+
*/
|
|
25
|
+
saveViews(ir: ArchitectureIr): string[];
|
|
26
|
+
saveHtml(view: ArchitectureView, audience: 'private' | 'shared', html: string): string;
|
|
27
|
+
}
|
|
28
|
+
export interface ProjectionSlice {
|
|
29
|
+
schemaVersion: string;
|
|
30
|
+
view: ArchitectureView;
|
|
31
|
+
generatedAt: string;
|
|
32
|
+
projection: ArchitectureProjection;
|
|
33
|
+
nodes: ArchitectureNode[];
|
|
34
|
+
edges: ArchitectureEdge[];
|
|
35
|
+
unresolved: UnresolvedQuestion[];
|
|
36
|
+
}
|
|
37
|
+
/** 같은 노드를 알아보는 키. 재실행 병합과 분석 합치기가 같은 기준을 쓴다 */
|
|
38
|
+
export declare function nodeKey(node: Pick<ArchitectureNode, 'kind' | 'repo' | 'label'>): string;
|
|
39
|
+
/**
|
|
40
|
+
* 재실행 IR(next)이 이전 IR(prev)의 id를 물려받게 맞춘다.
|
|
41
|
+
*
|
|
42
|
+
* 생성할 때마다 id가 새로 매겨지면 사람이 단 답이나 화면 위치 기억이 전부 끊긴다.
|
|
43
|
+
* 노드는 kind, repo, 정규화한 label이 같으면 같은 것으로 보고 엣지는 바뀐 노드 id 기준
|
|
44
|
+
* (from, to, kind)가 같으면 같은 것으로 본다. next의 다른 id와 부딪히면 바꾸지 않는다.
|
|
45
|
+
* prev에서 답이 달린 질문은 대상이 merge 결과에 남아 있을 때만 이어 붙인다.
|
|
46
|
+
* 입력은 바꾸지 않는다.
|
|
47
|
+
*/
|
|
48
|
+
export declare function mergeWithPrevious(prev: ArchitectureIr, next: ArchitectureIr): ArchitectureIr;
|
|
49
|
+
export declare function previousRunSummary(prev: ArchitectureIr): PreviousRunSummary;
|
|
50
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/architecture/store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,gEAAgE;AAChE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,QAAQ,EAAE,MAAM;IAI5B,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM;IAItC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM;IAIxE,uDAAuD;IACvD,IAAI,CAAC,IAAI,EAAE,gBAAgB,GAAG,cAAc,GAAG,IAAI;IAOnD,sDAAsD;IACtD,IAAI,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM;IAMhC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAI9D;;;;OAIG;IACH,SAAS,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,EAAE;IAkBvC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;CAKvF;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,gBAAgB,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAwCD,+CAA+C;AAC/C,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,CAKvF;AAUD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,GAAG,cAAc,CAyJ5F;AAkCD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,kBAAkB,CAQ3E"}
|