@shopify/cli-kit 3.34.0 → 3.36.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/dist/content-tokens.js +1 -1
- package/dist/content-tokens.js.map +1 -1
- package/dist/error.js +2 -2
- package/dist/error.js.map +1 -1
- package/dist/git.js +2 -2
- package/dist/git.js.map +1 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.js +0 -6
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +1 -1
- package/dist/metadata.js.map +1 -1
- package/dist/monorail.d.ts +1 -1
- package/dist/monorail.js +1 -1
- package/dist/monorail.js.map +1 -1
- package/dist/output.js +3 -7
- package/dist/output.js.map +1 -1
- package/dist/plugins.d.ts +1 -1
- package/dist/plugins.js.map +1 -1
- package/dist/{typing → private/common/ts}/deep-required.d.ts +3 -3
- package/dist/{typing → private/common/ts}/deep-required.js +0 -0
- package/dist/private/common/ts/deep-required.js.map +1 -0
- package/dist/{typing → private/common/ts}/overloaded-parameters.d.ts +0 -0
- package/dist/{typing → private/common/ts}/overloaded-parameters.js +0 -0
- package/dist/private/common/ts/overloaded-parameters.js.map +1 -0
- package/dist/private/node/api/graphql.js +2 -3
- package/dist/private/node/api/graphql.js.map +1 -1
- package/dist/private/node/api/headers.d.ts +11 -2
- package/dist/private/node/api/headers.js +29 -3
- package/dist/private/node/api/headers.js.map +1 -1
- package/dist/private/node/api/rest.d.ts +5 -3
- package/dist/private/node/api/rest.js +8 -7
- package/dist/private/node/api/rest.js.map +1 -1
- package/dist/private/node/constants.d.ts +42 -0
- package/dist/private/node/constants.js +58 -0
- package/dist/private/node/constants.js.map +1 -0
- package/dist/private/node/environment/service.js +2 -2
- package/dist/private/node/environment/service.js.map +1 -1
- package/dist/private/node/session/device-authorization.js +1 -1
- package/dist/private/node/session/device-authorization.js.map +1 -1
- package/dist/private/node/session/exchange.js +1 -1
- package/dist/private/node/session/exchange.js.map +1 -1
- package/dist/private/node/session/identity-token-validation.js +1 -1
- package/dist/private/node/session/identity-token-validation.js.map +1 -1
- package/dist/private/node/session/post-auth.js +10 -10
- package/dist/private/node/session/post-auth.js.map +1 -1
- package/dist/private/node/session/store.js +6 -6
- package/dist/private/node/session/store.js.map +1 -1
- package/dist/private/node/session/validate.js +2 -2
- package/dist/private/node/session/validate.js.map +1 -1
- package/dist/private/node/session.js +2 -2
- package/dist/private/node/session.js.map +1 -1
- package/dist/{typing → private/node}/simple-definitions.d.ts +0 -0
- package/dist/{typing → private/node}/simple-definitions.js +0 -0
- package/dist/private/node/simple-definitions.js.map +1 -0
- package/dist/private/node/ui/alert.d.ts +1 -1
- package/dist/private/node/ui/alert.js +2 -2
- package/dist/private/node/ui/alert.js.map +1 -1
- package/dist/private/node/ui/components/Alert.d.ts +5 -0
- package/dist/private/node/ui/components/Alert.js +9 -6
- package/dist/private/node/ui/components/Alert.js.map +1 -1
- package/dist/private/node/ui/components/Alert.test.js +30 -4
- package/dist/private/node/ui/components/Alert.test.js.map +1 -1
- package/dist/private/node/ui/components/AutocompletePrompt.d.ts +12 -0
- package/dist/private/node/ui/components/AutocompletePrompt.js +111 -0
- package/dist/private/node/ui/components/AutocompletePrompt.js.map +1 -0
- package/dist/private/node/ui/components/AutocompletePrompt.test.d.ts +1 -0
- package/dist/private/node/ui/components/AutocompletePrompt.test.js +473 -0
- package/dist/private/node/ui/components/AutocompletePrompt.test.js.map +1 -0
- package/dist/private/node/ui/components/Banner.d.ts +0 -1
- package/dist/private/node/ui/components/Banner.js +4 -4
- package/dist/private/node/ui/components/Banner.js.map +1 -1
- package/dist/private/node/ui/components/Banner.test.js +10 -5
- package/dist/private/node/ui/components/Banner.test.js.map +1 -1
- package/dist/private/node/ui/components/FatalError.js +1 -1
- package/dist/private/node/ui/components/FatalError.js.map +1 -1
- package/dist/private/node/ui/components/FatalError.test.js +4 -8
- package/dist/private/node/ui/components/FatalError.test.js.map +1 -1
- package/dist/private/node/ui/components/{Table.d.ts → Prompts/InfoTable.d.ts} +2 -2
- package/dist/private/node/ui/components/{Table.js → Prompts/InfoTable.js} +6 -6
- package/dist/private/node/ui/components/Prompts/InfoTable.js.map +1 -0
- package/dist/private/node/ui/components/SelectInput.d.ts +9 -2
- package/dist/private/node/ui/components/SelectInput.js +96 -52
- package/dist/private/node/ui/components/SelectInput.js.map +1 -1
- package/dist/private/node/ui/components/SelectInput.test.js +140 -54
- package/dist/private/node/ui/components/SelectInput.test.js.map +1 -1
- package/dist/private/node/ui/components/SelectPrompt.d.ts +6 -4
- package/dist/private/node/ui/components/SelectPrompt.js +18 -11
- package/dist/private/node/ui/components/SelectPrompt.js.map +1 -1
- package/dist/private/node/ui/components/SelectPrompt.test.js +113 -23
- package/dist/private/node/ui/components/SelectPrompt.test.js.map +1 -1
- package/dist/private/node/ui/components/Table/Column.d.ts +5 -0
- package/dist/private/node/ui/components/Table/Column.js +2 -0
- package/dist/private/node/ui/components/Table/Column.js.map +1 -0
- package/dist/private/node/ui/components/Table/Row.d.ts +12 -0
- package/dist/private/node/ui/components/Table/Row.js +24 -0
- package/dist/private/node/ui/components/Table/Row.js.map +1 -0
- package/dist/private/node/ui/components/Table/ScalarDict.d.ts +5 -0
- package/dist/private/node/ui/components/Table/ScalarDict.js +2 -0
- package/dist/private/node/ui/components/Table/ScalarDict.js.map +1 -0
- package/dist/private/node/ui/components/Table/Table.d.ts +12 -0
- package/dist/private/node/ui/components/Table/Table.js +30 -0
- package/dist/private/node/ui/components/Table/Table.js.map +1 -0
- package/dist/private/node/ui/components/Table/Table.test.d.ts +1 -0
- package/dist/private/node/ui/components/Table/Table.test.js +41 -0
- package/dist/private/node/ui/components/Table/Table.test.js.map +1 -0
- package/dist/private/node/ui/components/Tasks.d.ts +6 -5
- package/dist/private/node/ui/components/Tasks.js +32 -11
- package/dist/private/node/ui/components/Tasks.js.map +1 -1
- package/dist/private/node/ui/components/Tasks.test.js +55 -9
- package/dist/private/node/ui/components/Tasks.test.js.map +1 -1
- package/dist/private/node/ui/components/TextInput.d.ts +4 -1
- package/dist/private/node/ui/components/TextInput.js +22 -13
- package/dist/private/node/ui/components/TextInput.js.map +1 -1
- package/dist/private/node/ui/components/TextInput.test.js +47 -40
- package/dist/private/node/ui/components/TextInput.test.js.map +1 -1
- package/dist/private/node/ui/components/TextPrompt.d.ts +3 -1
- package/dist/private/node/ui/components/TextPrompt.js +28 -15
- package/dist/private/node/ui/components/TextPrompt.js.map +1 -1
- package/dist/private/node/ui/components/TextPrompt.test.js +71 -15
- package/dist/private/node/ui/components/TextPrompt.test.js.map +1 -1
- package/dist/private/node/ui/components/TokenizedText.d.ts +3 -0
- package/dist/private/node/ui/components/TokenizedText.js +33 -1
- package/dist/private/node/ui/components/TokenizedText.js.map +1 -1
- package/dist/private/node/ui/utilities.d.ts +2 -0
- package/dist/private/node/ui/utilities.js +6 -0
- package/dist/private/node/ui/utilities.js.map +1 -0
- package/dist/public/common/string.d.ts +11 -0
- package/dist/public/common/string.js +21 -0
- package/dist/public/common/string.js.map +1 -1
- package/dist/{typing → public/common/ts}/pick-by-prefix.d.ts +4 -3
- package/dist/{typing → public/common/ts}/pick-by-prefix.js +0 -0
- package/dist/public/common/ts/pick-by-prefix.js.map +1 -0
- package/dist/public/common/version.d.ts +1 -0
- package/dist/public/common/version.js +2 -0
- package/dist/public/common/version.js.map +1 -0
- package/dist/public/node/analytics.js +2 -2
- package/dist/public/node/analytics.js.map +1 -1
- package/dist/public/node/api/admin.d.ts +4 -1
- package/dist/public/node/api/admin.js +5 -4
- package/dist/public/node/api/admin.js.map +1 -1
- package/dist/public/node/api/http.d.ts +0 -0
- package/dist/public/node/api/http.js +2 -0
- package/dist/public/node/api/http.js.map +1 -0
- package/dist/public/node/api/oxygen.js +1 -1
- package/dist/public/node/api/oxygen.js.map +1 -1
- package/dist/public/node/archiver.js +2 -1
- package/dist/public/node/archiver.js.map +1 -1
- package/dist/public/node/cli.js +6 -6
- package/dist/public/node/cli.js.map +1 -1
- package/dist/public/node/dot-env.js +2 -2
- package/dist/public/node/dot-env.js.map +1 -1
- package/dist/public/node/environment/local.js +17 -17
- package/dist/public/node/environment/local.js.map +1 -1
- package/dist/public/node/environment/spin.js +6 -6
- package/dist/public/node/environment/spin.js.map +1 -1
- package/dist/public/node/error-handler.js +13 -10
- package/dist/public/node/error-handler.js.map +1 -1
- package/dist/public/node/framework.js +2 -2
- package/dist/public/node/framework.js.map +1 -1
- package/dist/public/node/fs.d.ts +241 -4
- package/dist/public/node/fs.js +366 -2
- package/dist/public/node/fs.js.map +1 -1
- package/dist/public/node/git.d.ts +90 -0
- package/dist/public/node/git.js +174 -0
- package/dist/public/node/git.js.map +1 -0
- package/dist/public/node/github.js +1 -1
- package/dist/public/node/github.js.map +1 -1
- package/dist/{http/fetch.d.ts → public/node/http.d.ts} +18 -7
- package/dist/{http/fetch.js → public/node/http.js} +21 -8
- package/dist/public/node/http.js.map +1 -0
- package/dist/public/node/liquid.js +9 -9
- package/dist/public/node/liquid.js.map +1 -1
- package/dist/public/node/node-package-manager.d.ts +20 -9
- package/dist/public/node/node-package-manager.js +19 -25
- package/dist/public/node/node-package-manager.js.map +1 -1
- package/dist/public/node/path.d.ts +22 -0
- package/dist/{path.js → public/node/path.js} +8 -20
- package/dist/public/node/path.js.map +1 -0
- package/dist/public/node/presets.js +5 -5
- package/dist/public/node/presets.js.map +1 -1
- package/dist/public/node/ruby.js +29 -33
- package/dist/public/node/ruby.js.map +1 -1
- package/dist/public/node/session.js +2 -2
- package/dist/public/node/session.js.map +1 -1
- package/dist/public/node/ui.d.ts +63 -9
- package/dist/public/node/ui.js +83 -8
- package/dist/public/node/ui.js.map +1 -1
- package/dist/public/node/vscode.js +8 -8
- package/dist/public/node/vscode.js.map +1 -1
- package/dist/secure-store.js +4 -4
- package/dist/secure-store.js.map +1 -1
- package/dist/store.d.ts +10 -10
- package/dist/store.js +21 -22
- package/dist/store.js.map +1 -1
- package/dist/testing/store.js +3 -3
- package/dist/testing/store.js.map +1 -1
- package/dist/testing/ui.d.ts +4 -1
- package/dist/testing/ui.js +24 -1
- package/dist/testing/ui.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/executor.d.ts +2 -14
- package/dist/ui/executor.js +38 -72
- package/dist/ui/executor.js.map +1 -1
- package/dist/ui.js +9 -26
- package/dist/ui.js.map +1 -1
- package/package.json +4 -6
- package/dist/constants.d.ts +0 -48
- package/dist/constants.js +0 -67
- package/dist/constants.js.map +0 -1
- package/dist/file.d.ts +0 -98
- package/dist/file.js +0 -216
- package/dist/file.js.map +0 -1
- package/dist/http/fetch.js.map +0 -1
- package/dist/http/formdata.d.ts +0 -3
- package/dist/http/formdata.js +0 -6
- package/dist/http/formdata.js.map +0 -1
- package/dist/http.d.ts +0 -26
- package/dist/http.js +0 -31
- package/dist/http.js.map +0 -1
- package/dist/npm.d.ts +0 -27
- package/dist/npm.js +0 -20
- package/dist/npm.js.map +0 -1
- package/dist/path.d.ts +0 -25
- package/dist/path.js.map +0 -1
- package/dist/private/node/ui/components/Table.js.map +0 -1
- package/dist/typing/deep-required.js.map +0 -1
- package/dist/typing/overloaded-parameters.js.map +0 -1
- package/dist/typing/pick-by-prefix.js.map +0 -1
- package/dist/typing/simple-definitions.js.map +0 -1
- package/dist/ui/inquirer/autocomplete.d.ts +0 -11
- package/dist/ui/inquirer/autocomplete.js +0 -110
- package/dist/ui/inquirer/autocomplete.js.map +0 -1
- package/dist/ui/inquirer/input.d.ts +0 -16
- package/dist/ui/inquirer/input.js +0 -45
- package/dist/ui/inquirer/input.js.map +0 -1
- package/dist/ui/inquirer/password.d.ts +0 -7
- package/dist/ui/inquirer/password.js +0 -8
- package/dist/ui/inquirer/password.js.map +0 -1
- package/dist/ui/inquirer/select.d.ts +0 -14
- package/dist/ui/inquirer/select.js +0 -26
- package/dist/ui/inquirer/select.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import SelectInput from './SelectInput.js';
|
|
2
|
-
import {
|
|
2
|
+
import { sendInputAndWait, sendInputAndWaitForChange, waitForInputsToBeReady } from '../../../../testing/ui.js';
|
|
3
3
|
import { describe, expect, test, vi } from 'vitest';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import { render } from 'ink-testing-library';
|
|
@@ -24,13 +24,13 @@ describe('SelectInput', async () => {
|
|
|
24
24
|
];
|
|
25
25
|
const renderInstance = render(React.createElement(SelectInput, { items: items, onChange: onChange }));
|
|
26
26
|
await waitForInputsToBeReady();
|
|
27
|
-
await
|
|
27
|
+
await sendInputAndWaitForChange(renderInstance, ARROW_UP);
|
|
28
28
|
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
29
29
|
" (1) First
|
|
30
30
|
(2) Second
|
|
31
31
|
[36m>[39m [36m(3) Third[39m
|
|
32
32
|
|
|
33
|
-
[
|
|
33
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
34
34
|
`);
|
|
35
35
|
expect(onChange).toHaveBeenCalledWith(items[2]);
|
|
36
36
|
});
|
|
@@ -52,13 +52,13 @@ describe('SelectInput', async () => {
|
|
|
52
52
|
];
|
|
53
53
|
const renderInstance = render(React.createElement(SelectInput, { items: items, onChange: onChange }));
|
|
54
54
|
await waitForInputsToBeReady();
|
|
55
|
-
await
|
|
55
|
+
await sendInputAndWaitForChange(renderInstance, ARROW_DOWN);
|
|
56
56
|
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
57
57
|
" (1) First
|
|
58
58
|
[36m>[39m [36m(2) Second[39m
|
|
59
59
|
(3) Third
|
|
60
60
|
|
|
61
|
-
[
|
|
61
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
62
62
|
`);
|
|
63
63
|
expect(onChange).toHaveBeenCalledWith(items[1]);
|
|
64
64
|
});
|
|
@@ -81,16 +81,45 @@ describe('SelectInput', async () => {
|
|
|
81
81
|
];
|
|
82
82
|
const renderInstance = render(React.createElement(SelectInput, { items: items, onChange: onChange }));
|
|
83
83
|
await waitForInputsToBeReady();
|
|
84
|
-
await
|
|
84
|
+
await sendInputAndWaitForChange(renderInstance, '1', '0');
|
|
85
85
|
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
86
86
|
" (1) First
|
|
87
87
|
(2) Second
|
|
88
88
|
[36m>[39m [36m(10) Tenth[39m
|
|
89
89
|
|
|
90
|
-
[
|
|
90
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
91
91
|
`);
|
|
92
92
|
expect(onChange).toHaveBeenCalledWith(items[2]);
|
|
93
93
|
});
|
|
94
|
+
test('handles pressing non existing keys', async () => {
|
|
95
|
+
const onChange = vi.fn();
|
|
96
|
+
const items = [
|
|
97
|
+
{
|
|
98
|
+
label: 'First',
|
|
99
|
+
value: 'first',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
label: 'Second',
|
|
103
|
+
value: 'second',
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
label: 'Tenth',
|
|
107
|
+
value: 'tenth',
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
const renderInstance = render(React.createElement(SelectInput, { items: items, onChange: onChange }));
|
|
111
|
+
await waitForInputsToBeReady();
|
|
112
|
+
// nothing changes when pressing a key that doesn't exist
|
|
113
|
+
await sendInputAndWait(renderInstance, 100, '4');
|
|
114
|
+
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
115
|
+
"[36m>[39m [36m(1) First[39m
|
|
116
|
+
(2) Second
|
|
117
|
+
(3) Tenth
|
|
118
|
+
|
|
119
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
120
|
+
`);
|
|
121
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
122
|
+
});
|
|
94
123
|
test('handles custom keys', async () => {
|
|
95
124
|
const onChange = vi.fn();
|
|
96
125
|
const items = [
|
|
@@ -110,13 +139,13 @@ describe('SelectInput', async () => {
|
|
|
110
139
|
];
|
|
111
140
|
const renderInstance = render(React.createElement(SelectInput, { items: items, onChange: onChange }));
|
|
112
141
|
await waitForInputsToBeReady();
|
|
113
|
-
await
|
|
142
|
+
await sendInputAndWaitForChange(renderInstance, 't');
|
|
114
143
|
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
115
144
|
" (1) First
|
|
116
145
|
(2) Second
|
|
117
146
|
[36m>[39m [36m(t) Third[39m
|
|
118
147
|
|
|
119
|
-
[
|
|
148
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
120
149
|
`);
|
|
121
150
|
expect(onChange).toHaveBeenCalledWith(items[2]);
|
|
122
151
|
});
|
|
@@ -138,93 +167,150 @@ describe('SelectInput', async () => {
|
|
|
138
167
|
];
|
|
139
168
|
const renderInstance = render(React.createElement(SelectInput, { items: items, onChange: onChange }));
|
|
140
169
|
await waitForInputsToBeReady();
|
|
141
|
-
await
|
|
142
|
-
await
|
|
143
|
-
await
|
|
170
|
+
await sendInputAndWaitForChange(renderInstance, ARROW_DOWN);
|
|
171
|
+
await sendInputAndWaitForChange(renderInstance, ARROW_DOWN);
|
|
172
|
+
await sendInputAndWaitForChange(renderInstance, ARROW_DOWN);
|
|
144
173
|
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
145
174
|
"[36m>[39m [36m(1) First[39m
|
|
146
175
|
(2) Second
|
|
147
176
|
(3) Third
|
|
148
177
|
|
|
149
|
-
[
|
|
178
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
150
179
|
`);
|
|
151
180
|
expect(onChange).toHaveBeenCalledWith(items[0]);
|
|
152
181
|
});
|
|
153
182
|
test('support groups', async () => {
|
|
154
183
|
const onChange = vi.fn();
|
|
155
184
|
const items = [
|
|
156
|
-
{ label: 'first', value: 'first', key: 'f' },
|
|
157
|
-
{ label: 'second', value: 'second', key: 's' },
|
|
158
|
-
{ label: 'third', value: 'third' },
|
|
159
|
-
{ label: 'fourth', value: 'fourth' },
|
|
160
|
-
{ label: 'fifth', value: 'fifth',
|
|
161
|
-
{ label: 'sixth', value: 'sixth'
|
|
185
|
+
{ label: 'first', value: 'first', group: 'Automations', key: 'f' },
|
|
186
|
+
{ label: 'second', value: 'second', group: 'Automations', key: 's' },
|
|
187
|
+
{ label: 'third', value: 'third', group: 'Merchant Admin' },
|
|
188
|
+
{ label: 'fourth', value: 'fourth', group: 'Merchant Admin' },
|
|
189
|
+
{ label: 'fifth', value: 'fifth', key: 'a' },
|
|
190
|
+
{ label: 'sixth', value: 'sixth' },
|
|
162
191
|
{ label: 'seventh', value: 'seventh' },
|
|
163
|
-
{ label: 'eighth', value: 'eighth'
|
|
164
|
-
{ label: 'ninth', value: 'ninth'
|
|
192
|
+
{ label: 'eighth', value: 'eighth' },
|
|
193
|
+
{ label: 'ninth', value: 'ninth' },
|
|
165
194
|
{ label: 'tenth', value: 'tenth' },
|
|
166
195
|
];
|
|
167
196
|
const renderInstance = render(React.createElement(SelectInput, { items: items, onChange: onChange }));
|
|
168
197
|
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
169
|
-
"[
|
|
198
|
+
" [1mAutomations[22m
|
|
199
|
+
[36m>[39m [36m(f) first[39m
|
|
170
200
|
(s) second
|
|
201
|
+
|
|
202
|
+
[1mMerchant Admin[22m
|
|
171
203
|
(3) third
|
|
172
204
|
(4) fourth
|
|
173
|
-
(5) seventh
|
|
174
|
-
(6) tenth
|
|
175
205
|
|
|
176
|
-
[
|
|
206
|
+
[1mOther[22m
|
|
177
207
|
(a) fifth
|
|
178
|
-
(
|
|
208
|
+
(6) sixth
|
|
209
|
+
(7) seventh
|
|
210
|
+
(8) eighth
|
|
211
|
+
(9) ninth
|
|
212
|
+
(10) tenth
|
|
179
213
|
|
|
180
|
-
[
|
|
181
|
-
(9) eighth
|
|
182
|
-
(10) ninth
|
|
183
|
-
|
|
184
|
-
[2mnavigate with arrows, enter to select[22m"
|
|
214
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
185
215
|
`);
|
|
186
216
|
await waitForInputsToBeReady();
|
|
187
|
-
await
|
|
217
|
+
await sendInputAndWaitForChange(renderInstance, 'a');
|
|
188
218
|
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
189
|
-
"
|
|
219
|
+
" [1mAutomations[22m
|
|
220
|
+
(f) first
|
|
190
221
|
(s) second
|
|
222
|
+
|
|
223
|
+
[1mMerchant Admin[22m
|
|
191
224
|
(3) third
|
|
192
225
|
(4) fourth
|
|
193
|
-
(5) seventh
|
|
194
|
-
(6) tenth
|
|
195
226
|
|
|
196
|
-
[
|
|
227
|
+
[1mOther[22m
|
|
197
228
|
[36m>[39m [36m(a) fifth[39m
|
|
198
|
-
(
|
|
229
|
+
(6) sixth
|
|
230
|
+
(7) seventh
|
|
231
|
+
(8) eighth
|
|
232
|
+
(9) ninth
|
|
233
|
+
(10) tenth
|
|
199
234
|
|
|
200
|
-
[
|
|
201
|
-
(9) eighth
|
|
202
|
-
(10) ninth
|
|
203
|
-
|
|
204
|
-
[2mnavigate with arrows, enter to select[22m"
|
|
235
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
205
236
|
`);
|
|
206
237
|
expect(onChange).toHaveBeenCalledWith(items[4]);
|
|
207
|
-
await
|
|
208
|
-
await
|
|
238
|
+
await sendInputAndWaitForChange(renderInstance, ARROW_DOWN);
|
|
239
|
+
await sendInputAndWaitForChange(renderInstance, ARROW_DOWN);
|
|
209
240
|
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
210
|
-
"
|
|
241
|
+
" [1mAutomations[22m
|
|
242
|
+
(f) first
|
|
211
243
|
(s) second
|
|
244
|
+
|
|
245
|
+
[1mMerchant Admin[22m
|
|
212
246
|
(3) third
|
|
213
247
|
(4) fourth
|
|
214
|
-
[36m>[39m [36m(5) seventh[39m
|
|
215
|
-
(6) tenth
|
|
216
248
|
|
|
217
|
-
[
|
|
249
|
+
[1mOther[22m
|
|
218
250
|
(a) fifth
|
|
219
|
-
(
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
(9)
|
|
223
|
-
(10)
|
|
251
|
+
(6) sixth
|
|
252
|
+
[36m>[39m [36m(7) seventh[39m
|
|
253
|
+
(8) eighth
|
|
254
|
+
(9) ninth
|
|
255
|
+
(10) tenth
|
|
224
256
|
|
|
225
|
-
[
|
|
257
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
226
258
|
`);
|
|
227
259
|
expect(onChange).toHaveBeenCalledWith(items[6]);
|
|
228
260
|
});
|
|
261
|
+
test('allows disabling shortcuts', async () => {
|
|
262
|
+
const onChange = vi.fn();
|
|
263
|
+
const items = [
|
|
264
|
+
{
|
|
265
|
+
label: 'First',
|
|
266
|
+
value: 'first',
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
label: 'Second',
|
|
270
|
+
value: 'second',
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
label: 'Third',
|
|
274
|
+
value: 'third',
|
|
275
|
+
},
|
|
276
|
+
];
|
|
277
|
+
const renderInstance = render(React.createElement(SelectInput, { items: items, onChange: onChange, enableShortcuts: false }));
|
|
278
|
+
await waitForInputsToBeReady();
|
|
279
|
+
// input doesn't change on shortcut pressed
|
|
280
|
+
await sendInputAndWait(renderInstance, 100, '2');
|
|
281
|
+
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
282
|
+
"[36m>[39m [36mFirst[39m
|
|
283
|
+
Second
|
|
284
|
+
Third
|
|
285
|
+
|
|
286
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
287
|
+
`);
|
|
288
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
289
|
+
});
|
|
290
|
+
test('accepts a default value', async () => {
|
|
291
|
+
const items = [
|
|
292
|
+
{
|
|
293
|
+
label: 'First',
|
|
294
|
+
value: 'first',
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
label: 'Second',
|
|
298
|
+
value: 'second',
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
label: 'Third',
|
|
302
|
+
value: 'third',
|
|
303
|
+
},
|
|
304
|
+
];
|
|
305
|
+
const renderInstance = render(React.createElement(SelectInput, { items: items, onChange: () => { }, defaultValue: { label: 'Second', value: 'second' } }));
|
|
306
|
+
await waitForInputsToBeReady();
|
|
307
|
+
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
308
|
+
" (1) First
|
|
309
|
+
[36m>[39m [36m(2) Second[39m
|
|
310
|
+
(3) Third
|
|
311
|
+
|
|
312
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m"
|
|
313
|
+
`);
|
|
314
|
+
});
|
|
229
315
|
});
|
|
230
316
|
//# sourceMappingURL=SelectInput.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectInput.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectInput.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import SelectInput from './SelectInput.js'\nimport {waitForInputsToBeReady, sendInput} from '../../../../testing/ui.js'\nimport {describe, expect, test, vi} from 'vitest'\nimport React from 'react'\nimport {render} from 'ink-testing-library'\n\nconst ARROW_UP = '\\u001B[A'\nconst ARROW_DOWN = '\\u001B[B'\n\ndescribe('SelectInput', async () => {\n test('move up with up arrow key', async () => {\n const onChange = vi.fn()\n\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInput(renderInstance, ARROW_UP)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (1) First\n (2) Second\n \u001b[36m>\u001b[39m \u001b[36m(3) Third\u001b[39m\n\n \u001b[2mnavigate with arrows, enter to select\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[2]!)\n })\n\n test('move down with down arrow key', async () => {\n const onChange = vi.fn()\n\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInput(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (1) First\n \u001b[36m>\u001b[39m \u001b[36m(2) Second\u001b[39m\n (3) Third\n\n \u001b[2mnavigate with arrows, enter to select\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[1]!)\n })\n\n test('handles keys with multiple digits', async () => {\n const onChange = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Tenth',\n value: 'tenth',\n key: '10',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInput(renderInstance, '1', '0')\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (1) First\n (2) Second\n \u001b[36m>\u001b[39m \u001b[36m(10) Tenth\u001b[39m\n\n \u001b[2mnavigate with arrows, enter to select\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[2]!)\n })\n\n test('handles custom keys', async () => {\n const onChange = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInput(renderInstance, 't')\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (1) First\n (2) Second\n \u001b[36m>\u001b[39m \u001b[36m(t) Third\u001b[39m\n\n \u001b[2mnavigate with arrows, enter to select\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[2]!)\n })\n\n test('rotate after reaching the end of the list', async () => {\n const onChange = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInput(renderInstance, ARROW_DOWN)\n await sendInput(renderInstance, ARROW_DOWN)\n await sendInput(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"\u001b[36m>\u001b[39m \u001b[36m(1) First\u001b[39m\n (2) Second\n (3) Third\n\n \u001b[2mnavigate with arrows, enter to select\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[0]!)\n })\n\n test('support groups', async () => {\n const onChange = vi.fn()\n\n const items = [\n {label: 'first', value: 'first', key: 'f'},\n {label: 'second', value: 'second', key: 's'},\n {label: 'third', value: 'third'},\n {label: 'fourth', value: 'fourth'},\n {label: 'fifth', value: 'fifth', group: 'Automations', key: 'a'},\n {label: 'sixth', value: 'sixth', group: 'Automations'},\n {label: 'seventh', value: 'seventh'},\n {label: 'eighth', value: 'eighth', group: 'Merchant Admin'},\n {label: 'ninth', value: 'ninth', group: 'Merchant Admin'},\n {label: 'tenth', value: 'tenth'},\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"\u001b[36m>\u001b[39m \u001b[36m(f) first\u001b[39m\n (s) second\n (3) third\n (4) fourth\n (5) seventh\n (6) tenth\n\n \u001b[1mAutomations\u001b[22m\n (a) fifth\n (8) sixth\n\n \u001b[1mMerchant Admin\u001b[22m\n (9) eighth\n (10) ninth\n\n \u001b[2mnavigate with arrows, enter to select\u001b[22m\"\n `)\n\n await waitForInputsToBeReady()\n await sendInput(renderInstance, 'a')\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (f) first\n (s) second\n (3) third\n (4) fourth\n (5) seventh\n (6) tenth\n\n \u001b[1mAutomations\u001b[22m\n \u001b[36m>\u001b[39m \u001b[36m(a) fifth\u001b[39m\n (8) sixth\n\n \u001b[1mMerchant Admin\u001b[22m\n (9) eighth\n (10) ninth\n\n \u001b[2mnavigate with arrows, enter to select\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[4]!)\n\n await sendInput(renderInstance, ARROW_UP)\n await sendInput(renderInstance, ARROW_UP)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (f) first\n (s) second\n (3) third\n (4) fourth\n \u001b[36m>\u001b[39m \u001b[36m(5) seventh\u001b[39m\n (6) tenth\n\n \u001b[1mAutomations\u001b[22m\n (a) fifth\n (8) sixth\n\n \u001b[1mMerchant Admin\u001b[22m\n (9) eighth\n (10) ninth\n\n \u001b[2mnavigate with arrows, enter to select\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[6]!)\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"SelectInput.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectInput.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import SelectInput from './SelectInput.js'\nimport {sendInputAndWait, sendInputAndWaitForChange, waitForInputsToBeReady} from '../../../../testing/ui.js'\nimport {describe, expect, test, vi} from 'vitest'\nimport React from 'react'\nimport {render} from 'ink-testing-library'\n\nconst ARROW_UP = '\\u001B[A'\nconst ARROW_DOWN = '\\u001B[B'\n\ndescribe('SelectInput', async () => {\n test('move up with up arrow key', async () => {\n const onChange = vi.fn()\n\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_UP)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (1) First\n (2) Second\n \u001b[36m>\u001b[39m \u001b[36m(3) Third\u001b[39m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[2]!)\n })\n\n test('move down with down arrow key', async () => {\n const onChange = vi.fn()\n\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (1) First\n \u001b[36m>\u001b[39m \u001b[36m(2) Second\u001b[39m\n (3) Third\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[1]!)\n })\n\n test('handles keys with multiple digits', async () => {\n const onChange = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Tenth',\n value: 'tenth',\n key: '10',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, '1', '0')\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (1) First\n (2) Second\n \u001b[36m>\u001b[39m \u001b[36m(10) Tenth\u001b[39m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[2]!)\n })\n\n test('handles pressing non existing keys', async () => {\n const onChange = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Tenth',\n value: 'tenth',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n // nothing changes when pressing a key that doesn't exist\n await sendInputAndWait(renderInstance, 100, '4')\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"\u001b[36m>\u001b[39m \u001b[36m(1) First\u001b[39m\n (2) Second\n (3) Tenth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n expect(onChange).not.toHaveBeenCalled()\n })\n\n test('handles custom keys', async () => {\n const onChange = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, 't')\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (1) First\n (2) Second\n \u001b[36m>\u001b[39m \u001b[36m(t) Third\u001b[39m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[2]!)\n })\n\n test('rotate after reaching the end of the list', async () => {\n const onChange = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"\u001b[36m>\u001b[39m \u001b[36m(1) First\u001b[39m\n (2) Second\n (3) Third\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[0]!)\n })\n\n test('support groups', async () => {\n const onChange = vi.fn()\n\n const items = [\n {label: 'first', value: 'first', group: 'Automations', key: 'f'},\n {label: 'second', value: 'second', group: 'Automations', key: 's'},\n {label: 'third', value: 'third', group: 'Merchant Admin'},\n {label: 'fourth', value: 'fourth', group: 'Merchant Admin'},\n {label: 'fifth', value: 'fifth', key: 'a'},\n {label: 'sixth', value: 'sixth'},\n {label: 'seventh', value: 'seventh'},\n {label: 'eighth', value: 'eighth'},\n {label: 'ninth', value: 'ninth'},\n {label: 'tenth', value: 'tenth'},\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" \u001b[1mAutomations\u001b[22m\n \u001b[36m>\u001b[39m \u001b[36m(f) first\u001b[39m\n (s) second\n\n \u001b[1mMerchant Admin\u001b[22m\n (3) third\n (4) fourth\n\n \u001b[1mOther\u001b[22m\n (a) fifth\n (6) sixth\n (7) seventh\n (8) eighth\n (9) ninth\n (10) tenth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, 'a')\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" \u001b[1mAutomations\u001b[22m\n (f) first\n (s) second\n\n \u001b[1mMerchant Admin\u001b[22m\n (3) third\n (4) fourth\n\n \u001b[1mOther\u001b[22m\n \u001b[36m>\u001b[39m \u001b[36m(a) fifth\u001b[39m\n (6) sixth\n (7) seventh\n (8) eighth\n (9) ninth\n (10) tenth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[4]!)\n\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" \u001b[1mAutomations\u001b[22m\n (f) first\n (s) second\n\n \u001b[1mMerchant Admin\u001b[22m\n (3) third\n (4) fourth\n\n \u001b[1mOther\u001b[22m\n (a) fifth\n (6) sixth\n \u001b[36m>\u001b[39m \u001b[36m(7) seventh\u001b[39m\n (8) eighth\n (9) ninth\n (10) tenth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[6]!)\n })\n\n test('allows disabling shortcuts', async () => {\n const onChange = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} enableShortcuts={false} />)\n\n await waitForInputsToBeReady()\n // input doesn't change on shortcut pressed\n await sendInputAndWait(renderInstance, 100, '2')\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"\u001b[36m>\u001b[39m \u001b[36mFirst\u001b[39m\n Second\n Third\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n expect(onChange).not.toHaveBeenCalled()\n })\n\n test('accepts a default value', async () => {\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(\n <SelectInput items={items} onChange={() => {}} defaultValue={{label: 'Second', value: 'second'}} />,\n )\n\n await waitForInputsToBeReady()\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (1) First\n \u001b[36m>\u001b[39m \u001b[36m(2) Second\u001b[39m\n (3) Third\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n })\n})\n"]}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { Props as SelectProps } from './SelectInput.js';
|
|
2
|
-
import { Props as
|
|
2
|
+
import { Props as InfoTableProps } from './Prompts/InfoTable.js';
|
|
3
|
+
import { TokenItem } from './TokenizedText.js';
|
|
3
4
|
import React, { ReactElement } from 'react';
|
|
4
5
|
export interface Props<T> {
|
|
5
|
-
message:
|
|
6
|
+
message: TokenItem;
|
|
6
7
|
choices: SelectProps<T>['items'];
|
|
7
8
|
onSubmit: (value: T) => void;
|
|
8
|
-
infoTable?:
|
|
9
|
+
infoTable?: InfoTableProps['table'];
|
|
10
|
+
defaultValue?: T;
|
|
9
11
|
}
|
|
10
|
-
declare function SelectPrompt<T>({ message, choices, infoTable, onSubmit, }: React.PropsWithChildren<Props<T>>): ReactElement | null;
|
|
12
|
+
declare function SelectPrompt<T>({ message, choices, infoTable, onSubmit, defaultValue, }: React.PropsWithChildren<Props<T>>): ReactElement | null;
|
|
11
13
|
export { SelectPrompt };
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import SelectInput from './SelectInput.js';
|
|
2
|
-
import
|
|
2
|
+
import InfoTable from './Prompts/InfoTable.js';
|
|
3
|
+
import { TokenizedText } from './TokenizedText.js';
|
|
3
4
|
import { handleCtrlC } from '../../ui.js';
|
|
5
|
+
import { messageWithPunctuation } from '../utilities.js';
|
|
4
6
|
import React, { useCallback, useState } from 'react';
|
|
5
7
|
import { Box, measureElement, Text, useApp, useInput, useStdout } from 'ink';
|
|
6
|
-
import
|
|
8
|
+
import figures from 'figures';
|
|
7
9
|
import ansiEscapes from 'ansi-escapes';
|
|
8
|
-
function SelectPrompt({ message, choices, infoTable, onSubmit, }) {
|
|
9
|
-
|
|
10
|
+
function SelectPrompt({ message, choices, infoTable, onSubmit, defaultValue, }) {
|
|
11
|
+
if (choices.length === 0) {
|
|
12
|
+
throw new Error('SelectPrompt requires at least one choice');
|
|
13
|
+
}
|
|
14
|
+
const initialValue = defaultValue ? choices.find((choice) => choice.value === defaultValue) ?? choices[0] : choices[0];
|
|
15
|
+
const [answer, setAnswer] = useState(initialValue);
|
|
10
16
|
const { exit: unmountInk } = useApp();
|
|
11
17
|
const [submitted, setSubmitted] = useState(false);
|
|
12
18
|
const { stdout } = useStdout();
|
|
@@ -19,7 +25,7 @@ function SelectPrompt({ message, choices, infoTable, onSubmit, }) {
|
|
|
19
25
|
}, []);
|
|
20
26
|
useInput(useCallback((input, key) => {
|
|
21
27
|
handleCtrlC(input, key);
|
|
22
|
-
if (key.return) {
|
|
28
|
+
if (key.return && answer) {
|
|
23
29
|
if (stdout && height >= stdout.rows) {
|
|
24
30
|
stdout.write(ansiEscapes.clearTerminal);
|
|
25
31
|
}
|
|
@@ -32,15 +38,16 @@ function SelectPrompt({ message, choices, infoTable, onSubmit, }) {
|
|
|
32
38
|
React.createElement(Box, null,
|
|
33
39
|
React.createElement(Box, { marginRight: 2 },
|
|
34
40
|
React.createElement(Text, null, "?")),
|
|
35
|
-
React.createElement(
|
|
36
|
-
infoTable && !submitted && (React.createElement(Box, { marginLeft: 7 },
|
|
37
|
-
React.createElement(
|
|
41
|
+
React.createElement(TokenizedText, { item: messageWithPunctuation(message) })),
|
|
42
|
+
infoTable && !submitted && (React.createElement(Box, { marginLeft: 7, marginTop: 1 },
|
|
43
|
+
React.createElement(InfoTable, { table: infoTable }))),
|
|
38
44
|
submitted ? (React.createElement(Box, null,
|
|
39
45
|
React.createElement(Box, { marginRight: 2 },
|
|
40
46
|
React.createElement(Text, { color: "cyan" }, figures.tick)),
|
|
41
|
-
React.createElement(Text, { color: "cyan" }, answer.label))) : (React.createElement(
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
React.createElement(Text, { color: "cyan" }, answer.label))) : (React.createElement(Box, { marginTop: 1 },
|
|
48
|
+
React.createElement(SelectInput, { defaultValue: initialValue, items: choices, onChange: (item) => {
|
|
49
|
+
setAnswer(item);
|
|
50
|
+
} })))));
|
|
44
51
|
}
|
|
45
52
|
export { SelectPrompt };
|
|
46
53
|
//# sourceMappingURL=SelectPrompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectPrompt.tsx"],"names":[],"mappings":"AAAA,OAAO,WAA6D,MAAM,kBAAkB,CAAA;AAC5F,OAAO,
|
|
1
|
+
{"version":3,"file":"SelectPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["import SelectInput, {Props as SelectProps, Item as SelectItem, Item} from './SelectInput.js'\nimport InfoTable, {Props as InfoTableProps} from './Prompts/InfoTable.js'\nimport {TokenItem, TokenizedText} from './TokenizedText.js'\nimport {handleCtrlC} from '../../ui.js'\nimport {messageWithPunctuation} from '../utilities.js'\nimport React, {ReactElement, useCallback, useState} from 'react'\nimport {Box, measureElement, Text, useApp, useInput, useStdout} from 'ink'\nimport figures from 'figures'\nimport ansiEscapes from 'ansi-escapes'\n\nexport interface Props<T> {\n message: TokenItem\n choices: SelectProps<T>['items']\n onSubmit: (value: T) => void\n infoTable?: InfoTableProps['table']\n defaultValue?: T\n}\n\nfunction SelectPrompt<T>({\n message,\n choices,\n infoTable,\n onSubmit,\n defaultValue,\n}: React.PropsWithChildren<Props<T>>): ReactElement | null {\n if (choices.length === 0) {\n throw new Error('SelectPrompt requires at least one choice')\n }\n const initialValue = defaultValue ? choices.find((choice) => choice.value === defaultValue) ?? choices[0] : choices[0]\n const [answer, setAnswer] = useState<SelectItem<T> | undefined>(initialValue)\n const {exit: unmountInk} = useApp()\n const [submitted, setSubmitted] = useState(false)\n const {stdout} = useStdout()\n const [height, setHeight] = useState(0)\n\n const measuredRef = useCallback((node) => {\n if (node !== null) {\n const {height} = measureElement(node)\n setHeight(height)\n }\n }, [])\n\n useInput(\n useCallback(\n (input, key) => {\n handleCtrlC(input, key)\n\n if (key.return && answer) {\n if (stdout && height >= stdout.rows) {\n stdout.write(ansiEscapes.clearTerminal)\n }\n setSubmitted(true)\n unmountInk()\n onSubmit(answer.value)\n }\n },\n [answer, onSubmit, height],\n ),\n )\n\n return (\n <Box flexDirection=\"column\" marginBottom={1} ref={measuredRef}>\n <Box>\n <Box marginRight={2}>\n <Text>?</Text>\n </Box>\n <TokenizedText item={messageWithPunctuation(message)} />\n </Box>\n {infoTable && !submitted && (\n <Box marginLeft={7} marginTop={1}>\n <InfoTable table={infoTable} />\n </Box>\n )}\n {submitted ? (\n <Box>\n <Box marginRight={2}>\n <Text color=\"cyan\">{figures.tick}</Text>\n </Box>\n\n <Text color=\"cyan\">{answer!.label}</Text>\n </Box>\n ) : (\n <Box marginTop={1}>\n <SelectInput\n defaultValue={initialValue}\n items={choices}\n onChange={(item: Item<T> | undefined) => {\n setAnswer(item)\n }}\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport {SelectPrompt}\n"]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { SelectPrompt } from './SelectPrompt.js';
|
|
2
|
-
import { getLastFrameAfterUnmount,
|
|
2
|
+
import { getLastFrameAfterUnmount, sendInputAndWaitForChange, waitForInputsToBeReady } from '../../../../testing/ui.js';
|
|
3
|
+
import { unstyled } from '../../../../output.js';
|
|
3
4
|
import { describe, expect, test, vi } from 'vitest';
|
|
4
5
|
import React from 'react';
|
|
5
6
|
import { render } from 'ink-testing-library';
|
|
6
7
|
const ARROW_DOWN = '\u001B[B';
|
|
7
8
|
const ENTER = '\r';
|
|
8
|
-
describe('
|
|
9
|
+
describe('SelectPrompt', async () => {
|
|
9
10
|
test('choose an answer', async () => {
|
|
10
11
|
const onEnter = vi.fn();
|
|
11
12
|
const items = [
|
|
@@ -16,8 +17,8 @@ describe('Prompt', async () => {
|
|
|
16
17
|
const infoTable = { Add: ['new-ext'], Remove: ['integrated-demand-ext', 'order-discount'] };
|
|
17
18
|
const renderInstance = render(React.createElement(SelectPrompt, { message: "Associate your project with the org Castile Ventures?", choices: items, infoTable: infoTable, onSubmit: onEnter }));
|
|
18
19
|
await waitForInputsToBeReady();
|
|
19
|
-
await
|
|
20
|
-
await
|
|
20
|
+
await sendInputAndWaitForChange(renderInstance, ARROW_DOWN);
|
|
21
|
+
await sendInputAndWaitForChange(renderInstance, ENTER);
|
|
21
22
|
expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`
|
|
22
23
|
"? Associate your project with the org Castile Ventures?
|
|
23
24
|
[36m✔[39m [36msecond[39m
|
|
@@ -25,18 +26,49 @@ describe('Prompt', async () => {
|
|
|
25
26
|
`);
|
|
26
27
|
expect(onEnter).toHaveBeenCalledWith(items[1].value);
|
|
27
28
|
});
|
|
29
|
+
test('renders groups', async () => {
|
|
30
|
+
const items = [
|
|
31
|
+
{ label: 'first', value: 'first', group: 'Automations', key: 'f' },
|
|
32
|
+
{ label: 'second', value: 'second', group: 'Automations', key: 's' },
|
|
33
|
+
{ label: 'third', value: 'third', group: 'Merchant Admin' },
|
|
34
|
+
{ label: 'fourth', value: 'fourth', group: 'Merchant Admin' },
|
|
35
|
+
{ label: 'fifth', value: 'fifth', key: 'a' },
|
|
36
|
+
{ label: 'sixth', value: 'sixth' },
|
|
37
|
+
{ label: 'seventh', value: 'seventh' },
|
|
38
|
+
{ label: 'eighth', value: 'eighth' },
|
|
39
|
+
{ label: 'ninth', value: 'ninth' },
|
|
40
|
+
{ label: 'tenth', value: 'tenth' },
|
|
41
|
+
];
|
|
42
|
+
const renderInstance = render(React.createElement(SelectPrompt, { message: "Associate your project with the org Castile Ventures?", choices: items, onSubmit: () => { } }));
|
|
43
|
+
expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
|
|
44
|
+
"? Associate your project with the org Castile Ventures?
|
|
45
|
+
|
|
46
|
+
[1mAutomations[22m
|
|
47
|
+
[36m>[39m [36m(f) first[39m
|
|
48
|
+
(s) second
|
|
49
|
+
|
|
50
|
+
[1mMerchant Admin[22m
|
|
51
|
+
(3) third
|
|
52
|
+
(4) fourth
|
|
53
|
+
|
|
54
|
+
[1mOther[22m
|
|
55
|
+
(a) fifth
|
|
56
|
+
(6) sixth
|
|
57
|
+
(7) seventh
|
|
58
|
+
(8) eighth
|
|
59
|
+
(9) ninth
|
|
60
|
+
(10) tenth
|
|
61
|
+
|
|
62
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m
|
|
63
|
+
"
|
|
64
|
+
`);
|
|
65
|
+
});
|
|
28
66
|
test('supports an info table', async () => {
|
|
29
67
|
const items = [
|
|
30
|
-
{ label: 'first', value: 'first'
|
|
31
|
-
{ label: 'second', value: 'second'
|
|
68
|
+
{ label: 'first', value: 'first' },
|
|
69
|
+
{ label: 'second', value: 'second' },
|
|
32
70
|
{ label: 'third', value: 'third' },
|
|
33
71
|
{ label: 'fourth', value: 'fourth' },
|
|
34
|
-
{ label: 'fifth', value: 'fifth', group: 'Automations' },
|
|
35
|
-
{ label: 'sixth', value: 'sixth', group: 'Automations' },
|
|
36
|
-
{ label: 'seventh', value: 'seventh' },
|
|
37
|
-
{ label: 'eighth', value: 'eighth', group: 'Merchant Admin' },
|
|
38
|
-
{ label: 'ninth', value: 'ninth', group: 'Merchant Admin' },
|
|
39
|
-
{ label: 'tenth', value: 'tenth' },
|
|
40
72
|
];
|
|
41
73
|
const infoTable = {
|
|
42
74
|
Add: ['new-ext'],
|
|
@@ -51,24 +83,82 @@ describe('Prompt', async () => {
|
|
|
51
83
|
Remove: • integrated-demand-ext
|
|
52
84
|
• order-discount
|
|
53
85
|
|
|
54
|
-
[36m>[39m [36m(
|
|
55
|
-
(
|
|
86
|
+
[36m>[39m [36m(1) first[39m
|
|
87
|
+
(2) second
|
|
56
88
|
(3) third
|
|
57
89
|
(4) fourth
|
|
58
|
-
(5) seventh
|
|
59
|
-
(6) tenth
|
|
60
90
|
|
|
61
|
-
[
|
|
62
|
-
|
|
63
|
-
|
|
91
|
+
[2mPress ↑↓ arrows to select, enter to confirm[22m
|
|
92
|
+
"
|
|
93
|
+
`);
|
|
94
|
+
});
|
|
95
|
+
test("it doesn't submit if there are no choices", async () => {
|
|
96
|
+
const onEnter = vi.fn();
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
|
+
const items = [];
|
|
99
|
+
const renderInstance = render(React.createElement(SelectPrompt, { message: "Associate your project with the org Castile Ventures?", choices: items, onSubmit: onEnter }));
|
|
100
|
+
expect(unstyled(getLastFrameAfterUnmount(renderInstance))).toContain('ERROR SelectPrompt requires at least one choice');
|
|
101
|
+
});
|
|
102
|
+
test("doesn't append a colon to the message if it ends with a question mark", async () => {
|
|
103
|
+
const { lastFrame } = render(React.createElement(SelectPrompt, { choices: [{ label: 'a', value: 'a' }], onSubmit: () => { }, message: "Test question?" }));
|
|
104
|
+
expect(unstyled(lastFrame())).toMatchInlineSnapshot(`
|
|
105
|
+
"? Test question?
|
|
64
106
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
107
|
+
> (1) a
|
|
108
|
+
|
|
109
|
+
Press ↑↓ arrows to select, enter to confirm
|
|
110
|
+
"
|
|
111
|
+
`);
|
|
112
|
+
});
|
|
113
|
+
test('accepts a default value', async () => {
|
|
114
|
+
const onEnter = vi.fn();
|
|
115
|
+
const items = [
|
|
116
|
+
{ label: 'a', value: 'a' },
|
|
117
|
+
{ label: 'b', value: 'b' },
|
|
118
|
+
];
|
|
119
|
+
const renderInstance = render(React.createElement(SelectPrompt, { choices: items, onSubmit: onEnter, message: "Test question?", defaultValue: "b" }));
|
|
120
|
+
expect(unstyled(renderInstance.lastFrame())).toMatchInlineSnapshot(`
|
|
121
|
+
"? Test question?
|
|
122
|
+
|
|
123
|
+
(1) a
|
|
124
|
+
> (2) b
|
|
125
|
+
|
|
126
|
+
Press ↑↓ arrows to select, enter to confirm
|
|
127
|
+
"
|
|
128
|
+
`);
|
|
129
|
+
await waitForInputsToBeReady();
|
|
130
|
+
await sendInputAndWaitForChange(renderInstance, ENTER);
|
|
131
|
+
expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`
|
|
132
|
+
"? Test question?
|
|
133
|
+
[36m✔[39m [36mb[39m
|
|
134
|
+
"
|
|
135
|
+
`);
|
|
136
|
+
expect(onEnter).toHaveBeenCalledWith(items[1].value);
|
|
137
|
+
});
|
|
138
|
+
test('can submit the initial value', async () => {
|
|
139
|
+
const onEnter = vi.fn();
|
|
140
|
+
const items = [
|
|
141
|
+
{ label: 'a', value: 'a' },
|
|
142
|
+
{ label: 'b', value: 'b' },
|
|
143
|
+
];
|
|
144
|
+
const renderInstance = render(React.createElement(SelectPrompt, { choices: items, onSubmit: onEnter, message: "Test question?" }));
|
|
145
|
+
expect(unstyled(renderInstance.lastFrame())).toMatchInlineSnapshot(`
|
|
146
|
+
"? Test question?
|
|
68
147
|
|
|
69
|
-
|
|
148
|
+
> (1) a
|
|
149
|
+
(2) b
|
|
150
|
+
|
|
151
|
+
Press ↑↓ arrows to select, enter to confirm
|
|
152
|
+
"
|
|
153
|
+
`);
|
|
154
|
+
await waitForInputsToBeReady();
|
|
155
|
+
await sendInputAndWaitForChange(renderInstance, ENTER);
|
|
156
|
+
expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`
|
|
157
|
+
"? Test question?
|
|
158
|
+
[36m✔[39m [36ma[39m
|
|
70
159
|
"
|
|
71
160
|
`);
|
|
161
|
+
expect(onEnter).toHaveBeenCalledWith(items[0].value);
|
|
72
162
|
});
|
|
73
163
|
});
|
|
74
164
|
//# sourceMappingURL=SelectPrompt.test.js.map
|