@shopify/cli-kit 3.91.1 → 3.92.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 (261) hide show
  1. package/dist/private/node/analytics/bounded-collections.d.ts +1 -3
  2. package/dist/private/node/analytics/bounded-collections.js.map +1 -1
  3. package/dist/private/node/analytics/error-categorizer.js.map +1 -1
  4. package/dist/private/node/analytics.js.map +1 -1
  5. package/dist/private/node/api/graphql.d.ts +1 -3
  6. package/dist/private/node/api/graphql.js.map +1 -1
  7. package/dist/private/node/api/headers.d.ts +2 -6
  8. package/dist/private/node/api/headers.js +0 -1
  9. package/dist/private/node/api/headers.js.map +1 -1
  10. package/dist/private/node/api/rest.d.ts +2 -6
  11. package/dist/private/node/api/rest.js.map +1 -1
  12. package/dist/private/node/api.js.map +1 -1
  13. package/dist/private/node/conf-store.d.ts +6 -6
  14. package/dist/private/node/conf-store.js +13 -6
  15. package/dist/private/node/conf-store.js.map +1 -1
  16. package/dist/private/node/session/device-authorization.js.map +1 -1
  17. package/dist/private/node/session/exchange.d.ts +1 -19
  18. package/dist/private/node/session/exchange.js +13 -30
  19. package/dist/private/node/session/exchange.js.map +1 -1
  20. package/dist/private/node/session/schema.d.ts +62 -62
  21. package/dist/private/node/session/store.js +1 -1
  22. package/dist/private/node/session/store.js.map +1 -1
  23. package/dist/private/node/session/validate.d.ts +4 -5
  24. package/dist/private/node/session/validate.js +7 -35
  25. package/dist/private/node/session/validate.js.map +1 -1
  26. package/dist/private/node/session.js +18 -65
  27. package/dist/private/node/session.js.map +1 -1
  28. package/dist/private/node/testing/ui.d.ts +2 -1
  29. package/dist/private/node/testing/ui.js +22 -24
  30. package/dist/private/node/testing/ui.js.map +1 -1
  31. package/dist/private/node/themes/generate-theme-name.js +0 -1
  32. package/dist/private/node/themes/generate-theme-name.js.map +1 -1
  33. package/dist/private/node/ui/alert.js.map +1 -1
  34. package/dist/private/node/ui/components/Alert.test.js +2 -4
  35. package/dist/private/node/ui/components/Alert.test.js.map +1 -1
  36. package/dist/private/node/ui/components/AutocompletePrompt.js +6 -1
  37. package/dist/private/node/ui/components/AutocompletePrompt.js.map +1 -1
  38. package/dist/private/node/ui/components/AutocompletePrompt.test.js +2 -3
  39. package/dist/private/node/ui/components/AutocompletePrompt.test.js.map +1 -1
  40. package/dist/private/node/ui/components/Banner.js +0 -1
  41. package/dist/private/node/ui/components/Banner.js.map +1 -1
  42. package/dist/private/node/ui/components/Banner.test.js +2 -2
  43. package/dist/private/node/ui/components/Banner.test.js.map +1 -1
  44. package/dist/private/node/ui/components/ConcurrentOutput.js +4 -2
  45. package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
  46. package/dist/private/node/ui/components/ConcurrentOutput.test.js +9 -3
  47. package/dist/private/node/ui/components/ConcurrentOutput.test.js.map +1 -1
  48. package/dist/private/node/ui/components/DangerousConfirmationPrompt.js.map +1 -1
  49. package/dist/private/node/ui/components/DangerousConfirmationPrompt.test.js.map +1 -1
  50. package/dist/private/node/ui/components/FatalError.js +0 -1
  51. package/dist/private/node/ui/components/FatalError.js.map +1 -1
  52. package/dist/private/node/ui/components/FatalError.test.js.map +1 -1
  53. package/dist/private/node/ui/components/List.test.js.map +1 -1
  54. package/dist/private/node/ui/components/LoadingBar.js.map +1 -1
  55. package/dist/private/node/ui/components/LoadingBar.test.js.map +1 -1
  56. package/dist/private/node/ui/components/Prompts/InfoTable.d.ts +1 -3
  57. package/dist/private/node/ui/components/Prompts/InfoTable.js +0 -1
  58. package/dist/private/node/ui/components/Prompts/InfoTable.js.map +1 -1
  59. package/dist/private/node/ui/components/Prompts/InfoTable.test.js.map +1 -1
  60. package/dist/private/node/ui/components/Prompts/PromptLayout.d.ts +1 -1
  61. package/dist/private/node/ui/components/Prompts/PromptLayout.js +1 -1
  62. package/dist/private/node/ui/components/Prompts/PromptLayout.js.map +1 -1
  63. package/dist/private/node/ui/components/Prompts/PromptLayout.test.js +1 -1
  64. package/dist/private/node/ui/components/Prompts/PromptLayout.test.js.map +1 -1
  65. package/dist/private/node/ui/components/SelectInput.d.ts +4 -5
  66. package/dist/private/node/ui/components/SelectInput.js +5 -7
  67. package/dist/private/node/ui/components/SelectInput.js.map +1 -1
  68. package/dist/private/node/ui/components/SelectInput.test.js.map +1 -1
  69. package/dist/private/node/ui/components/SelectPrompt.js +0 -1
  70. package/dist/private/node/ui/components/SelectPrompt.js.map +1 -1
  71. package/dist/private/node/ui/components/SelectPrompt.test.js +0 -1
  72. package/dist/private/node/ui/components/SelectPrompt.test.js.map +1 -1
  73. package/dist/private/node/ui/components/SingleTask.js.map +1 -1
  74. package/dist/private/node/ui/components/SingleTask.test.js.map +1 -1
  75. package/dist/private/node/ui/components/Table/ScalarDict.d.ts +2 -4
  76. package/dist/private/node/ui/components/Table/ScalarDict.js.map +1 -1
  77. package/dist/private/node/ui/components/Table/Table.js +0 -1
  78. package/dist/private/node/ui/components/Table/Table.js.map +1 -1
  79. package/dist/private/node/ui/components/Table/Table.test.js.map +1 -1
  80. package/dist/private/node/ui/components/Tasks.js +0 -2
  81. package/dist/private/node/ui/components/Tasks.js.map +1 -1
  82. package/dist/private/node/ui/components/Tasks.test.js +2 -6
  83. package/dist/private/node/ui/components/Tasks.test.js.map +1 -1
  84. package/dist/private/node/ui/components/TextAnimation.test.js +1 -1
  85. package/dist/private/node/ui/components/TextAnimation.test.js.map +1 -1
  86. package/dist/private/node/ui/components/TextInput.js +19 -19
  87. package/dist/private/node/ui/components/TextInput.js.map +1 -1
  88. package/dist/private/node/ui/components/TextPrompt.js +1 -1
  89. package/dist/private/node/ui/components/TextPrompt.js.map +1 -1
  90. package/dist/private/node/ui/components/TextPrompt.test.js +0 -1
  91. package/dist/private/node/ui/components/TextPrompt.test.js.map +1 -1
  92. package/dist/private/node/ui/components/TokenizedText.js +1 -2
  93. package/dist/private/node/ui/components/TokenizedText.js.map +1 -1
  94. package/dist/private/node/ui/components/TokenizedText.test.js.map +1 -1
  95. package/dist/private/node/ui/contexts/LinksContext.d.ts +1 -3
  96. package/dist/private/node/ui/contexts/LinksContext.js.map +1 -1
  97. package/dist/private/node/ui/hooks/use-abort-signal.js +9 -1
  98. package/dist/private/node/ui/hooks/use-abort-signal.js.map +1 -1
  99. package/dist/private/node/ui.js +8 -1
  100. package/dist/private/node/ui.js.map +1 -1
  101. package/dist/public/common/array.js +0 -1
  102. package/dist/public/common/array.js.map +1 -1
  103. package/dist/public/common/collection.d.ts +1 -3
  104. package/dist/public/common/collection.js.map +1 -1
  105. package/dist/public/common/string.js +1 -4
  106. package/dist/public/common/string.js.map +1 -1
  107. package/dist/public/common/ts/json-narrowing.d.ts +1 -3
  108. package/dist/public/common/ts/json-narrowing.js.map +1 -1
  109. package/dist/public/common/version.d.ts +1 -1
  110. package/dist/public/common/version.js +1 -1
  111. package/dist/public/common/version.js.map +1 -1
  112. package/dist/public/node/analytics.js +1 -1
  113. package/dist/public/node/analytics.js.map +1 -1
  114. package/dist/public/node/api/admin.d.ts +2 -6
  115. package/dist/public/node/api/admin.js +1 -2
  116. package/dist/public/node/api/admin.js.map +1 -1
  117. package/dist/public/node/api/app-dev.d.ts +1 -1
  118. package/dist/public/node/api/app-dev.js +1 -1
  119. package/dist/public/node/api/app-dev.js.map +1 -1
  120. package/dist/public/node/api/app-management.d.ts +1 -3
  121. package/dist/public/node/api/app-management.js +1 -1
  122. package/dist/public/node/api/app-management.js.map +1 -1
  123. package/dist/public/node/api/business-platform.js.map +1 -1
  124. package/dist/public/node/api/functions.js +1 -1
  125. package/dist/public/node/api/functions.js.map +1 -1
  126. package/dist/public/node/api/graphql.d.ts +4 -12
  127. package/dist/public/node/api/graphql.js.map +1 -1
  128. package/dist/public/node/api/partners.js +1 -1
  129. package/dist/public/node/api/partners.js.map +1 -1
  130. package/dist/public/node/api/rest-api-throttler.js +0 -1
  131. package/dist/public/node/api/rest-api-throttler.js.map +1 -1
  132. package/dist/public/node/archiver.js +2 -2
  133. package/dist/public/node/archiver.js.map +1 -1
  134. package/dist/public/node/base-command.js +0 -2
  135. package/dist/public/node/base-command.js.map +1 -1
  136. package/dist/public/node/cli.js.map +1 -1
  137. package/dist/public/node/context/local.js.map +1 -1
  138. package/dist/public/node/custom-oclif-loader.js +0 -1
  139. package/dist/public/node/custom-oclif-loader.js.map +1 -1
  140. package/dist/public/node/doctor/framework.d.ts +14 -9
  141. package/dist/public/node/doctor/framework.js +10 -3
  142. package/dist/public/node/doctor/framework.js.map +1 -1
  143. package/dist/public/node/doctor/reporter.d.ts +23 -0
  144. package/dist/public/node/doctor/reporter.js +33 -1
  145. package/dist/public/node/doctor/reporter.js.map +1 -1
  146. package/dist/public/node/dot-env.d.ts +2 -6
  147. package/dist/public/node/dot-env.js +1 -2
  148. package/dist/public/node/dot-env.js.map +1 -1
  149. package/dist/public/node/environments.d.ts +1 -3
  150. package/dist/public/node/environments.js.map +1 -1
  151. package/dist/public/node/error-handler.js +3 -3
  152. package/dist/public/node/error-handler.js.map +1 -1
  153. package/dist/public/node/error.d.ts +1 -1
  154. package/dist/public/node/error.js +2 -2
  155. package/dist/public/node/error.js.map +1 -1
  156. package/dist/public/node/framework.js +0 -1
  157. package/dist/public/node/framework.js.map +1 -1
  158. package/dist/public/node/fs.d.ts +1 -1
  159. package/dist/public/node/fs.js +1 -1
  160. package/dist/public/node/fs.js.map +1 -1
  161. package/dist/public/node/git.d.ts +1 -3
  162. package/dist/public/node/git.js +1 -3
  163. package/dist/public/node/git.js.map +1 -1
  164. package/dist/public/node/github.js +14 -8
  165. package/dist/public/node/github.js.map +1 -1
  166. package/dist/public/node/hooks/postrun.js +2 -2
  167. package/dist/public/node/hooks/postrun.js.map +1 -1
  168. package/dist/public/node/hooks/prerun.js +2 -2
  169. package/dist/public/node/hooks/prerun.js.map +1 -1
  170. package/dist/public/node/http.js +2 -3
  171. package/dist/public/node/http.js.map +1 -1
  172. package/dist/public/node/json-schema.d.ts +1 -3
  173. package/dist/public/node/json-schema.js +0 -1
  174. package/dist/public/node/json-schema.js.map +1 -1
  175. package/dist/public/node/liquid.js +1 -1
  176. package/dist/public/node/liquid.js.map +1 -1
  177. package/dist/public/node/local-storage.d.ts +1 -3
  178. package/dist/public/node/local-storage.js.map +1 -1
  179. package/dist/public/node/metadata.d.ts +1 -3
  180. package/dist/public/node/metadata.js +0 -1
  181. package/dist/public/node/metadata.js.map +1 -1
  182. package/dist/public/node/mimes.d.ts +1 -3
  183. package/dist/public/node/mimes.js.map +1 -1
  184. package/dist/public/node/monorail.js +1 -1
  185. package/dist/public/node/monorail.js.map +1 -1
  186. package/dist/public/node/multiple-installation-warning.d.ts +1 -3
  187. package/dist/public/node/multiple-installation-warning.js.map +1 -1
  188. package/dist/public/node/node-package-manager.d.ts +9 -27
  189. package/dist/public/node/node-package-manager.js +1 -1
  190. package/dist/public/node/node-package-manager.js.map +1 -1
  191. package/dist/public/node/os.js +1 -1
  192. package/dist/public/node/os.js.map +1 -1
  193. package/dist/public/node/output.d.ts +1 -3
  194. package/dist/public/node/output.js +1 -2
  195. package/dist/public/node/output.js.map +1 -1
  196. package/dist/public/node/path.d.ts +13 -0
  197. package/dist/public/node/path.js +10 -1
  198. package/dist/public/node/path.js.map +1 -1
  199. package/dist/public/node/plugins/tunnel.d.ts +5 -11
  200. package/dist/public/node/plugins/tunnel.js.map +1 -1
  201. package/dist/public/node/plugins.d.ts +4 -12
  202. package/dist/public/node/plugins.js.map +1 -1
  203. package/dist/public/node/result.js +1 -1
  204. package/dist/public/node/result.js.map +1 -1
  205. package/dist/public/node/session.js +15 -7
  206. package/dist/public/node/session.js.map +1 -1
  207. package/dist/public/node/system.d.ts +1 -3
  208. package/dist/public/node/system.js +1 -1
  209. package/dist/public/node/system.js.map +1 -1
  210. package/dist/public/node/tcp.js +1 -1
  211. package/dist/public/node/tcp.js.map +1 -1
  212. package/dist/public/node/testing/output.js +1 -1
  213. package/dist/public/node/testing/output.js.map +1 -1
  214. package/dist/public/node/themes/api.js +2 -2
  215. package/dist/public/node/themes/api.js.map +1 -1
  216. package/dist/public/node/themes/conf.d.ts +1 -3
  217. package/dist/public/node/themes/conf.js.map +1 -1
  218. package/dist/public/node/tree-kill.js +0 -1
  219. package/dist/public/node/tree-kill.js.map +1 -1
  220. package/dist/public/node/ui.js +0 -12
  221. package/dist/public/node/ui.js.map +1 -1
  222. package/dist/public/node/vendor/dev_server/dev-server-2016.d.ts +8 -0
  223. package/dist/public/node/vendor/dev_server/dev-server-2016.js +10 -2
  224. package/dist/public/node/vendor/dev_server/dev-server-2016.js.map +1 -1
  225. package/dist/public/node/vendor/dev_server/dev-server-2024.d.ts +8 -0
  226. package/dist/public/node/vendor/dev_server/dev-server-2024.js +10 -2
  227. package/dist/public/node/vendor/dev_server/dev-server-2024.js.map +1 -1
  228. package/dist/public/node/vendor/dev_server/dev-server.js +1 -1
  229. package/dist/public/node/vendor/dev_server/dev-server.js.map +1 -1
  230. package/dist/public/node/vendor/dev_server/env.d.ts +3 -0
  231. package/dist/public/node/vendor/dev_server/env.js +3 -0
  232. package/dist/public/node/vendor/dev_server/env.js.map +1 -1
  233. package/dist/public/node/vendor/dev_server/network/host.d.ts +7 -0
  234. package/dist/public/node/vendor/dev_server/network/host.js +7 -1
  235. package/dist/public/node/vendor/dev_server/network/host.js.map +1 -1
  236. package/dist/public/node/vendor/dev_server/network/index.d.ts +7 -0
  237. package/dist/public/node/vendor/dev_server/network/index.js +7 -2
  238. package/dist/public/node/vendor/dev_server/network/index.js.map +1 -1
  239. package/dist/public/node/vendor/otel-js/export/InstantaneousMetricReader.d.ts +1 -1
  240. package/dist/public/node/vendor/otel-js/export/InstantaneousMetricReader.js +2 -4
  241. package/dist/public/node/vendor/otel-js/export/InstantaneousMetricReader.js.map +1 -1
  242. package/dist/public/node/vendor/otel-js/service/BaseOtelService/BaseOtelService.d.ts +7 -0
  243. package/dist/public/node/vendor/otel-js/service/BaseOtelService/BaseOtelService.js +9 -1
  244. package/dist/public/node/vendor/otel-js/service/BaseOtelService/BaseOtelService.js.map +1 -1
  245. package/dist/public/node/vendor/otel-js/service/DefaultOtelService/DefaultOtelService.d.ts +12 -1
  246. package/dist/public/node/vendor/otel-js/service/DefaultOtelService/DefaultOtelService.js +11 -0
  247. package/dist/public/node/vendor/otel-js/service/DefaultOtelService/DefaultOtelService.js.map +1 -1
  248. package/dist/public/node/vendor/otel-js/service/types.d.ts +6 -10
  249. package/dist/public/node/vendor/otel-js/service/types.js.map +1 -1
  250. package/dist/public/node/vendor/otel-js/utils/throttle.d.ts +10 -2
  251. package/dist/public/node/vendor/otel-js/utils/throttle.js +9 -0
  252. package/dist/public/node/vendor/otel-js/utils/throttle.js.map +1 -1
  253. package/dist/public/node/vendor/otel-js/utils/validators.d.ts +4 -0
  254. package/dist/public/node/vendor/otel-js/utils/validators.js +4 -0
  255. package/dist/public/node/vendor/otel-js/utils/validators.js.map +1 -1
  256. package/dist/public/node/version.js +1 -1
  257. package/dist/public/node/version.js.map +1 -1
  258. package/dist/public/node/vscode.js +1 -1
  259. package/dist/public/node/vscode.js.map +1 -1
  260. package/dist/tsconfig.tsbuildinfo +1 -1
  261. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"SelectPrompt.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectPrompt.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {SelectPrompt} from './SelectPrompt.js'\nimport {getLastFrameAfterUnmount, sendInputAndWaitForChange, waitForInputsToBeReady, render} from '../../testing/ui.js'\nimport {unstyled} from '../../../../public/node/output.js'\nimport {Stdout} from '../../ui.js'\nimport {AbortController} from '../../../../public/node/abort.js'\nimport {beforeEach, describe, expect, test, vi} from 'vitest'\nimport React from 'react'\nimport {useStdout} from 'ink'\n\nvi.mock('ink', async () => {\n const original: any = await vi.importActual('ink')\n return {\n ...original,\n useStdout: vi.fn(),\n }\n})\n\nconst ARROW_DOWN = '\\u001B[B'\nconst ARROW_UP = '\\u001B[A'\nconst ENTER = '\\r'\n\nbeforeEach(() => {\n vi.mocked(useStdout).mockReturnValue({\n stdout: new Stdout({\n columns: 80,\n rows: 80,\n }) as any,\n write: () => {},\n })\n})\n\ndescribe('SelectPrompt', async () => {\n test('choose an answer', async () => {\n const onEnter = vi.fn()\n\n const items = [\n {label: 'first', value: 'first'},\n {label: 'second', value: 'second'},\n {label: 'third', value: 'third'},\n ]\n\n const infoTable = {Add: ['new-ext'], Remove: ['integrated-demand-ext', 'order-discount']}\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n infoTable={infoTable}\n onSubmit={onEnter}\n />,\n )\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ENTER)\n\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n \u001b[36m✔\u001b[39m \u001b[36msecond\u001b[39m\n \"\n `)\n\n expect(onEnter).toHaveBeenCalledWith(items[1]!.value)\n })\n\n test('renders groups', async () => {\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(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={() => {}}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\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 })\n\n test('supports an info table', 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 ]\n\n const infoTable = [\n {\n header: 'Add',\n items: ['new-ext'],\n bullet: '+',\n },\n {\n header: 'Remove',\n items: ['integrated-demand-ext', ['order-discount', {subdued: '(1)'}]],\n bullet: '-',\n },\n ]\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n infoTable={infoTable}\n onSubmit={() => {}}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n ┃ \\u001b[1mAdd\\u001b[22m\n ┃ + new-ext\n ┃\n ┃ \\u001b[1mRemove\\u001b[22m\n ┃ - integrated-demand-ext\n ┃ - order-discount \u001b[2m(1)\u001b[22m\n\n \u001b[36m>\u001b[39m \u001b[36mfirst\u001b[39m\n second\n third\n fourth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test('supports an info message', 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 ]\n\n const infoMessage = {\n title: {\n color: 'red',\n text: 'Info message title',\n },\n body: 'Info message body',\n }\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n infoMessage={infoMessage}\n onSubmit={() => {}}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n ┃ \u001b[31mInfo message title\u001b[39m\n ┃\n ┃ Info message body\n\n \u001b[36m>\u001b[39m \u001b[36mfirst\u001b[39m\n second\n third\n fourth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test(\"it doesn't submit if there are no choices\", async () => {\n const onEnter = vi.fn()\n\n const items: any[] = []\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={onEnter}\n />,\n )\n\n expect(unstyled(getLastFrameAfterUnmount(renderInstance)!)).toContain(\n 'ERROR SelectPrompt requires at least one choice',\n )\n })\n\n test(\"doesn't append a colon to the message if it ends with a question mark\", async () => {\n const {lastFrame} = render(\n <SelectPrompt choices={[{label: 'a', value: 'a'}]} onSubmit={() => {}} message=\"Test question?\" />,\n )\n\n expect(unstyled(lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n > a\n\n\n Press ↑↓ arrows to select, enter to confirm.\n \"\n `)\n })\n\n test('accepts a default value', async () => {\n const onEnter = vi.fn()\n const items = [\n {label: 'a', value: 'a'},\n {label: 'b', value: 'b'},\n ]\n\n const renderInstance = render(\n <SelectPrompt choices={items} onSubmit={onEnter} message=\"Test question?\" defaultValue=\"b\" />,\n )\n\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n a\n > b\n\n Press ↑↓ arrows to select, enter to confirm.\n \"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ENTER)\n\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`\n \"? Test question?\n \u001b[36m✔\u001b[39m \u001b[36mb\u001b[39m\n \"\n `)\n expect(onEnter).toHaveBeenCalledWith(items[1]!.value)\n })\n\n test('can submit the initial value', async () => {\n const onEnter = vi.fn()\n const items = [\n {label: 'a', value: 'a'},\n {label: 'b', value: 'b'},\n ]\n\n const renderInstance = render(<SelectPrompt choices={items} onSubmit={onEnter} message=\"Test question?\" />)\n\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n > a\n b\n\n Press ↑↓ arrows to select, enter to confirm.\n \"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ENTER)\n\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`\n \"? Test question?\n \u001b[36m✔\u001b[39m \u001b[36ma\u001b[39m\n \"\n `)\n expect(onEnter).toHaveBeenCalledWith(items[0]!.value)\n })\n\n test('allow submitting with a shortcut directly', async () => {\n const onEnter = vi.fn()\n const items = [\n {label: 'a', value: 'a', key: 'a'},\n {label: 'b', value: 'b', key: 'b'},\n ]\n\n const renderInstance = render(<SelectPrompt choices={items} onSubmit={onEnter} message=\"Test question?\" />)\n\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n > (a) a\n (b) b\n\n Press ↑↓ arrows to select, enter or a shortcut to confirm.\n \"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, 'b')\n\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`\n \"? Test question?\n \u001b[36m✔\u001b[39m \u001b[36mb\u001b[39m\n \"\n `)\n expect(onEnter).toHaveBeenCalledWith(items[1]!.value)\n })\n\n test('adapts to the height of the container', async () => {\n vi.mocked(useStdout).mockReturnValue({\n stdout: new Stdout({rows: 10}) as any,\n write: () => {},\n })\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(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={() => {}}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n \u001b[1mAutomations\u001b[22m \u001b[46m \u001b[49m\n \u001b[36m>\u001b[39m \u001b[36mfirst\u001b[39m \u001b[100m \u001b[49m\n second \u001b[100m \u001b[49m\n \u001b[100m \u001b[49m\n \u001b[1mMerchant Admin\u001b[22m \u001b[100m \u001b[49m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test('allows passing false as the default value', async () => {\n const items = [\n {label: 'yes', value: true},\n {label: 'no', value: false},\n ]\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={() => {}}\n defaultValue={false}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n yes\n \u001b[36m>\u001b[39m \u001b[36mno\u001b[39m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test('allows selecting a different option after having selected an option with a falsy value', async () => {\n const items = [\n {label: 'yes', value: true},\n {label: 'no', value: false},\n ]\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={() => {}}\n />,\n )\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n yes\n \u001b[36m>\u001b[39m \u001b[36mno\u001b[39m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n\n await sendInputAndWaitForChange(renderInstance, ARROW_UP)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n \u001b[36m>\u001b[39m \u001b[36myes\u001b[39m\n no\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test('abortController can be used to exit the prompt from outside', async () => {\n const items = [\n {label: 'a', value: 'a'},\n {label: 'b', value: 'b'},\n ]\n\n const abortController = new AbortController()\n\n const renderInstance = render(\n <SelectPrompt\n choices={items}\n onSubmit={() => {}}\n message=\"Test question?\"\n abortSignal={abortController.signal}\n />,\n )\n\n const promise = renderInstance.waitUntilExit()\n\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n > a\n b\n\n Press ↑↓ arrows to select, enter to confirm.\n \"\n `)\n\n abortController.abort()\n\n // wait for the onAbort promise to resolve\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n expect(getLastFrameAfterUnmount(renderInstance)).toEqual('')\n await expect(promise).resolves.toEqual(undefined)\n })\n})\n"]}
