@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.
Files changed (54) hide show
  1. package/README.md +24 -40
  2. package/dist/__tests__/data-client.test.d.ts +4 -4
  3. package/dist/__tests__/data-client.test.js +158 -66
  4. package/dist/__tests__/data-client.test.js.map +1 -1
  5. package/dist/api/api-result.d.ts +30 -0
  6. package/dist/api/api-result.d.ts.map +1 -0
  7. package/dist/api/api-result.js +50 -0
  8. package/dist/api/api-result.js.map +1 -0
  9. package/dist/api/data-client.d.ts +24 -26
  10. package/dist/api/data-client.d.ts.map +1 -1
  11. package/dist/api/data-client.js +209 -220
  12. package/dist/api/data-client.js.map +1 -1
  13. package/dist/data/recipe-resolver.d.ts.map +1 -1
  14. package/dist/data/recipe-resolver.js +6 -4
  15. package/dist/data/recipe-resolver.js.map +1 -1
  16. package/dist/data/template-matcher.d.ts.map +1 -1
  17. package/dist/data/template-matcher.js +2 -1
  18. package/dist/data/template-matcher.js.map +1 -1
  19. package/dist/generators/css-generator.js +4 -4
  20. package/dist/generators/css-generator.js.map +1 -1
  21. package/dist/tools/get-screen-generation-context.d.ts.map +1 -1
  22. package/dist/tools/get-screen-generation-context.js +9 -6
  23. package/dist/tools/get-screen-generation-context.js.map +1 -1
  24. package/dist/tools/list-components.d.ts.map +1 -1
  25. package/dist/tools/list-components.js +6 -1
  26. package/dist/tools/list-components.js.map +1 -1
  27. package/dist/tools/list-icon-libraries.d.ts.map +1 -1
  28. package/dist/tools/list-icon-libraries.js +5 -8
  29. package/dist/tools/list-icon-libraries.js.map +1 -1
  30. package/dist/tools/list-screen-templates.d.ts.map +1 -1
  31. package/dist/tools/list-screen-templates.js +8 -2
  32. package/dist/tools/list-screen-templates.js.map +1 -1
  33. package/dist/tools/list-themes.d.ts.map +1 -1
  34. package/dist/tools/list-themes.js +6 -1
  35. package/dist/tools/list-themes.js.map +1 -1
  36. package/dist/tools/list-tokens.d.ts.map +1 -1
  37. package/dist/tools/list-tokens.js +6 -1
  38. package/dist/tools/list-tokens.js.map +1 -1
  39. package/dist/tools/preview-component.d.ts.map +1 -1
  40. package/dist/tools/preview-component.js +16 -9
  41. package/dist/tools/preview-component.js.map +1 -1
  42. package/dist/tools/preview-icon-library.d.ts.map +1 -1
  43. package/dist/tools/preview-icon-library.js +5 -7
  44. package/dist/tools/preview-icon-library.js.map +1 -1
  45. package/dist/tools/preview-screen-template.d.ts.map +1 -1
  46. package/dist/tools/preview-screen-template.js +16 -9
  47. package/dist/tools/preview-screen-template.js.map +1 -1
  48. package/dist/tools/preview-theme.d.ts.map +1 -1
  49. package/dist/tools/preview-theme.js +6 -15
  50. package/dist/tools/preview-theme.js.map +1 -1
  51. package/dist/tools/validate-screen-definition.d.ts.map +1 -1
  52. package/dist/tools/validate-screen-definition.js +8 -4
  53. package/dist/tools/validate-screen-definition.js.map +1 -1
  54. 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` | 브라우저 OAuth 로그인 |
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/ # Static data registries (SPEC-MCP-003)
828
- │ │ ├── component-registry.ts # Component metadata registry
829
- │ │ └── component-metadata.json # Static component metadata
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
- - 22 test files
887
- - 214 test cases
887
+ - 29 test files
888
+ - 290 test cases
888
889
  - 100% pass rate
889
890
  - Zero failures
890
891
 
891
- ## Integration with @framingui/core
892
+ ## Architecture: API-Based Data Sources (v0.6.0)
892
893
 
893
- All MCP tools reuse `@framingui/core` functions:
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
- **Blueprint & Theme Tools**:
896
+ **Data Client** (`src/api/data-client.ts`):
896
897
 
897
- - `loadTheme()` - Theme loading
898
- - `listThemes()` - Theme enumeration
899
- - `createBlueprint()` - Blueprint creation
900
- - `validateBlueprint()` - Schema validation
901
- - `generateCSSVariables()` - CSS variable extraction
902
- - `render()` - Code generation
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
- **Screen Generation Tools** (SPEC-LAYOUT-002):
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**: 3.0.0 (stdio-based MCP standard + Component & Template Discovery)
1025
- **Last Updated**: 2026-02-01
1026
- **SPEC**: SPEC-MCP-002 v2.0.0, SPEC-LAYOUT-002 Phase 4, SPEC-MCP-003 v1.0.0
1027
- **Total Tools**: 13 (9 existing + 4 new discovery 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 실패 + 캐시 없음: 배열/null 반환
9
- * 3. 인증 없음: fetch 호출 없이 배열/null 반환
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 실패 + 캐시 없음: 배열/null 반환
9
- * 3. 인증 없음: fetch 호출 없이 배열/null 반환
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), // stale 캐시도 없음
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 (.ts 확장자로 직접 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).toHaveLength(1);
90
- expect(result[0].id).toBe('dashboard');
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 실패 배열을 반환한다', async () => {
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).toEqual([]);
118
+ expect(result.ok).toBe(false);
119
+ if (!result.ok) {
120
+ expect(result.error.code).toBe('SERVER_ERROR');
121
+ }
109
122
  });
110
- it('fetch 네트워크 오류 시 배열을 반환한다', async () => {
123
+ it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
111
124
  mockFetch.mockRejectedValueOnce(new Error('Network error'));
112
125
  const result = await fetchTemplateList();
113
- expect(result).toEqual([]);
126
+ expect(result.ok).toBe(false);
127
+ if (!result.ok) {
128
+ expect(result.error.code).toBe('NETWORK_ERROR');
129
+ }
114
130
  });
115
- it('인증 없는 상태에서 배열을 반환한다', async () => {
131
+ it('인증 없는 상태에서 NOT_AUTHENTICATED를 반환한다', async () => {
116
132
  mockGetAuthData.mockReturnValue(null);
117
133
  const result = await fetchTemplateList();
118
- expect(result).toEqual([]);
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).not.toBeNull();
131
- expect(result.id).toBe('dashboard');
149
+ expect(result.ok).toBe(true);
150
+ if (result.ok) {
151
+ expect(result.data.id).toBe('dashboard');
152
+ }
132
153
  });
133
- it('API 실패null을 반환한다', async () => {
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).toBeNull();
157
+ expect(result.ok).toBe(false);
137
158
  });
138
- it('fetch 네트워크 오류 시 null을 반환한다', async () => {
159
+ it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
139
160
  mockFetch.mockRejectedValueOnce(new Error('timeout'));
140
161
  const result = await fetchTemplate('dashboard');
141
- expect(result).toBeNull();
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).toHaveLength(1);
169
- expect(result[0].id).toBe('button');
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 실패 배열을 반환한다', async () => {
198
+ it('API 응답 success: false 에러를 반환한다', async () => {
172
199
  mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false }));
173
200
  const result = await fetchComponentList();
174
- expect(result).toEqual([]);
201
+ expect(result.ok).toBe(false);
175
202
  });
176
- it('fetch 네트워크 오류 시 배열을 반환한다', async () => {
203
+ it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
177
204
  mockFetch.mockRejectedValueOnce(new Error('Network error'));
178
205
  const result = await fetchComponentList();
179
- expect(result).toEqual([]);
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).not.toBeNull();
201
- expect(result?.id).toBe('button');
202
- expect(result?.props).toBeDefined();
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 실패null을 반환한다', async () => {
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).toBeNull();
239
+ expect(result.ok).toBe(false);
208
240
  });
209
- it('fetch 네트워크 오류 시 null을 반환한다', async () => {
241
+ it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
210
242
  mockFetch.mockRejectedValueOnce(new Error('timeout'));
211
243
  const result = await fetchComponent('button');
212
- expect(result).toBeNull();
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 포함 응답을 반환한다', async () => {
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.metadata.total).toBe(3);
230
- expect(result.shells).toHaveLength(1);
231
- expect(result.pages).toHaveLength(1);
232
- expect(result.sections).toHaveLength(1);
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 실패 metadata를 반환한다', async () => {
278
+ it('API 응답 success: false 에러를 반환한다', async () => {
241
279
  mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false }));
242
280
  const result = await fetchTokenList('all');
243
- expect(result.metadata.total).toBe(0);
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(css);
262
- expect(result).toContain(':root');
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 실패null을 반환한다', async () => {
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).toBeNull();
307
+ expect(result.ok).toBe(false);
268
308
  });
269
- it('fetch 네트워크 오류 시 null을 반환한다', async () => {
309
+ it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
270
310
  mockFetch.mockRejectedValueOnce(new Error('timeout'));
271
311
  const result = await fetchCSSVariables('square-minimalism');
272
- expect(result).toBeNull();
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).toHaveLength(2);
294
- expect(result[0].name).toBe('Team Grid');
295
- expect(result[1].definition.id).toBe('login-screen');
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 실패 배열을 반환한다', async () => {
343
+ it('API 응답 success: false 에러를 반환한다', async () => {
298
344
  mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false }));
299
345
  const result = await fetchScreenExamples();
300
- expect(result).toEqual([]);
346
+ expect(result.ok).toBe(false);
301
347
  });
302
- it('fetch 네트워크 오류 시 배열을 반환한다', async () => {
348
+ it('fetch 네트워크 오류 시 NETWORK_ERROR를 반환한다', async () => {
303
349
  mockFetch.mockRejectedValueOnce(new Error('Network error'));
304
350
  const result = await fetchScreenExamples();
305
- expect(result).toEqual([]);
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[0]).toHaveProperty('name');
318
- expect(result[0]).toHaveProperty('description');
319
- expect(result[0]).toHaveProperty('definition');
320
- expect(result[0].definition.shell).toBe('shell.web.dashboard');
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":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,gFAAgF;AAChF,0DAA0D;AAC1D,gFAAgF;AAChF,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1F,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;IACxB,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;IACzB,0BAA0B,EAAE,EAAE,CAAC,EAAE,EAAE;CACpC,CAAC,CAAC,CAAC;AAEJ,oDAAoD;AACpD,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,WAAW,EAAE,eAAe;IAC5B,YAAY,EAAE,gBAAgB;CAC/B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,sBAAsB,EAAE,0BAA0B;CACnD,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC,CAAC,CAAC;AAEJ,gDAAgD;AAChD,oDAAoD;AACpD,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC/B,OAAO;QACL,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7C,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,QAAQ;YAC5C,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,eAAe;YACxD,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YACf,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;YACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;SACjC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;AAEzB,gFAAgF;AAChF,gDAAgD;AAChD,gFAAgF;AAEhF,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,gFAAgF;AAChF,KAAK;AACL,gFAAgF;AAChF,SAAS,cAAc,CAAC,IAAa;IACnC,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAChF,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,eAAe,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,gBAAgB,CAAC,eAAe,CAC9B,oFAAoF,CACrF,CAAC;IACF,0BAA0B,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAChF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,SAAS,GAAG;YAChB;gBACE,EAAE,EAAE,WAAW;gBACf,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,EAAE;gBACf,uBAAuB,EAAE,CAAC;aAC3B;SACF,CAAC;QACF,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEzC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAElF,MAAM,iBAAiB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAElF,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAExF,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAChF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACtE,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAExF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;QAElD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CACnE,CAAC;QAEF,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;QAEnC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAChF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,UAAU,GAAG;YACjB;gBACE,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;gBACP,WAAW,EAAE,EAAE;gBACf,aAAa,EAAE,CAAC;gBAChB,gBAAgB,EAAE,KAAK;aACxB;SACF,CAAC;QACF,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAE/E,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAChF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,SAAS,GAAG;YAChB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,CAAC;YACP,WAAW,EAAE,aAAa;YAC1B,aAAa,EAAE,CAAC;YAChB,gBAAgB,EAAE,KAAK;YACvB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAExF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;QAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAChF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,YAAY,GAAG;YACnB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,CAAC;YACvC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC;YACjC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,mBAAmB,EAAE,CAAC;YACvC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SACvB,CAAC;QACF,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,SAAS,CAAC,qBAAqB,CAC7B,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACtE,CAAC;QAEF,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAE9B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAE3F,MAAM,cAAc,EAAE,CAAC;QAEvB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAChF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,GAAG,GAAG,kDAAkD,CAAC;QAC/D,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAExF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAEtD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAEpF,MAAM,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAChF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,QAAQ,GAAG;YACf,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE;YAClF,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE;SACvF,CAAC;QACF,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,QAAQ,GAAG;YACf;gBACE,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,WAAW;gBACxB,UAAU,EAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,qBAAqB,EAAE;aACvE;SACF,CAAC;QACF,SAAS,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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"}