@iress-oss/ids-mcp-server 0.0.1 → 5.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +201 -0
- package/README.md +29 -159
- package/dist/componentHandlers.js +241 -0
- package/dist/componentHandlers.test.js +380 -0
- package/{build → dist}/config.js +5 -5
- package/dist/index.js +53 -0
- package/{build → dist}/iressHandlers.js +52 -46
- package/dist/iressHandlers.test.js +316 -0
- package/{build → dist}/resourceHandlers.js +23 -22
- package/dist/resourceHandlers.test.js +352 -0
- package/{build → dist}/searchHandlers.js +107 -92
- package/dist/searchHandlers.test.js +524 -0
- package/{build → dist}/toolHandler.js +13 -13
- package/dist/toolHandler.test.js +369 -0
- package/dist/tools.js +165 -0
- package/{build → dist}/utils.js +11 -15
- package/dist/utils.test.js +286 -0
- package/{docs/ids → generated/docs}/components-autocomplete-docs.md +3 -3
- package/{docs/ids → generated/docs}/components-autocomplete-recipes-docs.md +17 -51
- package/{docs/ids → generated/docs}/components-card-recipes-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-checkbox-docs.md +6 -19
- package/{docs/ids → generated/docs}/components-checkboxgroup-docs.md +18 -18
- package/{docs/ids → generated/docs}/components-checkboxgroup-recipes-docs.md +9 -9
- package/{docs/ids → generated/docs}/components-col-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-combobox-docs.md +4 -4
- package/{docs/ids → generated/docs}/components-container-docs.md +8 -42
- package/{docs/ids → generated/docs}/components-filter-docs.md +14 -67
- package/{docs/ids → generated/docs}/components-form-docs.md +341 -335
- package/{docs/ids → generated/docs}/components-form-recipes-docs.md +198 -1
- package/{docs/ids → generated/docs}/components-hide-docs.md +16 -70
- package/{docs/ids → generated/docs}/components-icon-docs.md +4 -4
- package/{docs/ids → generated/docs}/components-input-recipes-docs.md +2 -2
- package/{docs/ids → generated/docs}/components-inputcurrency-recipes-docs.md +6 -40
- package/{docs/ids → generated/docs}/components-modal-docs.md +3 -113
- package/generated/docs/components-popover-docs.md +464 -0
- package/{docs/ids → generated/docs}/components-radiogroup-docs.md +21 -21
- package/{docs/ids → generated/docs}/components-richselect-docs.md +149 -111
- package/{docs/ids → generated/docs}/components-row-docs.md +4 -4
- package/{docs/ids → generated/docs}/components-skeleton-docs.md +3 -3
- package/{docs/ids → generated/docs}/components-skeleton-recipes-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-skiplink-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-slideout-docs.md +3 -113
- package/{docs/ids → generated/docs}/components-table-ag-grid-docs.md +109 -137
- package/{docs/ids → generated/docs}/components-table-docs.md +92 -597
- package/{docs/ids → generated/docs}/components-tabset-docs.md +2 -2
- package/{docs/ids → generated/docs}/components-tag-docs.md +1 -1
- package/{docs/ids → generated/docs}/components-toaster-docs.md +5 -5
- package/{docs/ids → generated/docs}/extensions-editor-docs.md +4 -4
- package/generated/docs/foundations-accessibility-docs.md +62 -0
- package/{docs/ids → generated/docs}/foundations-colours-docs.md +1 -1
- package/generated/docs/foundations-consistency-docs.md +52 -0
- package/generated/docs/foundations-content-docs.md +23 -0
- package/generated/docs/foundations-introduction-docs.md +17 -0
- package/generated/docs/foundations-principles-docs.md +70 -0
- package/{docs/ids → generated/docs}/foundations-typography-docs.md +7 -2
- package/generated/docs/foundations-user-experience-docs.md +63 -0
- package/generated/docs/foundations-visual-design-docs.md +46 -0
- package/{docs/ids → generated/docs}/get-started-develop-docs.md +3 -3
- package/generated/docs/guidelines.md +812 -0
- package/{docs/ids → generated/docs}/introduction-docs.md +4 -4
- package/{docs/ids → generated/docs}/patterns-loading-docs.md +332 -2
- package/generated/docs/resources-migration-guides-from-v4-to-v5-docs.md +437 -0
- package/generated/docs/themes-available-themes-docs.md +66 -0
- package/generated/docs/themes-tokens-docs.md +1200 -0
- package/generated/docs/versions-docs.md +17 -0
- package/package.json +42 -14
- package/LICENSE +0 -193
- package/build/componentHandlers.js +0 -205
- package/build/index.js +0 -51
- package/build/tools.js +0 -165
- package/docs/api-reference.md +0 -0
- package/docs/best-practices.md +0 -0
- package/docs/configuration.md +0 -0
- package/docs/examples.md +0 -0
- package/docs/guidelines.md +0 -269
- package/docs/ids/components-popover-docs.md +0 -4
- package/docs/ids/resources-migration-guides-from-v4-to-v5-docs.md +0 -639
- package/docs/ids/themes-available-themes-docs.md +0 -74
- package/docs/ids/themes-tokens-docs.md +0 -4580
- package/docs/ids/versions-docs.md +0 -27
- package/docs/tutorials/basic-integration.md +0 -0
- /package/{build → dist}/types.js +0 -0
- /package/{docs/ids → generated/docs}/components-alert-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-badge-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-button-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-button-recipes-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-buttongroup-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-card-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-divider-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-expander-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-field-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-inline-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-input-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-inputcurrency-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-label-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-menu-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-menu-menuitem-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-navbar-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-navbar-recipes-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-panel-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-placeholder-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-popover-recipes-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-progress-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-radio-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-readonly-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-select-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-slider-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-spinner-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-stack-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-tabset-tab-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-text-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-toaster-toast-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-toggle-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-tooltip-docs.md +0 -0
- /package/{docs/ids → generated/docs}/components-validationmessage-docs.md +0 -0
- /package/{docs/ids → generated/docs}/contact-us-docs.md +0 -0
- /package/{docs/ids → generated/docs}/extensions-editor-recipes-docs.md +0 -0
- /package/{docs/ids → generated/docs}/frequently-asked-questions-docs.md +0 -0
- /package/{docs/ids → generated/docs}/get-started-using-storybook-docs.md +0 -0
- /package/{docs/ids → generated/docs}/resources-changelog-docs.md +0 -0
- /package/{docs/ids → generated/docs}/resources-code-katas-docs.md +0 -0
- /package/{docs/ids → generated/docs}/themes-introduction-docs.md +0 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for utility functions
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import { getMarkdownFiles, mapIressComponentToFile, extractIressComponents, readFileContent, fileExists, } from './utils.js';
|
|
7
|
+
// Mock fs module
|
|
8
|
+
vi.mock('fs');
|
|
9
|
+
vi.mock('./config.js', () => ({
|
|
10
|
+
DOCS_DIR: '/mock/docs/dir',
|
|
11
|
+
}));
|
|
12
|
+
const mockedFs = vi.mocked(fs);
|
|
13
|
+
// Test helper functions and types
|
|
14
|
+
const createComponentMapping = (componentName, filePath) => ({
|
|
15
|
+
componentName,
|
|
16
|
+
filePath,
|
|
17
|
+
});
|
|
18
|
+
const mockFileList = [
|
|
19
|
+
'components-button-docs.md',
|
|
20
|
+
'components-input-docs.md',
|
|
21
|
+
'components-card-docs.md',
|
|
22
|
+
];
|
|
23
|
+
// Type for fs.readdirSync return value to avoid repetitive eslint-disable comments
|
|
24
|
+
const createMockFileArray = (...files) => files.filter((file) => file != null);
|
|
25
|
+
describe('utils', () => {
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
vi.clearAllMocks();
|
|
28
|
+
});
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
vi.restoreAllMocks();
|
|
31
|
+
});
|
|
32
|
+
describe('getMarkdownFiles', () => {
|
|
33
|
+
it('should return empty array when docs directory does not exist', () => {
|
|
34
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
35
|
+
const result = getMarkdownFiles();
|
|
36
|
+
expect(result).toEqual([]);
|
|
37
|
+
expect(fs.existsSync).toHaveBeenCalledWith('/mock/docs/dir');
|
|
38
|
+
});
|
|
39
|
+
it('should return markdown files when directory exists', () => {
|
|
40
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
41
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray('components-button-docs.md', 'components-input-docs.md', 'other-file.txt', 'nested/components-card-docs.md', Buffer.from('buffer-file')));
|
|
42
|
+
const result = getMarkdownFiles();
|
|
43
|
+
expect(result).toEqual([
|
|
44
|
+
'components-button-docs.md',
|
|
45
|
+
'components-input-docs.md',
|
|
46
|
+
'nested/components-card-docs.md',
|
|
47
|
+
]);
|
|
48
|
+
expect(fs.readdirSync).toHaveBeenCalledWith('/mock/docs/dir', {
|
|
49
|
+
recursive: true,
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
it('should handle errors gracefully', () => {
|
|
53
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
54
|
+
mockedFs.readdirSync.mockImplementation(() => {
|
|
55
|
+
throw new Error('Read error');
|
|
56
|
+
});
|
|
57
|
+
const consoleSpy = vi
|
|
58
|
+
.spyOn(console, 'error')
|
|
59
|
+
.mockImplementation(() => { });
|
|
60
|
+
const result = getMarkdownFiles();
|
|
61
|
+
expect(result).toEqual([]);
|
|
62
|
+
expect(consoleSpy).toHaveBeenCalledWith('Error reading docs directory:', expect.any(Error));
|
|
63
|
+
});
|
|
64
|
+
it('should filter out non-string entries from directory listing', () => {
|
|
65
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
66
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray('file1.md', Buffer.from('buffer'), 'file2.md', null, undefined, 'file3.txt'));
|
|
67
|
+
const result = getMarkdownFiles();
|
|
68
|
+
expect(result).toEqual(['file1.md', 'file2.md']);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('mapIressComponentToFile', () => {
|
|
72
|
+
beforeEach(() => {
|
|
73
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
74
|
+
});
|
|
75
|
+
it('should find exact match for component', () => {
|
|
76
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray(...mockFileList));
|
|
77
|
+
const mapping = createComponentMapping('IressButton', 'components-button-docs.md');
|
|
78
|
+
const result = mapIressComponentToFile(mapping.componentName);
|
|
79
|
+
expect(result).toBe(mapping.filePath);
|
|
80
|
+
});
|
|
81
|
+
it('should find partial match when exact match is not available', () => {
|
|
82
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray('components-button-advanced-docs.md', 'components-input-docs.md'));
|
|
83
|
+
const mapping = createComponentMapping('IressButton', 'components-button-advanced-docs.md');
|
|
84
|
+
const result = mapIressComponentToFile(mapping.componentName);
|
|
85
|
+
expect(result).toBe(mapping.filePath);
|
|
86
|
+
});
|
|
87
|
+
it('should find fuzzy match when exact and partial matches are not available', () => {
|
|
88
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray('components-custom-button-docs.md', 'components-input-docs.md'));
|
|
89
|
+
const mapping = createComponentMapping('IressButton', 'components-custom-button-docs.md');
|
|
90
|
+
const result = mapIressComponentToFile(mapping.componentName);
|
|
91
|
+
expect(result).toBe(mapping.filePath);
|
|
92
|
+
});
|
|
93
|
+
it('should return null when no match is found', () => {
|
|
94
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray('components-input-docs.md', 'components-card-docs.md'));
|
|
95
|
+
const mapping = createComponentMapping('IressButton', null);
|
|
96
|
+
const result = mapIressComponentToFile(mapping.componentName);
|
|
97
|
+
expect(result).toBe(mapping.filePath);
|
|
98
|
+
});
|
|
99
|
+
it('should handle component names without Iress prefix', () => {
|
|
100
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray('components-button-docs.md'));
|
|
101
|
+
const mapping = createComponentMapping('Button', 'components-button-docs.md');
|
|
102
|
+
const result = mapIressComponentToFile(mapping.componentName);
|
|
103
|
+
expect(result).toBe(mapping.filePath);
|
|
104
|
+
});
|
|
105
|
+
it('should handle camelCase to lowercase conversion correctly', () => {
|
|
106
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray('components-datepicker-docs.md'));
|
|
107
|
+
const mapping = createComponentMapping('IressDatePicker', 'components-datepicker-docs.md');
|
|
108
|
+
const result = mapIressComponentToFile(mapping.componentName);
|
|
109
|
+
expect(result).toBe(mapping.filePath);
|
|
110
|
+
});
|
|
111
|
+
it('should prioritize exact match over partial match', () => {
|
|
112
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray('components-button-docs.md', 'components-button-advanced-docs.md'));
|
|
113
|
+
const mapping = createComponentMapping('IressButton', 'components-button-docs.md');
|
|
114
|
+
const result = mapIressComponentToFile(mapping.componentName);
|
|
115
|
+
expect(result).toBe(mapping.filePath);
|
|
116
|
+
});
|
|
117
|
+
it('should prioritize partial match over fuzzy match', () => {
|
|
118
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray('components-custom-button-docs.md', 'components-button-advanced-docs.md'));
|
|
119
|
+
const mapping = createComponentMapping('IressButton', 'components-button-advanced-docs.md');
|
|
120
|
+
const result = mapIressComponentToFile(mapping.componentName);
|
|
121
|
+
expect(result).toBe(mapping.filePath);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('extractIressComponents', () => {
|
|
125
|
+
it('should extract Iress component names from text', () => {
|
|
126
|
+
const text = `
|
|
127
|
+
Use IressButton for actions and IressInput for text entry.
|
|
128
|
+
You can also use IressCard to display content.
|
|
129
|
+
`;
|
|
130
|
+
const result = extractIressComponents(text);
|
|
131
|
+
expect(result).toEqual(['IressButton', 'IressInput', 'IressCard']);
|
|
132
|
+
});
|
|
133
|
+
it('should handle empty text', () => {
|
|
134
|
+
const result = extractIressComponents('');
|
|
135
|
+
expect(result).toEqual([]);
|
|
136
|
+
});
|
|
137
|
+
it('should handle text without Iress components', () => {
|
|
138
|
+
const text = 'This is just regular text with no components.';
|
|
139
|
+
const result = extractIressComponents(text);
|
|
140
|
+
expect(result).toEqual([]);
|
|
141
|
+
});
|
|
142
|
+
it('should remove duplicate component names', () => {
|
|
143
|
+
const text = `
|
|
144
|
+
Use IressButton here and IressButton there.
|
|
145
|
+
Also use IressInput and IressButton again.
|
|
146
|
+
`;
|
|
147
|
+
const result = extractIressComponents(text);
|
|
148
|
+
expect(result).toEqual(['IressButton', 'IressInput']);
|
|
149
|
+
});
|
|
150
|
+
it('should match component names with various cases', () => {
|
|
151
|
+
const text = `
|
|
152
|
+
IressA, IressB, IressC, IressABC, IressXYZ,
|
|
153
|
+
IressCamelCase, IressPascalCase
|
|
154
|
+
`;
|
|
155
|
+
const result = extractIressComponents(text);
|
|
156
|
+
expect(result).toEqual([
|
|
157
|
+
'IressA',
|
|
158
|
+
'IressB',
|
|
159
|
+
'IressC',
|
|
160
|
+
'IressABC',
|
|
161
|
+
'IressXYZ',
|
|
162
|
+
'IressCamelCase',
|
|
163
|
+
'IressPascalCase',
|
|
164
|
+
]);
|
|
165
|
+
});
|
|
166
|
+
it('should match component names according to current implementation', () => {
|
|
167
|
+
const text = 'ThisIressButtonIsNotValid and IressButton is valid';
|
|
168
|
+
const result = extractIressComponents(text);
|
|
169
|
+
// Current implementation matches any "Iress" followed by capital letter and additional letters
|
|
170
|
+
// This includes compound words like "IressButtonIsNotValid"
|
|
171
|
+
expect(result).toEqual(['IressButtonIsNotValid', 'IressButton']);
|
|
172
|
+
});
|
|
173
|
+
it('should handle special characters and boundaries', () => {
|
|
174
|
+
const text = `
|
|
175
|
+
<IressButton>Click me</IressButton>
|
|
176
|
+
{IressInput}
|
|
177
|
+
IressCard.
|
|
178
|
+
IressModal,
|
|
179
|
+
IressDialog;
|
|
180
|
+
IressTooltip!
|
|
181
|
+
IressForm?
|
|
182
|
+
`;
|
|
183
|
+
const result = extractIressComponents(text);
|
|
184
|
+
expect(result).toEqual([
|
|
185
|
+
'IressButton',
|
|
186
|
+
'IressInput',
|
|
187
|
+
'IressCard',
|
|
188
|
+
'IressModal',
|
|
189
|
+
'IressDialog',
|
|
190
|
+
'IressTooltip',
|
|
191
|
+
'IressForm',
|
|
192
|
+
]);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe('readFileContent', () => {
|
|
196
|
+
it('should read file content successfully', () => {
|
|
197
|
+
const mockContent = 'Mock file content';
|
|
198
|
+
mockedFs.readFileSync.mockReturnValue(mockContent);
|
|
199
|
+
const result = readFileContent('/path/to/file.txt');
|
|
200
|
+
expect(result).toBe(mockContent);
|
|
201
|
+
expect(fs.readFileSync).toHaveBeenCalledWith('/path/to/file.txt', 'utf-8');
|
|
202
|
+
});
|
|
203
|
+
it('should propagate file system errors', () => {
|
|
204
|
+
const error = new Error('File not found');
|
|
205
|
+
mockedFs.readFileSync.mockImplementation(() => {
|
|
206
|
+
throw error;
|
|
207
|
+
});
|
|
208
|
+
expect(() => readFileContent('/nonexistent/file.txt')).toThrow('File not found');
|
|
209
|
+
});
|
|
210
|
+
it('should handle different file paths', () => {
|
|
211
|
+
mockedFs.readFileSync.mockReturnValue('content');
|
|
212
|
+
readFileContent('/absolute/path/file.txt');
|
|
213
|
+
expect(fs.readFileSync).toHaveBeenCalledWith('/absolute/path/file.txt', 'utf-8');
|
|
214
|
+
readFileContent('relative/path/file.txt');
|
|
215
|
+
expect(fs.readFileSync).toHaveBeenCalledWith('relative/path/file.txt', 'utf-8');
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe('fileExists', () => {
|
|
219
|
+
it('should return true when file exists', () => {
|
|
220
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
221
|
+
const result = fileExists('/path/to/file.txt');
|
|
222
|
+
expect(result).toBe(true);
|
|
223
|
+
expect(fs.existsSync).toHaveBeenCalledWith('/path/to/file.txt');
|
|
224
|
+
});
|
|
225
|
+
it('should return false when file does not exist', () => {
|
|
226
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
227
|
+
const result = fileExists('/nonexistent/file.txt');
|
|
228
|
+
expect(result).toBe(false);
|
|
229
|
+
expect(fs.existsSync).toHaveBeenCalledWith('/nonexistent/file.txt');
|
|
230
|
+
});
|
|
231
|
+
it('should handle different file paths', () => {
|
|
232
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
233
|
+
fileExists('/absolute/path/file.txt');
|
|
234
|
+
expect(fs.existsSync).toHaveBeenCalledWith('/absolute/path/file.txt');
|
|
235
|
+
fileExists('relative/path/file.txt');
|
|
236
|
+
expect(fs.existsSync).toHaveBeenCalledWith('relative/path/file.txt');
|
|
237
|
+
});
|
|
238
|
+
it('should handle edge cases', () => {
|
|
239
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
240
|
+
expect(fileExists('')).toBe(false);
|
|
241
|
+
expect(fileExists(' ')).toBe(false);
|
|
242
|
+
expect(fileExists('.')).toBe(false);
|
|
243
|
+
expect(fileExists('..')).toBe(false);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
describe('type safety and helper functions', () => {
|
|
247
|
+
it('should create valid ComponentMapping objects', () => {
|
|
248
|
+
const validMapping = createComponentMapping('IressButton', 'components-button-docs.md');
|
|
249
|
+
const nullMapping = createComponentMapping('IressNonExistent', null);
|
|
250
|
+
expect(validMapping).toEqual({
|
|
251
|
+
componentName: 'IressButton',
|
|
252
|
+
filePath: 'components-button-docs.md',
|
|
253
|
+
});
|
|
254
|
+
expect(nullMapping).toEqual({
|
|
255
|
+
componentName: 'IressNonExistent',
|
|
256
|
+
filePath: null,
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
it('should work with mock file list type', () => {
|
|
260
|
+
const mockFile = 'components-button-docs.md';
|
|
261
|
+
expect(mockFileList).toContain(mockFile);
|
|
262
|
+
// Type checking ensures we can only use valid file names
|
|
263
|
+
expect(typeof mockFile).toBe('string');
|
|
264
|
+
expect(mockFile.endsWith('.md')).toBe(true);
|
|
265
|
+
});
|
|
266
|
+
it('should demonstrate type-safe component mapping workflow', () => {
|
|
267
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
268
|
+
mockedFs.readdirSync.mockReturnValue(createMockFileArray(...mockFileList));
|
|
269
|
+
const componentMappings = [
|
|
270
|
+
createComponentMapping('IressButton', null),
|
|
271
|
+
createComponentMapping('IressInput', null),
|
|
272
|
+
createComponentMapping('IressCard', null),
|
|
273
|
+
];
|
|
274
|
+
// Test that all components get properly mapped
|
|
275
|
+
const results = componentMappings.map((mapping) => ({
|
|
276
|
+
...mapping,
|
|
277
|
+
filePath: mapIressComponentToFile(mapping.componentName),
|
|
278
|
+
}));
|
|
279
|
+
expect(results).toEqual([
|
|
280
|
+
{ componentName: 'IressButton', filePath: 'components-button-docs.md' },
|
|
281
|
+
{ componentName: 'IressInput', filePath: 'components-input-docs.md' },
|
|
282
|
+
{ componentName: 'IressCard', filePath: 'components-card-docs.md' },
|
|
283
|
+
]);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
});
|
|
@@ -88,7 +88,7 @@ Hide code
|
|
|
88
88
|
|
|
89
89
|
\[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
|
|
90
90
|
|
|
91
|
-
import { IressAutocomplete, IressAutocompleteProps } from '@iress/ids-components';
|
|
91
|
+
import { IressAutocomplete, IressAutocompleteProps } from '@iress-oss/ids-components';
|
|
92
92
|
import { useState } from 'react';
|
|
93
93
|
export const AutocompleteUsingState \= () \=> {
|
|
94
94
|
const \[value, setValue\] \= useState('Option 1');
|
|
@@ -170,7 +170,7 @@ Hide code
|
|
|
170
170
|
|
|
171
171
|
\[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
|
|
172
172
|
|
|
173
|
-
import { IressAutocomplete, IressAutocompleteProps } from '@iress/ids-components';
|
|
173
|
+
import { IressAutocomplete, IressAutocompleteProps } from '@iress-oss/ids-components';
|
|
174
174
|
interface StarWarsCharacter {
|
|
175
175
|
name: string;
|
|
176
176
|
gender: string;
|
|
@@ -553,7 +553,7 @@ Hide code
|
|
|
553
553
|
}
|
|
554
554
|
\]}
|
|
555
555
|
popoverProps\={{
|
|
556
|
-
container:
|
|
556
|
+
container: document.body
|
|
557
557
|
}}
|
|
558
558
|
/>
|
|
559
559
|
</IressStack\>
|
|
@@ -17,29 +17,13 @@ It has been exposed in case you need it in your application to provide custom se
|
|
|
17
17
|
|
|
18
18
|
1. You want to provide filtering in a certain area of the application (eg. a table).
|
|
19
19
|
|
|
20
|
-
Name
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
Person
|
|
25
|
-
|
|
26
|
-
Male
|
|
27
|
-
|
|
28
|
-
Person 2
|
|
29
|
-
|
|
30
|
-
Female
|
|
31
|
-
|
|
32
|
-
Person 3
|
|
33
|
-
|
|
34
|
-
Male
|
|
35
|
-
|
|
36
|
-
Person 4
|
|
37
|
-
|
|
38
|
-
Female
|
|
39
|
-
|
|
40
|
-
Person 5
|
|
41
|
-
|
|
42
|
-
Male
|
|
20
|
+
| Name | Gender |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| Person 1 | Male |
|
|
23
|
+
| Person 2 | Female |
|
|
24
|
+
| Person 3 | Male |
|
|
25
|
+
| Person 4 | Female |
|
|
26
|
+
| Person 5 | Male |
|
|
43
27
|
|
|
44
28
|
Hide code
|
|
45
29
|
|
|
@@ -91,45 +75,27 @@ Copy
|
|
|
91
75
|
|
|
92
76
|
### [](#parameters)Parameters
|
|
93
77
|
|
|
94
|
-
Name
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
Default
|
|
99
|
-
|
|
100
|
-
Control
|
|
101
|
-
|
|
102
|
-
debounceThreshold
|
|
103
|
-
|
|
78
|
+
| Name | Description | Default | Control |
|
|
79
|
+
| --- | --- | --- | --- |
|
|
80
|
+
| debounceThreshold |
|
|
104
81
|
\-
|
|
105
82
|
|
|
106
|
-
\-
|
|
107
|
-
|
|
108
|
-
\-
|
|
109
|
-
|
|
110
|
-
initialOptions
|
|
83
|
+
| \- | \- |
|
|
84
|
+
| initialOptions |
|
|
111
85
|
|
|
112
86
|
\-
|
|
113
87
|
|
|
114
|
-
\-
|
|
88
|
+
| \- | \- |
|
|
89
|
+
| options |
|
|
115
90
|
|
|
116
91
|
\-
|
|
117
92
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
\-
|
|
93
|
+
| \- | \- |
|
|
94
|
+
| query |
|
|
121
95
|
|
|
122
96
|
\-
|
|
123
97
|
|
|
124
|
-
\-
|
|
125
|
-
|
|
126
|
-
query
|
|
127
|
-
|
|
128
|
-
\-
|
|
129
|
-
|
|
130
|
-
\-
|
|
131
|
-
|
|
132
|
-
\-
|
|
98
|
+
| \- | \- |
|
|
133
99
|
|
|
134
100
|
On this page
|
|
135
101
|
|
|
@@ -46,7 +46,7 @@ import {
|
|
|
46
46
|
IressCardProps,
|
|
47
47
|
IressStack,
|
|
48
48
|
IressText,
|
|
49
|
-
} from '@iress/ids-components';
|
|
49
|
+
} from '@iress-oss/ids-components';
|
|
50
50
|
import styles from '@iress-storybook/styles.module.scss';
|
|
51
51
|
export const CardUsingHook \= () \=> {
|
|
52
52
|
const cardProps \= composeIDSCard({
|
|
@@ -80,30 +80,17 @@ When using a checkbox without a visible label, you must supply a label and apply
|
|
|
80
80
|
It is also important to not hide the table headers.
|
|
81
81
|
|
|
82
82
|
List of investments
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
Name
|
|
87
|
-
|
|
88
|
-
Date
|
|
89
|
-
|
|
90
|
-
Cost
|
|
91
|
-
|
|
83
|
+
| Select | Name | Date | Cost |
|
|
84
|
+
| --- | --- | --- | --- |
|
|
85
|
+
|
|
|
92
86
|
Toggle row
|
|
93
87
|
|
|
94
|
-
Artemis Fund Managers Limited
|
|
95
|
-
|
|
96
|
-
2019-09-23
|
|
97
|
-
|
|
98
|
-
23898.12
|
|
88
|
+
| Artemis Fund Managers Limited | 2019-09-23 | 23898.12 |
|
|
89
|
+
|
|
|
99
90
|
|
|
100
91
|
Toggle row
|
|
101
92
|
|
|
102
|
-
CASH.CASH
|
|
103
|
-
|
|
104
|
-
2020-06-28
|
|
105
|
-
|
|
106
|
-
49751.43
|
|
93
|
+
| CASH.CASH | 2020-06-28 | 49751.43 |
|
|
107
94
|
|
|
108
95
|
Hide code
|
|
109
96
|
|
|
@@ -115,7 +115,7 @@ import {
|
|
|
115
115
|
IressCheckboxGroup,
|
|
116
116
|
IressCheckboxGroupProps,
|
|
117
117
|
IressStack,
|
|
118
|
-
} from '@iress/ids-components';
|
|
118
|
+
} from '@iress-oss/ids-components';
|
|
119
119
|
import { useState } from 'react';
|
|
120
120
|
export const CheckboxGroupUsingState \= () \=> {
|
|
121
121
|
const \[value, setValue\] \= useState<FormControlValue\[\]\>(\[\]);
|
|
@@ -197,22 +197,22 @@ Hide code
|
|
|
197
197
|
stack </h3\>
|
|
198
198
|
<IressCheckboxGroup layout\="stack"\>
|
|
199
199
|
<IressCheckbox
|
|
200
|
-
className\="ids-styles--add-border-to-label-
|
|
200
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
201
201
|
value\="google"
|
|
202
202
|
\>
|
|
203
203
|
Google </IressCheckbox\>
|
|
204
204
|
<IressCheckbox
|
|
205
|
-
className\="ids-styles--add-border-to-label-
|
|
205
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
206
206
|
value\="newspaper"
|
|
207
207
|
\>
|
|
208
208
|
Newspaper </IressCheckbox\>
|
|
209
209
|
<IressCheckbox
|
|
210
|
-
className\="ids-styles--add-border-to-label-
|
|
210
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
211
211
|
value\="friend"
|
|
212
212
|
\>
|
|
213
213
|
Friend </IressCheckbox\>
|
|
214
214
|
<IressCheckbox
|
|
215
|
-
className\="ids-styles--add-border-to-label-
|
|
215
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
216
216
|
value\="other"
|
|
217
217
|
\>
|
|
218
218
|
Other </IressCheckbox\>
|
|
@@ -223,22 +223,22 @@ Hide code
|
|
|
223
223
|
block </h3\>
|
|
224
224
|
<IressCheckboxGroup layout\="block"\>
|
|
225
225
|
<IressCheckbox
|
|
226
|
-
className\="ids-styles--add-border-to-label-
|
|
226
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
227
227
|
value\="google"
|
|
228
228
|
\>
|
|
229
229
|
Google </IressCheckbox\>
|
|
230
230
|
<IressCheckbox
|
|
231
|
-
className\="ids-styles--add-border-to-label-
|
|
231
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
232
232
|
value\="newspaper"
|
|
233
233
|
\>
|
|
234
234
|
Newspaper </IressCheckbox\>
|
|
235
235
|
<IressCheckbox
|
|
236
|
-
className\="ids-styles--add-border-to-label-
|
|
236
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
237
237
|
value\="friend"
|
|
238
238
|
\>
|
|
239
239
|
Friend </IressCheckbox\>
|
|
240
240
|
<IressCheckbox
|
|
241
|
-
className\="ids-styles--add-border-to-label-
|
|
241
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
242
242
|
value\="other"
|
|
243
243
|
\>
|
|
244
244
|
Other </IressCheckbox\>
|
|
@@ -249,22 +249,22 @@ Hide code
|
|
|
249
249
|
inline </h3\>
|
|
250
250
|
<IressCheckboxGroup layout\="inline"\>
|
|
251
251
|
<IressCheckbox
|
|
252
|
-
className\="ids-styles--add-border-to-label-
|
|
252
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
253
253
|
value\="google"
|
|
254
254
|
\>
|
|
255
255
|
Google </IressCheckbox\>
|
|
256
256
|
<IressCheckbox
|
|
257
|
-
className\="ids-styles--add-border-to-label-
|
|
257
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
258
258
|
value\="newspaper"
|
|
259
259
|
\>
|
|
260
260
|
Newspaper </IressCheckbox\>
|
|
261
261
|
<IressCheckbox
|
|
262
|
-
className\="ids-styles--add-border-to-label-
|
|
262
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
263
263
|
value\="friend"
|
|
264
264
|
\>
|
|
265
265
|
Friend </IressCheckbox\>
|
|
266
266
|
<IressCheckbox
|
|
267
|
-
className\="ids-styles--add-border-to-label-
|
|
267
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
268
268
|
value\="other"
|
|
269
269
|
\>
|
|
270
270
|
Other </IressCheckbox\>
|
|
@@ -275,22 +275,22 @@ Hide code
|
|
|
275
275
|
full </h3\>
|
|
276
276
|
<IressCheckboxGroup layout\="full"\>
|
|
277
277
|
<IressCheckbox
|
|
278
|
-
className\="ids-styles--add-border-to-label-
|
|
278
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
279
279
|
value\="google"
|
|
280
280
|
\>
|
|
281
281
|
Google </IressCheckbox\>
|
|
282
282
|
<IressCheckbox
|
|
283
|
-
className\="ids-styles--add-border-to-label-
|
|
283
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
284
284
|
value\="newspaper"
|
|
285
285
|
\>
|
|
286
286
|
Newspaper </IressCheckbox\>
|
|
287
287
|
<IressCheckbox
|
|
288
|
-
className\="ids-styles--add-border-to-label-
|
|
288
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
289
289
|
value\="friend"
|
|
290
290
|
\>
|
|
291
291
|
Friend </IressCheckbox\>
|
|
292
292
|
<IressCheckbox
|
|
293
|
-
className\="ids-styles--add-border-to-label-
|
|
293
|
+
className\="ids-styles--add-border-to-label-v5142"
|
|
294
294
|
value\="other"
|
|
295
295
|
\>
|
|
296
296
|
Other </IressCheckbox\>
|
|
@@ -445,7 +445,7 @@ Hide code
|
|
|
445
445
|
}}
|
|
446
446
|
\>
|
|
447
447
|
<div
|
|
448
|
-
className\="ids-styles--resizable-
|
|
448
|
+
className\="ids-styles--resizable-v5142"
|
|
449
449
|
style\={{
|
|
450
450
|
display: 'grid',
|
|
451
451
|
gridAutoRows: '1fr',
|
|
@@ -11,22 +11,22 @@ Selected values: lemon-drizzle, victoria-sponge
|
|
|
11
11
|
Required Let them eat cake
|
|
12
12
|
|
|
13
13
|
Available options
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Name
|
|
18
|
-
|
|
14
|
+
| Select | Name |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
|
|
|
19
17
|
Select lemon drizzle
|
|
20
18
|
|
|
21
|
-
Lemon drizzle
|
|
19
|
+
| Lemon drizzle |
|
|
20
|
+
|
|
|
22
21
|
|
|
23
22
|
Select Victoria Sponge
|
|
24
23
|
|
|
25
|
-
Victoria Sponge
|
|
24
|
+
| Victoria Sponge |
|
|
25
|
+
|
|
|
26
26
|
|
|
27
27
|
Select Carrot Cake
|
|
28
28
|
|
|
29
|
-
Carrot Cake
|
|
29
|
+
| Carrot Cake |
|
|
30
30
|
|
|
31
31
|
Submit
|
|
32
32
|
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
IressPanel,
|
|
44
44
|
IressStack,
|
|
45
45
|
IressTable,
|
|
46
|
-
} from '@iress/ids-components';
|
|
46
|
+
} from '@iress-oss/ids-components';
|
|
47
47
|
import { IressCheckboxGroup } from '../CheckboxGroup';
|
|
48
48
|
import { toArray } from '../../../helpers/formatting/toArray';
|
|
49
49
|
interface FieldValues {
|
|
@@ -117,7 +117,7 @@ Hide code
|
|
|
117
117
|
|
|
118
118
|
\[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
|
|
119
119
|
|
|
120
|
-
import { IressCombobox, IressComboboxProps, LabelValueMeta } from '@iress/ids-components';
|
|
120
|
+
import { IressCombobox, IressComboboxProps, LabelValueMeta } from '@iress-oss/ids-components';
|
|
121
121
|
import { useState } from 'react';
|
|
122
122
|
export const ComboboxUsingState \= () \=> {
|
|
123
123
|
const \[value, setValue\] \= useState<LabelValueMeta | undefined\>();
|
|
@@ -211,7 +211,7 @@ Hide code
|
|
|
211
211
|
|
|
212
212
|
\[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
|
|
213
213
|
|
|
214
|
-
import { IressCombobox, IressComboboxProps } from '@iress/ids-components';
|
|
214
|
+
import { IressCombobox, IressComboboxProps } from '@iress-oss/ids-components';
|
|
215
215
|
interface StarWarsCharacter {
|
|
216
216
|
name: string;
|
|
217
217
|
gender: string;
|
|
@@ -400,7 +400,7 @@ Hide code
|
|
|
400
400
|
}
|
|
401
401
|
\]}
|
|
402
402
|
popoverProps\={{
|
|
403
|
-
container:
|
|
403
|
+
container: {}
|
|
404
404
|
}}
|
|
405
405
|
prepend\={<IressIcon name\="search" />}
|
|
406
406
|
width\="12"
|
|
@@ -533,7 +533,7 @@ Hide code
|
|
|
533
533
|
\]}
|
|
534
534
|
placeholder\="Instant search!"
|
|
535
535
|
popoverProps\={{
|
|
536
|
-
container:
|
|
536
|
+
container: document.body
|
|
537
537
|
}}
|
|
538
538
|
/>
|
|
539
539
|
|