@shopify/cli-kit 3.47.5 → 3.48.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/assets/cli-ruby/lib/project_types/extension/messages/messages.rb +18 -1
  2. package/assets/cli-ruby/lib/shopify_cli/constants.rb +1 -0
  3. package/assets/cli-ruby/lib/shopify_cli/environment.rb +7 -0
  4. package/assets/cli-ruby/lib/shopify_cli/theme/extension/dev_server.rb +8 -2
  5. package/dist/private/node/api/graphql.js +8 -1
  6. package/dist/private/node/api/graphql.js.map +1 -1
  7. package/dist/private/node/api/headers.js +1 -1
  8. package/dist/private/node/api/headers.js.map +1 -1
  9. package/dist/private/node/api/urls.d.ts +6 -0
  10. package/dist/private/node/api/urls.js +16 -0
  11. package/dist/private/node/api/urls.js.map +1 -0
  12. package/dist/private/node/api.js +2 -1
  13. package/dist/private/node/api.js.map +1 -1
  14. package/dist/private/node/ui/alert.js +3 -1
  15. package/dist/private/node/ui/alert.js.map +1 -1
  16. package/dist/private/node/ui/components/Alert.d.ts +1 -1
  17. package/dist/private/node/ui/components/Alert.js.map +1 -1
  18. package/dist/private/node/ui/components/AutocompletePrompt.d.ts +7 -2
  19. package/dist/private/node/ui/components/AutocompletePrompt.js +28 -91
  20. package/dist/private/node/ui/components/AutocompletePrompt.js.map +1 -1
  21. package/dist/private/node/ui/components/AutocompletePrompt.test.js +317 -257
  22. package/dist/private/node/ui/components/AutocompletePrompt.test.js.map +1 -1
  23. package/dist/private/node/ui/components/ConcurrentOutput.d.ts +1 -0
  24. package/dist/private/node/ui/components/ConcurrentOutput.js +59 -32
  25. package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
  26. package/dist/private/node/ui/components/ConcurrentOutput.test.js +62 -22
  27. package/dist/private/node/ui/components/ConcurrentOutput.test.js.map +1 -1
  28. package/dist/private/node/ui/components/DangerousConfirmationPrompt.d.ts +12 -0
  29. package/dist/private/node/ui/components/DangerousConfirmationPrompt.js +77 -0
  30. package/dist/private/node/ui/components/DangerousConfirmationPrompt.js.map +1 -0
  31. package/dist/private/node/ui/components/DangerousConfirmationPrompt.test.js +101 -0
  32. package/dist/private/node/ui/components/DangerousConfirmationPrompt.test.js.map +1 -0
  33. package/dist/private/node/ui/components/List.d.ts +1 -0
  34. package/dist/private/node/ui/components/List.js +2 -2
  35. package/dist/private/node/ui/components/List.js.map +1 -1
  36. package/dist/private/node/ui/components/{GitDiff.d.ts → Prompts/GitDiff.d.ts} +4 -2
  37. package/dist/private/node/ui/components/{GitDiff.js → Prompts/GitDiff.js} +3 -2
  38. package/dist/private/node/ui/components/Prompts/GitDiff.js.map +1 -0
  39. package/dist/private/node/ui/components/Prompts/GitDiff.test.d.ts +1 -0
  40. package/dist/private/node/ui/components/{GitDiff.test.js → Prompts/GitDiff.test.js} +50 -28
  41. package/dist/private/node/ui/components/Prompts/GitDiff.test.js.map +1 -0
  42. package/dist/private/node/ui/components/Prompts/InfoMessage.d.ts +14 -0
  43. package/dist/private/node/ui/components/Prompts/InfoMessage.js +11 -0
  44. package/dist/private/node/ui/components/Prompts/InfoMessage.js.map +1 -0
  45. package/dist/private/node/ui/components/Prompts/InfoMessage.test.d.ts +1 -0
  46. package/dist/private/node/ui/components/Prompts/InfoMessage.test.js +21 -0
  47. package/dist/private/node/ui/components/Prompts/InfoMessage.test.js.map +1 -0
  48. package/dist/private/node/ui/components/Prompts/InfoTable.d.ts +1 -0
  49. package/dist/private/node/ui/components/Prompts/InfoTable.js +11 -7
  50. package/dist/private/node/ui/components/Prompts/InfoTable.js.map +1 -1
  51. package/dist/private/node/ui/components/Prompts/InfoTable.test.js +6 -4
  52. package/dist/private/node/ui/components/Prompts/InfoTable.test.js.map +1 -1
  53. package/dist/private/node/ui/components/Prompts/PromptLayout.d.ts +21 -0
  54. package/dist/private/node/ui/components/Prompts/PromptLayout.js +73 -0
  55. package/dist/private/node/ui/components/Prompts/PromptLayout.js.map +1 -0
  56. package/dist/private/node/ui/components/Prompts/PromptLayout.test.d.ts +1 -0
  57. package/dist/private/node/ui/components/Prompts/PromptLayout.test.js +129 -0
  58. package/dist/private/node/ui/components/Prompts/PromptLayout.test.js.map +1 -0
  59. package/dist/private/node/ui/components/Scrollbar.d.ts +10 -0
  60. package/dist/private/node/ui/components/Scrollbar.js +44 -0
  61. package/dist/private/node/ui/components/Scrollbar.js.map +1 -0
  62. package/dist/private/node/ui/components/Scrollbar.test.d.ts +1 -0
  63. package/dist/private/node/ui/components/Scrollbar.test.js +96 -0
  64. package/dist/private/node/ui/components/Scrollbar.test.js.map +1 -0
  65. package/dist/private/node/ui/components/SelectInput.d.ts +3 -6
  66. package/dist/private/node/ui/components/SelectInput.js +57 -41
  67. package/dist/private/node/ui/components/SelectInput.js.map +1 -1
  68. package/dist/private/node/ui/components/SelectInput.test.js +120 -192
  69. package/dist/private/node/ui/components/SelectInput.test.js.map +1 -1
  70. package/dist/private/node/ui/components/SelectPrompt.d.ts +7 -6
  71. package/dist/private/node/ui/components/SelectPrompt.js +11 -68
  72. package/dist/private/node/ui/components/SelectPrompt.js.map +1 -1
  73. package/dist/private/node/ui/components/SelectPrompt.test.js +135 -65
  74. package/dist/private/node/ui/components/SelectPrompt.test.js.map +1 -1
  75. package/dist/private/node/ui/components/Table/Row.js +2 -1
  76. package/dist/private/node/ui/components/Table/Row.js.map +1 -1
  77. package/dist/private/node/ui/components/Table/Table.js +2 -1
  78. package/dist/private/node/ui/components/Table/Table.js.map +1 -1
  79. package/dist/private/node/ui/components/Tasks.js +1 -8
  80. package/dist/private/node/ui/components/Tasks.js.map +1 -1
  81. package/dist/private/node/ui/components/TextInput.d.ts +1 -0
  82. package/dist/private/node/ui/components/TextInput.js +10 -4
  83. package/dist/private/node/ui/components/TextInput.js.map +1 -1
  84. package/dist/private/node/ui/components/TextInput.test.js +27 -18
  85. package/dist/private/node/ui/components/TextInput.test.js.map +1 -1
  86. package/dist/private/node/ui/components/TextPrompt.d.ts +2 -3
  87. package/dist/private/node/ui/components/TextPrompt.js +18 -16
  88. package/dist/private/node/ui/components/TextPrompt.js.map +1 -1
  89. package/dist/private/node/ui/components/TextPrompt.test.js +25 -11
  90. package/dist/private/node/ui/components/TextPrompt.test.js.map +1 -1
  91. package/dist/private/node/ui/hooks/use-prompt.d.ts +18 -0
  92. package/dist/private/node/ui/hooks/use-prompt.js +20 -0
  93. package/dist/private/node/ui/hooks/use-prompt.js.map +1 -0
  94. package/dist/private/node/ui/hooks/use-select-state.d.ts +4 -4
  95. package/dist/private/node/ui/hooks/use-select-state.js +9 -9
  96. package/dist/private/node/ui/hooks/use-select-state.js.map +1 -1
  97. package/dist/public/common/object.d.ts +16 -0
  98. package/dist/public/common/object.js +26 -0
  99. package/dist/public/common/object.js.map +1 -1
  100. package/dist/public/common/string.d.ts +16 -0
  101. package/dist/public/common/string.js +30 -0
  102. package/dist/public/common/string.js.map +1 -1
  103. package/dist/public/common/version.d.ts +1 -1
  104. package/dist/public/common/version.js +1 -1
  105. package/dist/public/common/version.js.map +1 -1
  106. package/dist/public/node/analytics.js +3 -1
  107. package/dist/public/node/analytics.js.map +1 -1
  108. package/dist/public/node/api/partners.js +11 -2
  109. package/dist/public/node/api/partners.js.map +1 -1
  110. package/dist/public/node/base-command.d.ts +1 -0
  111. package/dist/public/node/base-command.js +21 -1
  112. package/dist/public/node/base-command.js.map +1 -1
  113. package/dist/public/node/figures.d.ts +2 -0
  114. package/dist/public/node/figures.js +3 -0
  115. package/dist/public/node/figures.js.map +1 -0
  116. package/dist/public/node/http.js +5 -2
  117. package/dist/public/node/http.js.map +1 -1
  118. package/dist/public/node/metadata.d.ts +2 -1
  119. package/dist/public/node/metadata.js +5 -2
  120. package/dist/public/node/metadata.js.map +1 -1
  121. package/dist/public/node/monorail.d.ts +22 -1
  122. package/dist/public/node/monorail.js +1 -1
  123. package/dist/public/node/monorail.js.map +1 -1
  124. package/dist/public/node/node-package-manager.d.ts +2 -0
  125. package/dist/public/node/node-package-manager.js +5 -2
  126. package/dist/public/node/node-package-manager.js.map +1 -1
  127. package/dist/public/node/output.d.ts +1 -1
  128. package/dist/public/node/output.js +1 -1
  129. package/dist/public/node/output.js.map +1 -1
  130. package/dist/public/node/ruby.d.ts +1 -0
  131. package/dist/public/node/ruby.js +1 -0
  132. package/dist/public/node/ruby.js.map +1 -1
  133. package/dist/public/node/system.js +2 -2
  134. package/dist/public/node/system.js.map +1 -1
  135. package/dist/public/node/themes/models/theme.d.ts +2 -1
  136. package/dist/public/node/themes/models/theme.js +2 -1
  137. package/dist/public/node/themes/models/theme.js.map +1 -1
  138. package/dist/public/node/themes/theme-urls.d.ts +1 -0
  139. package/dist/public/node/themes/theme-urls.js +4 -0
  140. package/dist/public/node/themes/theme-urls.js.map +1 -1
  141. package/dist/public/node/themes/themes-api.d.ts +9 -1
  142. package/dist/public/node/themes/themes-api.js +14 -3
  143. package/dist/public/node/themes/themes-api.js.map +1 -1
  144. package/dist/public/node/toml.d.ts +3 -2
  145. package/dist/public/node/toml.js +5 -2
  146. package/dist/public/node/toml.js.map +1 -1
  147. package/dist/public/node/ui.d.ts +82 -27
  148. package/dist/public/node/ui.js +97 -32
  149. package/dist/public/node/ui.js.map +1 -1
  150. package/dist/tsconfig.tsbuildinfo +1 -1
  151. package/package.json +15 -14
  152. package/dist/private/node/ui/components/GitDiff.js.map +0 -1
  153. package/dist/private/node/ui/components/GitDiff.test.js.map +0 -1
  154. /package/dist/private/node/ui/components/{GitDiff.test.d.ts → DangerousConfirmationPrompt.test.d.ts} +0 -0
