@framingui/mcp-server 0.5.5 → 0.6.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.
Files changed (90) hide show
  1. package/dist/__tests__/cache.test.d.ts +6 -0
  2. package/dist/__tests__/cache.test.d.ts.map +1 -0
  3. package/dist/__tests__/cache.test.js +86 -0
  4. package/dist/__tests__/cache.test.js.map +1 -0
  5. package/dist/__tests__/data-client.test.d.ts +13 -0
  6. package/dist/__tests__/data-client.test.d.ts.map +1 -0
  7. package/dist/__tests__/data-client.test.js +323 -0
  8. package/dist/__tests__/data-client.test.js.map +1 -0
  9. package/dist/api/data-client.d.ts +124 -0
  10. package/dist/api/data-client.d.ts.map +1 -0
  11. package/dist/api/data-client.js +331 -0
  12. package/dist/api/data-client.js.map +1 -0
  13. package/dist/auth/cache.d.ts +5 -0
  14. package/dist/auth/cache.d.ts.map +1 -1
  15. package/dist/auth/cache.js +11 -0
  16. package/dist/auth/cache.js.map +1 -1
  17. package/dist/auth/state.d.ts +8 -0
  18. package/dist/auth/state.d.ts.map +1 -1
  19. package/dist/auth/state.js +15 -0
  20. package/dist/auth/state.js.map +1 -1
  21. package/dist/data/recipe-resolver.d.ts +6 -5
  22. package/dist/data/recipe-resolver.d.ts.map +1 -1
  23. package/dist/data/recipe-resolver.js +23 -18
  24. package/dist/data/recipe-resolver.js.map +1 -1
  25. package/dist/data/template-matcher.d.ts +7 -1
  26. package/dist/data/template-matcher.d.ts.map +1 -1
  27. package/dist/data/template-matcher.js +18 -5
  28. package/dist/data/template-matcher.js.map +1 -1
  29. package/dist/generators/core-resolver.d.ts +7 -13
  30. package/dist/generators/core-resolver.d.ts.map +1 -1
  31. package/dist/generators/core-resolver.js +7 -84
  32. package/dist/generators/core-resolver.js.map +1 -1
  33. package/dist/generators/css-generator.d.ts +8 -26
  34. package/dist/generators/css-generator.d.ts.map +1 -1
  35. package/dist/generators/css-generator.js +17 -265
  36. package/dist/generators/css-generator.js.map +1 -1
  37. package/dist/generators/index.d.ts +2 -2
  38. package/dist/generators/index.d.ts.map +1 -1
  39. package/dist/generators/index.js +4 -2
  40. package/dist/generators/index.js.map +1 -1
  41. package/dist/index.js +2 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/schemas/mcp-schemas.d.ts +351 -351
  44. package/dist/tools/export-screen.d.ts.map +1 -1
  45. package/dist/tools/export-screen.js +8 -11
  46. package/dist/tools/export-screen.js.map +1 -1
  47. package/dist/tools/get-screen-generation-context.d.ts +1 -0
  48. package/dist/tools/get-screen-generation-context.d.ts.map +1 -1
  49. package/dist/tools/get-screen-generation-context.js +38 -27
  50. package/dist/tools/get-screen-generation-context.js.map +1 -1
  51. package/dist/tools/list-components.d.ts +2 -1
  52. package/dist/tools/list-components.d.ts.map +1 -1
  53. package/dist/tools/list-components.js +20 -14
  54. package/dist/tools/list-components.js.map +1 -1
  55. package/dist/tools/list-icon-libraries.d.ts +2 -1
  56. package/dist/tools/list-icon-libraries.d.ts.map +1 -1
  57. package/dist/tools/list-icon-libraries.js +4 -3
  58. package/dist/tools/list-icon-libraries.js.map +1 -1
  59. package/dist/tools/list-screen-templates.d.ts +2 -1
  60. package/dist/tools/list-screen-templates.d.ts.map +1 -1
  61. package/dist/tools/list-screen-templates.js +23 -25
  62. package/dist/tools/list-screen-templates.js.map +1 -1
  63. package/dist/tools/list-themes.d.ts +3 -4
  64. package/dist/tools/list-themes.d.ts.map +1 -1
  65. package/dist/tools/list-themes.js +7 -15
  66. package/dist/tools/list-themes.js.map +1 -1
  67. package/dist/tools/list-tokens.d.ts +2 -1
  68. package/dist/tools/list-tokens.d.ts.map +1 -1
  69. package/dist/tools/list-tokens.js +8 -37
  70. package/dist/tools/list-tokens.js.map +1 -1
  71. package/dist/tools/preview-component.d.ts +1 -0
  72. package/dist/tools/preview-component.d.ts.map +1 -1
  73. package/dist/tools/preview-component.js +21 -23
  74. package/dist/tools/preview-component.js.map +1 -1
  75. package/dist/tools/preview-icon-library.d.ts +2 -1
  76. package/dist/tools/preview-icon-library.d.ts.map +1 -1
  77. package/dist/tools/preview-icon-library.js +7 -13
  78. package/dist/tools/preview-icon-library.js.map +1 -1
  79. package/dist/tools/preview-screen-template.d.ts +1 -0
  80. package/dist/tools/preview-screen-template.d.ts.map +1 -1
  81. package/dist/tools/preview-screen-template.js +5 -3
  82. package/dist/tools/preview-screen-template.js.map +1 -1
  83. package/dist/tools/preview-theme.d.ts +2 -2
  84. package/dist/tools/preview-theme.d.ts.map +1 -1
  85. package/dist/tools/preview-theme.js +17 -14
  86. package/dist/tools/preview-theme.js.map +1 -1
  87. package/dist/tools/validate-screen-definition.d.ts.map +1 -1
  88. package/dist/tools/validate-screen-definition.js +49 -12
  89. package/dist/tools/validate-screen-definition.js.map +1 -1
  90. package/package.json +2 -4
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MemoryCache 테스트
3
+ * SPEC-MCP-007:S-004 - getStale() 메서드: TTL 만료 후에도 캐시 값 반환
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cache.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cache.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * MemoryCache 테스트
3
+ * SPEC-MCP-007:S-004 - getStale() 메서드: TTL 만료 후에도 캐시 값 반환
4
+ */
5
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
6
+ // vitest에서 .js 확장자는 dist 파일을 참조할 수 있으므로 .ts 확장자로 직접 import
7
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
8
+ // @ts-ignore
9
+ import { MemoryCache } from '../auth/cache.ts';
10
+ describe('MemoryCache', () => {
11
+ let cache;
12
+ beforeEach(() => {
13
+ cache = new MemoryCache();
14
+ vi.useRealTimers();
15
+ });
16
+ describe('set / get (기본 동작)', () => {
17
+ it('TTL 이내에 get()으로 값을 반환한다', () => {
18
+ cache.set('key1', 'value1', 10_000);
19
+ expect(cache.get('key1')).toBe('value1');
20
+ });
21
+ it('존재하지 않는 키에 대해 null을 반환한다', () => {
22
+ expect(cache.get('non-existent')).toBeNull();
23
+ });
24
+ it('TTL 만료 후 get()은 null을 반환한다', () => {
25
+ vi.useFakeTimers();
26
+ cache.set('key2', 'expired', 1_000);
27
+ // TTL(1초) 이후로 시간 이동
28
+ vi.advanceTimersByTime(1_001);
29
+ expect(cache.get('key2')).toBeNull();
30
+ vi.useRealTimers();
31
+ });
32
+ });
33
+ describe('getStale()', () => {
34
+ it('TTL 이내에 getStale()은 값을 반환한다', () => {
35
+ cache.set('key3', 'fresh', 10_000);
36
+ expect(cache.getStale('key3')).toBe('fresh');
37
+ });
38
+ it('TTL 만료 후에도 getStale()은 값을 반환한다 (stale 허용)', () => {
39
+ vi.useFakeTimers();
40
+ cache.set('key4', 'stale-value', 500);
41
+ // TTL 만료
42
+ vi.advanceTimersByTime(1_000);
43
+ // getStale()은 만료 후에도 값을 반환해야 한다
44
+ // 주의: get()을 먼저 호출하면 만료된 항목이 삭제됨
45
+ expect(cache.getStale('key4')).toBe('stale-value');
46
+ // get()은 만료된 항목을 삭제하고 null을 반환한다
47
+ const freshCache = new MemoryCache();
48
+ freshCache.set('key4b', 'stale-value-b', 500);
49
+ vi.advanceTimersByTime(1_000);
50
+ expect(freshCache.get('key4b')).toBeNull();
51
+ // get() 호출 후에는 항목이 삭제되어 getStale()도 null 반환
52
+ expect(freshCache.getStale('key4b')).toBeNull();
53
+ vi.useRealTimers();
54
+ });
55
+ it('키가 설정된 적 없으면 getStale()은 null을 반환한다', () => {
56
+ expect(cache.getStale('never-set')).toBeNull();
57
+ });
58
+ it('delete() 후 getStale()은 null을 반환한다', () => {
59
+ cache.set('key5', 'to-delete', 10_000);
60
+ cache.delete('key5');
61
+ expect(cache.getStale('key5')).toBeNull();
62
+ });
63
+ });
64
+ describe('delete / clear', () => {
65
+ it('delete()로 특정 키를 제거한다', () => {
66
+ cache.set('key6', 'val6', 10_000);
67
+ cache.delete('key6');
68
+ expect(cache.get('key6')).toBeNull();
69
+ });
70
+ it('clear()로 모든 캐시를 비운다', () => {
71
+ cache.set('a', 'aa', 10_000);
72
+ cache.set('b', 'bb', 10_000);
73
+ cache.clear();
74
+ expect(cache.size()).toBe(0);
75
+ });
76
+ });
77
+ describe('size()', () => {
78
+ it('항목 추가 수만큼 size()가 증가한다', () => {
79
+ expect(cache.size()).toBe(0);
80
+ cache.set('s1', 'v1', 10_000);
81
+ cache.set('s2', 'v2', 10_000);
82
+ expect(cache.size()).toBe(2);
83
+ });
84
+ });
85
+ });
86
+ //# sourceMappingURL=cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../../src/__tests__/cache.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * data-client.ts 테스트
3
+ * SPEC-MCP-007 Phase 2 - fetchTemplateList, fetchTemplate, fetchComponentList,
4
+ * fetchComponent, fetchTokenList, fetchCSSVariables, fetchScreenExamples
5
+ *
6
+ * 테스트 시나리오:
7
+ * 1. 캐시 미스: fetch 호출 → 결과 반환
8
+ * 2. API 실패 + 캐시 없음: 빈 배열/null 반환
9
+ * 3. 인증 없음: fetch 호출 없이 빈 배열/null 반환
10
+ * 4. URL 파라미터 전달 확인
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=data-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/data-client.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,323 @@
1
+ /**
2
+ * data-client.ts 테스트
3
+ * SPEC-MCP-007 Phase 2 - fetchTemplateList, fetchTemplate, fetchComponentList,
4
+ * fetchComponent, fetchTokenList, fetchCSSVariables, fetchScreenExamples
5
+ *
6
+ * 테스트 시나리오:
7
+ * 1. 캐시 미스: fetch 호출 → 결과 반환
8
+ * 2. API 실패 + 캐시 없음: 빈 배열/null 반환
9
+ * 3. 인증 없음: fetch 호출 없이 빈 배열/null 반환
10
+ * 4. URL 파라미터 전달 확인
11
+ */
12
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
13
+ // ─────────────────────────────────────────────────────────────────────────────
14
+ // vi.mock 호이스팅: factory 안에서 참조할 mock 함수를 vi.hoisted()로 선언
15
+ // ─────────────────────────────────────────────────────────────────────────────
16
+ const { mockGetAuthData, mockGetRawApiKey, mockResolveFraminguiApiUrl } = vi.hoisted(() => ({
17
+ mockGetAuthData: vi.fn(),
18
+ mockGetRawApiKey: vi.fn(),
19
+ mockResolveFraminguiApiUrl: vi.fn(),
20
+ }));
21
+ // data-client.ts가 .js 확장자로 import하므로 mock도 동일 경로 사용
22
+ vi.mock('../auth/state.js', () => ({
23
+ getAuthData: mockGetAuthData,
24
+ getRawApiKey: mockGetRawApiKey,
25
+ }));
26
+ vi.mock('../utils/api-url.js', () => ({
27
+ resolveFraminguiApiUrl: mockResolveFraminguiApiUrl,
28
+ }));
29
+ vi.mock('../utils/logger.js', () => ({
30
+ info: vi.fn(),
31
+ error: vi.fn(),
32
+ }));
33
+ // MemoryCache를 mock으로 교체 - 캐시가 항상 miss인 상태로 테스트
34
+ // (data-client.ts의 스코프에서 MemoryCache new 호출 결과를 제어)
35
+ vi.mock('../auth/cache.js', () => {
36
+ return {
37
+ MemoryCache: vi.fn().mockImplementation(() => ({
38
+ get: vi.fn().mockReturnValue(null), // 캐시 미스
39
+ getStale: vi.fn().mockReturnValue(null), // stale 캐시도 없음
40
+ set: vi.fn(),
41
+ delete: vi.fn(),
42
+ clear: vi.fn(),
43
+ size: vi.fn().mockReturnValue(0),
44
+ })),
45
+ };
46
+ });
47
+ // global fetch 목업
48
+ const mockFetch = vi.fn();
49
+ global.fetch = mockFetch;
50
+ // ─────────────────────────────────────────────────────────────────────────────
51
+ // 테스트 대상 import (.ts 확장자로 직접 import해서 최신 소스 사용)
52
+ // ─────────────────────────────────────────────────────────────────────────────
53
+ import { fetchTemplateList, fetchTemplate, fetchComponentList, fetchComponent, fetchTokenList, fetchCSSVariables, fetchScreenExamples, } from '../api/data-client.js';
54
+ // ─────────────────────────────────────────────────────────────────────────────
55
+ // 헬퍼
56
+ // ─────────────────────────────────────────────────────────────────────────────
57
+ function makeOkResponse(body) {
58
+ return {
59
+ ok: true,
60
+ status: 200,
61
+ json: vi.fn().mockResolvedValue(body),
62
+ };
63
+ }
64
+ // ─────────────────────────────────────────────────────────────────────────────
65
+ // 공통 beforeEach
66
+ // ─────────────────────────────────────────────────────────────────────────────
67
+ beforeEach(() => {
68
+ vi.clearAllMocks();
69
+ mockGetAuthData.mockReturnValue({ valid: true });
70
+ mockGetRawApiKey.mockReturnValue('tk_live_test_key_00000000000000000000000000000000000000000000000000000000000000000');
71
+ mockResolveFraminguiApiUrl.mockReturnValue({ apiUrl: 'https://framingui.com' });
72
+ });
73
+ // ─────────────────────────────────────────────────────────────────────────────
74
+ // fetchTemplateList
75
+ // ─────────────────────────────────────────────────────────────────────────────
76
+ describe('fetchTemplateList()', () => {
77
+ it('API 성공 시 템플릿 목록을 반환한다', async () => {
78
+ const templates = [
79
+ {
80
+ id: 'dashboard',
81
+ name: 'Dashboard',
82
+ category: 'web',
83
+ description: '',
84
+ requiredComponentsCount: 3,
85
+ },
86
+ ];
87
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, templates }));
88
+ const result = await fetchTemplateList();
89
+ expect(result).toHaveLength(1);
90
+ expect(result[0].id).toBe('dashboard');
91
+ expect(mockFetch).toHaveBeenCalledOnce();
92
+ });
93
+ it('category 파라미터를 쿼리스트링으로 전달한다', async () => {
94
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, templates: [] }));
95
+ await fetchTemplateList({ category: 'mobile' });
96
+ const calledUrl = mockFetch.mock.calls[0][0];
97
+ expect(calledUrl).toContain('category=mobile');
98
+ });
99
+ it('search 파라미터를 쿼리스트링으로 전달한다', async () => {
100
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, templates: [] }));
101
+ await fetchTemplateList({ search: 'login' });
102
+ const calledUrl = mockFetch.mock.calls[0][0];
103
+ expect(calledUrl).toContain('search=login');
104
+ });
105
+ it('API 실패 시 빈 배열을 반환한다', async () => {
106
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false, error: 'not found' }));
107
+ const result = await fetchTemplateList();
108
+ expect(result).toEqual([]);
109
+ });
110
+ it('fetch 네트워크 오류 시 빈 배열을 반환한다', async () => {
111
+ mockFetch.mockRejectedValueOnce(new Error('Network error'));
112
+ const result = await fetchTemplateList();
113
+ expect(result).toEqual([]);
114
+ });
115
+ it('인증 없는 상태에서 빈 배열을 반환한다', async () => {
116
+ mockGetAuthData.mockReturnValue(null);
117
+ const result = await fetchTemplateList();
118
+ expect(result).toEqual([]);
119
+ expect(mockFetch).not.toHaveBeenCalled();
120
+ });
121
+ });
122
+ // ─────────────────────────────────────────────────────────────────────────────
123
+ // fetchTemplate
124
+ // ─────────────────────────────────────────────────────────────────────────────
125
+ describe('fetchTemplate()', () => {
126
+ it('API 성공 시 템플릿 상세를 반환한다', async () => {
127
+ const template = { id: 'dashboard', name: 'Dashboard', sections: [] };
128
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, template }));
129
+ const result = await fetchTemplate('dashboard');
130
+ expect(result).not.toBeNull();
131
+ expect(result.id).toBe('dashboard');
132
+ });
133
+ it('API 실패 시 null을 반환한다', async () => {
134
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false, error: 'not found' }));
135
+ const result = await fetchTemplate('nonexistent');
136
+ expect(result).toBeNull();
137
+ });
138
+ it('fetch 네트워크 오류 시 null을 반환한다', async () => {
139
+ mockFetch.mockRejectedValueOnce(new Error('timeout'));
140
+ const result = await fetchTemplate('dashboard');
141
+ expect(result).toBeNull();
142
+ });
143
+ it('ID가 URL 인코딩되어 전달된다', async () => {
144
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, template: { id: 'my template' } }));
145
+ await fetchTemplate('my template');
146
+ const calledUrl = mockFetch.mock.calls[0][0];
147
+ expect(calledUrl).toContain('my%20template');
148
+ });
149
+ });
150
+ // ─────────────────────────────────────────────────────────────────────────────
151
+ // fetchComponentList
152
+ // ─────────────────────────────────────────────────────────────────────────────
153
+ describe('fetchComponentList()', () => {
154
+ it('API 성공 시 컴포넌트 목록을 반환한다', async () => {
155
+ const components = [
156
+ {
157
+ id: 'button',
158
+ name: 'Button',
159
+ category: 'core',
160
+ tier: 1,
161
+ description: '',
162
+ variantsCount: 6,
163
+ hasSubComponents: false,
164
+ },
165
+ ];
166
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, components }));
167
+ const result = await fetchComponentList();
168
+ expect(result).toHaveLength(1);
169
+ expect(result[0].id).toBe('button');
170
+ });
171
+ it('API 실패 시 빈 배열을 반환한다', async () => {
172
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false }));
173
+ const result = await fetchComponentList();
174
+ expect(result).toEqual([]);
175
+ });
176
+ it('fetch 네트워크 오류 시 빈 배열을 반환한다', async () => {
177
+ mockFetch.mockRejectedValueOnce(new Error('Network error'));
178
+ const result = await fetchComponentList();
179
+ expect(result).toEqual([]);
180
+ });
181
+ });
182
+ // ─────────────────────────────────────────────────────────────────────────────
183
+ // fetchComponent
184
+ // ─────────────────────────────────────────────────────────────────────────────
185
+ describe('fetchComponent()', () => {
186
+ it('API 성공 시 컴포넌트 상세를 반환한다', async () => {
187
+ const component = {
188
+ id: 'button',
189
+ name: 'Button',
190
+ category: 'core',
191
+ tier: 1,
192
+ description: 'Button desc',
193
+ variantsCount: 6,
194
+ hasSubComponents: false,
195
+ props: [],
196
+ variants: [],
197
+ };
198
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, component }));
199
+ const result = await fetchComponent('button');
200
+ expect(result).not.toBeNull();
201
+ expect(result?.id).toBe('button');
202
+ expect(result?.props).toBeDefined();
203
+ });
204
+ it('API 실패 시 null을 반환한다', async () => {
205
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false, error: 'not found' }));
206
+ const result = await fetchComponent('nonexistent');
207
+ expect(result).toBeNull();
208
+ });
209
+ it('fetch 네트워크 오류 시 null을 반환한다', async () => {
210
+ mockFetch.mockRejectedValueOnce(new Error('timeout'));
211
+ const result = await fetchComponent('button');
212
+ expect(result).toBeNull();
213
+ });
214
+ });
215
+ // ─────────────────────────────────────────────────────────────────────────────
216
+ // fetchTokenList
217
+ // ─────────────────────────────────────────────────────────────────────────────
218
+ describe('fetchTokenList()', () => {
219
+ it('type=all 요청 시 shells/pages/sections 포함 응답을 반환한다', async () => {
220
+ const responseBody = {
221
+ success: true,
222
+ shells: [{ id: 'shell.web.dashboard' }],
223
+ pages: [{ id: 'page.dashboard' }],
224
+ sections: [{ id: 'section.container' }],
225
+ metadata: { total: 3 },
226
+ };
227
+ mockFetch.mockResolvedValueOnce(makeOkResponse(responseBody));
228
+ 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);
233
+ });
234
+ it('type=shell 쿼리파라미터가 전달된다', async () => {
235
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, shells: [], metadata: { total: 0 } }));
236
+ await fetchTokenList('shell');
237
+ const calledUrl = mockFetch.mock.calls[0][0];
238
+ expect(calledUrl).toContain('type=shell');
239
+ });
240
+ it('API 실패 시 빈 metadata를 반환한다', async () => {
241
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false }));
242
+ const result = await fetchTokenList('all');
243
+ expect(result.metadata.total).toBe(0);
244
+ expect(result.shells).toBeUndefined();
245
+ });
246
+ it('tokenType 미지정 시 type=all로 요청된다', async () => {
247
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, metadata: { total: 0 } }));
248
+ await fetchTokenList();
249
+ const calledUrl = mockFetch.mock.calls[0][0];
250
+ expect(calledUrl).toContain('type=all');
251
+ });
252
+ });
253
+ // ─────────────────────────────────────────────────────────────────────────────
254
+ // fetchCSSVariables
255
+ // ─────────────────────────────────────────────────────────────────────────────
256
+ describe('fetchCSSVariables()', () => {
257
+ it('API 성공 시 CSS 문자열을 반환한다', async () => {
258
+ const css = ':root { --color-brand-500: oklch(0.5 0.2 240); }';
259
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, css }));
260
+ const result = await fetchCSSVariables('square-minimalism');
261
+ expect(result).toBe(css);
262
+ expect(result).toContain(':root');
263
+ });
264
+ it('API 실패 시 null을 반환한다', async () => {
265
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false, error: 'not found' }));
266
+ const result = await fetchCSSVariables('nonexistent');
267
+ expect(result).toBeNull();
268
+ });
269
+ it('fetch 네트워크 오류 시 null을 반환한다', async () => {
270
+ mockFetch.mockRejectedValueOnce(new Error('timeout'));
271
+ const result = await fetchCSSVariables('square-minimalism');
272
+ expect(result).toBeNull();
273
+ });
274
+ it('themeId와 /css 경로가 URL에 포함된다', async () => {
275
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, css: ':root {}' }));
276
+ await fetchCSSVariables('dark-boldness');
277
+ const calledUrl = mockFetch.mock.calls[0][0];
278
+ expect(calledUrl).toContain('dark-boldness');
279
+ expect(calledUrl).toContain('/css');
280
+ });
281
+ });
282
+ // ─────────────────────────────────────────────────────────────────────────────
283
+ // fetchScreenExamples
284
+ // ─────────────────────────────────────────────────────────────────────────────
285
+ describe('fetchScreenExamples()', () => {
286
+ it('API 성공 시 스크린 예제 목록을 반환한다', async () => {
287
+ const examples = [
288
+ { name: 'Team Grid', description: 'Grid layout', definition: { id: 'team-grid' } },
289
+ { name: 'Login Form', description: 'Auth screen', definition: { id: 'login-screen' } },
290
+ ];
291
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, examples }));
292
+ 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');
296
+ });
297
+ it('API 실패 시 빈 배열을 반환한다', async () => {
298
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: false }));
299
+ const result = await fetchScreenExamples();
300
+ expect(result).toEqual([]);
301
+ });
302
+ it('fetch 네트워크 오류 시 빈 배열을 반환한다', async () => {
303
+ mockFetch.mockRejectedValueOnce(new Error('Network error'));
304
+ const result = await fetchScreenExamples();
305
+ expect(result).toEqual([]);
306
+ });
307
+ it('응답 예제에 name, description, definition이 포함된다', async () => {
308
+ const examples = [
309
+ {
310
+ name: 'Dashboard',
311
+ description: 'Analytics',
312
+ definition: { id: 'dashboard-overview', shell: 'shell.web.dashboard' },
313
+ },
314
+ ];
315
+ mockFetch.mockResolvedValueOnce(makeOkResponse({ success: true, examples }));
316
+ 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');
321
+ });
322
+ });
323
+ //# sourceMappingURL=data-client.test.js.map
@@ -0,0 +1 @@
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,124 @@
1
+ /**
2
+ * MCP 서버 API 데이터 클라이언트
3
+ * 로컬 파일 시스템 읽기를 framingui.com API fetch로 대체
4
+ *
5
+ * 기존 인프라 재사용:
6
+ * - resolveFraminguiApiUrl(): base URL 결정
7
+ * - getAuthData(): API key 가져오기
8
+ * - MemoryCache: 인메모리 캐시 (TTL: 10분)
9
+ */
10
+ export interface ThemeMeta {
11
+ id: string;
12
+ name: string;
13
+ description?: string;
14
+ brandTone: string;
15
+ schemaVersion: string;
16
+ }
17
+ export interface IconLibMeta {
18
+ id: string;
19
+ name: string;
20
+ description: string;
21
+ version: string;
22
+ license: string;
23
+ totalIcons: number;
24
+ categories: string[];
25
+ }
26
+ export interface ComponentMeta {
27
+ id: string;
28
+ name: string;
29
+ category: string;
30
+ tier: number;
31
+ description: string;
32
+ variantsCount: number;
33
+ hasSubComponents: boolean;
34
+ }
35
+ export interface ComponentDetail extends ComponentMeta {
36
+ props?: any[];
37
+ variants?: any[];
38
+ subComponents?: string[];
39
+ importStatement?: string;
40
+ dependencies?: {
41
+ internal: string[];
42
+ external: string[];
43
+ };
44
+ examples?: any[];
45
+ accessibility?: string;
46
+ }
47
+ export interface TemplateMeta {
48
+ id: string;
49
+ name: string;
50
+ category: string;
51
+ description: string;
52
+ requiredComponentsCount: number;
53
+ layoutType?: string;
54
+ version?: string;
55
+ tags?: string[];
56
+ }
57
+ export interface TokenListResponse {
58
+ shells?: any[];
59
+ pages?: any[];
60
+ sections?: any[];
61
+ metadata: {
62
+ total: number;
63
+ };
64
+ }
65
+ export interface ScreenExample {
66
+ name: string;
67
+ description: string;
68
+ definition: any;
69
+ }
70
+ /**
71
+ * 테마 목록 조회 (라이선스 보유 테마만)
72
+ */
73
+ export declare function fetchThemeList(): Promise<ThemeMeta[]>;
74
+ /**
75
+ * 단일 테마 상세 조회 (전체 ThemeV2 JSON)
76
+ */
77
+ export declare function fetchTheme(themeId: string): Promise<any | null>;
78
+ /**
79
+ * 아이콘 라이브러리 목록 조회
80
+ */
81
+ export declare function fetchIconLibraryList(): Promise<IconLibMeta[]>;
82
+ /**
83
+ * 단일 아이콘 라이브러리 상세 조회 (전체 IconLibrary JSON)
84
+ */
85
+ export declare function fetchIconLibrary(libraryId: string): Promise<any | null>;
86
+ /**
87
+ * 스크린 템플릿 목록 조회
88
+ * [SPEC-MCP-007:E-001]
89
+ */
90
+ export declare function fetchTemplateList(params?: {
91
+ category?: string;
92
+ search?: string;
93
+ }): Promise<TemplateMeta[]>;
94
+ /**
95
+ * 단일 스크린 템플릿 상세 조회
96
+ * [SPEC-MCP-007:E-002]
97
+ */
98
+ export declare function fetchTemplate(templateId: string): Promise<any | null>;
99
+ /**
100
+ * UI 컴포넌트 목록 조회 (전체 카탈로그)
101
+ * [SPEC-MCP-007:E-003]
102
+ */
103
+ export declare function fetchComponentList(): Promise<ComponentMeta[]>;
104
+ /**
105
+ * 단일 컴포넌트 상세 정보 조회 (props + variants + examples 포함)
106
+ * [SPEC-MCP-007:E-004]
107
+ */
108
+ export declare function fetchComponent(componentId: string): Promise<ComponentDetail | null>;
109
+ /**
110
+ * 레이아웃 토큰 목록 조회 (shell / page / section)
111
+ * [SPEC-MCP-007:E-005]
112
+ */
113
+ export declare function fetchTokenList(tokenType?: 'shell' | 'page' | 'section' | 'all'): Promise<TokenListResponse>;
114
+ /**
115
+ * 테마 CSS 변수 문자열 조회
116
+ * [SPEC-MCP-007:E-006]
117
+ */
118
+ export declare function fetchCSSVariables(themeId: string): Promise<string | null>;
119
+ /**
120
+ * 스크린 예제 정의 목록 조회
121
+ * [SPEC-MCP-007:E-007]
122
+ */
123
+ export declare function fetchScreenExamples(): Promise<ScreenExample[]>;
124
+ //# sourceMappingURL=data-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-client.d.ts","sourceRoot":"","sources":["../../src/api/data-client.ts"],"names":[],"mappings":"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"}