@furystack/shades-common-components 10.0.35 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -0
- package/esm/components/animations.spec.d.ts +2 -0
- package/esm/components/animations.spec.d.ts.map +1 -0
- package/esm/components/animations.spec.js +201 -0
- package/esm/components/animations.spec.js.map +1 -0
- package/esm/components/app-bar-link.js +21 -20
- package/esm/components/app-bar-link.js.map +1 -1
- package/esm/components/app-bar-link.spec.d.ts +2 -0
- package/esm/components/app-bar-link.spec.d.ts.map +1 -0
- package/esm/components/app-bar-link.spec.js +252 -0
- package/esm/components/app-bar-link.spec.js.map +1 -0
- package/esm/components/app-bar.js +21 -21
- package/esm/components/app-bar.js.map +1 -1
- package/esm/components/app-bar.spec.d.ts +2 -0
- package/esm/components/app-bar.spec.d.ts.map +1 -0
- package/esm/components/app-bar.spec.js +117 -0
- package/esm/components/app-bar.spec.js.map +1 -0
- package/esm/components/avatar.d.ts.map +1 -1
- package/esm/components/avatar.js +15 -19
- package/esm/components/avatar.js.map +1 -1
- package/esm/components/avatar.spec.d.ts +2 -0
- package/esm/components/avatar.spec.d.ts.map +1 -0
- package/esm/components/avatar.spec.js +114 -0
- package/esm/components/avatar.spec.js.map +1 -0
- package/esm/components/button.d.ts.map +1 -1
- package/esm/components/button.js +145 -156
- package/esm/components/button.js.map +1 -1
- package/esm/components/button.spec.d.ts +2 -0
- package/esm/components/button.spec.d.ts.map +1 -0
- package/esm/components/button.spec.js +155 -0
- package/esm/components/button.spec.js.map +1 -0
- package/esm/components/command-palette/command-palette-input.d.ts.map +1 -1
- package/esm/components/command-palette/command-palette-input.js +18 -16
- package/esm/components/command-palette/command-palette-input.js.map +1 -1
- package/esm/components/command-palette/command-palette-input.spec.d.ts +2 -0
- package/esm/components/command-palette/command-palette-input.spec.d.ts.map +1 -0
- package/esm/components/command-palette/command-palette-input.spec.js +233 -0
- package/esm/components/command-palette/command-palette-input.spec.js.map +1 -0
- package/esm/components/command-palette/command-palette-manager.spec.d.ts +2 -0
- package/esm/components/command-palette/command-palette-manager.spec.d.ts.map +1 -0
- package/esm/components/command-palette/command-palette-manager.spec.js +362 -0
- package/esm/components/command-palette/command-palette-manager.spec.js.map +1 -0
- package/esm/components/command-palette/command-palette-suggestion-list.d.ts.map +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.js +42 -46
- package/esm/components/command-palette/command-palette-suggestion-list.js.map +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.spec.d.ts +2 -0
- package/esm/components/command-palette/command-palette-suggestion-list.spec.d.ts.map +1 -0
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js +376 -0
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -0
- package/esm/components/command-palette/index.d.ts.map +1 -1
- package/esm/components/command-palette/index.js +100 -110
- package/esm/components/command-palette/index.js.map +1 -1
- package/esm/components/command-palette/index.spec.d.ts +2 -0
- package/esm/components/command-palette/index.spec.d.ts.map +1 -0
- package/esm/components/command-palette/index.spec.js +509 -0
- package/esm/components/command-palette/index.spec.js.map +1 -0
- package/esm/components/data-grid/body.js +1 -1
- package/esm/components/data-grid/body.js.map +1 -1
- package/esm/components/data-grid/body.spec.d.ts +2 -0
- package/esm/components/data-grid/body.spec.d.ts.map +1 -0
- package/esm/components/data-grid/body.spec.js +228 -0
- package/esm/components/data-grid/body.spec.js.map +1 -0
- package/esm/components/data-grid/data-grid-row.d.ts.map +1 -1
- package/esm/components/data-grid/data-grid-row.js +49 -73
- package/esm/components/data-grid/data-grid-row.js.map +1 -1
- package/esm/components/data-grid/data-grid-row.spec.d.ts +2 -0
- package/esm/components/data-grid/data-grid-row.spec.d.ts.map +1 -0
- package/esm/components/data-grid/data-grid-row.spec.js +296 -0
- package/esm/components/data-grid/data-grid-row.spec.js.map +1 -0
- package/esm/components/data-grid/data-grid.d.ts.map +1 -1
- package/esm/components/data-grid/data-grid.js +35 -28
- package/esm/components/data-grid/data-grid.js.map +1 -1
- package/esm/components/data-grid/data-grid.spec.d.ts +2 -0
- package/esm/components/data-grid/data-grid.spec.d.ts.map +1 -0
- package/esm/components/data-grid/data-grid.spec.js +544 -0
- package/esm/components/data-grid/data-grid.spec.js.map +1 -0
- package/esm/components/data-grid/footer.js +21 -15
- package/esm/components/data-grid/footer.js.map +1 -1
- package/esm/components/data-grid/footer.spec.d.ts +2 -0
- package/esm/components/data-grid/footer.spec.d.ts.map +1 -0
- package/esm/components/data-grid/footer.spec.js +264 -0
- package/esm/components/data-grid/footer.spec.js.map +1 -0
- package/esm/components/data-grid/header.d.ts.map +1 -1
- package/esm/components/data-grid/header.js +55 -33
- package/esm/components/data-grid/header.js.map +1 -1
- package/esm/components/data-grid/header.spec.d.ts +2 -0
- package/esm/components/data-grid/header.spec.d.ts.map +1 -0
- package/esm/components/data-grid/header.spec.js +421 -0
- package/esm/components/data-grid/header.spec.js.map +1 -0
- package/esm/components/data-grid/selection-cell.d.ts.map +1 -1
- package/esm/components/data-grid/selection-cell.js +13 -6
- package/esm/components/data-grid/selection-cell.js.map +1 -1
- package/esm/components/data-grid/selection-cell.spec.d.ts +2 -0
- package/esm/components/data-grid/selection-cell.spec.d.ts.map +1 -0
- package/esm/components/data-grid/selection-cell.spec.js +118 -0
- package/esm/components/data-grid/selection-cell.spec.js.map +1 -0
- package/esm/components/fab.d.ts.map +1 -1
- package/esm/components/fab.js +10 -1
- package/esm/components/fab.js.map +1 -1
- package/esm/components/fab.spec.d.ts +2 -0
- package/esm/components/fab.spec.d.ts.map +1 -0
- package/esm/components/fab.spec.js +95 -0
- package/esm/components/fab.spec.js.map +1 -0
- package/esm/components/form.spec.d.ts +2 -0
- package/esm/components/form.spec.d.ts.map +1 -0
- package/esm/components/form.spec.js +314 -0
- package/esm/components/form.spec.js.map +1 -0
- package/esm/components/grid.d.ts.map +1 -1
- package/esm/components/grid.js +40 -37
- package/esm/components/grid.js.map +1 -1
- package/esm/components/grid.spec.d.ts +2 -0
- package/esm/components/grid.spec.d.ts.map +1 -0
- package/esm/components/grid.spec.js +316 -0
- package/esm/components/grid.spec.js.map +1 -0
- package/esm/components/inputs/autocomplete.spec.d.ts +2 -0
- package/esm/components/inputs/autocomplete.spec.d.ts.map +1 -0
- package/esm/components/inputs/autocomplete.spec.js +194 -0
- package/esm/components/inputs/autocomplete.spec.js.map +1 -0
- package/esm/components/inputs/input.d.ts.map +1 -1
- package/esm/components/inputs/input.js +141 -109
- package/esm/components/inputs/input.js.map +1 -1
- package/esm/components/inputs/input.spec.d.ts +2 -0
- package/esm/components/inputs/input.spec.d.ts.map +1 -0
- package/esm/components/inputs/input.spec.js +577 -0
- package/esm/components/inputs/input.spec.js.map +1 -0
- package/esm/components/inputs/text-area.d.ts.map +1 -1
- package/esm/components/inputs/text-area.js +54 -58
- package/esm/components/inputs/text-area.js.map +1 -1
- package/esm/components/inputs/text-area.spec.d.ts +2 -0
- package/esm/components/inputs/text-area.spec.d.ts.map +1 -0
- package/esm/components/inputs/text-area.spec.js +214 -0
- package/esm/components/inputs/text-area.spec.js.map +1 -0
- package/esm/components/loader.js +1 -1
- package/esm/components/loader.js.map +1 -1
- package/esm/components/loader.spec.d.ts +2 -0
- package/esm/components/loader.spec.d.ts.map +1 -0
- package/esm/components/loader.spec.js +251 -0
- package/esm/components/loader.spec.js.map +1 -0
- package/esm/components/modal.d.ts.map +1 -1
- package/esm/components/modal.js +11 -9
- package/esm/components/modal.js.map +1 -1
- package/esm/components/modal.spec.d.ts +2 -0
- package/esm/components/modal.spec.d.ts.map +1 -0
- package/esm/components/modal.spec.js +227 -0
- package/esm/components/modal.spec.js.map +1 -0
- package/esm/components/noty-list.d.ts.map +1 -1
- package/esm/components/noty-list.js +39 -40
- package/esm/components/noty-list.js.map +1 -1
- package/esm/components/noty-list.spec.d.ts +2 -0
- package/esm/components/noty-list.spec.d.ts.map +1 -0
- package/esm/components/noty-list.spec.js +486 -0
- package/esm/components/noty-list.spec.js.map +1 -0
- package/esm/components/paper.d.ts.map +1 -1
- package/esm/components/paper.js +15 -12
- package/esm/components/paper.js.map +1 -1
- package/esm/components/paper.spec.d.ts +2 -0
- package/esm/components/paper.spec.d.ts.map +1 -0
- package/esm/components/paper.spec.js +63 -0
- package/esm/components/paper.spec.js.map +1 -0
- package/esm/components/skeleton.js +1 -1
- package/esm/components/skeleton.js.map +1 -1
- package/esm/components/skeleton.spec.d.ts +2 -0
- package/esm/components/skeleton.spec.d.ts.map +1 -0
- package/esm/components/skeleton.spec.js +159 -0
- package/esm/components/skeleton.spec.js.map +1 -0
- package/esm/components/styles.spec.d.ts +2 -0
- package/esm/components/styles.spec.d.ts.map +1 -0
- package/esm/components/styles.spec.js +56 -0
- package/esm/components/styles.spec.js.map +1 -0
- package/esm/components/suggest/index.d.ts.map +1 -1
- package/esm/components/suggest/index.js +74 -83
- package/esm/components/suggest/index.js.map +1 -1
- package/esm/components/suggest/index.spec.d.ts +2 -0
- package/esm/components/suggest/index.spec.d.ts.map +1 -0
- package/esm/components/suggest/index.spec.js +515 -0
- package/esm/components/suggest/index.spec.js.map +1 -0
- package/esm/components/suggest/suggest-input.d.ts.map +1 -1
- package/esm/components/suggest/suggest-input.js +16 -17
- package/esm/components/suggest/suggest-input.js.map +1 -1
- package/esm/components/suggest/suggest-input.spec.d.ts +2 -0
- package/esm/components/suggest/suggest-input.spec.d.ts.map +1 -0
- package/esm/components/suggest/suggest-input.spec.js +138 -0
- package/esm/components/suggest/suggest-input.spec.js.map +1 -0
- package/esm/components/suggest/suggest-manager.spec.d.ts +2 -0
- package/esm/components/suggest/suggest-manager.spec.d.ts.map +1 -0
- package/esm/components/suggest/suggest-manager.spec.js +308 -0
- package/esm/components/suggest/suggest-manager.spec.js.map +1 -0
- package/esm/components/suggest/suggestion-list.d.ts.map +1 -1
- package/esm/components/suggest/suggestion-list.js +43 -48
- package/esm/components/suggest/suggestion-list.js.map +1 -1
- package/esm/components/suggest/suggestion-list.spec.d.ts +2 -0
- package/esm/components/suggest/suggestion-list.spec.d.ts.map +1 -0
- package/esm/components/suggest/suggestion-list.spec.js +252 -0
- package/esm/components/suggest/suggestion-list.spec.js.map +1 -0
- package/esm/components/tabs.d.ts.map +1 -1
- package/esm/components/tabs.js +32 -18
- package/esm/components/tabs.js.map +1 -1
- package/esm/components/tabs.spec.d.ts +2 -0
- package/esm/components/tabs.spec.d.ts.map +1 -0
- package/esm/components/tabs.spec.js +187 -0
- package/esm/components/tabs.spec.js.map +1 -0
- package/esm/components/wizard/index.d.ts.map +1 -1
- package/esm/components/wizard/index.js +10 -7
- package/esm/components/wizard/index.js.map +1 -1
- package/esm/components/wizard/index.spec.d.ts +2 -0
- package/esm/components/wizard/index.spec.d.ts.map +1 -0
- package/esm/components/wizard/index.spec.js +171 -0
- package/esm/components/wizard/index.spec.js.map +1 -0
- package/esm/services/collection-service.spec.js +391 -2
- package/esm/services/collection-service.spec.js.map +1 -1
- package/esm/services/css-variable-theme.d.ts.map +1 -1
- package/esm/services/css-variable-theme.js +21 -1
- package/esm/services/css-variable-theme.js.map +1 -1
- package/esm/services/css-variable-theme.spec.d.ts +2 -0
- package/esm/services/css-variable-theme.spec.d.ts.map +1 -0
- package/esm/services/css-variable-theme.spec.js +169 -0
- package/esm/services/css-variable-theme.spec.js.map +1 -0
- package/esm/services/default-palette.d.ts +4 -0
- package/esm/services/default-palette.d.ts.map +1 -1
- package/esm/services/default-palette.js +22 -0
- package/esm/services/default-palette.js.map +1 -1
- package/esm/services/theme-provider-service.d.ts +59 -1
- package/esm/services/theme-provider-service.d.ts.map +1 -1
- package/esm/services/theme-provider-service.js.map +1 -1
- package/esm/services/theme-provider-service.spec.d.ts +2 -0
- package/esm/services/theme-provider-service.spec.d.ts.map +1 -0
- package/esm/services/theme-provider-service.spec.js +166 -0
- package/esm/services/theme-provider-service.spec.js.map +1 -0
- package/package.json +2 -2
- package/src/components/animations.spec.ts +299 -0
- package/src/components/app-bar-link.spec.tsx +341 -0
- package/src/components/app-bar-link.tsx +21 -21
- package/src/components/app-bar.spec.tsx +142 -0
- package/src/components/app-bar.tsx +22 -22
- package/src/components/avatar.spec.tsx +146 -0
- package/src/components/avatar.tsx +17 -20
- package/src/components/button.spec.tsx +193 -0
- package/src/components/button.tsx +162 -197
- package/src/components/command-palette/command-palette-input.spec.tsx +320 -0
- package/src/components/command-palette/command-palette-input.tsx +19 -22
- package/src/components/command-palette/command-palette-manager.spec.ts +470 -0
- package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +499 -0
- package/src/components/command-palette/command-palette-suggestion-list.tsx +42 -46
- package/src/components/command-palette/index.spec.tsx +684 -0
- package/src/components/command-palette/index.tsx +107 -136
- package/src/components/data-grid/body.spec.tsx +340 -0
- package/src/components/data-grid/body.tsx +1 -1
- package/src/components/data-grid/data-grid-row.spec.tsx +382 -0
- package/src/components/data-grid/data-grid-row.tsx +50 -82
- package/src/components/data-grid/data-grid.spec.tsx +939 -0
- package/src/components/data-grid/data-grid.tsx +38 -35
- package/src/components/data-grid/footer.spec.tsx +344 -0
- package/src/components/data-grid/footer.tsx +19 -19
- package/src/components/data-grid/header.spec.tsx +563 -0
- package/src/components/data-grid/header.tsx +53 -44
- package/src/components/data-grid/selection-cell.spec.tsx +150 -0
- package/src/components/data-grid/selection-cell.tsx +12 -6
- package/src/components/fab.spec.tsx +108 -0
- package/src/components/fab.tsx +10 -1
- package/src/components/form.spec.tsx +481 -0
- package/src/components/grid.spec.tsx +334 -0
- package/src/components/grid.tsx +57 -63
- package/src/components/inputs/autocomplete.spec.tsx +258 -0
- package/src/components/inputs/input.spec.tsx +808 -0
- package/src/components/inputs/input.tsx +153 -139
- package/src/components/inputs/text-area.spec.tsx +285 -0
- package/src/components/inputs/text-area.tsx +53 -79
- package/src/components/loader.spec.tsx +346 -0
- package/src/components/loader.tsx +1 -1
- package/src/components/modal.spec.tsx +304 -0
- package/src/components/modal.tsx +11 -9
- package/src/components/noty-list.spec.tsx +631 -0
- package/src/components/noty-list.tsx +39 -50
- package/src/components/paper.spec.tsx +72 -0
- package/src/components/paper.tsx +15 -13
- package/src/components/skeleton.spec.tsx +219 -0
- package/src/components/skeleton.tsx +1 -1
- package/src/components/styles.spec.ts +70 -0
- package/src/components/suggest/index.spec.tsx +861 -0
- package/src/components/suggest/index.tsx +74 -101
- package/src/components/suggest/suggest-input.spec.tsx +181 -0
- package/src/components/suggest/suggest-input.tsx +16 -24
- package/src/components/suggest/suggest-manager.spec.ts +409 -0
- package/src/components/suggest/suggestion-list.spec.tsx +334 -0
- package/src/components/suggest/suggestion-list.tsx +43 -48
- package/src/components/tabs.spec.tsx +236 -0
- package/src/components/tabs.tsx +33 -21
- package/src/components/wizard/index.spec.tsx +224 -0
- package/src/components/wizard/index.tsx +10 -9
- package/src/services/collection-service.spec.ts +492 -3
- package/src/services/css-variable-theme.spec.ts +204 -0
- package/src/services/css-variable-theme.ts +21 -1
- package/src/services/default-palette.ts +22 -0
- package/src/services/theme-provider-service.spec.ts +195 -0
- package/src/services/theme-provider-service.ts +60 -2
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { Injector } from '@furystack/inject';
|
|
2
|
+
import { createComponent, initializeShadeRoot } from '@furystack/shades';
|
|
3
|
+
import { sleepAsync } from '@furystack/utils';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { CommandPaletteInput } from './command-palette-input.js';
|
|
6
|
+
import { CommandPaletteManager } from './command-palette-manager.js';
|
|
7
|
+
describe('CommandPaletteInput', () => {
|
|
8
|
+
let originalAnimate;
|
|
9
|
+
let animateCalls;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
document.body.innerHTML = '<div id="root"></div>';
|
|
12
|
+
animateCalls = [];
|
|
13
|
+
originalAnimate = Element.prototype.animate;
|
|
14
|
+
Element.prototype.animate = vi.fn((keyframes, options) => {
|
|
15
|
+
animateCalls.push({ keyframes, options });
|
|
16
|
+
const mockAnimation = {
|
|
17
|
+
onfinish: null,
|
|
18
|
+
oncancel: null,
|
|
19
|
+
cancel: vi.fn(),
|
|
20
|
+
play: vi.fn(),
|
|
21
|
+
pause: vi.fn(),
|
|
22
|
+
finish: vi.fn(),
|
|
23
|
+
addEventListener: vi.fn(),
|
|
24
|
+
removeEventListener: vi.fn(),
|
|
25
|
+
};
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
mockAnimation.onfinish?.({});
|
|
28
|
+
}, 10);
|
|
29
|
+
return mockAnimation;
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
document.body.innerHTML = '';
|
|
34
|
+
Element.prototype.animate = originalAnimate;
|
|
35
|
+
vi.restoreAllMocks();
|
|
36
|
+
});
|
|
37
|
+
const createManager = () => {
|
|
38
|
+
return new CommandPaletteManager([]);
|
|
39
|
+
};
|
|
40
|
+
it('should render with shadow DOM', async () => {
|
|
41
|
+
const injector = new Injector();
|
|
42
|
+
const manager = createManager();
|
|
43
|
+
const rootElement = document.getElementById('root');
|
|
44
|
+
initializeShadeRoot({
|
|
45
|
+
injector,
|
|
46
|
+
rootElement,
|
|
47
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
48
|
+
});
|
|
49
|
+
await sleepAsync(50);
|
|
50
|
+
const input = document.querySelector('shades-command-palette-input');
|
|
51
|
+
expect(input).not.toBeNull();
|
|
52
|
+
manager[Symbol.dispose]();
|
|
53
|
+
});
|
|
54
|
+
it('should render an input element with placeholder', async () => {
|
|
55
|
+
const injector = new Injector();
|
|
56
|
+
const manager = createManager();
|
|
57
|
+
const rootElement = document.getElementById('root');
|
|
58
|
+
initializeShadeRoot({
|
|
59
|
+
injector,
|
|
60
|
+
rootElement,
|
|
61
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
62
|
+
});
|
|
63
|
+
await sleepAsync(50);
|
|
64
|
+
const component = document.querySelector('shades-command-palette-input');
|
|
65
|
+
const inputElement = component?.querySelector('input');
|
|
66
|
+
expect(inputElement).not.toBeNull();
|
|
67
|
+
expect(inputElement?.placeholder).toBe('Type to search commands...');
|
|
68
|
+
manager[Symbol.dispose]();
|
|
69
|
+
});
|
|
70
|
+
it('should start with width 0% when closed', async () => {
|
|
71
|
+
const injector = new Injector();
|
|
72
|
+
const manager = createManager();
|
|
73
|
+
manager.isOpened.setValue(false);
|
|
74
|
+
const rootElement = document.getElementById('root');
|
|
75
|
+
initializeShadeRoot({
|
|
76
|
+
injector,
|
|
77
|
+
rootElement,
|
|
78
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
79
|
+
});
|
|
80
|
+
await sleepAsync(50);
|
|
81
|
+
const component = document.querySelector('shades-command-palette-input');
|
|
82
|
+
expect(component.style.width).toBe('0%');
|
|
83
|
+
manager[Symbol.dispose]();
|
|
84
|
+
});
|
|
85
|
+
it('should have width 100% when opened', async () => {
|
|
86
|
+
const injector = new Injector();
|
|
87
|
+
const manager = createManager();
|
|
88
|
+
manager.isOpened.setValue(true);
|
|
89
|
+
const rootElement = document.getElementById('root');
|
|
90
|
+
initializeShadeRoot({
|
|
91
|
+
injector,
|
|
92
|
+
rootElement,
|
|
93
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
94
|
+
});
|
|
95
|
+
await sleepAsync(50);
|
|
96
|
+
const component = document.querySelector('shades-command-palette-input');
|
|
97
|
+
expect(component.style.width).toBe('100%');
|
|
98
|
+
manager[Symbol.dispose]();
|
|
99
|
+
});
|
|
100
|
+
it('should animate width when opening', async () => {
|
|
101
|
+
const injector = new Injector();
|
|
102
|
+
const manager = createManager();
|
|
103
|
+
manager.isOpened.setValue(false);
|
|
104
|
+
const rootElement = document.getElementById('root');
|
|
105
|
+
initializeShadeRoot({
|
|
106
|
+
injector,
|
|
107
|
+
rootElement,
|
|
108
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
109
|
+
});
|
|
110
|
+
await sleepAsync(50);
|
|
111
|
+
animateCalls = [];
|
|
112
|
+
manager.isOpened.setValue(true);
|
|
113
|
+
await sleepAsync(50);
|
|
114
|
+
const widthAnimation = animateCalls.find((call) => Array.isArray(call.keyframes) &&
|
|
115
|
+
call.keyframes.some((kf) => kf.width === '0%') &&
|
|
116
|
+
call.keyframes.some((kf) => kf.width === '100%'));
|
|
117
|
+
expect(widthAnimation).toBeDefined();
|
|
118
|
+
expect(widthAnimation?.options?.duration).toBe(300);
|
|
119
|
+
manager[Symbol.dispose]();
|
|
120
|
+
});
|
|
121
|
+
it('should animate width when closing', async () => {
|
|
122
|
+
const injector = new Injector();
|
|
123
|
+
const manager = createManager();
|
|
124
|
+
manager.isOpened.setValue(true);
|
|
125
|
+
const rootElement = document.getElementById('root');
|
|
126
|
+
initializeShadeRoot({
|
|
127
|
+
injector,
|
|
128
|
+
rootElement,
|
|
129
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
130
|
+
});
|
|
131
|
+
await sleepAsync(50);
|
|
132
|
+
animateCalls = [];
|
|
133
|
+
manager.isOpened.setValue(false);
|
|
134
|
+
await sleepAsync(50);
|
|
135
|
+
const widthAnimation = animateCalls.find((call) => Array.isArray(call.keyframes) &&
|
|
136
|
+
call.keyframes.some((kf) => kf.width === '100%') &&
|
|
137
|
+
call.keyframes.some((kf) => kf.width === '0%'));
|
|
138
|
+
expect(widthAnimation).toBeDefined();
|
|
139
|
+
manager[Symbol.dispose]();
|
|
140
|
+
});
|
|
141
|
+
it('should clear input value when opening', async () => {
|
|
142
|
+
const injector = new Injector();
|
|
143
|
+
const manager = createManager();
|
|
144
|
+
manager.isOpened.setValue(false);
|
|
145
|
+
const rootElement = document.getElementById('root');
|
|
146
|
+
initializeShadeRoot({
|
|
147
|
+
injector,
|
|
148
|
+
rootElement,
|
|
149
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
150
|
+
});
|
|
151
|
+
await sleepAsync(50);
|
|
152
|
+
const component = document.querySelector('shades-command-palette-input');
|
|
153
|
+
const inputElement = component?.querySelector('input');
|
|
154
|
+
inputElement.value = 'some text';
|
|
155
|
+
manager.isOpened.setValue(true);
|
|
156
|
+
await sleepAsync(50);
|
|
157
|
+
expect(inputElement.value).toBe('');
|
|
158
|
+
manager[Symbol.dispose]();
|
|
159
|
+
});
|
|
160
|
+
it('should clear input value when closing', async () => {
|
|
161
|
+
const injector = new Injector();
|
|
162
|
+
const manager = createManager();
|
|
163
|
+
manager.isOpened.setValue(true);
|
|
164
|
+
const rootElement = document.getElementById('root');
|
|
165
|
+
initializeShadeRoot({
|
|
166
|
+
injector,
|
|
167
|
+
rootElement,
|
|
168
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
169
|
+
});
|
|
170
|
+
await sleepAsync(50);
|
|
171
|
+
const component = document.querySelector('shades-command-palette-input');
|
|
172
|
+
const inputElement = component?.querySelector('input');
|
|
173
|
+
inputElement.value = 'search term';
|
|
174
|
+
manager.isOpened.setValue(false);
|
|
175
|
+
await sleepAsync(50);
|
|
176
|
+
expect(inputElement.value).toBe('');
|
|
177
|
+
manager[Symbol.dispose]();
|
|
178
|
+
});
|
|
179
|
+
it('should have overflow hidden style', async () => {
|
|
180
|
+
const injector = new Injector();
|
|
181
|
+
const manager = createManager();
|
|
182
|
+
const rootElement = document.getElementById('root');
|
|
183
|
+
initializeShadeRoot({
|
|
184
|
+
injector,
|
|
185
|
+
rootElement,
|
|
186
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
187
|
+
});
|
|
188
|
+
await sleepAsync(50);
|
|
189
|
+
const component = document.querySelector('shades-command-palette-input');
|
|
190
|
+
const computedStyle = window.getComputedStyle(component);
|
|
191
|
+
expect(computedStyle.overflow).toBe('hidden');
|
|
192
|
+
manager[Symbol.dispose]();
|
|
193
|
+
});
|
|
194
|
+
it('should use cubic-bezier easing for animations', async () => {
|
|
195
|
+
const injector = new Injector();
|
|
196
|
+
const manager = createManager();
|
|
197
|
+
manager.isOpened.setValue(false);
|
|
198
|
+
const rootElement = document.getElementById('root');
|
|
199
|
+
initializeShadeRoot({
|
|
200
|
+
injector,
|
|
201
|
+
rootElement,
|
|
202
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
203
|
+
});
|
|
204
|
+
await sleepAsync(50);
|
|
205
|
+
animateCalls = [];
|
|
206
|
+
manager.isOpened.setValue(true);
|
|
207
|
+
await sleepAsync(50);
|
|
208
|
+
const widthAnimation = animateCalls.find((call) => Array.isArray(call.keyframes) && call.keyframes.some((kf) => 'width' in kf));
|
|
209
|
+
expect(widthAnimation).toBeDefined();
|
|
210
|
+
expect(widthAnimation?.options?.easing).toBe('cubic-bezier(0.595, 0.425, 0.415, 0.845)');
|
|
211
|
+
manager[Symbol.dispose]();
|
|
212
|
+
});
|
|
213
|
+
it('should fill animation forwards', async () => {
|
|
214
|
+
const injector = new Injector();
|
|
215
|
+
const manager = createManager();
|
|
216
|
+
manager.isOpened.setValue(false);
|
|
217
|
+
const rootElement = document.getElementById('root');
|
|
218
|
+
initializeShadeRoot({
|
|
219
|
+
injector,
|
|
220
|
+
rootElement,
|
|
221
|
+
jsxElement: createComponent(CommandPaletteInput, { manager: manager }),
|
|
222
|
+
});
|
|
223
|
+
await sleepAsync(50);
|
|
224
|
+
animateCalls = [];
|
|
225
|
+
manager.isOpened.setValue(true);
|
|
226
|
+
await sleepAsync(50);
|
|
227
|
+
const widthAnimation = animateCalls.find((call) => Array.isArray(call.keyframes) && call.keyframes.some((kf) => 'width' in kf));
|
|
228
|
+
expect(widthAnimation).toBeDefined();
|
|
229
|
+
expect(widthAnimation?.options?.fill).toBe('forwards');
|
|
230
|
+
manager[Symbol.dispose]();
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
//# sourceMappingURL=command-palette-input.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-palette-input.spec.js","sourceRoot":"","sources":["../../../src/components/command-palette/command-palette-input.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-palette-manager.spec.d.ts","sourceRoot":"","sources":["../../../src/components/command-palette/command-palette-manager.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { Injector } from '@furystack/inject';
|
|
2
|
+
import { using, usingAsync } from '@furystack/utils';
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { CommandPaletteManager } from './command-palette-manager.js';
|
|
5
|
+
const createMockSuggestion = (name, score) => ({
|
|
6
|
+
element: { tagName: 'div', textContent: name },
|
|
7
|
+
score,
|
|
8
|
+
onSelected: vi.fn(),
|
|
9
|
+
});
|
|
10
|
+
const createCommandProvider = (suggestions) => {
|
|
11
|
+
return vi.fn().mockResolvedValue(suggestions);
|
|
12
|
+
};
|
|
13
|
+
describe('CommandPaletteManager', () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.useFakeTimers();
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
vi.useRealTimers();
|
|
19
|
+
});
|
|
20
|
+
describe('Construction and disposal', () => {
|
|
21
|
+
it('Should be constructed with command providers', () => {
|
|
22
|
+
const providers = [];
|
|
23
|
+
using(new CommandPaletteManager(providers), (manager) => {
|
|
24
|
+
expect(manager.isOpened.getValue()).toBe(false);
|
|
25
|
+
expect(manager.isLoading.getValue()).toBe(false);
|
|
26
|
+
expect(manager.term.getValue()).toBe('');
|
|
27
|
+
expect(manager.selectedIndex.getValue()).toBe(0);
|
|
28
|
+
expect(manager.currentSuggestions.getValue()).toEqual([]);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it('Should register keyboard listener on construction', () => {
|
|
32
|
+
const addEventListenerSpy = vi.spyOn(window, 'addEventListener');
|
|
33
|
+
const providers = [];
|
|
34
|
+
using(new CommandPaletteManager(providers), () => {
|
|
35
|
+
expect(addEventListenerSpy).toHaveBeenCalledWith('keyup', expect.any(Function), true);
|
|
36
|
+
});
|
|
37
|
+
addEventListenerSpy.mockRestore();
|
|
38
|
+
});
|
|
39
|
+
it('Should dispose all observables and remove event listeners', () => {
|
|
40
|
+
const removeEventListenerSpy = vi.spyOn(window, 'removeEventListener');
|
|
41
|
+
const providers = [];
|
|
42
|
+
const manager = new CommandPaletteManager(providers);
|
|
43
|
+
const isOpenedDisposeSpy = vi.spyOn(manager.isOpened, Symbol.dispose);
|
|
44
|
+
const isLoadingDisposeSpy = vi.spyOn(manager.isLoading, Symbol.dispose);
|
|
45
|
+
const termDisposeSpy = vi.spyOn(manager.term, Symbol.dispose);
|
|
46
|
+
const selectedIndexDisposeSpy = vi.spyOn(manager.selectedIndex, Symbol.dispose);
|
|
47
|
+
const currentSuggestionsDisposeSpy = vi.spyOn(manager.currentSuggestions, Symbol.dispose);
|
|
48
|
+
manager[Symbol.dispose]();
|
|
49
|
+
expect(isOpenedDisposeSpy).toHaveBeenCalled();
|
|
50
|
+
expect(isLoadingDisposeSpy).toHaveBeenCalled();
|
|
51
|
+
expect(termDisposeSpy).toHaveBeenCalled();
|
|
52
|
+
expect(selectedIndexDisposeSpy).toHaveBeenCalled();
|
|
53
|
+
expect(currentSuggestionsDisposeSpy).toHaveBeenCalled();
|
|
54
|
+
expect(removeEventListenerSpy).toHaveBeenCalledWith('keyup', manager.keyPressListener);
|
|
55
|
+
removeEventListenerSpy.mockRestore();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('Keyboard shortcuts', () => {
|
|
59
|
+
it('Should open command palette on Ctrl+P', () => {
|
|
60
|
+
const providers = [];
|
|
61
|
+
using(new CommandPaletteManager(providers), (manager) => {
|
|
62
|
+
expect(manager.isOpened.getValue()).toBe(false);
|
|
63
|
+
manager.keyPressListener({ key: 'p', ctrlKey: true });
|
|
64
|
+
expect(manager.isOpened.getValue()).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
it('Should open command palette on Ctrl+P (uppercase P)', () => {
|
|
68
|
+
const providers = [];
|
|
69
|
+
using(new CommandPaletteManager(providers), (manager) => {
|
|
70
|
+
expect(manager.isOpened.getValue()).toBe(false);
|
|
71
|
+
manager.keyPressListener({ key: 'P', ctrlKey: true });
|
|
72
|
+
expect(manager.isOpened.getValue()).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
it('Should clear suggestions when opening with Ctrl+P', () => {
|
|
76
|
+
const suggestions = [createMockSuggestion('test', 1)];
|
|
77
|
+
const providers = [];
|
|
78
|
+
using(new CommandPaletteManager(providers), (manager) => {
|
|
79
|
+
manager.currentSuggestions.setValue(suggestions);
|
|
80
|
+
manager.keyPressListener({ key: 'p', ctrlKey: true });
|
|
81
|
+
expect(manager.currentSuggestions.getValue()).toEqual([]);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
it('Should not open command palette on P without Ctrl', () => {
|
|
85
|
+
const providers = [];
|
|
86
|
+
using(new CommandPaletteManager(providers), (manager) => {
|
|
87
|
+
manager.keyPressListener({ key: 'p', ctrlKey: false });
|
|
88
|
+
expect(manager.isOpened.getValue()).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
it('Should not open command palette on Ctrl without P', () => {
|
|
92
|
+
const providers = [];
|
|
93
|
+
using(new CommandPaletteManager(providers), (manager) => {
|
|
94
|
+
manager.keyPressListener({ key: 'a', ctrlKey: true });
|
|
95
|
+
expect(manager.isOpened.getValue()).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
it('Should close command palette on Escape', () => {
|
|
99
|
+
const providers = [];
|
|
100
|
+
using(new CommandPaletteManager(providers), (manager) => {
|
|
101
|
+
manager.isOpened.setValue(true);
|
|
102
|
+
expect(manager.isOpened.getValue()).toBe(true);
|
|
103
|
+
manager.keyPressListener({ key: 'Escape' });
|
|
104
|
+
expect(manager.isOpened.getValue()).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
it('Should not close command palette for other keys', () => {
|
|
108
|
+
const providers = [];
|
|
109
|
+
using(new CommandPaletteManager(providers), (manager) => {
|
|
110
|
+
manager.isOpened.setValue(true);
|
|
111
|
+
manager.keyPressListener({ key: 'Enter' });
|
|
112
|
+
expect(manager.isOpened.getValue()).toBe(true);
|
|
113
|
+
manager.keyPressListener({ key: 'ArrowDown' });
|
|
114
|
+
expect(manager.isOpened.getValue()).toBe(true);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
it('Should handle undefined key gracefully', () => {
|
|
118
|
+
const providers = [];
|
|
119
|
+
using(new CommandPaletteManager(providers), (manager) => {
|
|
120
|
+
manager.keyPressListener({ key: undefined, ctrlKey: true });
|
|
121
|
+
expect(manager.isOpened.getValue()).toBe(false);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('getSuggestion (debounced search)', () => {
|
|
126
|
+
it('Should load suggestions after debounce delay', async () => {
|
|
127
|
+
const suggestions = [createMockSuggestion('test', 1)];
|
|
128
|
+
const provider = createCommandProvider(suggestions);
|
|
129
|
+
const injector = new Injector();
|
|
130
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
131
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
132
|
+
expect(provider).not.toHaveBeenCalled();
|
|
133
|
+
expect(manager.isLoading.getValue()).toBe(false);
|
|
134
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
135
|
+
expect(provider).toHaveBeenCalledWith({ injector, term: 'test' });
|
|
136
|
+
expect(manager.currentSuggestions.getValue()).toHaveLength(1);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
it('Should set isLoading while fetching', async () => {
|
|
140
|
+
let resolveProvider;
|
|
141
|
+
const providerPromise = new Promise((resolve) => {
|
|
142
|
+
resolveProvider = resolve;
|
|
143
|
+
});
|
|
144
|
+
const provider = vi.fn().mockReturnValue(providerPromise);
|
|
145
|
+
const injector = new Injector();
|
|
146
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
147
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
148
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
149
|
+
expect(manager.isLoading.getValue()).toBe(true);
|
|
150
|
+
resolveProvider([]);
|
|
151
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
152
|
+
expect(manager.isLoading.getValue()).toBe(false);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
it('Should debounce multiple rapid calls', async () => {
|
|
156
|
+
const suggestions = [createMockSuggestion('test', 1)];
|
|
157
|
+
const provider = createCommandProvider(suggestions);
|
|
158
|
+
const injector = new Injector();
|
|
159
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
160
|
+
void manager.getSuggestion({ injector, term: 'a' });
|
|
161
|
+
await vi.advanceTimersByTimeAsync(100);
|
|
162
|
+
void manager.getSuggestion({ injector, term: 'ab' });
|
|
163
|
+
await vi.advanceTimersByTimeAsync(100);
|
|
164
|
+
void manager.getSuggestion({ injector, term: 'abc' });
|
|
165
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
166
|
+
expect(provider).toHaveBeenCalledTimes(1);
|
|
167
|
+
expect(provider).toHaveBeenCalledWith({ injector, term: 'abc' });
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
it('Should not fetch again if term is unchanged', async () => {
|
|
171
|
+
const suggestions = [createMockSuggestion('test', 1)];
|
|
172
|
+
const provider = createCommandProvider(suggestions);
|
|
173
|
+
const injector = new Injector();
|
|
174
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
175
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
176
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
177
|
+
expect(provider).toHaveBeenCalledTimes(1);
|
|
178
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
179
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
180
|
+
expect(provider).toHaveBeenCalledTimes(1);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
it('Should reset selectedIndex when fetching new suggestions', async () => {
|
|
184
|
+
const suggestions = [createMockSuggestion('test', 1)];
|
|
185
|
+
const provider = createCommandProvider(suggestions);
|
|
186
|
+
const injector = new Injector();
|
|
187
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
188
|
+
manager.selectedIndex.setValue(5);
|
|
189
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
190
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
191
|
+
expect(manager.selectedIndex.getValue()).toBe(0);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
it('Should clear suggestions when starting new search', async () => {
|
|
195
|
+
const suggestions = [createMockSuggestion('test', 1)];
|
|
196
|
+
const provider = createCommandProvider(suggestions);
|
|
197
|
+
const injector = new Injector();
|
|
198
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
199
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
200
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
201
|
+
expect(manager.currentSuggestions.getValue()).toHaveLength(1);
|
|
202
|
+
void manager.getSuggestion({ injector, term: 'test2' });
|
|
203
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
204
|
+
expect(manager.currentSuggestions.getValue()).toHaveLength(1);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
it('Should set isLoading to false even when error occurs', async () => {
|
|
208
|
+
const provider = vi.fn().mockImplementation(async () => {
|
|
209
|
+
throw new Error('Network error');
|
|
210
|
+
});
|
|
211
|
+
const injector = new Injector();
|
|
212
|
+
// Suppress expected unhandled rejection from debounced async error
|
|
213
|
+
const errorHandler = (reason) => {
|
|
214
|
+
if (reason?.message === 'Network error') {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
throw reason;
|
|
218
|
+
};
|
|
219
|
+
process.on('unhandledRejection', errorHandler);
|
|
220
|
+
try {
|
|
221
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
222
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
223
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
224
|
+
// Wait for promise rejection to be handled
|
|
225
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
226
|
+
expect(manager.isLoading.getValue()).toBe(false);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
process.removeListener('unhandledRejection', errorHandler);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe('Multiple command providers', () => {
|
|
235
|
+
it('Should call all providers when getting suggestions', async () => {
|
|
236
|
+
const provider1 = createCommandProvider([createMockSuggestion('cmd1', 1)]);
|
|
237
|
+
const provider2 = createCommandProvider([createMockSuggestion('cmd2', 2)]);
|
|
238
|
+
const provider3 = createCommandProvider([createMockSuggestion('cmd3', 3)]);
|
|
239
|
+
const injector = new Injector();
|
|
240
|
+
await usingAsync(new CommandPaletteManager([provider1, provider2, provider3]), async (manager) => {
|
|
241
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
242
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
243
|
+
expect(provider1).toHaveBeenCalledWith({ injector, term: 'test' });
|
|
244
|
+
expect(provider2).toHaveBeenCalledWith({ injector, term: 'test' });
|
|
245
|
+
expect(provider3).toHaveBeenCalledWith({ injector, term: 'test' });
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
it('Should aggregate suggestions from all providers', async () => {
|
|
249
|
+
const provider1 = createCommandProvider([createMockSuggestion('cmd1', 1)]);
|
|
250
|
+
const provider2 = createCommandProvider([createMockSuggestion('cmd2', 2), createMockSuggestion('cmd3', 3)]);
|
|
251
|
+
const injector = new Injector();
|
|
252
|
+
await usingAsync(new CommandPaletteManager([provider1, provider2]), async (manager) => {
|
|
253
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
254
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
255
|
+
expect(manager.currentSuggestions.getValue()).toHaveLength(3);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
it('Should sort suggestions by score', async () => {
|
|
259
|
+
const provider1 = createCommandProvider([createMockSuggestion('low', 1)]);
|
|
260
|
+
const provider2 = createCommandProvider([createMockSuggestion('high', 10)]);
|
|
261
|
+
const provider3 = createCommandProvider([createMockSuggestion('medium', 5)]);
|
|
262
|
+
const injector = new Injector();
|
|
263
|
+
await usingAsync(new CommandPaletteManager([provider1, provider2, provider3]), async (manager) => {
|
|
264
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
265
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
266
|
+
const suggestions = manager.currentSuggestions.getValue();
|
|
267
|
+
expect(suggestions[0].score).toBe(1);
|
|
268
|
+
expect(suggestions[1].score).toBe(5);
|
|
269
|
+
expect(suggestions[2].score).toBe(10);
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
it('Should handle providers returning empty arrays', async () => {
|
|
273
|
+
const provider1 = createCommandProvider([createMockSuggestion('cmd1', 1)]);
|
|
274
|
+
const provider2 = createCommandProvider([]);
|
|
275
|
+
const injector = new Injector();
|
|
276
|
+
await usingAsync(new CommandPaletteManager([provider1, provider2]), async (manager) => {
|
|
277
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
278
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
279
|
+
expect(manager.currentSuggestions.getValue()).toHaveLength(1);
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
it('Should work with no providers', async () => {
|
|
283
|
+
const injector = new Injector();
|
|
284
|
+
await usingAsync(new CommandPaletteManager([]), async (manager) => {
|
|
285
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
286
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
287
|
+
expect(manager.currentSuggestions.getValue()).toHaveLength(0);
|
|
288
|
+
expect(manager.isLoading.getValue()).toBe(false);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
it('Should handle provider errors gracefully', async () => {
|
|
292
|
+
const provider1 = createCommandProvider([createMockSuggestion('cmd1', 1)]);
|
|
293
|
+
const provider2 = vi.fn().mockImplementation(async () => {
|
|
294
|
+
throw new Error('Provider failed');
|
|
295
|
+
});
|
|
296
|
+
const injector = new Injector();
|
|
297
|
+
// Suppress expected unhandled rejection from debounced async error
|
|
298
|
+
const errorHandler = (reason) => {
|
|
299
|
+
if (reason?.message === 'Provider failed') {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
throw reason;
|
|
303
|
+
};
|
|
304
|
+
process.on('unhandledRejection', errorHandler);
|
|
305
|
+
try {
|
|
306
|
+
await usingAsync(new CommandPaletteManager([provider1, provider2]), async (manager) => {
|
|
307
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
308
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
309
|
+
// Wait for promise rejection to be handled
|
|
310
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
311
|
+
expect(manager.isLoading.getValue()).toBe(false);
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
process.removeListener('unhandledRejection', errorHandler);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
describe('selectSuggestion', () => {
|
|
320
|
+
it('Should call onSelected callback with injector', async () => {
|
|
321
|
+
const suggestion = createMockSuggestion('cmd', 1);
|
|
322
|
+
const provider = createCommandProvider([suggestion]);
|
|
323
|
+
const injector = new Injector();
|
|
324
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
325
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
326
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
327
|
+
manager.selectSuggestion(injector, 0);
|
|
328
|
+
expect(suggestion.onSelected).toHaveBeenCalledWith({ injector });
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
it('Should use current selectedIndex when no index provided', async () => {
|
|
332
|
+
const suggestions = [
|
|
333
|
+
createMockSuggestion('cmd1', 1),
|
|
334
|
+
createMockSuggestion('cmd2', 2),
|
|
335
|
+
createMockSuggestion('cmd3', 3),
|
|
336
|
+
];
|
|
337
|
+
const provider = createCommandProvider(suggestions);
|
|
338
|
+
const injector = new Injector();
|
|
339
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
340
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
341
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
342
|
+
manager.selectedIndex.setValue(2);
|
|
343
|
+
manager.selectSuggestion(injector);
|
|
344
|
+
expect(suggestions[2].onSelected).toHaveBeenCalledWith({ injector });
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
it('Should close the command palette after selection', async () => {
|
|
348
|
+
const suggestion = createMockSuggestion('cmd', 1);
|
|
349
|
+
const provider = createCommandProvider([suggestion]);
|
|
350
|
+
const injector = new Injector();
|
|
351
|
+
await usingAsync(new CommandPaletteManager([provider]), async (manager) => {
|
|
352
|
+
void manager.getSuggestion({ injector, term: 'test' });
|
|
353
|
+
await vi.advanceTimersByTimeAsync(250);
|
|
354
|
+
manager.isOpened.setValue(true);
|
|
355
|
+
expect(manager.isOpened.getValue()).toBe(true);
|
|
356
|
+
manager.selectSuggestion(injector, 0);
|
|
357
|
+
expect(manager.isOpened.getValue()).toBe(false);
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
//# sourceMappingURL=command-palette-manager.spec.js.map
|