@@ -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 {sendInputAndWait, sendInputAndWaitForChange, waitForInputsToBeReady, render} from '../../testing/ui.js'\nimport {platformAndArch} from '../../../../public/node/os.js'\nimport {describe, expect, test, vi} from 'vitest'\nimport React from 'react'\n\nconst ARROW_UP = '\\u001B[A'\nconst ARROW_DOWN = '\\u001B[B'\nconst ENTER = '\\r'\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_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_UP)\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).toHaveBeenLastCalledWith(items[1])\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 single digit numeric shortcuts', 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, '2')\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, 500, '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 const runningOnWindows = platformAndArch().platform === 'windows'\n\n test.skipIf(runningOnWindows)('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).toHaveBeenLastCalledWith(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(<SelectInput items={items} onChange={() => {}} defaultValue=\"second\" />)\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 test('shows if there are more pages', 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\n items={items}\n onChange={() => {}}\n morePagesMessage=\"Keep scrolling to see more items\"\n hasMorePages\n />,\n )\n\n await waitForInputsToBeReady()\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[1m1-3 of many\u001b[22m Keep scrolling to see more items\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n })\n\n test('supports a limit of items to show', async () => {\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={() => {}} limit={5} />)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" \u001b[1mAutomations\u001b[22m\n \u001b[36m>\u001b[39m \u001b[36m(a) fifth\u001b[39m\n (2) sixth\n\n \u001b[1mMerchant Admin\u001b[22m\n (3) eighth\n (4) ninth\n\n \u001b[1mOther\u001b[22m\n (f) first\n\n \u001b[2mShowing 5 of 10 items.\u001b[22m\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\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[1mAutomations\u001b[22m\n (2) sixth\n\n \u001b[1mMerchant Admin\u001b[22m\n (3) eighth\n (4) ninth\n\n \u001b[1mOther\u001b[22m\n (f) first\n \u001b[36m>\u001b[39m \u001b[36m(s) second\u001b[39m\n\n \u001b[2mShowing 5 of 10 items.\u001b[22m\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n })\n\n test('pressing enter calls onSubmit on the default option', async () => {\n const onSubmit = 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={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[0])\n })\n\n test('pressing enter calls onSubmit on the selected option', async () => {\n const onSubmit = 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={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 100, ARROW_DOWN)\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[1])\n })\n\n test('using a shortcut calls onSubmit if submitWithShortcuts is true', async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n key: 'f',\n },\n {\n label: 'Second',\n value: 'second',\n key: 's',\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(\n <SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} submitWithShortcuts />,\n )\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 500, 's')\n\n expect(onSubmit).toHaveBeenCalledWith(items[1])\n })\n\n test('using a shortcut does not call onSubmit if submitWithShortcuts is false', async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n key: 'f',\n },\n {\n label: 'Second',\n value: 'second',\n key: 's',\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 500, 's')\n\n expect(onSubmit).not.toHaveBeenCalled()\n })\n\n test('supports disabled options', async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n key: 'f',\n },\n {\n label: 'Second',\n value: 'second',\n key: 's',\n disabled: true,\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" (f) First\n \u001b[2m(s) Second\u001b[22m\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\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[2])\n })\n\n test('default value will be skipped if the option is disabled', async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n key: 'f',\n },\n {\n label: 'Second',\n value: 'second',\n key: 's',\n disabled: true,\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(\n <SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} defaultValue=\"second\" />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"\u001b[36m>\u001b[39m \u001b[36m(f) First\u001b[39m\n \u001b[2m(s) Second\u001b[22m\n (t) Third\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm\u001b[22m\"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[0])\n })\n\n test('selects the next non-disabled option if the first option is disabled', async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n key: 'f',\n disabled: true,\n },\n {\n label: 'Second',\n value: 'second',\n key: 's',\n disabled: true,\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" \u001b[2m(f) First\u001b[22m\n \u001b[2m(s) Second\u001b[22m\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\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[2])\n })\n})\n"]}
1
+ {"version":3,"file":"SelectInput.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectInput.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,MAAM,EACN,wBAAwB,GACzB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAC,eAAe,EAAC,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAC,MAAM,QAAQ,CAAA;AACjD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,QAAQ,GAAG,UAAU,CAAA;AAC3B,MAAM,UAAU,GAAG,UAAU,CAAA;AAC7B,MAAM,KAAK,GAAG,IAAI,CAAA;AAElB,QAAQ,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;IACjC,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAExB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEhF,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,yBAAyB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;QAEzD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMxD,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAExB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEhF,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAE3D,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMxD,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAExB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,GAAG;aACT;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;gBACf,GAAG,EAAE,GAAG;aACT;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,IAAI;aACV;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAChF,MAAM,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAA;IAC1G,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAExB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,GAAG;aACT;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAChF,MAAM,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAA;IAC/G,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEhF,MAAM,sBAAsB,EAAE,CAAA;QAC9B,yDAAyD;QACzD,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAEhD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMxD,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,MAAM,gBAAgB,GAAG,eAAe,EAAE,CAAC,QAAQ,KAAK,SAAS,CAAA;IAEjE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAExB,MAAM,KAAK,GAAG;YACZ,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAC;YACtD,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAC;YACxD,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAC;YACzD,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAC;YAC3D,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAC;YAChC,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAC;YAChC,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAC;YACpC,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAC;YAClC,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAC;YAChC,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAC;SACjC,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEhF,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;KAkBxD,CAAC,CAAA;QAEF,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAE3D,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;KAkBxD,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,GAAI,CAAC,CAAA;QAExG,MAAM,sBAAsB,EAAE,CAAA;QAC9B,2CAA2C;QAC3C,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAEhD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMxD,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,YAAY,EAAC,QAAQ,GAAG,CAAC,CAAA;QAEtG,MAAM,sBAAsB,EAAE,CAAA;QAE9B,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMxD,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAC3B,oBAAC,WAAW,IACV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAClB,gBAAgB,EAAC,kCAAkC,EACnD,YAAY,SACZ,CACH,CAAA;QAED,MAAM,sBAAsB,EAAE,CAAA;QAE9B,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;;KAOxD,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,KAAK,GAAG;YACZ,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAC;YAChC,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAC;YAClC,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAC;YAChC,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAC;YAClC,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAC;YACtD,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAC;YACtD,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAC;YACpC,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAC;YAC3D,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAC;YACzD,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAC;SACjC,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,cAAc,EAAE,EAAE,GAAI,CAAC,CAAA;QAEpG,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;KAaxD,CAAC,CAAA;QAEF,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAC3D,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAE3D,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;KAaxD,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEpG,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAElD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;aAChB;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEpG,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;QACvD,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAElD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,GAAG;aACT;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;gBACf,GAAG,EAAE,GAAG;aACT;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,GAAG;aACT;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEpG,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAEhD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEpG,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAE3D,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMxD,CAAC,CAAA;QAEF,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAElD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAC3B,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAC,QAAQ,GAAG,CAC5F,CAAA;QAED,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMxD,CAAC,CAAA;QAEF,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAElD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;gBACf,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,GAAG;aACT;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEpG,MAAM,sBAAsB,EAAE,CAAA;QAE9B,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;KAMxD,CAAC,CAAA;QAEF,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAElD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG;YACZ;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,GAAG;aACT;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ;gBACf,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,GAAG;aACT;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAEpG,MAAM,sBAAsB,EAAE,CAAA;QAC9B,MAAM,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAEhD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import {SelectInput} from './SelectInput.js'\nimport {\n sendInputAndWait,\n sendInputAndWaitForChange,\n waitForInputsToBeReady,\n render,\n getLastFrameAfterUnmount,\n} from '../../testing/ui.js'\nimport {platformAndArch} from '../../../../public/node/os.js'\nimport {describe, expect, test, vi} from 'vitest'\nimport React from 'react'\n\nconst ARROW_UP = '\\u001B[A'\nconst ARROW_DOWN = '\\u001B[B'\nconst ENTER = '\\r'\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_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_UP)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" First\n \u001b[36m>\u001b[39m \u001b[36mSecond\u001b[39m\n Third\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n expect(onChange).toHaveBeenLastCalledWith(items[1])\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 \" First\n \u001b[36m>\u001b[39m \u001b[36mSecond\u001b[39m\n Third\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n expect(onChange).toHaveBeenCalledWith(items[1])\n })\n\n test('throws an error if a key has more than 1 character', async () => {\n const onChange = vi.fn()\n\n const items = [\n {\n label: 'First',\n value: 'first',\n key: 'a',\n },\n {\n label: 'Second',\n value: 'second',\n key: 'b',\n },\n {\n label: 'Third',\n value: 'third',\n key: 'ab',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n expect(getLastFrameAfterUnmount(renderInstance)).toMatch('SelectInput: Keys must be a single character')\n })\n\n test(\"throws an error if an item has key but others don't\", 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 key: 'a',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={onChange} />)\n expect(getLastFrameAfterUnmount(renderInstance)).toMatch('SelectInput: All items must have keys if one does')\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[36mFirst\u001b[39m\n Second\n Tenth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n expect(onChange).not.toHaveBeenCalled()\n })\n\n const runningOnWindows = platformAndArch().platform === 'windows'\n\n test.skipIf(runningOnWindows)('support groups', async () => {\n const onChange = vi.fn()\n\n const items = [\n {label: 'first', value: 'first', group: 'Automations'},\n {label: 'second', value: 'second', group: 'Automations'},\n {label: 'third', value: 'third', group: 'Merchant Admin'},\n {label: 'fourth', value: 'fourth', group: 'Merchant Admin'},\n {label: 'fifth', value: 'fifth'},\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[36mfirst\u001b[39m\n second\n\n \u001b[1mMerchant Admin\u001b[22m\n third\n fourth\n\n \u001b[1mOther\u001b[22m\n fifth\n sixth\n seventh\n eighth\n ninth\n tenth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" \u001b[1mAutomations\u001b[22m\n first\n second\n\n \u001b[1mMerchant Admin\u001b[22m\n \u001b[36m>\u001b[39m \u001b[36mthird\u001b[39m\n fourth\n\n \u001b[1mOther\u001b[22m\n fifth\n sixth\n seventh\n eighth\n ninth\n tenth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n expect(onChange).toHaveBeenLastCalledWith(items[2])\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(<SelectInput items={items} onChange={() => {}} defaultValue=\"second\" />)\n\n await waitForInputsToBeReady()\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" First\n \u001b[36m>\u001b[39m \u001b[36mSecond\u001b[39m\n Third\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n })\n\n test('shows if there are more pages', 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\n items={items}\n onChange={() => {}}\n morePagesMessage=\"Keep scrolling to see more items\"\n hasMorePages\n />,\n )\n\n await waitForInputsToBeReady()\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 \u001b[1m1-3 of many\u001b[22m Keep scrolling to see more items\"\n `)\n })\n\n test('supports a limit of items to show', async () => {\n const items = [\n {label: 'first', value: 'first'},\n {label: 'second', value: 'second'},\n {label: 'third', value: 'third'},\n {label: 'fourth', value: 'fourth'},\n {label: 'fifth', value: 'fifth', group: 'Automations'},\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={() => {}} availableLines={10} />)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" \u001b[1mAutomations\u001b[22m \u001b[46m \u001b[49m\n \u001b[36m>\u001b[39m \u001b[36mfifth\u001b[39m \u001b[46m \u001b[49m\n sixth \u001b[46m \u001b[49m\n \u001b[46m \u001b[49m\n \u001b[1mMerchant Admin\u001b[22m \u001b[46m \u001b[49m\n eighth \u001b[100m \u001b[49m\n ninth \u001b[100m \u001b[49m\n \u001b[100m \u001b[49m\n \u001b[1mOther\u001b[22m \u001b[100m \u001b[49m\n first \u001b[100m \u001b[49m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\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[1mAutomations\u001b[22m \u001b[100m \u001b[49m\n sixth \u001b[46m \u001b[49m\n \u001b[46m \u001b[49m\n \u001b[1mMerchant Admin\u001b[22m \u001b[46m \u001b[49m\n eighth \u001b[46m \u001b[49m\n ninth \u001b[46m \u001b[49m\n \u001b[100m \u001b[49m\n \u001b[1mOther\u001b[22m \u001b[100m \u001b[49m\n first \u001b[100m \u001b[49m\n \u001b[36m>\u001b[39m \u001b[36msecond\u001b[39m \u001b[100m \u001b[49m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n })\n\n test('pressing enter calls onSubmit on the default option', async () => {\n const onSubmit = 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={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[0])\n })\n\n test('pressing enter calls onSubmit on the selected option', async () => {\n const onSubmit = 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={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 100, ARROW_DOWN)\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[1])\n })\n\n test('using a shortcut calls onSubmit', async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n key: 'f',\n },\n {\n label: 'Second',\n value: 'second',\n key: 's',\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 100, 's')\n\n expect(onSubmit).toHaveBeenCalledWith(items[1])\n })\n\n test('supports disabled options', async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n disabled: true,\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" First\n \u001b[2mSecond\u001b[22m\n \u001b[36m>\u001b[39m \u001b[36mThird\u001b[39m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[2])\n })\n\n test('default value will be skipped if the option is disabled', async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n },\n {\n label: 'Second',\n value: 'second',\n disabled: true,\n },\n {\n label: 'Third',\n value: 'third',\n },\n ]\n\n const renderInstance = render(\n <SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} defaultValue=\"second\" />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"\u001b[36m>\u001b[39m \u001b[36mFirst\u001b[39m\n \u001b[2mSecond\u001b[22m\n Third\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[0])\n })\n\n test('selects the next non-disabled option if the first option is disabled', async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n key: 'f',\n disabled: true,\n },\n {\n label: 'Second',\n value: 'second',\n key: 's',\n disabled: true,\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \" \u001b[2m(f) First\u001b[22m\n \u001b[2m(s) Second\u001b[22m\n \u001b[36m>\u001b[39m \u001b[36m(t) Third\u001b[39m\n\n \u001b[2mPress ↑↓ arrows to select, enter or a shortcut to confirm.\u001b[22m\"\n `)\n\n await sendInputAndWait(renderInstance, 100, ENTER)\n\n expect(onSubmit).toHaveBeenCalledWith(items[2])\n })\n\n test(\"doesn't allow submitting disabled options with shortcuts\", async () => {\n const onSubmit = vi.fn()\n const items = [\n {\n label: 'First',\n value: 'first',\n key: 'f',\n },\n {\n label: 'Second',\n value: 'second',\n key: 's',\n disabled: true,\n },\n {\n label: 'Third',\n value: 'third',\n key: 't',\n },\n ]\n\n const renderInstance = render(<SelectInput items={items} onChange={() => {}} onSubmit={onSubmit} />)\n\n await waitForInputsToBeReady()\n await sendInputAndWait(renderInstance, 100, 's')\n\n expect(onSubmit).not.toHaveBeenCalled()\n })\n})\n"]}
@@ -1,18 +1,19 @@
1
1
  import { SelectInputProps } from './SelectInput.js';
2
2
  import { InfoTableProps } from './Prompts/InfoTable.js';
3
- import { InlineToken, LinkToken, TokenItem } from './TokenizedText.js';
4
- import { GitDiffProps } from './GitDiff.js';
3
+ import { GitDiffProps } from './Prompts/GitDiff.js';
4
+ import { InfoMessageProps } from './Prompts/InfoMessage.js';
5
+ import { Message } from './Prompts/PromptLayout.js';
5
6
  import { AbortSignal } from '../../../../public/node/abort.js';
6
7
  import React, { ReactElement } from 'react';
7
8
  export interface SelectPromptProps<T> {
8
- message: TokenItem<Exclude<InlineToken, LinkToken>>;
9
+ message: Message;
9
10
  choices: SelectInputProps<T>['items'];
10
11
  onSubmit: (value: T) => void;
11
12
  infoTable?: InfoTableProps['table'];
12
- gitDiff?: GitDiffProps;
13
+ gitDiff?: GitDiffProps['gitDiff'];
13
14
  defaultValue?: T;
14
- submitWithShortcuts?: boolean;
15
15
  abortSignal?: AbortSignal;
16
+ infoMessage?: InfoMessageProps['message'];
16
17
  }
17
- declare function SelectPrompt<T>({ message, choices, infoTable, gitDiff, onSubmit, defaultValue, submitWithShortcuts, abortSignal, }: React.PropsWithChildren<SelectPromptProps<T>>): ReactElement | null;
18
+ declare function SelectPrompt<T>({ message, choices, infoTable, infoMessage, gitDiff, onSubmit, defaultValue, abortSignal, }: React.PropsWithChildren<SelectPromptProps<T>>): ReactElement | null;
18
19
  export { SelectPrompt };
@@ -1,81 +1,24 @@
1
1
  import { SelectInput } from './SelectInput.js';
2
- import { InfoTable } from './Prompts/InfoTable.js';
3
- import { TokenizedText } from './TokenizedText.js';
4
- import { GitDiff } from './GitDiff.js';
5
- import { messageWithPunctuation } from '../utilities.js';
6
- import { uniqBy } from '../../../../public/common/array.js';
7
- import useAbortSignal from '../hooks/use-abort-signal.js';
8
- import React, { useCallback, useLayoutEffect, useState } from 'react';
9
- import { Box, measureElement, Text, useApp, useStdout } from 'ink';
10
- import figures from 'figures';
11
- import ansiEscapes from 'ansi-escapes';
2
+ import { PromptLayout } from './Prompts/PromptLayout.js';
3
+ import usePrompt, { PromptState } from '../hooks/use-prompt.js';
4
+ import React, { useCallback } from 'react';
5
+ import { useApp } from 'ink';
12
6
  // eslint-disable-next-line react/function-component-definition
13
- function SelectPrompt({ message, choices, infoTable, gitDiff, onSubmit, defaultValue, submitWithShortcuts = false, abortSignal, }) {
7
+ function SelectPrompt({ message, choices, infoTable, infoMessage, gitDiff, onSubmit, defaultValue, abortSignal, }) {
14
8
  if (choices.length === 0) {
15
9
  throw new Error('SelectPrompt requires at least one choice');
16
10
  }
17
- const [answer, setAnswer] = useState(undefined);
18
11
  const { exit: unmountInk } = useApp();
19
- const [submitted, setSubmitted] = useState(false);
20
- const { stdout } = useStdout();
21
- const [wrapperHeight, setWrapperHeight] = useState(0);
22
- const [selectInputHeight, setSelectInputHeight] = useState(0);
23
- const [limit, setLimit] = useState(choices.length);
24
- const numberOfGroups = uniqBy(choices.filter((choice) => choice.group), 'group').length;
25
- const wrapperRef = useCallback((node) => {
26
- if (node !== null) {
27
- const { height } = measureElement(node);
28
- setWrapperHeight(height);
29
- }
30
- }, []);
31
- const inputRef = useCallback((node) => {
32
- if (node !== null) {
33
- const { height } = measureElement(node);
34
- setSelectInputHeight(height);
35
- }
36
- }, []);
37
- useLayoutEffect(() => {
38
- function onResize() {
39
- const availableSpace = stdout.rows - (wrapperHeight - selectInputHeight);
40
- // rough estimate of the limit needed based on the space available
41
- const newLimit = Math.max(2, availableSpace - numberOfGroups * 2 - 4);
42
- if (newLimit < limit) {
43
- stdout.write(ansiEscapes.clearTerminal);
44
- }
45
- setLimit(Math.min(newLimit, choices.length));
46
- }
47
- onResize();
48
- stdout.on('resize', onResize);
49
- return () => {
50
- stdout.off('resize', onResize);
51
- };
52
- }, [wrapperHeight, selectInputHeight, choices.length, numberOfGroups, stdout, limit]);
12
+ const { promptState, setPromptState, answer, setAnswer } = usePrompt({
13
+ initialAnswer: undefined,
14
+ });
53
15
  const submitAnswer = useCallback((answer) => {
54
- if (stdout && wrapperHeight >= stdout.rows) {
55
- stdout.write(ansiEscapes.clearTerminal);
56
- }
57
16
  setAnswer(answer);
58
- setSubmitted(true);
17
+ setPromptState(PromptState.Submitted);
59
18
  unmountInk();
60
19
  onSubmit(answer.value);
61
- }, [stdout, wrapperHeight, unmountInk, onSubmit]);
62
- const { isAborted } = useAbortSignal(abortSignal);
63
- return isAborted ? null : (React.createElement(Box, { flexDirection: "column", marginBottom: 1, ref: wrapperRef },
64
- React.createElement(Box, null,
65
- React.createElement(Box, { marginRight: 2 },
66
- React.createElement(Text, null, "?")),
67
- React.createElement(TokenizedText, { item: messageWithPunctuation(message) })),
68
- infoTable && !submitted ? (React.createElement(Box, { marginLeft: 7, marginTop: 1 },
69
- React.createElement(InfoTable, { table: infoTable }))) : null,
70
- gitDiff && !submitted ? (React.createElement(Box, { marginLeft: 7, marginTop: 1 },
71
- React.createElement(GitDiff, { ...gitDiff }))) : null,
72
- submitted ? (React.createElement(Box, null,
73
- React.createElement(Box, { marginRight: 2 },
74
- React.createElement(Text, { color: "cyan" }, figures.tick)),
75
- React.createElement(Text, { color: "cyan" }, answer.label))) : (React.createElement(Box, { marginTop: 1 },
76
- React.createElement(SelectInput, { defaultValue: defaultValue, items: choices, infoMessage: submitWithShortcuts
77
- ? `Press ${figures.arrowUp}${figures.arrowDown} arrows to select, enter or a shortcut to confirm`
78
- : undefined, limit: limit, ref: inputRef, submitWithShortcuts: submitWithShortcuts, onSubmit: submitAnswer })))));
20
+ }, [setAnswer, setPromptState, unmountInk, onSubmit]);
21
+ return (React.createElement(PromptLayout, { message: message, state: promptState, submittedAnswerLabel: answer?.label, infoTable: infoTable, infoMessage: infoMessage, gitDiff: gitDiff, abortSignal: abortSignal, input: React.createElement(SelectInput, { defaultValue: defaultValue, items: choices, onSubmit: submitAnswer }) }));
79
22
  }
80
23
  export { SelectPrompt };
81
24
  //# sourceMappingURL=SelectPrompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["import {SelectInput, SelectInputProps, Item as SelectItem} from './SelectInput.js'\nimport {InfoTable, InfoTableProps} from './Prompts/InfoTable.js'\nimport {InlineToken, LinkToken, TokenItem, TokenizedText} from './TokenizedText.js'\nimport {GitDiff, GitDiffProps} from './GitDiff.js'\nimport {messageWithPunctuation} from '../utilities.js'\nimport {uniqBy} from '../../../../public/common/array.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport useAbortSignal from '../hooks/use-abort-signal.js'\nimport React, {ReactElement, useCallback, useLayoutEffect, useState} from 'react'\nimport {Box, measureElement, Text, useApp, useStdout} from 'ink'\nimport figures from 'figures'\nimport ansiEscapes from 'ansi-escapes'\n\nexport interface SelectPromptProps<T> {\n message: TokenItem<Exclude<InlineToken, LinkToken>>\n choices: SelectInputProps<T>['items']\n onSubmit: (value: T) => void\n infoTable?: InfoTableProps['table']\n gitDiff?: GitDiffProps\n defaultValue?: T\n submitWithShortcuts?: boolean\n abortSignal?: AbortSignal\n}\n\n// eslint-disable-next-line react/function-component-definition\nfunction SelectPrompt<T>({\n message,\n choices,\n infoTable,\n gitDiff,\n onSubmit,\n defaultValue,\n submitWithShortcuts = false,\n abortSignal,\n}: React.PropsWithChildren<SelectPromptProps<T>>): ReactElement | null {\n if (choices.length === 0) {\n throw new Error('SelectPrompt requires at least one choice')\n }\n const [answer, setAnswer] = useState<SelectItem<T> | undefined>(undefined)\n const {exit: unmountInk} = useApp()\n const [submitted, setSubmitted] = useState(false)\n const {stdout} = useStdout()\n const [wrapperHeight, setWrapperHeight] = useState(0)\n const [selectInputHeight, setSelectInputHeight] = useState(0)\n const [limit, setLimit] = useState(choices.length)\n const numberOfGroups = uniqBy(\n choices.filter((choice) => choice.group),\n 'group',\n ).length\n\n const wrapperRef = useCallback((node) => {\n if (node !== null) {\n const {height} = measureElement(node)\n setWrapperHeight(height)\n }\n }, [])\n\n const inputRef = useCallback((node) => {\n if (node !== null) {\n const {height} = measureElement(node)\n setSelectInputHeight(height)\n }\n }, [])\n\n useLayoutEffect(() => {\n function onResize() {\n const availableSpace = stdout.rows - (wrapperHeight - selectInputHeight)\n // rough estimate of the limit needed based on the space available\n const newLimit = Math.max(2, availableSpace - numberOfGroups * 2 - 4)\n\n if (newLimit < limit) {\n stdout.write(ansiEscapes.clearTerminal)\n }\n\n setLimit(Math.min(newLimit, choices.length))\n }\n\n onResize()\n\n stdout.on('resize', onResize)\n return () => {\n stdout.off('resize', onResize)\n }\n }, [wrapperHeight, selectInputHeight, choices.length, numberOfGroups, stdout, limit])\n\n const submitAnswer = useCallback(\n (answer: SelectItem<T>) => {\n if (stdout && wrapperHeight >= stdout.rows) {\n stdout.write(ansiEscapes.clearTerminal)\n }\n setAnswer(answer)\n setSubmitted(true)\n unmountInk()\n onSubmit(answer.value)\n },\n [stdout, wrapperHeight, unmountInk, onSubmit],\n )\n\n const {isAborted} = useAbortSignal(abortSignal)\n\n return isAborted ? null : (\n <Box flexDirection=\"column\" marginBottom={1} ref={wrapperRef}>\n <Box>\n <Box marginRight={2}>\n <Text>?</Text>\n </Box>\n <TokenizedText item={messageWithPunctuation(message)} />\n </Box>\n\n {infoTable && !submitted ? (\n <Box marginLeft={7} marginTop={1}>\n <InfoTable table={infoTable} />\n </Box>\n ) : null}\n\n {gitDiff && !submitted ? (\n <Box marginLeft={7} marginTop={1}>\n <GitDiff {...gitDiff} />\n </Box>\n ) : null}\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={defaultValue}\n items={choices}\n infoMessage={\n submitWithShortcuts\n ? `Press ${figures.arrowUp}${figures.arrowDown} arrows to select, enter or a shortcut to confirm`\n : undefined\n }\n limit={limit}\n ref={inputRef}\n submitWithShortcuts={submitWithShortcuts}\n onSubmit={submitAnswer}\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport {SelectPrompt}\n"]}
1
+ {"version":3,"file":"SelectPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectPrompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAuC,MAAM,kBAAkB,CAAA;AAIlF,OAAO,EAAU,YAAY,EAAC,MAAM,2BAA2B,CAAA;AAE/D,OAAO,SAAS,EAAE,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,EAAe,WAAW,EAAC,MAAM,OAAO,CAAA;AACtD,OAAO,EAAC,MAAM,EAAC,MAAM,KAAK,CAAA;AAa1B,+DAA+D;AAC/D,SAAS,YAAY,CAAI,EACvB,OAAO,EACP,OAAO,EACP,SAAS,EACT,WAAW,EACX,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,WAAW,GACmC;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;KAC7D;IACD,MAAM,EAAC,IAAI,EAAE,UAAU,EAAC,GAAG,MAAM,EAAE,CAAA;IACnC,MAAM,EAAC,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAC,GAAG,SAAS,CAA4B;QAC5F,aAAa,EAAE,SAAS;KACzB,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,MAAqB,EAAE,EAAE;QACxB,SAAS,CAAC,MAAM,CAAC,CAAA;QACjB,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QACrC,UAAU,EAAE,CAAA;QACZ,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC,EACD,CAAC,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,CAClD,CAAA;IAED,OAAO,CACL,oBAAC,YAAY,IACX,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,oBAAoB,EAAE,MAAM,EAAE,KAAK,EACnC,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,oBAAC,WAAW,IAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,GAAI,GAC1F,CACH,CAAA;AACH,CAAC;AAED,OAAO,EAAC,YAAY,EAAC,CAAA","sourcesContent":["import {SelectInput, SelectInputProps, Item as SelectItem} from './SelectInput.js'\nimport {InfoTableProps} from './Prompts/InfoTable.js'\nimport {GitDiffProps} from './Prompts/GitDiff.js'\nimport {InfoMessageProps} from './Prompts/InfoMessage.js'\nimport {Message, PromptLayout} from './Prompts/PromptLayout.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport usePrompt, {PromptState} from '../hooks/use-prompt.js'\nimport React, {ReactElement, useCallback} from 'react'\nimport {useApp} from 'ink'\n\nexport interface SelectPromptProps<T> {\n message: Message\n choices: SelectInputProps<T>['items']\n onSubmit: (value: T) => void\n infoTable?: InfoTableProps['table']\n gitDiff?: GitDiffProps['gitDiff']\n defaultValue?: T\n abortSignal?: AbortSignal\n infoMessage?: InfoMessageProps['message']\n}\n\n// eslint-disable-next-line react/function-component-definition\nfunction SelectPrompt<T>({\n message,\n choices,\n infoTable,\n infoMessage,\n gitDiff,\n onSubmit,\n defaultValue,\n abortSignal,\n}: React.PropsWithChildren<SelectPromptProps<T>>): ReactElement | null {\n if (choices.length === 0) {\n throw new Error('SelectPrompt requires at least one choice')\n }\n const {exit: unmountInk} = useApp()\n const {promptState, setPromptState, answer, setAnswer} = usePrompt<SelectItem<T> | undefined>({\n initialAnswer: undefined,\n })\n\n const submitAnswer = useCallback(\n (answer: SelectItem<T>) => {\n setAnswer(answer)\n setPromptState(PromptState.Submitted)\n unmountInk()\n onSubmit(answer.value)\n },\n [setAnswer, setPromptState, unmountInk, onSubmit],\n )\n\n return (\n <PromptLayout\n message={message}\n state={promptState}\n submittedAnswerLabel={answer?.label}\n infoTable={infoTable}\n infoMessage={infoMessage}\n gitDiff={gitDiff}\n abortSignal={abortSignal}\n input={<SelectInput defaultValue={defaultValue} items={choices} onSubmit={submitAnswer} />}\n />\n )\n}\n\nexport {SelectPrompt}\n"]}
@@ -49,11 +49,11 @@ describe('SelectPrompt', async () => {
49
49
  });
50
50
  test('renders groups', async () => {
51
51
  const items = [
52
- { label: 'first', value: 'first', group: 'Automations', key: 'f' },
53
- { label: 'second', value: 'second', group: 'Automations', key: 's' },
52
+ { label: 'first', value: 'first', group: 'Automations' },
53
+ { label: 'second', value: 'second', group: 'Automations' },
54
54
  { label: 'third', value: 'third', group: 'Merchant Admin' },
55
55
  { label: 'fourth', value: 'fourth', group: 'Merchant Admin' },
56
- { label: 'fifth', value: 'fifth', key: 'a' },
56
+ { label: 'fifth', value: 'fifth' },
57
57
  { label: 'sixth', value: 'sixth' },
58
58
  { label: 'seventh', value: 'seventh' },
59
59
  { label: 'eighth', value: 'eighth' },
@@ -65,22 +65,22 @@ describe('SelectPrompt', async () => {
65
65
  "? Associate your project with the org Castile Ventures?
66
66
 
67
67
  Automations
68
- > (f) first
69
- (s) second
68
+ > first
69
+ second
70
70
 
71
71
  Merchant Admin
72
- (3) third
73
- (4) fourth
72
+ third
73
+ fourth
74
74
 
75
75
  Other
76
- (a) fifth
77
- (6) sixth
78
- (7) seventh
79
- (8) eighth
80
- (9) ninth
81
- (10) tenth
82
-
83
- Press ↑↓ arrows to select, enter to confirm
76
+ fifth
77
+ sixth
78
+ seventh
79
+ eighth
80
+ ninth
81
+ tenth
82
+
83
+ Press ↑↓ arrows to select, enter to confirm.
84
84
  "
85
85
  `);
86
86
  });
@@ -91,25 +91,93 @@ describe('SelectPrompt', async () => {
91
91
  { label: 'third', value: 'third' },
92
92
  { label: 'fourth', value: 'fourth' },
93
93
  ];
94
- const infoTable = {
95
- Add: ['new-ext'],
96
- Remove: ['integrated-demand-ext', ['order-discount', { subdued: '(1)' }]],
97
- };
94
+ const infoTable = [
95
+ {
96
+ header: 'Add',
97
+ items: ['new-ext'],
98
+ bullet: '+',
99
+ },
100
+ {
101
+ header: 'Remove',
102
+ items: ['integrated-demand-ext', ['order-discount', { subdued: '(1)' }]],
103
+ bullet: '-',
104
+ },
105
+ ];
98
106
  const renderInstance = render(React.createElement(SelectPrompt, { message: "Associate your project with the org Castile Ventures?", choices: items, infoTable: infoTable, onSubmit: () => { } }));
99
107
  expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
100
108
  "? Associate your project with the org Castile Ventures?
101
109
 
102
- Add: • new-ext
110
+ ┃ \u001b[1mAdd\u001b[22m
111
+ ┃ + new-ext
112
+
113
+ ┃ \u001b[1mRemove\u001b[22m
114
+ ┃ - integrated-demand-ext
115
+ ┃ - order-discount (1)
103
116
 
104
- Remove: • integrated-demand-ext
105
- • order-discount (1)
117
+ > first
118
+ second
119
+ third
120
+ fourth
106
121
 
107
- > (1) first
108
- (2) second
109
- (3) third
110
- (4) fourth
122
+ Press ↑↓ arrows to select, enter to confirm.
123
+ "
124
+ `);
125
+ });
126
+ test('supports a git diff', async () => {
127
+ const items = [
128
+ { label: 'first', value: 'first' },
129
+ { label: 'second', value: 'second' },
130
+ { label: 'third', value: 'third' },
131
+ { label: 'fourth', value: 'fourth' },
132
+ ];
133
+ const gitDiff = {
134
+ baselineContent: 'hello\n',
135
+ updatedContent: 'world\n',
136
+ };
137
+ const renderInstance = render(React.createElement(SelectPrompt, { message: "Associate your project with the org Castile Ventures?", choices: items, gitDiff: gitDiff, onSubmit: () => { } }));
138
+ expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
139
+ "? Associate your project with the org Castile Ventures?
140
+
141
+ ┃ - hello
142
+ ┃ + world
111
143
 
112
- Press ↑↓ arrows to select, enter to confirm
144
+ > first
145
+ second
146
+ third
147
+ fourth
148
+
149
+ Press ↑↓ arrows to select, enter to confirm.
150
+ "
151
+ `);
152
+ });
153
+ test('supports an info message', async () => {
154
+ const items = [
155
+ { label: 'first', value: 'first' },
156
+ { label: 'second', value: 'second' },
157
+ { label: 'third', value: 'third' },
158
+ { label: 'fourth', value: 'fourth' },
159
+ ];
160
+ const infoMessage = {
161
+ title: {
162
+ color: 'red',
163
+ text: 'Info message title',
164
+ },
165
+ body: 'Info message body',
166
+ };
167
+ const renderInstance = render(React.createElement(SelectPrompt, { message: "Associate your project with the org Castile Ventures?", choices: items, infoMessage: infoMessage, onSubmit: () => { } }));
168
+ expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
169
+ "? Associate your project with the org Castile Ventures?
170
+
171
+ ┃ Info message title
172
+
173
+ ┃ Info message body
174
+
175
+ > first
176
+ second
177
+ third
178
+ fourth
179
+
180
+ Press ↑↓ arrows to select, enter to confirm.
113
181
  "
114
182
  `);
115
183
  });
@@ -125,9 +193,10 @@ describe('SelectPrompt', async () => {
125
193
  expect(unstyled(lastFrame())).toMatchInlineSnapshot(`
126
194
  "? Test question?
127
195
 
128
- > (1) a
196
+ > a
197
+
129
198
 
130
- Press ↑↓ arrows to select, enter to confirm
199
+ Press ↑↓ arrows to select, enter to confirm.
131
200
  "
132
201
  `);
133
202
  });
@@ -141,10 +210,10 @@ describe('SelectPrompt', async () => {
141
210
  expect(unstyled(renderInstance.lastFrame())).toMatchInlineSnapshot(`
142
211
  "? Test question?
143
212
 
144
- (1) a
145
- > (2) b
213
+ a
214
+ > b
146
215
 
147
- Press ↑↓ arrows to select, enter to confirm
216
+ Press ↑↓ arrows to select, enter to confirm.
148
217
  "
149
218
  `);
150
219
  await waitForInputsToBeReady();
@@ -166,10 +235,10 @@ describe('SelectPrompt', async () => {
166
235
  expect(unstyled(renderInstance.lastFrame())).toMatchInlineSnapshot(`
167
236
  "? Test question?
168
237
 
169
- > (1) a
170
- (2) b
238
+ > a
239
+ b
171
240
 
172
- Press ↑↓ arrows to select, enter to confirm
241
+ Press ↑↓ arrows to select, enter to confirm.
173
242
  "
174
243
  `);
175
244
  await waitForInputsToBeReady();
@@ -187,16 +256,16 @@ describe('SelectPrompt', async () => {
187
256
  { label: 'a', value: 'a', key: 'a' },
188
257
  { label: 'b', value: 'b', key: 'b' },
189
258
  ];
190
- const renderInstance = render(React.createElement(SelectPrompt, { choices: items, onSubmit: onEnter, message: "Test question?", submitWithShortcuts: true }));
259
+ const renderInstance = render(React.createElement(SelectPrompt, { choices: items, onSubmit: onEnter, message: "Test question?" }));
191
260
  expect(unstyled(renderInstance.lastFrame())).toMatchInlineSnapshot(`
192
- "? Test question?
261
+ "? Test question?
193
262
 
194
- > (a) a
195
- (b) b
263
+ > (a) a
264
+ (b) b
196
265
 
197
- Press ↑↓ arrows to select, enter or a shortcut to confirm
198
- "
199
- `);
266
+ Press ↑↓ arrows to select, enter or a shortcut to confirm.
267
+ "
268
+ `);
200
269
  await waitForInputsToBeReady();
201
270
  await sendInputAndWaitForChange(renderInstance, 'b');
202
271
  expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`
@@ -213,11 +282,11 @@ describe('SelectPrompt', async () => {
213
282
  write: () => { },
214
283
  });
215
284
  const items = [
216
- { label: 'first', value: 'first', group: 'Automations', key: 'f' },
217
- { label: 'second', value: 'second', group: 'Automations', key: 's' },
285
+ { label: 'first', value: 'first', group: 'Automations' },
286
+ { label: 'second', value: 'second', group: 'Automations' },
218
287
  { label: 'third', value: 'third', group: 'Merchant Admin' },
219
288
  { label: 'fourth', value: 'fourth', group: 'Merchant Admin' },
220
- { label: 'fifth', value: 'fifth', key: 'a' },
289
+ { label: 'fifth', value: 'fifth' },
221
290
  { label: 'sixth', value: 'sixth' },
222
291
  { label: 'seventh', value: 'seventh' },
223
292
  { label: 'eighth', value: 'eighth' },
@@ -228,12 +297,13 @@ describe('SelectPrompt', async () => {
228
297
  expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
229
298
  "? Associate your project with the org Castile Ventures?
230
299
 
231
- Automations
232
- > (f) first
233
- (s) second
300
+ Automations  
301
+ > first  
302
+ second  
303
+  
304
+ Merchant Admin  
234
305
 
235
- Showing 2 of 10 items.
236
- Press ↑↓ arrows to select, enter to confirm
306
+ Press ↑↓ arrows to select, enter to confirm.
237
307
  "
238
308
  `);
239
309
  });
@@ -246,10 +316,10 @@ describe('SelectPrompt', async () => {
246
316
  expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
247
317
  "? Associate your project with the org Castile Ventures?
248
318
 
249
- (1) yes
250
- > (2) no
319
+ yes
320
+ > no
251
321
 
252
- Press ↑↓ arrows to select, enter to confirm
322
+ Press ↑↓ arrows to select, enter to confirm.
253
323
  "
254
324
  `);
255
325
  });
@@ -264,20 +334,20 @@ describe('SelectPrompt', async () => {
264
334
  expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
265
335
  "? Associate your project with the org Castile Ventures?
266
336
 
267
- (1) yes
268
- > (2) no
337
+ yes
338
+ > no
269
339
 
270
- Press ↑↓ arrows to select, enter to confirm
340
+ Press ↑↓ arrows to select, enter to confirm.
271
341
  "
272
342
  `);
273
343
  await sendInputAndWaitForChange(renderInstance, ARROW_UP);
274
344
  expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`
275
345
  "? Associate your project with the org Castile Ventures?
276
346
 
277
- > (1) yes
278
- (2) no
347
+ > yes
348
+ no
279
349
 
280
- Press ↑↓ arrows to select, enter to confirm
350
+ Press ↑↓ arrows to select, enter to confirm.
281
351
  "
282
352
  `);
283
353
  });
@@ -290,14 +360,14 @@ describe('SelectPrompt', async () => {
290
360
  const renderInstance = render(React.createElement(SelectPrompt, { choices: items, onSubmit: () => { }, message: "Test question?", abortSignal: abortController.signal }));
291
361
  const promise = renderInstance.waitUntilExit();
292
362
  expect(unstyled(renderInstance.lastFrame())).toMatchInlineSnapshot(`
293
- "? Test question?
363
+ "? Test question?
294
364
 
295
- > (1) a
296
- (2) b
365
+ > a
366
+ b
297
367
 
298
- Press ↑↓ arrows to select, enter to confirm
299
- "
300
- `);
368
+ Press ↑↓ arrows to select, enter to confirm.
369
+ "
370
+ `);
301
371
  abortController.abort();
302
372
  expect(getLastFrameAfterUnmount(renderInstance)).toEqual('');
303
373
  await expect(promise).resolves.toEqual(undefined);