1
+ {"version":3,"file":"SelectPrompt.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectPrompt.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {SelectPrompt} from './SelectPrompt.js'\nimport {getLastFrameAfterUnmount, sendInputAndWaitForChange, waitForInputsToBeReady, render} from '../../testing/ui.js'\nimport {unstyled} from '../../../../public/node/output.js'\nimport {Stdout} from '../../ui.js'\nimport {AbortController} from '../../../../public/node/abort.js'\nimport {beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport React from 'react'\nimport {useStdout} from 'ink'\n\nvi.mock('ink', async () => {\n const original: any = await vi.importActual('ink')\n return {\n ...original,\n useStdout: vi.fn(),\n }\n})\n\nconst ARROW_DOWN = '\\u001B[B'\nconst ARROW_UP = '\\u001B[A'\nconst ENTER = '\\r'\n\nbeforeEach(() => {\n vi.mocked(useStdout).mockReturnValue({\n stdout: new Stdout({\n columns: 80,\n rows: 80,\n }) as any,\n write: () => {},\n })\n})\n\ndescribe('SelectPrompt', async () => {\n test('choose an answer', async () => {\n const onEnter = vi.fn()\n\n const items = [\n {label: 'first', value: 'first'},\n {label: 'second', value: 'second'},\n {label: 'third', value: 'third'},\n ]\n\n const infoTable = {Add: ['new-ext'], Remove: ['integrated-demand-ext', 'order-discount']}\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n infoTable={infoTable}\n onSubmit={onEnter}\n />,\n )\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n await sendInputAndWaitForChange(renderInstance, ENTER)\n\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n \u001b[36m✔\u001b[39m \u001b[36msecond\u001b[39m\n \"\n `)\n\n expect(onEnter).toHaveBeenCalledWith(items[1]!.value)\n })\n\n test('renders groups', async () => {\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(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={() => {}}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\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 })\n\n test('supports an info table', 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 ]\n\n const infoTable = [\n {\n header: 'Add',\n items: ['new-ext'],\n bullet: '+',\n },\n {\n header: 'Remove',\n items: ['integrated-demand-ext', ['order-discount', {subdued: '(1)'}]],\n bullet: '-',\n },\n ]\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n infoTable={infoTable}\n onSubmit={() => {}}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n ┃ \\u001b[1mAdd\\u001b[22m\n ┃ + new-ext\n ┃\n ┃ \\u001b[1mRemove\\u001b[22m\n ┃ - integrated-demand-ext\n ┃ - order-discount \u001b[2m(1)\u001b[22m\n\n \u001b[36m>\u001b[39m \u001b[36mfirst\u001b[39m\n second\n third\n fourth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test('supports an info message', 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 ]\n\n const infoMessage = {\n title: {\n color: 'red',\n text: 'Info message title',\n },\n body: 'Info message body',\n }\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n infoMessage={infoMessage}\n onSubmit={() => {}}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n ┃ \u001b[31mInfo message title\u001b[39m\n ┃\n ┃ Info message body\n\n \u001b[36m>\u001b[39m \u001b[36mfirst\u001b[39m\n second\n third\n fourth\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test(\"it doesn't submit if there are no choices\", async () => {\n const onEnter = vi.fn()\n\n const items: any[] = []\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={onEnter}\n />,\n )\n\n expect(unstyled(getLastFrameAfterUnmount(renderInstance)!)).toContain(\n 'ERROR SelectPrompt requires at least one choice',\n )\n })\n\n test(\"doesn't append a colon to the message if it ends with a question mark\", async () => {\n const {lastFrame} = render(\n <SelectPrompt choices={[{label: 'a', value: 'a'}]} onSubmit={() => {}} message=\"Test question?\" />,\n )\n\n expect(unstyled(lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n > a\n\n\n Press ↑↓ arrows to select, enter to confirm.\n \"\n `)\n })\n\n test('accepts a default value', async () => {\n const onEnter = vi.fn()\n const items = [\n {label: 'a', value: 'a'},\n {label: 'b', value: 'b'},\n ]\n\n const renderInstance = render(\n <SelectPrompt choices={items} onSubmit={onEnter} message=\"Test question?\" defaultValue=\"b\" />,\n )\n\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n a\n > b\n\n Press ↑↓ arrows to select, enter to confirm.\n \"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ENTER)\n\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`\n \"? Test question?\n \u001b[36m✔\u001b[39m \u001b[36mb\u001b[39m\n \"\n `)\n expect(onEnter).toHaveBeenCalledWith(items[1]!.value)\n })\n\n test('can submit the initial value', async () => {\n const onEnter = vi.fn()\n const items = [\n {label: 'a', value: 'a'},\n {label: 'b', value: 'b'},\n ]\n\n const renderInstance = render(<SelectPrompt choices={items} onSubmit={onEnter} message=\"Test question?\" />)\n\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n > a\n b\n\n Press ↑↓ arrows to select, enter to confirm.\n \"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ENTER)\n\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`\n \"? Test question?\n \u001b[36m✔\u001b[39m \u001b[36ma\u001b[39m\n \"\n `)\n expect(onEnter).toHaveBeenCalledWith(items[0]!.value)\n })\n\n test('allow submitting with a shortcut directly', async () => {\n const onEnter = vi.fn()\n const items = [\n {label: 'a', value: 'a', key: 'a'},\n {label: 'b', value: 'b', key: 'b'},\n ]\n\n const renderInstance = render(<SelectPrompt choices={items} onSubmit={onEnter} message=\"Test question?\" />)\n\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n > (a) a\n (b) b\n\n Press ↑↓ arrows to select, enter or a shortcut to confirm.\n \"\n `)\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, 'b')\n\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot(`\n \"? Test question?\n \u001b[36m✔\u001b[39m \u001b[36mb\u001b[39m\n \"\n `)\n expect(onEnter).toHaveBeenCalledWith(items[1]!.value)\n })\n\n test('adapts to the height of the container', async () => {\n vi.mocked(useStdout).mockReturnValue({\n stdout: new Stdout({rows: 10}) as any,\n write: () => {},\n })\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(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={() => {}}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n \u001b[1mAutomations\u001b[22m \u001b[46m \u001b[49m\n \u001b[36m>\u001b[39m \u001b[36mfirst\u001b[39m \u001b[100m \u001b[49m\n second \u001b[100m \u001b[49m\n \u001b[100m \u001b[49m\n \u001b[1mMerchant Admin\u001b[22m \u001b[100m \u001b[49m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test('allows passing false as the default value', async () => {\n const items = [\n {label: 'yes', value: true},\n {label: 'no', value: false},\n ]\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={() => {}}\n defaultValue={false}\n />,\n )\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n yes\n \u001b[36m>\u001b[39m \u001b[36mno\u001b[39m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test('allows selecting a different option after having selected an option with a falsy value', async () => {\n const items = [\n {label: 'yes', value: true},\n {label: 'no', value: false},\n ]\n\n const renderInstance = render(\n <SelectPrompt\n message=\"Associate your project with the org Castile Ventures?\"\n choices={items}\n onSubmit={() => {}}\n />,\n )\n\n await waitForInputsToBeReady()\n await sendInputAndWaitForChange(renderInstance, ARROW_DOWN)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n yes\n \u001b[36m>\u001b[39m \u001b[36mno\u001b[39m\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n\n await sendInputAndWaitForChange(renderInstance, ARROW_UP)\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"? Associate your project with the org Castile Ventures?\n\n \u001b[36m>\u001b[39m \u001b[36myes\u001b[39m\n no\n\n \u001b[2mPress ↑↓ arrows to select, enter to confirm.\u001b[22m\n \"\n `)\n })\n\n test('abortController can be used to exit the prompt from outside', async () => {\n const items = [\n {label: 'a', value: 'a'},\n {label: 'b', value: 'b'},\n ]\n\n const abortController = new AbortController()\n\n const renderInstance = render(\n <SelectPrompt\n choices={items}\n onSubmit={() => {}}\n message=\"Test question?\"\n abortSignal={abortController.signal}\n />,\n )\n\n const promise = renderInstance.waitUntilExit()\n\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"? Test question?\n\n > a\n b\n\n Press ↑↓ arrows to select, enter to confirm.\n \"\n `)\n\n abortController.abort()\n\n // wait for the onAbort promise to resolve\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n await expect(promise).resolves.toEqual(undefined)\n })\n})\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SingleTask.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SingleTask.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAA;AAEvC,OAAO,KAAK,EAAE,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AAChD,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,KAAK,CAAA;AAU9C,MAAM,UAAU,GAAG,CAAK,EAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAqB,EAAE,EAAE;IACzF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,EAAC,IAAI,EAAE,UAAU,EAAC,GAAG,MAAM,EAAE,CAAA;IACnC,MAAM,EAAC,kBAAkB,EAAC,GAAG,QAAQ,EAAE,CAAA;IAEvC,QAAQ,CACN,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACzB,CAAC;IACH,CAAC,EACD,EAAC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAC,CACxC,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC;aACZ,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,SAAS,CAAC,IAAI,CAAC,CAAA;YACf,UAAU,EAAE,CAAC,MAAM,CAAC,CAAA;YACpB,UAAU,EAAE,CAAA;QACd,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,SAAS,CAAC,IAAI,CAAC,CAAA;YACf,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;IACN,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAA;IAElC,IAAI,MAAM,EAAE,CAAC;QACX,yBAAyB;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,oBAAC,UAAU,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAI,CAAA;AAC9D,CAAC,CAAA;AAED,OAAO,EAAC,UAAU,EAAC,CAAA","sourcesContent":["import {LoadingBar} from './LoadingBar.js'\nimport {handleCtrlC} from '../../ui.js'\nimport {TokenizedString} from '../../../../public/node/output.js'\nimport React, {useEffect, useState} from 'react'\nimport {useApp, useInput, useStdin} from 'ink'\n\ninterface SingleTaskProps<T> {\n title: TokenizedString\n task: (updateStatus: (status: TokenizedString) => void) => Promise<T>\n onComplete?: (result: T) => void\n onAbort?: () => void\n noColor?: boolean\n}\n\nconst SingleTask = <T,>({task, title, onComplete, onAbort, noColor}: SingleTaskProps<T>) => {\n const [status, setStatus] = useState(title)\n const [isDone, setIsDone] = useState(false)\n const {exit: unmountInk} = useApp()\n const {isRawModeSupported} = useStdin()\n\n useInput(\n (input, key) => {\n if (onAbort) {\n handleCtrlC(input, key, onAbort)\n } else {\n handleCtrlC(input, key)\n }\n },\n {isActive: Boolean(isRawModeSupported)},\n )\n\n useEffect(() => {\n task(setStatus)\n .then((result) => {\n setIsDone(true)\n onComplete?.(result)\n unmountInk()\n })\n .catch((error) => {\n setIsDone(true)\n unmountInk(error)\n })\n }, [task, unmountInk, onComplete])\n\n if (isDone) {\n // clear things once done\n return null\n }\n\n return <LoadingBar title={status.value} noColor={noColor} />\n}\n\nexport {SingleTask}\n"]}
1
+ {"version":3,"file":"SingleTask.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SingleTask.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAA;AAEvC,OAAO,KAAK,EAAE,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AAEhD,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,KAAK,CAAA;AAU9C,MAAM,UAAU,GAAG,CAAK,EAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAqB,EAAE,EAAE;IACzF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,EAAC,IAAI,EAAE,UAAU,EAAC,GAAG,MAAM,EAAE,CAAA;IACnC,MAAM,EAAC,kBAAkB,EAAC,GAAG,QAAQ,EAAE,CAAA;IAEvC,QAAQ,CACN,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACzB,CAAC;IACH,CAAC,EACD,EAAC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAC,CACxC,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC;aACZ,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,SAAS,CAAC,IAAI,CAAC,CAAA;YACf,UAAU,EAAE,CAAC,MAAM,CAAC,CAAA;YACpB,UAAU,EAAE,CAAA;QACd,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,SAAS,CAAC,IAAI,CAAC,CAAA;YACf,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;IACN,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAA;IAElC,IAAI,MAAM,EAAE,CAAC;QACX,yBAAyB;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,oBAAC,UAAU,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAI,CAAA;AAC9D,CAAC,CAAA;AAED,OAAO,EAAC,UAAU,EAAC,CAAA","sourcesContent":["import {LoadingBar} from './LoadingBar.js'\nimport {handleCtrlC} from '../../ui.js'\nimport {TokenizedString} from '../../../../public/node/output.js'\nimport React, {useEffect, useState} from 'react'\n\nimport {useApp, useInput, useStdin} from 'ink'\n\ninterface SingleTaskProps<T> {\n title: TokenizedString\n task: (updateStatus: (status: TokenizedString) => void) => Promise<T>\n onComplete?: (result: T) => void\n onAbort?: () => void\n noColor?: boolean\n}\n\nconst SingleTask = <T,>({task, title, onComplete, onAbort, noColor}: SingleTaskProps<T>) => {\n const [status, setStatus] = useState(title)\n const [isDone, setIsDone] = useState(false)\n const {exit: unmountInk} = useApp()\n const {isRawModeSupported} = useStdin()\n\n useInput(\n (input, key) => {\n if (onAbort) {\n handleCtrlC(input, key, onAbort)\n } else {\n handleCtrlC(input, key)\n }\n },\n {isActive: Boolean(isRawModeSupported)},\n )\n\n useEffect(() => {\n task(setStatus)\n .then((result) => {\n setIsDone(true)\n onComplete?.(result)\n unmountInk()\n })\n .catch((error) => {\n setIsDone(true)\n unmountInk(error)\n })\n }, [task, unmountInk, onComplete])\n\n if (isDone) {\n // clear things once done\n return null\n }\n\n return <LoadingBar title={status.value} noColor={noColor} />\n}\n\nexport {SingleTask}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SingleTask.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SingleTask.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAC,eAAe,EAAC,MAAM,mCAAmC,CAAA;AACjE,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAC,MAAM,QAAQ,CAAA;AAE7C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,QAAQ;QACR,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAA;QACpD,IAAI,cAAuC,CAAA;QAC3C,MAAM,IAAI,GAAG,GAAG,EAAE,CAChB,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YAC9B,cAAc,GAAG,OAAO,CAAA;QAC1B,CAAC,CAAC,CAAA;QAEJ,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAA;QAEvE,0BAA0B;QAC1B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QAEvD,sBAAsB;QACtB,cAAe,CAAC,SAAS,CAAC,CAAA;QAE1B,2CAA2C;QAC3C,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,0CAA0C;QAC1C,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC/C,QAAQ;QACR,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,aAAa,CAAC,CAAA;QAChD,IAAI,aAAqC,CAAA;QACzC,MAAM,IAAI,GAAG,GAAG,EAAE,CAChB,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,aAAa,GAAG,MAAM,CAAA;QACxB,CAAC,CAAC,CAAA;QAEJ,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAA;QAEvE,0BAA0B;QAC1B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QAEvD,wDAAwD;QACxD,aAAc,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAA;QAExC,2CAA2C;QAC3C,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,QAAQ;QACR,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,cAAc,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;QAEvD,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAA;QACvE,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,gDAAgD;QAChD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QAC1D,QAAQ;QACR,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAA;QACpD,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAE/D,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAA;QAEvE,gCAAgC;QAChC,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACjF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAClE,mBAAmB;QACnB,IAAI,YAAgC,CAAA;QACpC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC1D,MAAM,YAAY,GAAG,MAAM,CACzB,oBAAC,UAAU,IACT,KAAK,EAAE,IAAI,eAAe,CAAC,aAAa,CAAC,EACzC,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,GAAG,MAAM,CAAC,GAC/C,CACH,CAAA;QACD,MAAM,YAAY,CAAC,aAAa,EAAE,CAAA;QAClC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAE3C,mBAAmB;QACnB,IAAI,YAAoD,CAAA;QACxD,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAC,CAAC,CAAA;QAC/D,MAAM,YAAY,GAAG,MAAM,CACzB,oBAAC,UAAU,IACT,KAAK,EAAE,IAAI,eAAe,CAAC,aAAa,CAAC,EACzC,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,GAAG,MAAM,CAAC,GAC/C,CACH,CAAA;QACD,MAAM,YAAY,CAAC,aAAa,EAAE,CAAA;QAClC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAE9C,mBAAmB;QACnB,IAAI,YAAgC,CAAA;QACpC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5C,MAAM,YAAY,GAAG,MAAM,CACzB,oBAAC,UAAU,IACT,KAAK,EAAE,IAAI,eAAe,CAAC,aAAa,CAAC,EACzC,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,GAAG,MAAM,CAAC,GAC/C,CACH,CAAA;QACD,MAAM,YAAY,CAAC,aAAa,EAAE,CAAA;QAClC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAE7B,oBAAoB;QACpB,IAAI,aAAkC,CAAA;QACtC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/C,MAAM,aAAa,GAAG,MAAM,CAC1B,oBAAC,UAAU,IACT,KAAK,EAAE,IAAI,eAAe,CAAC,cAAc,CAAC,EAC1C,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,aAAa,GAAG,MAAM,CAAC,GAChD,CACH,CAAA;QACD,MAAM,aAAa,CAAC,aAAa,EAAE,CAAA;QACnC,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,QAAQ;QACR,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,cAAc,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,GAAG,EAAE,CAChB,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YAC9B,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEJ,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAA;QAEvE,sBAAsB;QACtB,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,OAAO;QACP,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACxD,QAAQ;QACR,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAA;QACpD,MAAM,IAAI,GAAG,GAAG,EAAE,CAChB,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;QAEJ,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAA;QAEvE,2CAA2C;QAC3C,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACpD,yBAAyB;QACzB,MAAM,WAAY,SAAQ,KAAK;YAC7B,YAAY,OAAe,EAAS,IAAY;gBAC9C,KAAK,CAAC,OAAO,CAAC,CAAA;gBADoB,SAAI,GAAJ,IAAI,CAAQ;gBAE9C,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;YAC3B,CAAC;SACF;QAED,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,sBAAsB,EAAE,aAAa,CAAC,CAAA;QAC1E,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAE9C,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,IAAI,eAAe,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAA;QAE1G,yCAAyC;QACzC,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,iEAAiE;QACjE,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QACzF,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAE1F,OAAO;QACP,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,GAAI,CAAC,CAAA;QACrG,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,GAAI,CAAC,CAAA;QAErG,2CAA2C;QAC3C,MAAM,UAAU,CAAC,aAAa,EAAE,CAAA;QAChC,MAAM,UAAU,CAAC,aAAa,EAAE,CAAA;QAEhC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5C,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,QAAQ;QACR,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,eAAe,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;QAEpC,4DAA4D;QAC5D,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,SAAG,CAAC,CAAA;QAC/E,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,kEAAkE;QAClE,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC9D,QAAQ;QACR,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,eAAe,CAAC,CAAA;QACzD,IAAI,YAAwB,CAAA;QAC5B,IAAI,YAAwB,CAAA;QAC5B,IAAI,YAAwB,CAAA;QAE5B,MAAM,YAAY,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjD,YAAY,GAAG,OAAO,CAAA;QACxB,CAAC,CAAC,CAAA;QACF,MAAM,YAAY,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjD,YAAY,GAAG,OAAO,CAAA;QACxB,CAAC,CAAC,CAAA;QACF,MAAM,YAAY,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjD,YAAY,GAAG,OAAO,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,KAAK,EAAE,YAA+C,EAAE,EAAE;YACrE,YAAY,CAAC,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC,CAAA;YAC5D,MAAM,YAAY,CAAA;YAElB,YAAY,CAAC,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC,CAAA;YAC5D,MAAM,YAAY,CAAA;YAElB,YAAY,CAAC,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC,CAAA;YAC5D,MAAM,YAAY,CAAA;YAElB,OAAO,WAAW,CAAA;QACpB,CAAC,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,UAAU,IAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAA;QAE9E,iDAAiD;QACjD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAEtC,qBAAqB;QACrB,YAAa,EAAE,CAAA;QACf,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAEtC,qBAAqB;QACrB,YAAa,EAAE,CAAA;QACf,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAEtC,oBAAoB;QACpB,YAAa,EAAE,CAAA;QACf,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;IACtC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import {SingleTask} from './SingleTask.js'\nimport {render} from '../../testing/ui.js'\nimport {TokenizedString} from '../../../../public/node/output.js'\nimport React from 'react'\nimport {describe, expect, test} from 'vitest'\n\ndescribe('SingleTask', () => {\n test('unmounts when promise resolves successfully', async () => {\n // Given\n const title = new TokenizedString('Uploading files')\n let resolvePromise: (value: string) => void\n const task = () =>\n new Promise<string>((resolve) => {\n resolvePromise = resolve\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for initial render\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n // Resolve the promise\n resolvePromise!('success')\n\n // Wait for component to update and unmount\n await renderInstance.waitUntilExit()\n\n // Then - component should unmount cleanly\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('unmounts when promise rejects', async () => {\n // Given\n const title = new TokenizedString('Failed task')\n let rejectPromise: (error: Error) => void\n const task = () =>\n new Promise<string>((resolve, reject) => {\n rejectPromise = reject\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for initial render\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n // Reject the promise and expect waitUntilExit to reject\n rejectPromise!(new Error('Task failed'))\n\n // The component should exit with the error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Task failed')\n })\n\n test('handles promise that resolves immediately', async () => {\n // Given\n const title = new TokenizedString('Instant task')\n const task = () => Promise.resolve('immediate success')\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n await renderInstance.waitUntilExit()\n\n // Then - component should complete successfully\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('handles promise that rejects immediately', async () => {\n // Given\n const title = new TokenizedString('Instant failure')\n const task = () => Promise.reject(new Error('Immediate error'))\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Then - should exit with error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Immediate error')\n })\n\n test('handles different types of promise return values', async () => {\n // Test with string\n let stringResult: string | undefined\n const stringTask = () => Promise.resolve('task completed')\n const stringRender = render(\n <SingleTask\n title={new TokenizedString('String task')}\n task={stringTask}\n onComplete={(result) => (stringResult = result)}\n />,\n )\n await stringRender.waitUntilExit()\n expect(stringRender.lastFrame()).toBeDefined()\n expect(stringResult).toBe('task completed')\n\n // Test with object\n let objectResult: {id: number; name: string} | undefined\n const objectTask = () => Promise.resolve({id: 1, name: 'test'})\n const objectRender = render(\n <SingleTask\n title={new TokenizedString('Object task')}\n task={objectTask}\n onComplete={(result) => (objectResult = result)}\n />,\n )\n await objectRender.waitUntilExit()\n expect(objectRender.lastFrame()).toBeDefined()\n\n // Test with number\n let numberResult: number | undefined\n const numberTask = () => Promise.resolve(42)\n const numberRender = render(\n <SingleTask\n title={new TokenizedString('Number task')}\n task={numberTask}\n onComplete={(result) => (numberResult = result)}\n />,\n )\n await numberRender.waitUntilExit()\n expect(numberRender.lastFrame()).toBeDefined()\n expect(numberResult).toBe(42)\n\n // Test with boolean\n let booleanResult: boolean | undefined\n const booleanTask = () => Promise.resolve(true)\n const booleanRender = render(\n <SingleTask\n title={new TokenizedString('Boolean task')}\n task={booleanTask}\n onComplete={(result) => (booleanResult = result)}\n />,\n )\n await booleanRender.waitUntilExit()\n expect(booleanRender.lastFrame()).toBeDefined()\n expect(booleanResult).toBe(true)\n })\n\n test('handles promise with delayed resolution', async () => {\n // Given\n const title = new TokenizedString('Delayed task')\n const task = () =>\n new Promise<string>((resolve) => {\n setTimeout(() => resolve('completed'), 100)\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for completion\n await renderInstance.waitUntilExit()\n\n // Then\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('handles promise with delayed rejection', async () => {\n // Given\n const title = new TokenizedString('Delayed failure')\n const task = () =>\n new Promise<string>((resolve, reject) => {\n setTimeout(() => reject(new Error('delayed error')), 100)\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for completion - should throw error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('delayed error')\n })\n\n test('preserves error types and messages', async () => {\n // Test with custom error\n class CustomError extends Error {\n constructor(message: string, public code: string) {\n super(message)\n this.name = 'CustomError'\n }\n }\n\n const customError = new CustomError('Custom error message', 'CUSTOM_CODE')\n const task = () => Promise.reject(customError)\n\n // When\n const renderInstance = render(<SingleTask title={new TokenizedString('Custom error task')} task={task} />)\n\n // Then - should preserve the exact error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Custom error message')\n })\n\n test('handles concurrent promise operations', async () => {\n // Given - Multiple SingleTask components with different promises\n const fastPromise = () => new Promise((resolve) => setTimeout(() => resolve('fast'), 50))\n const slowPromise = () => new Promise((resolve) => setTimeout(() => resolve('slow'), 150))\n\n // When\n const fastRender = render(<SingleTask title={new TokenizedString('Fast task')} task={fastPromise} />)\n const slowRender = render(<SingleTask title={new TokenizedString('Slow task')} task={slowPromise} />)\n\n // Then - Both should complete successfully\n await fastRender.waitUntilExit()\n await slowRender.waitUntilExit()\n\n expect(fastRender.lastFrame()).toBeDefined()\n expect(slowRender.lastFrame()).toBeDefined()\n })\n\n test('passes noColor prop to LoadingBar component', async () => {\n // Given\n const title = new TokenizedString('No color task')\n const task = () => Promise.resolve()\n\n // When - Test that noColor prop doesn't break the component\n const renderInstance = render(<SingleTask title={title} task={task} noColor />)\n await renderInstance.waitUntilExit()\n\n // Then - Component should complete successfully with noColor prop\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('updates status message during task execution', async () => {\n // Given\n const initialTitle = new TokenizedString('Starting task')\n let step1Resolve: () => void\n let step2Resolve: () => void\n let step3Resolve: () => void\n\n const step1Promise = new Promise<void>((resolve) => {\n step1Resolve = resolve\n })\n const step2Promise = new Promise<void>((resolve) => {\n step2Resolve = resolve\n })\n const step3Promise = new Promise<void>((resolve) => {\n step3Resolve = resolve\n })\n\n const task = async (updateStatus: (status: TokenizedString) => void) => {\n updateStatus(new TokenizedString('Running (1 complete)...'))\n await step1Promise\n\n updateStatus(new TokenizedString('Running (2 complete)...'))\n await step2Promise\n\n updateStatus(new TokenizedString('Running (3 complete)...'))\n await step3Promise\n\n return 'completed'\n }\n\n // When\n const renderInstance = render(<SingleTask title={initialTitle} task={task} />)\n\n // Wait for component to render with first status\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame1 = renderInstance.lastFrame()\n expect(frame1).toContain('1 complete')\n\n // Progress to step 2\n step1Resolve!()\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame2 = renderInstance.lastFrame()\n expect(frame2).toContain('2 complete')\n\n // Progress to step 3\n step2Resolve!()\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame3 = renderInstance.lastFrame()\n expect(frame3).toContain('3 complete')\n\n // Complete the task\n step3Resolve!()\n await renderInstance.waitUntilExit()\n })\n})\n"]}
1
+ {"version":3,"file":"SingleTask.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SingleTask.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {SingleTask} from './SingleTask.js'\nimport {render} from '../../testing/ui.js'\nimport {TokenizedString} from '../../../../public/node/output.js'\nimport React from 'react'\n\nimport {describe, expect, test} from 'vitest'\n\ndescribe('SingleTask', () => {\n test('unmounts when promise resolves successfully', async () => {\n // Given\n const title = new TokenizedString('Uploading files')\n let resolvePromise: (value: string) => void\n const task = () =>\n new Promise<string>((resolve) => {\n resolvePromise = resolve\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for initial render\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n // Resolve the promise\n resolvePromise!('success')\n\n // Wait for component to update and unmount\n await renderInstance.waitUntilExit()\n\n // Then - component should unmount cleanly\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('unmounts when promise rejects', async () => {\n // Given\n const title = new TokenizedString('Failed task')\n let rejectPromise: (error: Error) => void\n const task = () =>\n new Promise<string>((resolve, reject) => {\n rejectPromise = reject\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for initial render\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n // Reject the promise and expect waitUntilExit to reject\n rejectPromise!(new Error('Task failed'))\n\n // The component should exit with the error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Task failed')\n })\n\n test('handles promise that resolves immediately', async () => {\n // Given\n const title = new TokenizedString('Instant task')\n const task = () => Promise.resolve('immediate success')\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n await renderInstance.waitUntilExit()\n\n // Then - component should complete successfully\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('handles promise that rejects immediately', async () => {\n // Given\n const title = new TokenizedString('Instant failure')\n const task = () => Promise.reject(new Error('Immediate error'))\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Then - should exit with error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Immediate error')\n })\n\n test('handles different types of promise return values', async () => {\n // Test with string\n let stringResult: string | undefined\n const stringTask = () => Promise.resolve('task completed')\n const stringRender = render(\n <SingleTask\n title={new TokenizedString('String task')}\n task={stringTask}\n onComplete={(result) => (stringResult = result)}\n />,\n )\n await stringRender.waitUntilExit()\n expect(stringRender.lastFrame()).toBeDefined()\n expect(stringResult).toBe('task completed')\n\n // Test with object\n let objectResult: {id: number; name: string} | undefined\n const objectTask = () => Promise.resolve({id: 1, name: 'test'})\n const objectRender = render(\n <SingleTask\n title={new TokenizedString('Object task')}\n task={objectTask}\n onComplete={(result) => (objectResult = result)}\n />,\n )\n await objectRender.waitUntilExit()\n expect(objectRender.lastFrame()).toBeDefined()\n\n // Test with number\n let numberResult: number | undefined\n const numberTask = () => Promise.resolve(42)\n const numberRender = render(\n <SingleTask\n title={new TokenizedString('Number task')}\n task={numberTask}\n onComplete={(result) => (numberResult = result)}\n />,\n )\n await numberRender.waitUntilExit()\n expect(numberRender.lastFrame()).toBeDefined()\n expect(numberResult).toBe(42)\n\n // Test with boolean\n let booleanResult: boolean | undefined\n const booleanTask = () => Promise.resolve(true)\n const booleanRender = render(\n <SingleTask\n title={new TokenizedString('Boolean task')}\n task={booleanTask}\n onComplete={(result) => (booleanResult = result)}\n />,\n )\n await booleanRender.waitUntilExit()\n expect(booleanRender.lastFrame()).toBeDefined()\n expect(booleanResult).toBe(true)\n })\n\n test('handles promise with delayed resolution', async () => {\n // Given\n const title = new TokenizedString('Delayed task')\n const task = () =>\n new Promise<string>((resolve) => {\n setTimeout(() => resolve('completed'), 100)\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for completion\n await renderInstance.waitUntilExit()\n\n // Then\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('handles promise with delayed rejection', async () => {\n // Given\n const title = new TokenizedString('Delayed failure')\n const task = () =>\n new Promise<string>((resolve, reject) => {\n setTimeout(() => reject(new Error('delayed error')), 100)\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for completion - should throw error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('delayed error')\n })\n\n test('preserves error types and messages', async () => {\n // Test with custom error\n class CustomError extends Error {\n constructor(\n message: string,\n public code: string,\n ) {\n super(message)\n this.name = 'CustomError'\n }\n }\n\n const customError = new CustomError('Custom error message', 'CUSTOM_CODE')\n const task = () => Promise.reject(customError)\n\n // When\n const renderInstance = render(<SingleTask title={new TokenizedString('Custom error task')} task={task} />)\n\n // Then - should preserve the exact error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Custom error message')\n })\n\n test('handles concurrent promise operations', async () => {\n // Given - Multiple SingleTask components with different promises\n const fastPromise = () => new Promise((resolve) => setTimeout(() => resolve('fast'), 50))\n const slowPromise = () => new Promise((resolve) => setTimeout(() => resolve('slow'), 150))\n\n // When\n const fastRender = render(<SingleTask title={new TokenizedString('Fast task')} task={fastPromise} />)\n const slowRender = render(<SingleTask title={new TokenizedString('Slow task')} task={slowPromise} />)\n\n // Then - Both should complete successfully\n await fastRender.waitUntilExit()\n await slowRender.waitUntilExit()\n\n expect(fastRender.lastFrame()).toBeDefined()\n expect(slowRender.lastFrame()).toBeDefined()\n })\n\n test('passes noColor prop to LoadingBar component', async () => {\n // Given\n const title = new TokenizedString('No color task')\n const task = () => Promise.resolve()\n\n // When - Test that noColor prop doesn't break the component\n const renderInstance = render(<SingleTask title={title} task={task} noColor />)\n await renderInstance.waitUntilExit()\n\n // Then - Component should complete successfully with noColor prop\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('updates status message during task execution', async () => {\n // Given\n const initialTitle = new TokenizedString('Starting task')\n let step1Resolve: () => void\n let step2Resolve: () => void\n let step3Resolve: () => void\n\n const step1Promise = new Promise<void>((resolve) => {\n step1Resolve = resolve\n })\n const step2Promise = new Promise<void>((resolve) => {\n step2Resolve = resolve\n })\n const step3Promise = new Promise<void>((resolve) => {\n step3Resolve = resolve\n })\n\n const task = async (updateStatus: (status: TokenizedString) => void) => {\n updateStatus(new TokenizedString('Running (1 complete)...'))\n await step1Promise\n\n updateStatus(new TokenizedString('Running (2 complete)...'))\n await step2Promise\n\n updateStatus(new TokenizedString('Running (3 complete)...'))\n await step3Promise\n\n return 'completed'\n }\n\n // When\n const renderInstance = render(<SingleTask title={initialTitle} task={task} />)\n\n // Wait for component to render with first status\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame1 = renderInstance.lastFrame()\n expect(frame1).toContain('1 complete')\n\n // Progress to step 2\n step1Resolve!()\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame2 = renderInstance.lastFrame()\n expect(frame2).toContain('2 complete')\n\n // Progress to step 3\n step2Resolve!()\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame3 = renderInstance.lastFrame()\n expect(frame3).toContain('3 complete')\n\n // Complete the task\n step3Resolve!()\n await renderInstance.waitUntilExit()\n })\n})\n"]}
@@ -1,5 +1,3 @@
1
1
  type Scalar = string | number | boolean | null | undefined;
2
- export default interface ScalarDict {
3
- [key: string]: Scalar;
4
- }
5
- export {};
2
+ type ScalarDict = Record<string, Scalar>;
3
+ export default ScalarDict;
@@ -1 +1 @@
1
- {"version":3,"file":"ScalarDict.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Table/ScalarDict.ts"],"names":[],"mappings":"","sourcesContent":["type Scalar = string | number | boolean | null | undefined\n\nexport default interface ScalarDict {\n [key: string]: Scalar\n}\n"]}
1
+ {"version":3,"file":"ScalarDict.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Table/ScalarDict.ts"],"names":[],"mappings":"","sourcesContent":["type Scalar = string | number | boolean | null | undefined\n\ntype ScalarDict = Record<string, Scalar>\nexport default ScalarDict\n"]}
@@ -2,7 +2,6 @@ import { Row } from './Row.js';
2
2
  import { unstyled } from '../../../../../public/node/output.js';
3
3
  import React from 'react';
4
4
  import { Box } from 'ink';
5
- // eslint-disable-next-line react/function-component-definition
6
5
  function Table({ rows, columns: columnsConfiguration }) {
7
6
  const columns = Object.entries(columnsConfiguration).map(([key, { header, color }]) => {
8
7
  const headerWidth = String(header || key).length;
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Table/Table.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,UAAU,CAAA;AAC5B,OAAO,EAAC,QAAQ,EAAC,MAAM,sCAAsC,CAAA;AAC7D,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAA;AAYvB,+DAA+D;AAC/D,SAAS,KAAK,CAAuB,EAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,EAAgB;IACvF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,EAAE,EAAE;QAClF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAA;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;YAEtB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,OAAO,CAAC,CAAA;YACV,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,EAAE,WAAW,CAAC;YAC7C,KAAK;SACN,CAAA;IACH,CAAC,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAC1D,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAC,MAAM,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,MAAM,EAAC,CAAC,EAC7E,EAAE,CACH,CAAA;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,GAAG,IAAC,MAAM,EAAC,SAAS,EAAC,UAAU,EAAC,GAAG,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,SAAG;QAC3F,oBAAC,GAAG,IAAC,MAAM,EAAC,WAAW,EAAC,UAAU,EAAC,QAAG,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,iBAAiB,SAAG;QACtF,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,GAAG,GAAG,OAAO,KAAK,EAAE,CAAA;YAE1B,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,GAAG;gBAClC,oBAAC,GAAG,IAAC,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,UAAU,EAAC,GAAG,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAI,CACtE,CACP,CAAA;QACH,CAAC,CAAC,CACE,CACP,CAAA;AACH,CAAC;AAED,OAAO,EAAC,KAAK,EAAC,CAAA","sourcesContent":["import ScalarDict from './ScalarDict.js'\nimport {Row} from './Row.js'\nimport {unstyled} from '../../../../../public/node/output.js'\nimport React from 'react'\nimport {Box} from 'ink'\nimport {ForegroundColor} from 'chalk'\n\nexport type TableColumn<T> = {\n [column in keyof T]: {header?: string; color?: ForegroundColor | 'dim'}\n}\n\nexport interface TableProps<T extends ScalarDict> {\n rows: T[]\n columns: TableColumn<T>\n}\n\n// eslint-disable-next-line react/function-component-definition\nfunction Table<T extends ScalarDict>({rows, columns: columnsConfiguration}: TableProps<T>) {\n const columns = Object.entries(columnsConfiguration).map(([key, {header, color}]) => {\n const headerWidth = String(header || key).length\n const columnWidths = rows.map((row) => {\n const value = row[key]\n\n if (value === undefined || value === null) {\n return 0\n }\n\n return unstyled(String(value)).length\n })\n\n return {\n name: key,\n width: Math.max(...columnWidths, headerWidth),\n color,\n }\n })\n const headings = Object.entries(columnsConfiguration).reduce(\n (headings, [column, {header}]) => ({...headings, [column]: header || column}),\n {},\n )\n\n return (\n <Box flexDirection=\"column\">\n <Row rowKey=\"heading\" fillerChar=\" \" columns={columns} data={headings} ignoreColumnColor />\n <Row rowKey=\"separator\" fillerChar=\"─\" columns={columns} data={{}} ignoreColumnColor />\n {rows.map((row, index) => {\n const key = `row-${index}`\n\n return (\n <Box flexDirection=\"column\" key={key}>\n <Row rowKey={`data-${key}`} fillerChar=\" \" columns={columns} data={row} />\n </Box>\n )\n })}\n </Box>\n )\n}\n\nexport {Table}\n"]}
1
+ {"version":3,"file":"Table.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Table/Table.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,UAAU,CAAA;AAE5B,OAAO,EAAC,QAAQ,EAAC,MAAM,sCAAsC,CAAA;AAC7D,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAA;AAYvB,SAAS,KAAK,CAAuB,EAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,EAAgB;IACvF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,EAAE,EAAE;QAClF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAA;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;YAEtB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,OAAO,CAAC,CAAA;YACV,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,EAAE,WAAW,CAAC;YAC7C,KAAK;SACN,CAAA;IACH,CAAC,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAC1D,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAC,MAAM,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,MAAM,EAAC,CAAC,EAC7E,EAAE,CACH,CAAA;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,GAAG,IAAC,MAAM,EAAC,SAAS,EAAC,UAAU,EAAC,GAAG,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,SAAG;QAC3F,oBAAC,GAAG,IAAC,MAAM,EAAC,WAAW,EAAC,UAAU,EAAC,QAAG,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,iBAAiB,SAAG;QACtF,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,GAAG,GAAG,OAAO,KAAK,EAAE,CAAA;YAE1B,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,GAAG;gBAClC,oBAAC,GAAG,IAAC,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,UAAU,EAAC,GAAG,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAI,CACtE,CACP,CAAA;QACH,CAAC,CAAC,CACE,CACP,CAAA;AACH,CAAC;AAED,OAAO,EAAC,KAAK,EAAC,CAAA","sourcesContent":["import {Row} from './Row.js'\nimport ScalarDict from './ScalarDict.js'\nimport {unstyled} from '../../../../../public/node/output.js'\nimport React from 'react'\nimport {Box} from 'ink'\nimport {ForegroundColor} from 'chalk'\n\nexport type TableColumn<T> = {\n [column in keyof T]: {header?: string; color?: ForegroundColor | 'dim'}\n}\n\nexport interface TableProps<T extends ScalarDict> {\n rows: T[]\n columns: TableColumn<T>\n}\n\nfunction Table<T extends ScalarDict>({rows, columns: columnsConfiguration}: TableProps<T>) {\n const columns = Object.entries(columnsConfiguration).map(([key, {header, color}]) => {\n const headerWidth = String(header || key).length\n const columnWidths = rows.map((row) => {\n const value = row[key]\n\n if (value === undefined || value === null) {\n return 0\n }\n\n return unstyled(String(value)).length\n })\n\n return {\n name: key,\n width: Math.max(...columnWidths, headerWidth),\n color,\n }\n })\n const headings = Object.entries(columnsConfiguration).reduce(\n (headings, [column, {header}]) => ({...headings, [column]: header || column}),\n {},\n )\n\n return (\n <Box flexDirection=\"column\">\n <Row rowKey=\"heading\" fillerChar=\" \" columns={columns} data={headings} ignoreColumnColor />\n <Row rowKey=\"separator\" fillerChar=\"─\" columns={columns} data={{}} ignoreColumnColor />\n {rows.map((row, index) => {\n const key = `row-${index}`\n\n return (\n <Box flexDirection=\"column\" key={key}>\n <Row rowKey={`data-${key}`} fillerChar=\" \" columns={columns} data={row} />\n </Box>\n )\n })}\n </Box>\n )\n}\n\nexport {Table}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Table.test.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Table/Table.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAc,MAAM,YAAY,CAAA;AAE7C,OAAO,EAAC,MAAM,EAAC,MAAM,wBAAwB,CAAA;AAC7C,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAC,MAAM,QAAQ,CAAA;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;IAC3B,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAiB;YACzB,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC;YAC3C,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAC;YACvC,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAC;YACnD;gBACE,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,0BAA0B;gBAChC,IAAI,EAAE,eAAe;aACtB;SACF,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,CAAA;QACpB,MAAM,OAAO,GAA2D;YACtE,IAAI,EAAE,EAAE;YACR,IAAI,EAAE;gBACJ,KAAK;aACN;YACD,EAAE,EAAE;gBACF,KAAK;gBACL,MAAM,EAAE,YAAY;aACrB;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAI,CAAC,CAAA;QAEtE,MAAM,QAAQ,GAAG,OAAO,CAAA;QACxB,MAAM,IAAI,GAAG,OAAO,CAAA;QAEpB,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;kCAG3B,IAAI,gBAAgB,QAAQ,KAAK,IAAI,aAAa,QAAQ;kCAC1D,IAAI,gBAAgB,QAAQ,KAAK,IAAI,aAAa,QAAQ;kCAC1D,IAAI,gBAAgB,QAAQ,KAAK,IAAI,aAAa,QAAQ;kCAC1D,IAAI,gBAAgB,QAAQ,KAAK,IAAI,aAAa,QAAQ;KACvF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import {Table, TableColumn} from './Table.js'\nimport ScalarDict from './ScalarDict.js'\nimport {render} from '../../../testing/ui.js'\nimport {describe, expect, test} from 'vitest'\nimport React from 'react'\n\ndescribe('Table', async () => {\n test('formats the table correctly', async () => {\n const rows: ScalarDict[] = [\n {id: '#1361', name: 'Dawn', role: '[live]'},\n {id: '#1363', name: 'Studio', role: ''},\n {id: '#1374', name: 'Debut', role: '[unpublished]'},\n {\n id: '#1368',\n name: 'Development (1a23b4-MBP)',\n role: '[development]',\n },\n ]\n const color = 'grey'\n const columns: TableColumn<{[key in 'name' | 'role' | 'id']: string}> = {\n name: {},\n role: {\n color,\n },\n id: {\n color,\n header: 'Identifier',\n },\n }\n\n const renderInstance = render(<Table rows={rows} columns={columns} />)\n\n const standard = '\u001b[39m'\n const grey = '\u001b[90m'\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"name role Identifier\n ──────────────────────── ───────────── ──────────\n Dawn ${grey}[live] ${standard} ${grey}#1361 ${standard}\n Studio ${grey} ${standard} ${grey}#1363 ${standard}\n Debut ${grey}[unpublished]${standard} ${grey}#1374 ${standard}\n Development (1a23b4-MBP) ${grey}[development]${standard} ${grey}#1368 ${standard}\"\n `)\n })\n})\n"]}
1
+ {"version":3,"file":"Table.test.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Table/Table.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAc,MAAM,YAAY,CAAA;AAE7C,OAAO,EAAC,MAAM,EAAC,MAAM,wBAAwB,CAAA;AAC7C,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAC,MAAM,QAAQ,CAAA;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;IAC3B,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAiB;YACzB,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC;YAC3C,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAC;YACvC,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAC;YACnD;gBACE,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,0BAA0B;gBAChC,IAAI,EAAE,eAAe;aACtB;SACF,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,CAAA;QACpB,MAAM,OAAO,GAAwD;YACnE,IAAI,EAAE,EAAE;YACR,IAAI,EAAE;gBACJ,KAAK;aACN;YACD,EAAE,EAAE;gBACF,KAAK;gBACL,MAAM,EAAE,YAAY;aACrB;SACF,CAAA;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAI,CAAC,CAAA;QAEtE,MAAM,QAAQ,GAAG,OAAO,CAAA;QACxB,MAAM,IAAI,GAAG,OAAO,CAAA;QAEpB,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;kCAG3B,IAAI,gBAAgB,QAAQ,KAAK,IAAI,aAAa,QAAQ;kCAC1D,IAAI,gBAAgB,QAAQ,KAAK,IAAI,aAAa,QAAQ;kCAC1D,IAAI,gBAAgB,QAAQ,KAAK,IAAI,aAAa,QAAQ;kCAC1D,IAAI,gBAAgB,QAAQ,KAAK,IAAI,aAAa,QAAQ;KACvF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import {Table, TableColumn} from './Table.js'\nimport ScalarDict from './ScalarDict.js'\nimport {render} from '../../../testing/ui.js'\nimport {describe, expect, test} from 'vitest'\nimport React from 'react'\n\ndescribe('Table', async () => {\n test('formats the table correctly', async () => {\n const rows: ScalarDict[] = [\n {id: '#1361', name: 'Dawn', role: '[live]'},\n {id: '#1363', name: 'Studio', role: ''},\n {id: '#1374', name: 'Debut', role: '[unpublished]'},\n {\n id: '#1368',\n name: 'Development (1a23b4-MBP)',\n role: '[development]',\n },\n ]\n const color = 'grey'\n const columns: TableColumn<Record<'name' | 'role' | 'id', string>> = {\n name: {},\n role: {\n color,\n },\n id: {\n color,\n header: 'Identifier',\n },\n }\n\n const renderInstance = render(<Table rows={rows} columns={columns} />)\n\n const standard = '\u001b[39m'\n const grey = '\u001b[90m'\n\n expect(renderInstance.lastFrame()).toMatchInlineSnapshot(`\n \"name role Identifier\n ──────────────────────── ───────────── ──────────\n Dawn ${grey}[live] ${standard} ${grey}#1361 ${standard}\n Studio ${grey} ${standard} ${grey}#1363 ${standard}\n Debut ${grey}[unpublished]${standard} ${grey}#1374 ${standard}\n Development (1a23b4-MBP) ${grey}[development]${standard} ${grey}#1368 ${standard}\"\n `)\n })\n})\n"]}
@@ -35,9 +35,7 @@ async function runTask(task, ctx) {
35
35
  }
36
36
  }
37
37
  const noop = () => { };
38
- // eslint-disable-next-line react/function-component-definition
39
38
  function Tasks({ tasks, silent = isUnitTest(), onComplete = noop, abortSignal, noColor, noProgressBar = false, }) {
40
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
41
39
  const [currentTask, setCurrentTask] = useState(tasks[0]);
42
40
  const [state, setState] = useState(TasksState.Loading);
43
41
  const ctx = useRef({});
@@ -1 +1 @@
1
- {"version":3,"file":"Tasks.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/Tasks.tsx"],"names":[],"mappings":"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","sourcesContent":["import {LoadingBar} from './LoadingBar.js'\nimport useAsyncAndUnmount from '../hooks/use-async-and-unmount.js'\nimport {isUnitTest} from '../../../../public/node/context/local.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport useAbortSignal from '../hooks/use-abort-signal.js'\nimport {useExitOnCtrlC} from '../hooks/use-exit-on-ctrl-c.js'\nimport {TokenizedString} from '../../../../public/node/output.js'\nimport React, {useRef, useState} from 'react'\n\nexport interface Task<TContext = unknown> {\n title: string | TokenizedString\n // eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n task: (ctx: TContext, task: Task<TContext>) => Promise<void | Task<TContext>[]>\n retry?: number\n retryCount?: number\n errors?: Error[]\n skip?: (ctx: TContext) => boolean\n}\n\ninterface TasksProps<TContext> {\n tasks: Task<TContext>[]\n silent?: boolean\n onComplete?: (ctx: TContext) => void\n abortSignal?: AbortSignal\n noColor?: boolean\n noProgressBar?: boolean\n}\n\nenum TasksState {\n Loading = 'loading',\n Success = 'success',\n Failure = 'failure',\n}\n\nasync function runTask<TContext>(task: Task<TContext>, ctx: TContext) {\n task.retryCount = 0\n task.errors = []\n const retry = task.retry && task.retry > 0 ? task.retry + 1 : 1\n\n for (let retries = 1; retries <= retry; retries++) {\n try {\n if (task.skip?.(ctx)) {\n return\n }\n // eslint-disable-next-line no-await-in-loop\n return await task.task(ctx, task)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (retries === retry) {\n throw error\n } else {\n task.errors.push(error)\n task.retryCount = retries\n }\n }\n }\n}\n\nconst noop = () => {}\n\n// eslint-disable-next-line react/function-component-definition\nfunction Tasks<TContext>({\n tasks,\n silent = isUnitTest(),\n onComplete = noop,\n abortSignal,\n noColor,\n noProgressBar = false,\n}: React.PropsWithChildren<TasksProps<TContext>>) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [currentTask, setCurrentTask] = useState<Task<TContext>>(tasks[0]!)\n const [state, setState] = useState<TasksState>(TasksState.Loading)\n const ctx = useRef<TContext>({} as TContext)\n\n const runTasks = async () => {\n for (const task of tasks) {\n setCurrentTask(task)\n\n // eslint-disable-next-line no-await-in-loop\n const subTasks = await runTask(task, ctx.current)\n\n // subtasks\n if (Array.isArray(subTasks) && subTasks.length > 0 && subTasks.every((task) => 'task' in task)) {\n for (const subTask of subTasks) {\n setCurrentTask(subTask)\n // eslint-disable-next-line no-await-in-loop\n await runTask(subTask, ctx.current)\n }\n }\n }\n }\n\n useAsyncAndUnmount(runTasks, {\n onFulfilled: () => {\n setState(TasksState.Success)\n onComplete(ctx.current)\n },\n onRejected: () => {\n setState(TasksState.Failure)\n },\n })\n\n useExitOnCtrlC()\n\n const {isAborted} = useAbortSignal(abortSignal)\n\n if (silent) {\n return null\n }\n\n const title = typeof currentTask.title === 'string' ? currentTask.title : currentTask.title.value\n\n return state === TasksState.Loading && !isAborted ? (\n <LoadingBar title={title} noColor={noColor} noProgressBar={noProgressBar} />\n ) : null\n}\n\nexport {Tasks}\n"]}
1
+ {"version":3,"file":"Tasks.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/Tasks.tsx"],"names":[],"mappings":"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","sourcesContent":["import {LoadingBar} from './LoadingBar.js'\nimport useAsyncAndUnmount from '../hooks/use-async-and-unmount.js'\nimport {isUnitTest} from '../../../../public/node/context/local.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport useAbortSignal from '../hooks/use-abort-signal.js'\nimport {useExitOnCtrlC} from '../hooks/use-exit-on-ctrl-c.js'\nimport {TokenizedString} from '../../../../public/node/output.js'\n\nimport React, {useRef, useState} from 'react'\n\nexport interface Task<TContext = unknown> {\n title: string | TokenizedString\n\n task: (ctx: TContext, task: Task<TContext>) => Promise<void | Task<TContext>[]>\n retry?: number\n retryCount?: number\n errors?: Error[]\n skip?: (ctx: TContext) => boolean\n}\n\ninterface TasksProps<TContext> {\n tasks: Task<TContext>[]\n silent?: boolean\n onComplete?: (ctx: TContext) => void\n abortSignal?: AbortSignal\n noColor?: boolean\n noProgressBar?: boolean\n}\n\nenum TasksState {\n Loading = 'loading',\n Success = 'success',\n Failure = 'failure',\n}\n\nasync function runTask<TContext>(task: Task<TContext>, ctx: TContext) {\n task.retryCount = 0\n task.errors = []\n const retry = task.retry && task.retry > 0 ? task.retry + 1 : 1\n\n for (let retries = 1; retries <= retry; retries++) {\n try {\n if (task.skip?.(ctx)) {\n return\n }\n // eslint-disable-next-line no-await-in-loop\n return await task.task(ctx, task)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (retries === retry) {\n throw error\n } else {\n task.errors.push(error)\n task.retryCount = retries\n }\n }\n }\n}\n\nconst noop = () => {}\n\nfunction Tasks<TContext>({\n tasks,\n silent = isUnitTest(),\n onComplete = noop,\n abortSignal,\n noColor,\n noProgressBar = false,\n}: React.PropsWithChildren<TasksProps<TContext>>) {\n const [currentTask, setCurrentTask] = useState<Task<TContext>>(tasks[0]!)\n const [state, setState] = useState<TasksState>(TasksState.Loading)\n const ctx = useRef<TContext>({} as TContext)\n\n const runTasks = async () => {\n for (const task of tasks) {\n setCurrentTask(task)\n\n // eslint-disable-next-line no-await-in-loop\n const subTasks = await runTask(task, ctx.current)\n\n // subtasks\n if (Array.isArray(subTasks) && subTasks.length > 0 && subTasks.every((task) => 'task' in task)) {\n for (const subTask of subTasks) {\n setCurrentTask(subTask)\n // eslint-disable-next-line no-await-in-loop\n await runTask(subTask, ctx.current)\n }\n }\n }\n }\n\n useAsyncAndUnmount(runTasks, {\n onFulfilled: () => {\n setState(TasksState.Success)\n onComplete(ctx.current)\n },\n onRejected: () => {\n setState(TasksState.Failure)\n },\n })\n\n useExitOnCtrlC()\n\n const {isAborted} = useAbortSignal(abortSignal)\n\n if (silent) {\n return null\n }\n\n const title = typeof currentTask.title === 'string' ? currentTask.title : currentTask.title.value\n\n return state === TasksState.Loading && !isAborted ? (\n <LoadingBar title={title} noColor={noColor} noProgressBar={noProgressBar} />\n ) : null\n}\n\nexport {Tasks}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Tasks } from './Tasks.js';
2
- import { getLastFrameAfterUnmount, render } from '../../testing/ui.js';
3
- import { unstyled, TokenizedString } from '../../../../public/node/output.js';
2
+ import { render } from '../../testing/ui.js';
3
+ import { TokenizedString } from '../../../../public/node/output.js';
4
4
  import { AbortController } from '../../../../public/node/abort.js';
5
5
  import { Stdout } from '../../ui.js';
6
6
  import React from 'react';
@@ -38,8 +38,6 @@ describe('Tasks', () => {
38
38
  // When
39
39
  const renderInstance = render(React.createElement(Tasks, { tasks: [firstTask, secondTask], silent: false }));
40
40
  await renderInstance.waitUntilExit();
41
- // Then
42
- expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot('""');
43
41
  });
44
42
  test('stops at the task that throws error', async () => {
45
43
  // Given
@@ -320,7 +318,6 @@ describe('Tasks', () => {
320
318
  // wait for the onAbort promise to resolve
321
319
  await new Promise((resolve) => setTimeout(resolve, 0));
322
320
  // Then
323
- expect(unstyled(getLastFrameAfterUnmount(renderInstance))).toEqual('');
324
321
  await expect(promise).resolves.toEqual(undefined);
325
322
  });
326
323
  test('supports TokenizedString as title', async () => {
@@ -339,7 +336,6 @@ describe('Tasks', () => {
339
336
  const renderInstance = render(React.createElement(Tasks, { tasks: [firstTask, secondTask], silent: false }));
340
337
  await renderInstance.waitUntilExit();
341
338
  // Then
342
- expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot('""');
343
339
  expect(firstTaskFunction).toHaveBeenCalled();
344
340
  expect(secondTaskFunction).toHaveBeenCalled();
345
341
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Tasks.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/Tasks.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Task, Tasks} from './Tasks.js'\nimport {getLastFrameAfterUnmount, render} from '../../testing/ui.js'\nimport {unstyled, TokenizedString} from '../../../../public/node/output.js'\nimport {AbortController} from '../../../../public/node/abort.js'\nimport {Stdout} from '../../ui.js'\nimport React from 'react'\nimport {beforeEach, describe, expect, test, vi} from 'vitest'\nimport {useStdout} from 'ink'\n\nvi.mock('ink', async () => {\n const original: any = await vi.importActual('ink')\n return {\n ...original,\n useStdout: vi.fn(),\n }\n})\n\nbeforeEach(() => {\n vi.mocked(useStdout).mockReturnValue({\n stdout: new Stdout({\n columns: 80,\n rows: 80,\n }) as any,\n write: () => {},\n })\n})\n\ndescribe('Tasks', () => {\n test('shows nothing at the end in case of success', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {})\n const secondTaskFunction = vi.fn(async () => {})\n\n const firstTask = {\n title: 'task 1',\n task: firstTaskFunction,\n }\n\n const secondTask = {\n title: 'task 2',\n task: secondTaskFunction,\n }\n // When\n\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot('\"\"')\n })\n\n test('stops at the task that throws error', async () => {\n // Given\n const abortController = new AbortController()\n const secondTaskFunction = vi.fn(async () => {})\n\n const firstTask: Task = {\n title: 'task 1',\n task: async () => {\n throw new Error('something went wrong')\n },\n }\n\n const secondTask = {\n title: 'task 2',\n task: secondTaskFunction,\n }\n\n // When\n const renderInstance = render(\n <Tasks tasks={[firstTask, secondTask]} silent={false} abortSignal={abortController.signal} />,\n )\n\n // Then\n await expect(renderInstance.waitUntilExit()).rejects.toThrowError('something went wrong')\n expect(secondTaskFunction).toHaveBeenCalledTimes(0)\n })\n\n test('it supports subtasks', async () => {\n // Given\n const firstSubtaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const secondSubtaskFunction = vi.fn(async () => {})\n\n const firstTask = {\n title: 'task 1',\n task: async () => {\n return [\n {\n title: 'subtask 1',\n task: firstSubtaskFunction,\n },\n {\n title: 'subtask 2',\n task: secondSubtaskFunction,\n },\n ]\n },\n }\n\n const secondTask = {\n title: 'task 2',\n task: async () => {},\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstSubtaskFunction).toHaveBeenCalled()\n expect(secondSubtaskFunction).toHaveBeenCalled()\n })\n\n test('supports skipping', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const secondTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const firstTask = {\n title: 'task 1',\n task: firstTaskFunction,\n skip: () => true,\n }\n\n const secondTask = {\n title: 'task 2',\n task: secondTaskFunction,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstTaskFunction).toHaveBeenCalledTimes(0)\n expect(secondTaskFunction).toHaveBeenCalled()\n })\n\n test('supports skipping a subtask', async () => {\n // Given\n const firstSubTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const secondSubTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const firstTask = {\n title: 'task 1',\n task: async () => {\n return [\n {\n title: 'subtask 1',\n task: firstSubTaskFunction,\n skip: () => true,\n },\n {\n title: 'subtask 2',\n task: secondSubTaskFunction,\n },\n ]\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstSubTaskFunction).toHaveBeenCalledTimes(0)\n expect(secondSubTaskFunction).toHaveBeenCalled()\n })\n\n test('supports retrying', async () => {\n // Given\n const firstTaskFunction = vi.fn(async (_ctx, task) => {\n if (task.retryCount < task.retry) {\n throw new Error(`something went wrong${task.retryCount}`)\n }\n })\n\n const firstTask: Task = {\n title: 'task 1',\n task: firstTaskFunction,\n retry: 3,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstTask.retryCount).toBe(3)\n expect(firstTask.errors).toEqual([\n Error('something went wrong0'),\n Error('something went wrong1'),\n Error('something went wrong2'),\n ])\n })\n\n test('supports retrying up to a limit', async () => {\n // Given\n const firstTaskFunction = vi.fn(async (_ctx, task) => {\n if (task.retryCount <= task.retry) {\n throw new Error(`something went wrong${task.retryCount}`)\n }\n })\n\n const secondTaskFunction = vi.fn(async () => {})\n\n const firstTask: Task = {\n title: 'task 1',\n task: firstTaskFunction,\n retry: 3,\n }\n\n const secondTask: Task = {\n title: 'task 2',\n task: secondTaskFunction,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n\n // Then\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('something went wrong3')\n expect(firstTask.retryCount).toBe(3)\n expect(firstTask.errors).toEqual([\n Error('something went wrong0'),\n Error('something went wrong1'),\n Error('something went wrong2'),\n ])\n expect(secondTaskFunction).toHaveBeenCalledTimes(0)\n })\n\n test('supports retrying a subtask', async () => {\n // Given\n const firstSubTaskFunction = vi.fn(async (_ctx, task) => {\n if (task.retryCount < task.retry) {\n throw new Error(`something went wrong${task.retryCount}`)\n }\n })\n\n const firstSubTask: Task = {\n title: 'subtask 1',\n task: firstSubTaskFunction,\n retry: 3,\n }\n\n const firstTask: Task = {\n title: 'task 1',\n task: async () => {\n return [firstSubTask]\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstSubTask.retryCount).toBe(3)\n expect(firstSubTask.errors).toEqual([\n Error('something went wrong0'),\n Error('something went wrong1'),\n Error('something went wrong2'),\n ])\n })\n\n test('supports retrying a subtask up to a limit', async () => {\n // Given\n const firstSubTaskFunction = vi.fn(async (_ctx, task) => {\n if (task.retryCount <= task.retry) {\n throw new Error(`something went wrong${task.retryCount}`)\n }\n })\n\n const secondSubTaskFunction = vi.fn(async () => {})\n\n const firstSubTask: Task = {\n title: 'subtask 1',\n task: firstSubTaskFunction,\n retry: 3,\n }\n\n const secondSubTask: Task = {\n title: 'subtask 2',\n task: secondSubTaskFunction,\n }\n\n const firstTask: Task = {\n title: 'task 1',\n task: async () => {\n return [firstSubTask, secondSubTask]\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} />)\n\n // Then\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('something went wrong3')\n expect(firstSubTask.retryCount).toBe(3)\n expect(firstSubTask.errors).toEqual([\n Error('something went wrong0'),\n Error('something went wrong1'),\n Error('something went wrong2'),\n ])\n expect(secondSubTaskFunction).toHaveBeenCalledTimes(0)\n })\n\n test('has a context', async () => {\n // Given\n const firstTaskFunction = vi.fn(async (ctx) => {\n ctx.foo = 'bar'\n })\n\n const firstTask: Task<{foo: string}> = {\n title: 'task 1',\n task: firstTaskFunction,\n }\n\n const secondTask: Task<{foo: string}> = {\n title: 'task 2',\n task: async (ctx) => {\n if (ctx.foo === 'bar') {\n throw new Error('context is shared')\n }\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n\n // Then\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('context is shared')\n })\n\n test('has an onComplete function that is called with the context', async () => {\n // Given\n const taskFunction = vi.fn(async (ctx) => {\n ctx.foo = 'bar'\n })\n\n const task: Task<{foo: string}> = {\n title: 'task 1',\n task: taskFunction,\n }\n\n // When\n const context = await new Promise((resolve, _reject) => {\n render(<Tasks tasks={[task]} silent={false} onComplete={resolve} />)\n })\n\n // Then\n expect(context).toEqual({foo: 'bar'})\n })\n\n test('abortController can be used to exit from outside', async () => {\n // Given\n const abortController = new AbortController()\n\n const firstTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 10000))\n })\n\n const firstTask = {\n title: 'task 1',\n task: firstTaskFunction,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} abortSignal={abortController.signal} />)\n await taskHasRendered()\n const promise = renderInstance.waitUntilExit()\n\n abortController.abort()\n\n // wait for the onAbort promise to resolve\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n // Then\n expect(unstyled(getLastFrameAfterUnmount(renderInstance)!)).toEqual('')\n await expect(promise).resolves.toEqual(undefined)\n })\n\n test('supports TokenizedString as title', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {})\n const secondTaskFunction = vi.fn(async () => {})\n\n const firstTask: Task = {\n title: new TokenizedString('tokenized task 1'),\n task: firstTaskFunction,\n }\n\n const secondTask: Task = {\n title: 'string task 2',\n task: secondTaskFunction,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(getLastFrameAfterUnmount(renderInstance)).toMatchInlineSnapshot('\"\"')\n expect(firstTaskFunction).toHaveBeenCalled()\n expect(secondTaskFunction).toHaveBeenCalled()\n })\n})\n\nasync function taskHasRendered() {\n await new Promise((resolve) => setTimeout(resolve, 100))\n}\n"]}
1
+ {"version":3,"file":"Tasks.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/Tasks.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,EAAC,MAAM,YAAY,CAAA;AACtC,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAC,eAAe,EAAC,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAC,eAAe,EAAC,MAAM,kCAAkC,CAAA;AAChE,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAC,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAC,SAAS,EAAC,MAAM,KAAK,CAAA;AAE7B,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;IACxB,MAAM,QAAQ,GAAQ,MAAM,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAClD,OAAO;QACL,GAAG,QAAQ;QACX,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;KACnB,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC;QACnC,MAAM,EAAE,IAAI,MAAM,CAAC;YACjB,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,EAAE;SACT,CAAQ;QACT,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;KAChB,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,QAAQ;QACR,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;QAC/C,MAAM,kBAAkB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;QAEhD,MAAM,SAAS,GAAG;YAChB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,iBAAiB;SACxB,CAAA;QAED,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,kBAAkB;SACzB,CAAA;QACD,OAAO;QAEP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QACvF,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACrD,QAAQ;QACR,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAC7C,MAAM,kBAAkB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;QAEhD,MAAM,SAAS,GAAS;YACtB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;YACzC,CAAC;SACF,CAAA;QAED,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,kBAAkB;SACzB,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAC3B,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,MAAM,GAAI,CAC9F,CAAA;QAED,OAAO;QACP,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAA;QACzF,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACtC,QAAQ;QACR,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAC5C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,MAAM,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;QAEnD,MAAM,SAAS,GAAG;YAChB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,OAAO;oBACL;wBACE,KAAK,EAAE,WAAW;wBAClB,IAAI,EAAE,oBAAoB;qBAC3B;oBACD;wBACE,KAAK,EAAE,WAAW;wBAClB,IAAI,EAAE,qBAAqB;qBAC5B;iBACF,CAAA;YACH,CAAC;SACF,CAAA;QAED,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;SACrB,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QACvF,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,OAAO;QACP,MAAM,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,EAAE,CAAA;QAC/C,MAAM,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACnC,QAAQ;QACR,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YACzC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,MAAM,kBAAkB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAC1C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG;YAChB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;SACjB,CAAA;QAED,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,kBAAkB;SACzB,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QACvF,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,OAAO;QACP,MAAM,CAAC,iBAAiB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAClD,MAAM,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC7C,QAAQ;QACR,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAC5C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,MAAM,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAC7C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG;YAChB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,OAAO;oBACL;wBACE,KAAK,EAAE,WAAW;wBAClB,IAAI,EAAE,oBAAoB;wBAC1B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;qBACjB;oBACD;wBACE,KAAK,EAAE,WAAW;wBAClB,IAAI,EAAE,qBAAqB;qBAC5B;iBACF,CAAA;YACH,CAAC;SACF,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QAC3E,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,OAAO;QACP,MAAM,CAAC,oBAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACnC,QAAQ;QACR,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACnD,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAS;YACtB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,CAAC;SACT,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QAC3E,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,OAAO;QACP,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACpC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAC/B,KAAK,CAAC,uBAAuB,CAAC;YAC9B,KAAK,CAAC,uBAAuB,CAAC;YAC9B,KAAK,CAAC,uBAAuB,CAAC;SAC/B,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACjD,QAAQ;QACR,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACnD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,kBAAkB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;QAEhD,MAAM,SAAS,GAAS;YACtB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,CAAC;SACT,CAAA;QAED,MAAM,UAAU,GAAS;YACvB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,kBAAkB;SACzB,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QAEvF,OAAO;QACP,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAA;QACrF,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACpC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAC/B,KAAK,CAAC,uBAAuB,CAAC;YAC9B,KAAK,CAAC,uBAAuB,CAAC;YAC9B,KAAK,CAAC,uBAAuB,CAAC;SAC/B,CAAC,CAAA;QACF,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC7C,QAAQ;QACR,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACtD,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAS;YACzB,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,CAAC;SACT,CAAA;QAED,MAAM,SAAS,GAAS;YACtB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,OAAO,CAAC,YAAY,CAAC,CAAA;YACvB,CAAC;SACF,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QAC3E,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,OAAO;QACP,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACvC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAClC,KAAK,CAAC,uBAAuB,CAAC;YAC9B,KAAK,CAAC,uBAAuB,CAAC;YAC9B,KAAK,CAAC,uBAAuB,CAAC;SAC/B,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,QAAQ;QACR,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACtD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;QAEnD,MAAM,YAAY,GAAS;YACzB,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,CAAC;SACT,CAAA;QAED,MAAM,aAAa,GAAS;YAC1B,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,qBAAqB;SAC5B,CAAA;QAED,MAAM,SAAS,GAAS;YACtB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;YACtC,CAAC;SACF,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QAE3E,OAAO;QACP,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAA;QACrF,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACvC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAClC,KAAK,CAAC,uBAAuB,CAAC;YAC9B,KAAK,CAAC,uBAAuB,CAAC;YAC9B,KAAK,CAAC,uBAAuB,CAAC;SAC/B,CAAC,CAAA;QACF,MAAM,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QAC/B,QAAQ;QACR,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5C,GAAG,CAAC,GAAG,GAAG,KAAK,CAAA;QACjB,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAwB;YACrC,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,iBAAiB;SACxB,CAAA;QAED,MAAM,UAAU,GAAwB;YACtC,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAClB,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;gBACtC,CAAC;YACH,CAAC;SACF,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QAEvF,OAAO;QACP,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC5E,QAAQ;QACR,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACvC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAA;QACjB,CAAC,CAAC,CAAA;QAEF,MAAM,IAAI,GAAwB;YAChC,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,YAAY;SACnB,CAAA;QAED,OAAO;QACP,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YACrD,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,GAAI,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,OAAO;QACP,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAC,GAAG,EAAE,KAAK,EAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAClE,QAAQ;QACR,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAE7C,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YACzC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG;YAChB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,iBAAiB;SACxB,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,MAAM,GAAI,CAAC,CAAA;QAChH,MAAM,eAAe,EAAE,CAAA;QACvB,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,EAAE,CAAA;QAE9C,eAAe,CAAC,KAAK,EAAE,CAAA;QAEvB,0CAA0C;QAC1C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAEtD,OAAO;QACP,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACnD,QAAQ;QACR,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;QAC/C,MAAM,kBAAkB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;QAEhD,MAAM,SAAS,GAAS;YACtB,KAAK,EAAE,IAAI,eAAe,CAAC,kBAAkB,CAAC;YAC9C,IAAI,EAAE,iBAAiB;SACxB,CAAA;QAED,MAAM,UAAU,GAAS;YACvB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,kBAAkB;SACzB,CAAA;QAED,OAAO;QACP,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,GAAI,CAAC,CAAA;QACvF,MAAM,cAAc,CAAC,aAAa,EAAE,CAAA;QAEpC,OAAO;QACP,MAAM,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAA;QAC5C,MAAM,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,KAAK,UAAU,eAAe;IAC5B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAC1D,CAAC","sourcesContent":["import {Task, Tasks} from './Tasks.js'\nimport {render} from '../../testing/ui.js'\nimport {TokenizedString} from '../../../../public/node/output.js'\nimport {AbortController} from '../../../../public/node/abort.js'\nimport {Stdout} from '../../ui.js'\nimport React from 'react'\n\nimport {beforeEach, describe, expect, test, vi} from 'vitest'\nimport {useStdout} from 'ink'\n\nvi.mock('ink', async () => {\n const original: any = await vi.importActual('ink')\n return {\n ...original,\n useStdout: vi.fn(),\n }\n})\n\nbeforeEach(() => {\n vi.mocked(useStdout).mockReturnValue({\n stdout: new Stdout({\n columns: 80,\n rows: 80,\n }) as any,\n write: () => {},\n })\n})\n\ndescribe('Tasks', () => {\n test('shows nothing at the end in case of success', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {})\n const secondTaskFunction = vi.fn(async () => {})\n\n const firstTask = {\n title: 'task 1',\n task: firstTaskFunction,\n }\n\n const secondTask = {\n title: 'task 2',\n task: secondTaskFunction,\n }\n // When\n\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n })\n\n test('stops at the task that throws error', async () => {\n // Given\n const abortController = new AbortController()\n const secondTaskFunction = vi.fn(async () => {})\n\n const firstTask: Task = {\n title: 'task 1',\n task: async () => {\n throw new Error('something went wrong')\n },\n }\n\n const secondTask = {\n title: 'task 2',\n task: secondTaskFunction,\n }\n\n // When\n const renderInstance = render(\n <Tasks tasks={[firstTask, secondTask]} silent={false} abortSignal={abortController.signal} />,\n )\n\n // Then\n await expect(renderInstance.waitUntilExit()).rejects.toThrowError('something went wrong')\n expect(secondTaskFunction).toHaveBeenCalledTimes(0)\n })\n\n test('it supports subtasks', async () => {\n // Given\n const firstSubtaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const secondSubtaskFunction = vi.fn(async () => {})\n\n const firstTask = {\n title: 'task 1',\n task: async () => {\n return [\n {\n title: 'subtask 1',\n task: firstSubtaskFunction,\n },\n {\n title: 'subtask 2',\n task: secondSubtaskFunction,\n },\n ]\n },\n }\n\n const secondTask = {\n title: 'task 2',\n task: async () => {},\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstSubtaskFunction).toHaveBeenCalled()\n expect(secondSubtaskFunction).toHaveBeenCalled()\n })\n\n test('supports skipping', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const secondTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const firstTask = {\n title: 'task 1',\n task: firstTaskFunction,\n skip: () => true,\n }\n\n const secondTask = {\n title: 'task 2',\n task: secondTaskFunction,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstTaskFunction).toHaveBeenCalledTimes(0)\n expect(secondTaskFunction).toHaveBeenCalled()\n })\n\n test('supports skipping a subtask', async () => {\n // Given\n const firstSubTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const secondSubTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 100))\n })\n\n const firstTask = {\n title: 'task 1',\n task: async () => {\n return [\n {\n title: 'subtask 1',\n task: firstSubTaskFunction,\n skip: () => true,\n },\n {\n title: 'subtask 2',\n task: secondSubTaskFunction,\n },\n ]\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstSubTaskFunction).toHaveBeenCalledTimes(0)\n expect(secondSubTaskFunction).toHaveBeenCalled()\n })\n\n test('supports retrying', async () => {\n // Given\n const firstTaskFunction = vi.fn(async (_ctx, task) => {\n if (task.retryCount < task.retry) {\n throw new Error(`something went wrong${task.retryCount}`)\n }\n })\n\n const firstTask: Task = {\n title: 'task 1',\n task: firstTaskFunction,\n retry: 3,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstTask.retryCount).toBe(3)\n expect(firstTask.errors).toEqual([\n Error('something went wrong0'),\n Error('something went wrong1'),\n Error('something went wrong2'),\n ])\n })\n\n test('supports retrying up to a limit', async () => {\n // Given\n const firstTaskFunction = vi.fn(async (_ctx, task) => {\n if (task.retryCount <= task.retry) {\n throw new Error(`something went wrong${task.retryCount}`)\n }\n })\n\n const secondTaskFunction = vi.fn(async () => {})\n\n const firstTask: Task = {\n title: 'task 1',\n task: firstTaskFunction,\n retry: 3,\n }\n\n const secondTask: Task = {\n title: 'task 2',\n task: secondTaskFunction,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n\n // Then\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('something went wrong3')\n expect(firstTask.retryCount).toBe(3)\n expect(firstTask.errors).toEqual([\n Error('something went wrong0'),\n Error('something went wrong1'),\n Error('something went wrong2'),\n ])\n expect(secondTaskFunction).toHaveBeenCalledTimes(0)\n })\n\n test('supports retrying a subtask', async () => {\n // Given\n const firstSubTaskFunction = vi.fn(async (_ctx, task) => {\n if (task.retryCount < task.retry) {\n throw new Error(`something went wrong${task.retryCount}`)\n }\n })\n\n const firstSubTask: Task = {\n title: 'subtask 1',\n task: firstSubTaskFunction,\n retry: 3,\n }\n\n const firstTask: Task = {\n title: 'task 1',\n task: async () => {\n return [firstSubTask]\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstSubTask.retryCount).toBe(3)\n expect(firstSubTask.errors).toEqual([\n Error('something went wrong0'),\n Error('something went wrong1'),\n Error('something went wrong2'),\n ])\n })\n\n test('supports retrying a subtask up to a limit', async () => {\n // Given\n const firstSubTaskFunction = vi.fn(async (_ctx, task) => {\n if (task.retryCount <= task.retry) {\n throw new Error(`something went wrong${task.retryCount}`)\n }\n })\n\n const secondSubTaskFunction = vi.fn(async () => {})\n\n const firstSubTask: Task = {\n title: 'subtask 1',\n task: firstSubTaskFunction,\n retry: 3,\n }\n\n const secondSubTask: Task = {\n title: 'subtask 2',\n task: secondSubTaskFunction,\n }\n\n const firstTask: Task = {\n title: 'task 1',\n task: async () => {\n return [firstSubTask, secondSubTask]\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} />)\n\n // Then\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('something went wrong3')\n expect(firstSubTask.retryCount).toBe(3)\n expect(firstSubTask.errors).toEqual([\n Error('something went wrong0'),\n Error('something went wrong1'),\n Error('something went wrong2'),\n ])\n expect(secondSubTaskFunction).toHaveBeenCalledTimes(0)\n })\n\n test('has a context', async () => {\n // Given\n const firstTaskFunction = vi.fn(async (ctx) => {\n ctx.foo = 'bar'\n })\n\n const firstTask: Task<{foo: string}> = {\n title: 'task 1',\n task: firstTaskFunction,\n }\n\n const secondTask: Task<{foo: string}> = {\n title: 'task 2',\n task: async (ctx) => {\n if (ctx.foo === 'bar') {\n throw new Error('context is shared')\n }\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n\n // Then\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('context is shared')\n })\n\n test('has an onComplete function that is called with the context', async () => {\n // Given\n const taskFunction = vi.fn(async (ctx) => {\n ctx.foo = 'bar'\n })\n\n const task: Task<{foo: string}> = {\n title: 'task 1',\n task: taskFunction,\n }\n\n // When\n const context = await new Promise((resolve, _reject) => {\n render(<Tasks tasks={[task]} silent={false} onComplete={resolve} />)\n })\n\n // Then\n expect(context).toEqual({foo: 'bar'})\n })\n\n test('abortController can be used to exit from outside', async () => {\n // Given\n const abortController = new AbortController()\n\n const firstTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 10000))\n })\n\n const firstTask = {\n title: 'task 1',\n task: firstTaskFunction,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask]} silent={false} abortSignal={abortController.signal} />)\n await taskHasRendered()\n const promise = renderInstance.waitUntilExit()\n\n abortController.abort()\n\n // wait for the onAbort promise to resolve\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n // Then\n await expect(promise).resolves.toEqual(undefined)\n })\n\n test('supports TokenizedString as title', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {})\n const secondTaskFunction = vi.fn(async () => {})\n\n const firstTask: Task = {\n title: new TokenizedString('tokenized task 1'),\n task: firstTaskFunction,\n }\n\n const secondTask: Task = {\n title: 'string task 2',\n task: secondTaskFunction,\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n await renderInstance.waitUntilExit()\n\n // Then\n expect(firstTaskFunction).toHaveBeenCalled()\n expect(secondTaskFunction).toHaveBeenCalled()\n })\n})\n\nasync function taskHasRendered() {\n await new Promise((resolve) => setTimeout(resolve, 100))\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { TextAnimation } from './TextAnimation.js';
2
- import { render } from '../../testing/ui.js';
3
2
  import { Stdout } from '../../ui.js';
3
+ import { render } from '../../testing/ui.js';
4
4
  import React from 'react';
5
5
  import { beforeEach, describe, expect, test, vi } from 'vitest';
6
6
  import { useStdout } from 'ink';
@@ -1 +1 @@
1
- {"version":3,"file":"TextAnimation.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextAnimation.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {TextAnimation} from './TextAnimation.js'\nimport {render} from '../../testing/ui.js'\nimport {Stdout} from '../../ui.js'\nimport React from 'react'\nimport {beforeEach, describe, expect, test, vi} from 'vitest'\nimport {useStdout} from 'ink'\n\nvi.mock('ink', async () => {\n const original: any = await vi.importActual('ink')\n return {\n ...original,\n useStdout: vi.fn(),\n }\n})\n\ndescribe('TextAnimation', () => {\n let stdout: Stdout\n let onSpy: any\n let offSpy: any\n\n beforeEach(() => {\n stdout = new Stdout({\n columns: 80,\n rows: 80,\n })\n\n onSpy = vi.spyOn(stdout, 'on')\n offSpy = vi.spyOn(stdout, 'off')\n\n vi.mocked(useStdout).mockReturnValue({\n stdout: stdout as any,\n write: () => {},\n })\n })\n\n test('removes resize listener on unmount', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n expect(onSpy).toHaveBeenCalledWith('resize', expect.any(Function))\n expect(onSpy).toHaveBeenCalledTimes(1)\n\n const resizeHandler = onSpy.mock.calls[0]![1]\n\n renderInstance.unmount()\n\n expect(offSpy).toHaveBeenCalledWith('resize', resizeHandler)\n expect(offSpy).toHaveBeenCalledTimes(1)\n })\n\n test('renders animated text', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n expect(renderInstance.lastFrame()).toBeDefined()\n // The text is rendered with ANSI color codes, so we need to check for the content\n // without the color codes. The actual output contains the text but with color formatting.\n const frame = renderInstance.lastFrame() ?? ''\n expect(frame).toBeTruthy()\n expect(frame.length).toBeGreaterThan(0)\n\n renderInstance.unmount()\n })\n\n test('updates width when stdout resizes', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n expect(onSpy).toHaveBeenCalledWith('resize', expect.any(Function))\n const resizeHandler = onSpy.mock.calls[0]![1] as () => void\n\n stdout.columns = 120\n resizeHandler()\n\n await new Promise((resolve) => setTimeout(resolve, 50))\n\n renderInstance.unmount()\n })\n\n test('respects maxWidth prop when provided', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" maxWidth={20} />)\n\n expect(renderInstance.lastFrame()).toBeDefined()\n\n renderInstance.unmount()\n })\n\n test('cleans up animation timeout on unmount', async () => {\n vi.useFakeTimers()\n const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout')\n\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n vi.advanceTimersByTime(50)\n\n renderInstance.unmount()\n\n expect(clearTimeoutSpy).toHaveBeenCalled()\n\n vi.useRealTimers()\n })\n})\n"]}
1
+ {"version":3,"file":"TextAnimation.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextAnimation.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {TextAnimation} from './TextAnimation.js'\nimport {Stdout} from '../../ui.js'\nimport {render} from '../../testing/ui.js'\nimport React from 'react'\nimport {beforeEach, describe, expect, test, vi} from 'vitest'\nimport {useStdout} from 'ink'\n\nvi.mock('ink', async () => {\n const original: any = await vi.importActual('ink')\n return {\n ...original,\n useStdout: vi.fn(),\n }\n})\n\ndescribe('TextAnimation', () => {\n let stdout: Stdout\n let onSpy: any\n let offSpy: any\n\n beforeEach(() => {\n stdout = new Stdout({\n columns: 80,\n rows: 80,\n })\n\n onSpy = vi.spyOn(stdout, 'on')\n offSpy = vi.spyOn(stdout, 'off')\n\n vi.mocked(useStdout).mockReturnValue({\n stdout: stdout as any,\n write: () => {},\n })\n })\n\n test('removes resize listener on unmount', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n expect(onSpy).toHaveBeenCalledWith('resize', expect.any(Function))\n expect(onSpy).toHaveBeenCalledTimes(1)\n\n const resizeHandler = onSpy.mock.calls[0]![1]\n\n renderInstance.unmount()\n\n expect(offSpy).toHaveBeenCalledWith('resize', resizeHandler)\n expect(offSpy).toHaveBeenCalledTimes(1)\n })\n\n test('renders animated text', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n expect(renderInstance.lastFrame()).toBeDefined()\n // The text is rendered with ANSI color codes, so we need to check for the content\n // without the color codes. The actual output contains the text but with color formatting.\n const frame = renderInstance.lastFrame() ?? ''\n expect(frame).toBeTruthy()\n expect(frame.length).toBeGreaterThan(0)\n\n renderInstance.unmount()\n })\n\n test('updates width when stdout resizes', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n expect(onSpy).toHaveBeenCalledWith('resize', expect.any(Function))\n const resizeHandler = onSpy.mock.calls[0]![1] as () => void\n\n stdout.columns = 120\n resizeHandler()\n\n await new Promise((resolve) => setTimeout(resolve, 50))\n\n renderInstance.unmount()\n })\n\n test('respects maxWidth prop when provided', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" maxWidth={20} />)\n\n expect(renderInstance.lastFrame()).toBeDefined()\n\n renderInstance.unmount()\n })\n\n test('cleans up animation timeout on unmount', async () => {\n vi.useFakeTimers()\n const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout')\n\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n vi.advanceTimersByTime(50)\n\n renderInstance.unmount()\n\n expect(clearTimeoutSpy).toHaveBeenCalled()\n\n vi.useRealTimers()\n })\n})\n"]}