@framingui/mcp-server 0.6.0 → 0.6.1
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.md +24 -40
- package/dist/__tests__/data-client.test.d.ts +4 -4
- package/dist/__tests__/data-client.test.js +158 -66
- package/dist/__tests__/data-client.test.js.map +1 -1
- package/dist/api/api-result.d.ts +30 -0
- package/dist/api/api-result.d.ts.map +1 -0
- package/dist/api/api-result.js +50 -0
- package/dist/api/api-result.js.map +1 -0
- package/dist/api/data-client.d.ts +24 -26
- package/dist/api/data-client.d.ts.map +1 -1
- package/dist/api/data-client.js +209 -220
- package/dist/api/data-client.js.map +1 -1
- package/dist/data/recipe-resolver.d.ts.map +1 -1
- package/dist/data/recipe-resolver.js +6 -4
- package/dist/data/recipe-resolver.js.map +1 -1
- package/dist/data/template-matcher.d.ts.map +1 -1
- package/dist/data/template-matcher.js +2 -1
- package/dist/data/template-matcher.js.map +1 -1
- package/dist/generators/css-generator.js +4 -4
- package/dist/generators/css-generator.js.map +1 -1
- package/dist/tools/get-screen-generation-context.d.ts.map +1 -1
- package/dist/tools/get-screen-generation-context.js +9 -6
- package/dist/tools/get-screen-generation-context.js.map +1 -1
- package/dist/tools/list-components.d.ts.map +1 -1
- package/dist/tools/list-components.js +6 -1
- package/dist/tools/list-components.js.map +1 -1
- package/dist/tools/list-icon-libraries.d.ts.map +1 -1
- package/dist/tools/list-icon-libraries.js +5 -8
- package/dist/tools/list-icon-libraries.js.map +1 -1
- package/dist/tools/list-screen-templates.d.ts.map +1 -1
- package/dist/tools/list-screen-templates.js +8 -2
- package/dist/tools/list-screen-templates.js.map +1 -1
- package/dist/tools/list-themes.d.ts.map +1 -1
- package/dist/tools/list-themes.js +6 -1
- package/dist/tools/list-themes.js.map +1 -1
- package/dist/tools/list-tokens.d.ts.map +1 -1
- package/dist/tools/list-tokens.js +6 -1
- package/dist/tools/list-tokens.js.map +1 -1
- package/dist/tools/preview-component.d.ts.map +1 -1
- package/dist/tools/preview-component.js +16 -9
- package/dist/tools/preview-component.js.map +1 -1
- package/dist/tools/preview-icon-library.d.ts.map +1 -1
- package/dist/tools/preview-icon-library.js +5 -7
- package/dist/tools/preview-icon-library.js.map +1 -1
- package/dist/tools/preview-screen-template.d.ts.map +1 -1
- package/dist/tools/preview-screen-template.js +16 -9
- package/dist/tools/preview-screen-template.js.map +1 -1
- package/dist/tools/preview-theme.d.ts.map +1 -1
- package/dist/tools/preview-theme.js +6 -15
- package/dist/tools/preview-theme.js.map +1 -1
- package/dist/tools/validate-screen-definition.d.ts.map +1 -1
- package/dist/tools/validate-screen-definition.js +8 -4
- package/dist/tools/validate-screen-definition.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -102,9 +102,9 @@ npx @framingui/mcp-server init
|
|
|
102
102
|
| -------------------------------- | --------------------- |
|
|
103
103
|
| `npx @framingui/mcp-server` | MCP stdio 서버 시작 |
|
|
104
104
|
| `npx @framingui/mcp-server init` | 프로젝트 초기 설정 |
|
|
105
|
-
| `framingui-mcp login`
|
|
106
|
-
| `framingui-mcp logout`
|
|
107
|
-
| `framingui-mcp status`
|
|
105
|
+
| `framingui-mcp login` | 브라우저 OAuth 로그인 |
|
|
106
|
+
| `framingui-mcp logout` | 로그아웃 |
|
|
107
|
+
| `framingui-mcp status` | 인증 상태 확인 |
|
|
108
108
|
|
|
109
109
|
## Development Quick Start
|
|
110
110
|
|
|
@@ -824,9 +824,10 @@ packages/mcp-server/
|
|
|
824
824
|
│ │ ├── preview-component.ts # Component preview (SPEC-MCP-003)
|
|
825
825
|
│ │ ├── list-screen-templates.ts # Template listing (SPEC-MCP-003)
|
|
826
826
|
│ │ └── preview-screen-template.ts # Template preview (SPEC-MCP-003)
|
|
827
|
-
│ ├── data/ #
|
|
828
|
-
│ │ ├──
|
|
829
|
-
│ │
|
|
827
|
+
│ ├── data/ # Data utilities (non-API helpers)
|
|
828
|
+
│ │ ├── template-matcher.ts # Template matching logic
|
|
829
|
+
│ │ ├── hint-generator.ts # AI hint generation
|
|
830
|
+
│ │ └── recipe-resolver.ts # Recipe resolution
|
|
830
831
|
│ ├── storage/ # Blueprint storage
|
|
831
832
|
│ │ ├── blueprint-storage.ts
|
|
832
833
|
│ │ └── timestamp-manager.ts
|
|
@@ -883,43 +884,26 @@ packages/mcp-server/
|
|
|
883
884
|
|
|
884
885
|
**Test Results**:
|
|
885
886
|
|
|
886
|
-
-
|
|
887
|
-
-
|
|
887
|
+
- 29 test files
|
|
888
|
+
- 290 test cases
|
|
888
889
|
- 100% pass rate
|
|
889
890
|
- Zero failures
|
|
890
891
|
|
|
891
|
-
##
|
|
892
|
+
## Architecture: API-Based Data Sources (v0.6.0)
|
|
892
893
|
|
|
893
|
-
|
|
894
|
+
Since v0.6.0, the MCP server fetches all data from the framingui.com API via `data-client.ts`. This removes `@framingui/core` and `@framingui/ui` from production dependencies, enabling truly standalone npm installation.
|
|
894
895
|
|
|
895
|
-
**
|
|
896
|
+
**Data Client** (`src/api/data-client.ts`):
|
|
896
897
|
|
|
897
|
-
- `
|
|
898
|
-
- `
|
|
899
|
-
- `
|
|
900
|
-
- `
|
|
901
|
-
- `
|
|
902
|
-
- `
|
|
898
|
+
- `fetchThemeList()`, `fetchTheme(id)` — Theme data
|
|
899
|
+
- `fetchIconLibraries()`, `fetchIconLibrary(id)` — Icon libraries
|
|
900
|
+
- `fetchTemplateList()`, `fetchTemplate(id)` — Screen templates
|
|
901
|
+
- `fetchComponentList()`, `fetchComponent(id)` — Component catalog
|
|
902
|
+
- `fetchTokenList(type?)` — Layout tokens
|
|
903
|
+
- `fetchCSSVariables(themeId)` — CSS generation
|
|
904
|
+
- `fetchScreenExamples()` — Screen examples
|
|
903
905
|
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
- `validateScreenDefinition()` - Screen validation
|
|
907
|
-
- `resolveScreen()` - Layout and component resolution
|
|
908
|
-
- `generateStyledComponents()` - CSS-in-JS generation
|
|
909
|
-
- `generateTailwindClasses()` - Tailwind CSS generation
|
|
910
|
-
- `generateReactComponent()` - React component generation
|
|
911
|
-
- `getAllShellTokens()` - Shell token listing
|
|
912
|
-
- `getAllPageLayoutTokens()` - Page token listing
|
|
913
|
-
- `getAllSectionPatternTokens()` - Section token listing
|
|
914
|
-
|
|
915
|
-
**Component & Template Discovery** (SPEC-MCP-003):
|
|
916
|
-
|
|
917
|
-
- `templateRegistry` from `@framingui` - Template metadata and search
|
|
918
|
-
- Component metadata registry - Static component catalog with 30+ components
|
|
919
|
-
- Component type definitions - TypeScript interfaces for props and variants
|
|
920
|
-
- Template structure definitions - Skeleton, layout, and customization schemas
|
|
921
|
-
|
|
922
|
-
**Zero code duplication** - Single source of truth maintained.
|
|
906
|
+
All functions use `MemoryCache` (10-min TTL) with `getStale()` fallback for network resilience.
|
|
923
907
|
|
|
924
908
|
## Documentation
|
|
925
909
|
|
|
@@ -1021,7 +1005,7 @@ MIT
|
|
|
1021
1005
|
|
|
1022
1006
|
---
|
|
1023
1007
|
|
|
1024
|
-
**Version**:
|
|
1025
|
-
**Last Updated**: 2026-
|
|
1026
|
-
**SPEC**: SPEC-MCP-002 v2.0.0, SPEC-LAYOUT-002 Phase 4, SPEC-MCP-003 v1.0.0
|
|
1027
|
-
**Total Tools**:
|
|
1008
|
+
**Version**: 0.6.0 (API-based data sources — no workspace dependencies)
|
|
1009
|
+
**Last Updated**: 2026-03-06
|
|
1010
|
+
**SPEC**: SPEC-MCP-002 v2.0.0, SPEC-LAYOUT-002 Phase 4, SPEC-MCP-003 v1.0.0, SPEC-MCP-007 v1.0.0
|
|
1011
|
+
**Total Tools**: 17
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* data-client.ts 테스트
|
|
2
|
+
* data-client.ts 테스트 (v2 - ApiResult 기반)
|
|
3
3
|
* SPEC-MCP-007 Phase 2 - fetchTemplateList, fetchTemplate, fetchComponentList,
|
|
4
4
|
* fetchComponent, fetchTokenList, fetchCSSVariables, fetchScreenExamples
|
|
5
5
|
*
|
|
6
6
|
* 테스트 시나리오:
|
|
7
|
-
* 1. 캐시 미스: fetch 호출 →
|
|
8
|
-
* 2. API 실패 + 캐시 없음:
|
|
9
|
-
* 3. 인증 없음: fetch 호출 없이
|
|
7
|
+
* 1. 캐시 미스: fetch 호출 → ApiResult 성공 반환
|
|
8
|
+
* 2. API 실패 + 캐시 없음: ApiResult 에러 반환
|
|
9
|
+
* 3. 인증 없음: fetch 호출 없이 NOT_AUTHENTICATED 에러 반환
|
|
10
10
|
* 4. URL 파라미터 전달 확인
|
|
11
11
|
*/
|
|
12
12
|
export {};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* data-client.ts 테스트
|
|
2
|
+
* data-client.ts 테스트 (v2 - ApiResult 기반)
|
|
3
3
|
* SPEC-MCP-007 Phase 2 - fetchTemplateList, fetchTemplate, fetchComponentList,
|
|
4
4
|
* fetchComponent, fetchTokenList, fetchCSSVariables, fetchScreenExamples
|
|
5
5
|
*
|
|
6
6
|
* 테스트 시나리오:
|
|
7
|
-
* 1. 캐시 미스: fetch 호출 →
|
|
8
|
-
* 2. API 실패 + 캐시 없음:
|
|
9
|
-
* 3. 인증 없음: fetch 호출 없이
|
|
7
|
+
* 1. 캐시 미스: fetch 호출 → ApiResult 성공 반환
|
|
8
|
+
* 2. API 실패 + 캐시 없음: ApiResult 에러 반환
|
|
9
|
+
* 3. 인증 없음: fetch 호출 없이 NOT_AUTHENTICATED 에러 반환
|
|
10
10
|
* 4. URL 파라미터 전달 확인
|
|
11
11
|
*/
|
|
12
12
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
@@ -31,12 +31,11 @@ vi.mock('../utils/logger.js', () => ({
|
|
|
31
31
|
error: vi.fn(),
|
|
32
32
|
}));
|
|
33
33
|
// MemoryCache를 mock으로 교체 - 캐시가 항상 miss인 상태로 테스트
|
|
34
|
-
// (data-client.ts의 스코프에서 MemoryCache new 호출 결과를 제어)
|
|
35
34
|
vi.mock('../auth/cache.js', () => {
|
|
36
35
|
return {
|
|
37
36
|
MemoryCache: vi.fn().mockImplementation(() => ({
|
|
38
|
-
get: vi.fn().mockReturnValue(null),
|
|
39
|
-
getStale: vi.fn().mockReturnValue(null),
|
|
37
|
+
get: vi.fn().mockReturnValue(null),
|
|
38
|
+
getStale: vi.fn().mockReturnValue(null),
|
|
40
39
|
set: vi.fn(),
|
|
41
40
|
delete: vi.fn(),
|
|
42
41
|
clear: vi.fn(),
|
|
@@ -48,7 +47,7 @@ vi.mock('../auth/cache.js', () => {
|
|
|
48
47
|
const mockFetch = vi.fn();
|
|
49
48
|
global.fetch = mockFetch;
|
|
50
49
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
51
|
-
// 테스트 대상 import
|
|
50
|
+
// 테스트 대상 import
|
|
52
51
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
53
52
|
import { fetchTemplateList, fetchTemplate, fetchComponentList, fetchComponent, fetchTokenList, fetchCSSVariables, fetchScreenExamples, } from '../api/data-client.js';
|
|
54
53
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -61,6 +60,14 @@ function makeOkResponse(body) {
|
|
|
61
60
|
json: vi.fn().mockResolvedValue(body),
|
|
62
61
|
};
|
|
63
62
|
}
|
|
63
|
+
function makeErrorResponse(status, body) {
|
|
64
|
+
return {
|
|
65
|
+
ok: false,
|
|
66
|
+
status,
|
|
67
|
+
statusText: 'Error',
|
|
68
|
+
json: vi.fn().mockResolvedValue(body),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
64
71
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
65
72
|
// 공통 beforeEach
|
|
66
73
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -74,7 +81,7 @@ beforeEach(() => {
|
|
|
74
81
|
// fetchTemplateList
|
|
75
82
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
76
83
|
describe('fetchTemplateList()', () => {
|
|
77
|
-
it('API 성공 시 템플릿 목록을 반환한다', async () => {
|
|
84
|
+
it('API 성공 시 ok: true와 템플릿 목록을 반환한다', async () => {
|
|
78
85
|
const templates = [
|
|
79
86
|
{
|
|
80
87
|
id: 'dashboard',
|
|
@@ -86,8 +93,11 @@ describe('fetchTemplateList()', () => {
|
|
|
86
93
|
];
|
|
87
94
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, templates }));
|
|
88
95
|
const result = await fetchTemplateList();
|
|
89
|
-
expect(result).
|
|
90
|
-
|
|
96
|
+
expect(result.ok).toBe(true);
|
|
97
|
+
if (result.ok) {
|
|
98
|
+
expect(result.data).toHaveLength(1);
|
|
99
|
+
expect(result.data[0].id).toBe('dashboard');
|
|
100
|
+
}
|
|
91
101
|
expect(mockFetch).toHaveBeenCalledOnce();
|
|
92
102
|
});
|
|
93
103
|
it('category 파라미터를 쿼리스트링으로 전달한다', async () => {
|
|
@@ -102,20 +112,29 @@ describe('fetchTemplateList()', () => {
|
|
|
102
112
|
const calledUrl = mockFetch.mock.calls[0][0];
|
|
103
113
|
expect(calledUrl).toContain('search=login');
|
|
104
114
|
});
|
|
105
|
-
it('API
|
|
115
|
+
it('API 응답 success: false 시 에러를 반환한다', async () => {
|
|
106
116
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false, error: 'not found' }));
|
|
107
117
|
const result = await fetchTemplateList();
|
|
108
|
-
expect(result).
|
|
118
|
+
expect(result.ok).toBe(false);
|
|
119
|
+
if (!result.ok) {
|
|
120
|
+
expect(result.error.code).toBe('SERVER_ERROR');
|
|
121
|
+
}
|
|
109
122
|
});
|
|
110
|
-
it('fetch 네트워크 오류 시
|
|
123
|
+
it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
|
|
111
124
|
mockFetch.mockRejectedValueOnce(new Error('Network error'));
|
|
112
125
|
const result = await fetchTemplateList();
|
|
113
|
-
expect(result).
|
|
126
|
+
expect(result.ok).toBe(false);
|
|
127
|
+
if (!result.ok) {
|
|
128
|
+
expect(result.error.code).toBe('NETWORK_ERROR');
|
|
129
|
+
}
|
|
114
130
|
});
|
|
115
|
-
it('인증 없는 상태에서
|
|
131
|
+
it('인증 없는 상태에서 NOT_AUTHENTICATED를 반환한다', async () => {
|
|
116
132
|
mockGetAuthData.mockReturnValue(null);
|
|
117
133
|
const result = await fetchTemplateList();
|
|
118
|
-
expect(result).
|
|
134
|
+
expect(result.ok).toBe(false);
|
|
135
|
+
if (!result.ok) {
|
|
136
|
+
expect(result.error.code).toBe('NOT_AUTHENTICATED');
|
|
137
|
+
}
|
|
119
138
|
expect(mockFetch).not.toHaveBeenCalled();
|
|
120
139
|
});
|
|
121
140
|
});
|
|
@@ -123,22 +142,27 @@ describe('fetchTemplateList()', () => {
|
|
|
123
142
|
// fetchTemplate
|
|
124
143
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
125
144
|
describe('fetchTemplate()', () => {
|
|
126
|
-
it('API 성공 시 템플릿 상세를 반환한다', async () => {
|
|
145
|
+
it('API 성공 시 ok: true와 템플릿 상세를 반환한다', async () => {
|
|
127
146
|
const template = { id: 'dashboard', name: 'Dashboard', sections: [] };
|
|
128
147
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, template }));
|
|
129
148
|
const result = await fetchTemplate('dashboard');
|
|
130
|
-
expect(result).
|
|
131
|
-
|
|
149
|
+
expect(result.ok).toBe(true);
|
|
150
|
+
if (result.ok) {
|
|
151
|
+
expect(result.data.id).toBe('dashboard');
|
|
152
|
+
}
|
|
132
153
|
});
|
|
133
|
-
it('API
|
|
154
|
+
it('API 응답 success: false 시 에러를 반환한다', async () => {
|
|
134
155
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false, error: 'not found' }));
|
|
135
156
|
const result = await fetchTemplate('nonexistent');
|
|
136
|
-
expect(result).
|
|
157
|
+
expect(result.ok).toBe(false);
|
|
137
158
|
});
|
|
138
|
-
it('fetch 네트워크 오류 시
|
|
159
|
+
it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
|
|
139
160
|
mockFetch.mockRejectedValueOnce(new Error('timeout'));
|
|
140
161
|
const result = await fetchTemplate('dashboard');
|
|
141
|
-
expect(result).
|
|
162
|
+
expect(result.ok).toBe(false);
|
|
163
|
+
if (!result.ok) {
|
|
164
|
+
expect(result.error.code).toBe('NETWORK_ERROR');
|
|
165
|
+
}
|
|
142
166
|
});
|
|
143
167
|
it('ID가 URL 인코딩되어 전달된다', async () => {
|
|
144
168
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, template: { id: 'my template' } }));
|
|
@@ -151,7 +175,7 @@ describe('fetchTemplate()', () => {
|
|
|
151
175
|
// fetchComponentList
|
|
152
176
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
153
177
|
describe('fetchComponentList()', () => {
|
|
154
|
-
it('API 성공 시 컴포넌트 목록을 반환한다', async () => {
|
|
178
|
+
it('API 성공 시 ok: true와 컴포넌트 목록을 반환한다', async () => {
|
|
155
179
|
const components = [
|
|
156
180
|
{
|
|
157
181
|
id: 'button',
|
|
@@ -165,25 +189,31 @@ describe('fetchComponentList()', () => {
|
|
|
165
189
|
];
|
|
166
190
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, components }));
|
|
167
191
|
const result = await fetchComponentList();
|
|
168
|
-
expect(result).
|
|
169
|
-
|
|
192
|
+
expect(result.ok).toBe(true);
|
|
193
|
+
if (result.ok) {
|
|
194
|
+
expect(result.data).toHaveLength(1);
|
|
195
|
+
expect(result.data[0].id).toBe('button');
|
|
196
|
+
}
|
|
170
197
|
});
|
|
171
|
-
it('API
|
|
198
|
+
it('API 응답 success: false 시 에러를 반환한다', async () => {
|
|
172
199
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false }));
|
|
173
200
|
const result = await fetchComponentList();
|
|
174
|
-
expect(result).
|
|
201
|
+
expect(result.ok).toBe(false);
|
|
175
202
|
});
|
|
176
|
-
it('fetch 네트워크 오류 시
|
|
203
|
+
it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
|
|
177
204
|
mockFetch.mockRejectedValueOnce(new Error('Network error'));
|
|
178
205
|
const result = await fetchComponentList();
|
|
179
|
-
expect(result).
|
|
206
|
+
expect(result.ok).toBe(false);
|
|
207
|
+
if (!result.ok) {
|
|
208
|
+
expect(result.error.code).toBe('NETWORK_ERROR');
|
|
209
|
+
}
|
|
180
210
|
});
|
|
181
211
|
});
|
|
182
212
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
183
213
|
// fetchComponent
|
|
184
214
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
185
215
|
describe('fetchComponent()', () => {
|
|
186
|
-
it('API 성공 시 컴포넌트 상세를 반환한다', async () => {
|
|
216
|
+
it('API 성공 시 ok: true와 컴포넌트 상세를 반환한다', async () => {
|
|
187
217
|
const component = {
|
|
188
218
|
id: 'button',
|
|
189
219
|
name: 'Button',
|
|
@@ -197,26 +227,31 @@ describe('fetchComponent()', () => {
|
|
|
197
227
|
};
|
|
198
228
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, component }));
|
|
199
229
|
const result = await fetchComponent('button');
|
|
200
|
-
expect(result).
|
|
201
|
-
|
|
202
|
-
|
|
230
|
+
expect(result.ok).toBe(true);
|
|
231
|
+
if (result.ok) {
|
|
232
|
+
expect(result.data.id).toBe('button');
|
|
233
|
+
expect(result.data.props).toBeDefined();
|
|
234
|
+
}
|
|
203
235
|
});
|
|
204
|
-
it('API
|
|
236
|
+
it('API 응답 success: false 시 에러를 반환한다', async () => {
|
|
205
237
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false, error: 'not found' }));
|
|
206
238
|
const result = await fetchComponent('nonexistent');
|
|
207
|
-
expect(result).
|
|
239
|
+
expect(result.ok).toBe(false);
|
|
208
240
|
});
|
|
209
|
-
it('fetch 네트워크 오류 시
|
|
241
|
+
it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
|
|
210
242
|
mockFetch.mockRejectedValueOnce(new Error('timeout'));
|
|
211
243
|
const result = await fetchComponent('button');
|
|
212
|
-
expect(result).
|
|
244
|
+
expect(result.ok).toBe(false);
|
|
245
|
+
if (!result.ok) {
|
|
246
|
+
expect(result.error.code).toBe('NETWORK_ERROR');
|
|
247
|
+
}
|
|
213
248
|
});
|
|
214
249
|
});
|
|
215
250
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
216
251
|
// fetchTokenList
|
|
217
252
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
218
253
|
describe('fetchTokenList()', () => {
|
|
219
|
-
it('type=all 요청 시 shells/pages/sections
|
|
254
|
+
it('type=all 요청 시 ok: true와 shells/pages/sections를 반환한다', async () => {
|
|
220
255
|
const responseBody = {
|
|
221
256
|
success: true,
|
|
222
257
|
shells: [{ id: 'shell.web.dashboard' }],
|
|
@@ -226,10 +261,13 @@ describe('fetchTokenList()', () => {
|
|
|
226
261
|
};
|
|
227
262
|
mockFetch.mockResolvedValueOnce(makeOkResponse(responseBody));
|
|
228
263
|
const result = await fetchTokenList('all');
|
|
229
|
-
expect(result.
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
264
|
+
expect(result.ok).toBe(true);
|
|
265
|
+
if (result.ok) {
|
|
266
|
+
expect(result.data.metadata.total).toBe(3);
|
|
267
|
+
expect(result.data.shells).toHaveLength(1);
|
|
268
|
+
expect(result.data.pages).toHaveLength(1);
|
|
269
|
+
expect(result.data.sections).toHaveLength(1);
|
|
270
|
+
}
|
|
233
271
|
});
|
|
234
272
|
it('type=shell 쿼리파라미터가 전달된다', async () => {
|
|
235
273
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, shells: [], metadata: { total: 0 } }));
|
|
@@ -237,11 +275,10 @@ describe('fetchTokenList()', () => {
|
|
|
237
275
|
const calledUrl = mockFetch.mock.calls[0][0];
|
|
238
276
|
expect(calledUrl).toContain('type=shell');
|
|
239
277
|
});
|
|
240
|
-
it('API
|
|
278
|
+
it('API 응답 success: false 시 에러를 반환한다', async () => {
|
|
241
279
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false }));
|
|
242
280
|
const result = await fetchTokenList('all');
|
|
243
|
-
expect(result.
|
|
244
|
-
expect(result.shells).toBeUndefined();
|
|
281
|
+
expect(result.ok).toBe(false);
|
|
245
282
|
});
|
|
246
283
|
it('tokenType 미지정 시 type=all로 요청된다', async () => {
|
|
247
284
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, metadata: { total: 0 } }));
|
|
@@ -254,22 +291,28 @@ describe('fetchTokenList()', () => {
|
|
|
254
291
|
// fetchCSSVariables
|
|
255
292
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
256
293
|
describe('fetchCSSVariables()', () => {
|
|
257
|
-
it('API 성공 시 CSS 문자열을 반환한다', async () => {
|
|
294
|
+
it('API 성공 시 ok: true와 CSS 문자열을 반환한다', async () => {
|
|
258
295
|
const css = ':root { --color-brand-500: oklch(0.5 0.2 240); }';
|
|
259
296
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, css }));
|
|
260
297
|
const result = await fetchCSSVariables('square-minimalism');
|
|
261
|
-
expect(result).toBe(
|
|
262
|
-
|
|
298
|
+
expect(result.ok).toBe(true);
|
|
299
|
+
if (result.ok) {
|
|
300
|
+
expect(result.data).toBe(css);
|
|
301
|
+
expect(result.data).toContain(':root');
|
|
302
|
+
}
|
|
263
303
|
});
|
|
264
|
-
it('API
|
|
304
|
+
it('API 응답 success: false 시 에러를 반환한다', async () => {
|
|
265
305
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false, error: 'not found' }));
|
|
266
306
|
const result = await fetchCSSVariables('nonexistent');
|
|
267
|
-
expect(result).
|
|
307
|
+
expect(result.ok).toBe(false);
|
|
268
308
|
});
|
|
269
|
-
it('fetch 네트워크 오류 시
|
|
309
|
+
it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
|
|
270
310
|
mockFetch.mockRejectedValueOnce(new Error('timeout'));
|
|
271
311
|
const result = await fetchCSSVariables('square-minimalism');
|
|
272
|
-
expect(result).
|
|
312
|
+
expect(result.ok).toBe(false);
|
|
313
|
+
if (!result.ok) {
|
|
314
|
+
expect(result.error.code).toBe('NETWORK_ERROR');
|
|
315
|
+
}
|
|
273
316
|
});
|
|
274
317
|
it('themeId와 /css 경로가 URL에 포함된다', async () => {
|
|
275
318
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, css: ':root {}' }));
|
|
@@ -283,26 +326,32 @@ describe('fetchCSSVariables()', () => {
|
|
|
283
326
|
// fetchScreenExamples
|
|
284
327
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
285
328
|
describe('fetchScreenExamples()', () => {
|
|
286
|
-
it('API 성공 시 스크린 예제 목록을 반환한다', async () => {
|
|
329
|
+
it('API 성공 시 ok: true와 스크린 예제 목록을 반환한다', async () => {
|
|
287
330
|
const examples = [
|
|
288
331
|
{ name: 'Team Grid', description: 'Grid layout', definition: { id: 'team-grid' } },
|
|
289
332
|
{ name: 'Login Form', description: 'Auth screen', definition: { id: 'login-screen' } },
|
|
290
333
|
];
|
|
291
334
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, examples }));
|
|
292
335
|
const result = await fetchScreenExamples();
|
|
293
|
-
expect(result).
|
|
294
|
-
|
|
295
|
-
|
|
336
|
+
expect(result.ok).toBe(true);
|
|
337
|
+
if (result.ok) {
|
|
338
|
+
expect(result.data).toHaveLength(2);
|
|
339
|
+
expect(result.data[0].name).toBe('Team Grid');
|
|
340
|
+
expect(result.data[1].definition.id).toBe('login-screen');
|
|
341
|
+
}
|
|
296
342
|
});
|
|
297
|
-
it('API
|
|
343
|
+
it('API 응답 success: false 시 에러를 반환한다', async () => {
|
|
298
344
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false }));
|
|
299
345
|
const result = await fetchScreenExamples();
|
|
300
|
-
expect(result).
|
|
346
|
+
expect(result.ok).toBe(false);
|
|
301
347
|
});
|
|
302
|
-
it('fetch 네트워크 오류 시
|
|
348
|
+
it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
|
|
303
349
|
mockFetch.mockRejectedValueOnce(new Error('Network error'));
|
|
304
350
|
const result = await fetchScreenExamples();
|
|
305
|
-
expect(result).
|
|
351
|
+
expect(result.ok).toBe(false);
|
|
352
|
+
if (!result.ok) {
|
|
353
|
+
expect(result.error.code).toBe('NETWORK_ERROR');
|
|
354
|
+
}
|
|
306
355
|
});
|
|
307
356
|
it('응답 예제에 name, description, definition이 포함된다', async () => {
|
|
308
357
|
const examples = [
|
|
@@ -314,10 +363,53 @@ describe('fetchScreenExamples()', () => {
|
|
|
314
363
|
];
|
|
315
364
|
mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, examples }));
|
|
316
365
|
const result = await fetchScreenExamples();
|
|
317
|
-
expect(result
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
366
|
+
expect(result.ok).toBe(true);
|
|
367
|
+
if (result.ok) {
|
|
368
|
+
expect(result.data[0]).toHaveProperty('name');
|
|
369
|
+
expect(result.data[0]).toHaveProperty('description');
|
|
370
|
+
expect(result.data[0]).toHaveProperty('definition');
|
|
371
|
+
expect(result.data[0].definition.shell).toBe('shell.web.dashboard');
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
376
|
+
// HTTP 에러 코드 분류 테스트
|
|
377
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
378
|
+
describe('HTTP 에러 코드 분류', () => {
|
|
379
|
+
it('401 응답 시 AUTH_FAILED 에러를 반환한다', async () => {
|
|
380
|
+
mockFetch.mockResolvedValueOnce(makeErrorResponse(401, { error: 'unauthorized' }));
|
|
381
|
+
const result = await fetchTemplate('pebble');
|
|
382
|
+
expect(result.ok).toBe(false);
|
|
383
|
+
if (!result.ok) {
|
|
384
|
+
expect(result.error.code).toBe('AUTH_FAILED');
|
|
385
|
+
expect(result.error.status).toBe(401);
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
it('403 응답 시 FORBIDDEN 에러를 반환한다', async () => {
|
|
389
|
+
mockFetch.mockResolvedValueOnce(makeErrorResponse(403, { error: 'Theme "pebble" is not included in your license.' }));
|
|
390
|
+
const result = await fetchTemplate('pebble');
|
|
391
|
+
expect(result.ok).toBe(false);
|
|
392
|
+
if (!result.ok) {
|
|
393
|
+
expect(result.error.code).toBe('FORBIDDEN');
|
|
394
|
+
expect(result.error.message).toContain('not included');
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
it('429 응답 시 RATE_LIMITED 에러를 반환한다', async () => {
|
|
398
|
+
mockFetch.mockResolvedValueOnce(makeErrorResponse(429, { error: 'Too many requests' }));
|
|
399
|
+
const result = await fetchTemplate('pebble');
|
|
400
|
+
expect(result.ok).toBe(false);
|
|
401
|
+
if (!result.ok) {
|
|
402
|
+
expect(result.error.code).toBe('RATE_LIMITED');
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
it('500 응답 시 SERVER_ERROR 에러를 반환한다', async () => {
|
|
406
|
+
mockFetch.mockResolvedValueOnce(makeErrorResponse(500, { error: 'Internal server error' }));
|
|
407
|
+
const result = await fetchTemplate('pebble');
|
|
408
|
+
expect(result.ok).toBe(false);
|
|
409
|
+
if (!result.ok) {
|
|
410
|
+
expect(result.error.code).toBe('SERVER_ERROR');
|
|
411
|
+
expect(result.error.status).toBe(500);
|
|
412
|
+
}
|
|
321
413
|
});
|
|
322
414
|
});
|
|
323
415
|
//# sourceMappingURL=data-client.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-client.test.js","sourceRoot":"","sources":["../../src/__tests__/data-client.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-client.test.js","sourceRoot":"","sources":["../../src/__tests__/data-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Result 타입 시스템
|
|
3
|
+
* 에러 유형을 명확히 구분하여 tool 핸들러가 적절한 메시지를 반환할 수 있게 함
|
|
4
|
+
*
|
|
5
|
+
* 기존 문제: apiFetch가 모든 실패를 null로 반환 → "라이선스 없음"으로 오해
|
|
6
|
+
* 해결: 에러 코드 기반 분류로 auth/forbidden/not_found/server/network 구분
|
|
7
|
+
*/
|
|
8
|
+
export type ApiErrorCode = 'AUTH_FAILED' | 'FORBIDDEN' | 'NOT_FOUND' | 'RATE_LIMITED' | 'SERVER_ERROR' | 'NETWORK_ERROR' | 'NOT_AUTHENTICATED';
|
|
9
|
+
export interface ApiError {
|
|
10
|
+
code: ApiErrorCode;
|
|
11
|
+
status?: number;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
export type ApiResult<T> = {
|
|
15
|
+
ok: true;
|
|
16
|
+
data: T;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
error: ApiError;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* HTTP 상태 코드 → ApiErrorCode 매핑
|
|
23
|
+
*/
|
|
24
|
+
export declare function mapStatusToErrorCode(status: number): ApiErrorCode;
|
|
25
|
+
/**
|
|
26
|
+
* Tool 핸들러용 에러 메시지 포맷터
|
|
27
|
+
* ApiError → 사용자 친화적 메시지 변환
|
|
28
|
+
*/
|
|
29
|
+
export declare function formatToolError(error: ApiError, context?: string): string;
|
|
30
|
+
//# sourceMappingURL=api-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-result.d.ts","sourceRoot":"","sources":["../../src/api/api-result.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,WAAW,GACX,WAAW,GACX,cAAc,GACd,cAAc,GACd,eAAe,GACf,mBAAmB,CAAC;AAExB,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC;AAElF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAcjE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBzE"}
|