@shopify/cli-kit 3.73.2 → 3.74.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.
- package/dist/cli/api/graphql/admin/generated/get_theme.d.ts +1 -3
- package/dist/cli/api/graphql/admin/generated/get_theme_file_bodies.d.ts +1 -5
- package/dist/cli/api/graphql/admin/generated/get_theme_file_checksums.d.ts +1 -4
- package/dist/cli/api/graphql/admin/generated/get_themes.d.ts +1 -3
- package/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.d.ts +1 -3
- package/dist/cli/api/graphql/admin/generated/online_store_password_protection.d.ts +13 -0
- package/dist/cli/api/graphql/admin/generated/online_store_password_protection.js +37 -0
- package/dist/cli/api/graphql/admin/generated/online_store_password_protection.js.map +1 -0
- package/dist/cli/api/graphql/admin/generated/public_api_versions.d.ts +1 -3
- package/dist/cli/api/graphql/admin/generated/theme_delete.d.ts +1 -3
- package/dist/cli/api/graphql/admin/generated/theme_files_upsert.d.ts +1 -4
- package/dist/cli/api/graphql/admin/generated/theme_publish.d.ts +1 -3
- package/dist/cli/api/graphql/admin/generated/theme_update.d.ts +1 -4
- package/dist/private/node/analytics.js.map +1 -1
- package/dist/private/node/api/graphql.js.map +1 -1
- package/dist/private/node/api/headers.d.ts +2 -2
- package/dist/private/node/api/headers.js +1 -1
- package/dist/private/node/api/headers.js.map +1 -1
- package/dist/private/node/api/rest.js.map +1 -1
- package/dist/private/node/api/urls.js.map +1 -1
- package/dist/private/node/api.js.map +1 -1
- package/dist/private/node/conf-store.js.map +1 -1
- package/dist/private/node/constants.d.ts +0 -1
- package/dist/private/node/constants.js +0 -1
- package/dist/private/node/constants.js.map +1 -1
- package/dist/private/node/content-tokens.js.map +1 -1
- package/dist/private/node/context/deprecations-store.js.map +1 -1
- package/dist/private/node/context/service.d.ts +0 -1
- package/dist/private/node/context/service.js.map +1 -1
- package/dist/private/node/context/utilities.d.ts +0 -1
- package/dist/private/node/context/utilities.js.map +1 -1
- package/dist/private/node/otel-metrics.js.map +1 -1
- package/dist/private/node/request-ids.js.map +1 -1
- package/dist/private/node/session/device-authorization.js.map +1 -1
- package/dist/private/node/session/exchange.js +2 -3
- package/dist/private/node/session/exchange.js.map +1 -1
- package/dist/private/node/session/identity-token-validation.js.map +1 -1
- package/dist/private/node/session/identity.js.map +1 -1
- package/dist/private/node/session/scopes.d.ts +2 -3
- package/dist/private/node/session/scopes.js +7 -8
- package/dist/private/node/session/scopes.js.map +1 -1
- package/dist/private/node/session/store.js.map +1 -1
- package/dist/private/node/session/validate.js.map +1 -1
- package/dist/private/node/session.d.ts +0 -1
- package/dist/private/node/session.js +3 -74
- package/dist/private/node/session.js.map +1 -1
- package/dist/private/node/testing/ui.d.ts +0 -1
- package/dist/private/node/testing/ui.js.map +1 -1
- package/dist/private/node/themes/replace-invalid-characters.js +3 -3
- package/dist/private/node/themes/replace-invalid-characters.js.map +1 -1
- package/dist/private/node/ui/components/Alert.d.ts +2 -1
- package/dist/private/node/ui/components/Alert.js +2 -1
- package/dist/private/node/ui/components/Alert.js.map +1 -1
- package/dist/private/node/ui/components/AutocompletePrompt.js.map +1 -1
- package/dist/private/node/ui/components/Banner.js.map +1 -1
- package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
- package/dist/private/node/ui/components/DangerousConfirmationPrompt.js.map +1 -1
- package/dist/private/node/ui/components/FatalError.js +2 -1
- package/dist/private/node/ui/components/FatalError.js.map +1 -1
- package/dist/private/node/ui/components/Link.js.map +1 -1
- package/dist/private/node/ui/components/Prompts/PromptLayout.js.map +1 -1
- package/dist/private/node/ui/components/Scrollbar.js.map +1 -1
- package/dist/private/node/ui/components/SelectInput.js.map +1 -1
- package/dist/private/node/ui/components/SelectPrompt.js.map +1 -1
- package/dist/private/node/ui/components/Table/Row.d.ts +0 -1
- package/dist/private/node/ui/components/Table/Row.js.map +1 -1
- package/dist/private/node/ui/components/Table/Table.d.ts +0 -1
- package/dist/private/node/ui/components/Table/Table.js.map +1 -1
- package/dist/private/node/ui/components/TabularData.d.ts +8 -0
- package/dist/private/node/ui/components/TabularData.js +16 -0
- package/dist/private/node/ui/components/TabularData.js.map +1 -0
- package/dist/private/node/ui/components/Tasks.d.ts +1 -1
- package/dist/private/node/ui/components/Tasks.js.map +1 -1
- package/dist/private/node/ui/components/Tasks.test.js.map +1 -1
- package/dist/private/node/ui/components/TextInput.js.map +1 -1
- package/dist/private/node/ui/components/TextPrompt.js.map +1 -1
- package/dist/private/node/ui/components/TokenizedText.d.ts +12 -19
- package/dist/private/node/ui/components/TokenizedText.js.map +1 -1
- package/dist/private/node/ui/hooks/use-layout.d.ts +0 -1
- package/dist/private/node/ui/hooks/use-layout.js.map +1 -1
- package/dist/private/node/ui/hooks/use-prompt.d.ts +0 -1
- package/dist/private/node/ui/hooks/use-select-state.js.map +1 -1
- package/dist/private/node/ui/utilities.d.ts +15 -1
- package/dist/private/node/ui.d.ts +0 -2
- package/dist/private/node/ui.js.map +1 -1
- package/dist/public/common/retry.js.map +1 -1
- package/dist/public/common/string.js.map +1 -1
- package/dist/public/common/ts/json-narrowing.js.map +1 -1
- package/dist/public/common/url.js.map +1 -1
- package/dist/public/common/version.d.ts +1 -1
- package/dist/public/common/version.js +1 -1
- package/dist/public/common/version.js.map +1 -1
- package/dist/public/node/analytics.js.map +1 -1
- package/dist/public/node/api/admin.js.map +1 -1
- package/dist/public/node/api/app-management.js.map +1 -1
- package/dist/public/node/api/graphql.js.map +1 -1
- package/dist/public/node/api/partners.js.map +1 -1
- package/dist/public/node/api/rest-api-throttler.js.map +1 -1
- package/dist/public/node/archiver.js.map +1 -1
- package/dist/public/node/base-command.js.map +1 -1
- package/dist/public/node/cli-launcher.js.map +1 -1
- package/dist/public/node/cli.d.ts +0 -1
- package/dist/public/node/cli.js.map +1 -1
- package/dist/public/node/context/fqdn.js.map +1 -1
- package/dist/public/node/context/local.d.ts +4 -5
- package/dist/public/node/context/local.js +6 -5
- package/dist/public/node/context/local.js.map +1 -1
- package/dist/public/node/context/spin.d.ts +0 -1
- package/dist/public/node/context/spin.js.map +1 -1
- package/dist/public/node/context/utilities.js.map +1 -1
- package/dist/public/node/crypto.d.ts +0 -1
- package/dist/public/node/custom-oclif-loader.js.map +1 -1
- package/dist/public/node/dot-env.js.map +1 -1
- package/dist/public/node/environment.d.ts +0 -1
- package/dist/public/node/environment.js.map +1 -1
- package/dist/public/node/environments.js.map +1 -1
- package/dist/public/node/error-handler.js +1 -1
- package/dist/public/node/error-handler.js.map +1 -1
- package/dist/public/node/error.js.map +1 -1
- package/dist/public/node/framework.js.map +1 -1
- package/dist/public/node/fs.d.ts +20 -2
- package/dist/public/node/fs.js +24 -0
- package/dist/public/node/fs.js.map +1 -1
- package/dist/public/node/git.js.map +1 -1
- package/dist/public/node/github.js.map +1 -1
- package/dist/public/node/global-context.js.map +1 -1
- package/dist/public/node/hooks/deprecations.js.map +1 -1
- package/dist/public/node/hooks/postrun.js.map +1 -1
- package/dist/public/node/hooks/prerun.js.map +1 -1
- package/dist/public/node/http.js.map +1 -1
- package/dist/public/node/is-global.js.map +1 -1
- package/dist/public/node/json-schema.js.map +1 -1
- package/dist/public/node/liquid.js.map +1 -1
- package/dist/public/node/metadata.js +1 -1
- package/dist/public/node/metadata.js.map +1 -1
- package/dist/public/node/monorail.d.ts +1 -0
- package/dist/public/node/monorail.js.map +1 -1
- package/dist/public/node/node-package-manager.d.ts +0 -2
- package/dist/public/node/node-package-manager.js.map +1 -1
- package/dist/public/node/notifications-system.d.ts +6 -7
- package/dist/public/node/notifications-system.js.map +1 -1
- package/dist/public/node/os.js.map +1 -1
- package/dist/public/node/output.d.ts +0 -2
- package/dist/public/node/output.js +3 -3
- package/dist/public/node/output.js.map +1 -1
- package/dist/public/node/path.d.ts +0 -1
- package/dist/public/node/path.js.map +1 -1
- package/dist/public/node/plugins.d.ts +1 -1
- package/dist/public/node/plugins.js.map +1 -1
- package/dist/public/node/result.js.map +1 -1
- package/dist/public/node/schema.js.map +1 -1
- package/dist/public/node/session.d.ts +0 -1
- package/dist/public/node/session.js.map +1 -1
- package/dist/public/node/system.d.ts +0 -1
- package/dist/public/node/system.js.map +1 -1
- package/dist/public/node/tcp.js.map +1 -1
- package/dist/public/node/themes/api.d.ts +1 -0
- package/dist/public/node/themes/api.js +10 -0
- package/dist/public/node/themes/api.js.map +1 -1
- package/dist/public/node/themes/conf.js.map +1 -1
- package/dist/public/node/themes/theme-manager.js.map +1 -1
- package/dist/public/node/themes/types.d.ts +4 -1
- package/dist/public/node/themes/types.js.map +1 -1
- package/dist/public/node/themes/urls.js.map +1 -1
- package/dist/public/node/themes/utils.js.map +1 -1
- package/dist/public/node/tree-kill.js.map +1 -1
- package/dist/public/node/ui.d.ts +0 -1
- package/dist/public/node/ui.js.map +1 -1
- package/dist/public/node/upgrade.js.map +1 -1
- package/dist/public/node/vendor/dev_server/DevServer.js.map +1 -1
- package/dist/public/node/vendor/otel-js/export/InstantaneousMetricReader.js.map +1 -1
- package/dist/public/node/vendor/otel-js/service/BaseOtelService/BaseOtelService.js.map +1 -1
- package/dist/public/node/vendor/otel-js/service/DefaultOtelService/DefaultMeterProvider.js.map +1 -1
- package/dist/public/node/vendor/otel-js/utils/throttle.js.map +1 -1
- package/dist/public/node/vendor/otel-js/utils/validators.js.map +1 -1
- package/dist/public/node/version.js.map +1 -1
- package/dist/public/node/vscode.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -29
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scrollbar.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/Scrollbar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAA;AACrE,OAAO,EAAC,GAAG,EAAE,IAAI,EAAC,MAAM,KAAK,CAAA;AAC7B,OAAO,KAA0B,MAAM,OAAO,CAAA;AAU9C,MAAM,eAAe,GAAG,GAAG,CAAA;AAC3B,MAAM,cAAc,GAAG,GAAG,CAAA;AAE1B,MAAM,SAAS,GAAsC,CAAC,EACpD,eAAe,EACf,wBAAwB,EACxB,cAAc,EACd,gBAAgB,EAChB,OAAO,GAAG,CAAC,mBAAmB,EAAE,GACjC,EAAE,EAAE;IACH,MAAM,aAAa,GAAG,eAAe,IAAI,CAAC,IAAI,OAAO,CAAA;IACrD,MAAM,cAAc,GAAG,gBAAgB,GAAG,wBAAwB,GAAG,CAAC,CAAA;IAEtE,2EAA2E;IAC3E,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAA;IACxE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAC9B,UAAU,GAAG,CAAC,EACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,GAAG,cAAc,CAAC,GAAG,UAAU,CAAC,CAC/E,CAAA;IAED,IAAI,SAAiB,CAAA;IACrB,qEAAqE;IACrE,IAAI,cAAc,IAAI,cAAc,GAAG,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"Scrollbar.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/Scrollbar.tsx"],"names":[],"mappings":"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","sourcesContent":["import {shouldDisplayColors} from '../../../../public/node/output.js'\nimport {Box, Text} from 'ink'\nimport React, {FunctionComponent} from 'react'\n\ninterface ScrollbarProps {\n containerHeight: number\n visibleListSectionLength: number\n fullListLength: number\n visibleFromIndex: number\n noColor?: boolean\n}\n\nconst BACKGROUND_CHAR = '│'\nconst SCROLLBOX_CHAR = '║'\n\nconst Scrollbar: FunctionComponent<ScrollbarProps> = ({\n containerHeight,\n visibleListSectionLength,\n fullListLength,\n visibleFromIndex,\n noColor = !shouldDisplayColors(),\n}) => {\n const displayArrows = containerHeight >= 4 && noColor\n const visibleToIndex = visibleFromIndex + visibleListSectionLength - 1\n\n // Leave 2 rows for top/bottom arrows when there is vertical room for them.\n const fullHeight = displayArrows ? containerHeight - 2 : containerHeight\n const scrollboxHeight = Math.min(\n fullHeight - 1,\n Math.ceil(Math.min(1, visibleListSectionLength / fullListLength) * fullHeight),\n )\n\n let topBuffer: number\n // Ensure it scrolls all the way to the bottom when we hit the bottom\n if (visibleToIndex >= fullListLength - 1) {\n topBuffer = fullHeight - scrollboxHeight\n } else {\n // This is the actual number of rows available for the scrollbar to go up and down\n const scrollingLength = fullHeight - scrollboxHeight\n // This is the number of times the screen itself can scroll down\n const scrollableIncrements = fullListLength - visibleListSectionLength\n\n topBuffer = Math.max(\n // Never go negative, that causes errors!\n 0,\n Math.min(\n // Never have more buffer than filling in all spaces above the scrollbox\n fullHeight - scrollboxHeight,\n Math.round((visibleFromIndex / scrollableIncrements) * scrollingLength),\n ),\n )\n }\n const bottomBuffer = fullHeight - scrollboxHeight - topBuffer\n\n const backgroundChar = noColor ? BACKGROUND_CHAR : ' '\n const scrollboxChar = noColor ? SCROLLBOX_CHAR : ' '\n const bgColor = noColor ? undefined : 'gray'\n const scrollboxColor = noColor ? undefined : 'cyan'\n\n return (\n <Box flexDirection=\"column\">\n {displayArrows ? <Text>△</Text> : null}\n\n <Box width={1}>\n <Text backgroundColor={bgColor}>{backgroundChar.repeat(topBuffer)}</Text>\n </Box>\n <Box width={1}>\n <Text backgroundColor={scrollboxColor}>{scrollboxChar.repeat(scrollboxHeight)}</Text>\n </Box>\n <Box width={1}>\n <Text backgroundColor={bgColor}>{backgroundChar.repeat(bottomBuffer)}</Text>\n </Box>\n\n {displayArrows ? <Text>▽</Text> : null}\n </Box>\n )\n}\n\nexport {Scrollbar}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectInput.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Scrollbar} from './Scrollbar.js'\nimport {useSelectState} from '../hooks/use-select-state.js'\nimport useLayout from '../hooks/use-layout.js'\nimport {handleCtrlC} from '../../ui.js'\nimport React, {useCallback, forwardRef, useEffect} from 'react'\nimport {Box, Key, useInput, Text, DOMElement} from 'ink'\nimport chalk from 'chalk'\nimport figures from 'figures'\nimport sortBy from 'lodash/sortBy.js'\n\ndeclare module 'react' {\n function forwardRef<T, P>(\n render: (props: P, ref: React.Ref<T>) => JSX.Element | null,\n ): (props: P & React.RefAttributes<T>) => JSX.Element | null\n}\nexport interface SelectInputProps<T> {\n items: Item<T>[]\n initialItems?: Item<T>[]\n onChange?: (item: Item<T> | undefined) => void\n enableShortcuts?: boolean\n focus?: boolean\n emptyMessage?: string\n defaultValue?: T\n highlightedTerm?: string\n loading?: boolean\n errorMessage?: string\n hasMorePages?: boolean\n morePagesMessage?: string\n availableLines?: number\n onSubmit?: (item: Item<T>) => void\n inputFixedAreaRef?: React.RefObject<DOMElement>\n}\n\nexport interface Item<T> {\n label: string\n value: T\n key?: string\n group?: string\n helperText?: string\n disabled?: boolean\n}\n\nfunction highlightedLabel(label: string, term: string | undefined) {\n if (!term) {\n return label\n }\n\n let regex\n try {\n regex = new RegExp(term, 'i')\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch (error) {\n // term is user provided and could be an invalid regex at that moment (e.g. ending in '\\')\n return label\n }\n return label.replace(regex, (match) => {\n return chalk.bold(match)\n })\n}\n\nfunction validateKeys(items: Item<unknown>[]) {\n if (items.some((item) => (item.key?.length ?? 0) > 1)) {\n throw new Error('SelectInput: Keys must be a single character')\n }\n\n if (!items.every((item) => typeof item.key !== 'undefined' && item.key.length > 0)) {\n throw new Error('SelectInput: All items must have keys if one does')\n }\n}\n\ninterface ItemProps<T> {\n item: Item<T>\n previousItem: Item<T> | undefined\n items: Item<T>[]\n isSelected: boolean\n highlightedTerm?: string\n enableShortcuts: boolean\n hasAnyGroup: boolean\n index: number\n}\n\n// eslint-disable-next-line react/function-component-definition\nfunction Item<T>({\n item,\n previousItem,\n isSelected,\n highlightedTerm,\n enableShortcuts,\n items,\n hasAnyGroup,\n index,\n}: ItemProps<T>): JSX.Element {\n const label = highlightedLabel(item.label, highlightedTerm)\n let title: string | undefined\n let labelColor\n\n if (isSelected) {\n labelColor = 'cyan'\n } else if (item.disabled) {\n labelColor = 'dim'\n }\n\n if (typeof previousItem === 'undefined' || item.group !== previousItem.group) {\n title = item.group ?? (hasAnyGroup ? 'Other' : undefined)\n }\n\n const showKey = enableShortcuts && item.key && item.key.length > 0\n\n return (\n <Box\n key={index}\n flexDirection=\"column\"\n marginTop={items.indexOf(item) !== 0 && title ? 1 : 0}\n minHeight={title ? 2 : 1}\n >\n {title ? (\n <Box marginLeft={3}>\n <Text bold>{title}</Text>\n </Box>\n ) : null}\n\n <Box key={index} marginLeft={hasAnyGroup ? 3 : 0}>\n <Box marginRight={2}>{isSelected ? <Text color=\"cyan\">{`>`}</Text> : <Text> </Text>}</Box>\n <Text wrap=\"end\" color={labelColor}>\n {showKey ? `(${item.key}) ${label}` : label}\n </Text>\n </Box>\n </Box>\n )\n}\n\nconst MAX_AVAILABLE_LINES = 25\n\n// eslint-disable-next-line react/function-component-definition\nfunction SelectInputInner<T>(\n {\n items: rawItems,\n initialItems = rawItems,\n onChange,\n enableShortcuts = true,\n focus = true,\n emptyMessage = 'No items to select.',\n defaultValue,\n highlightedTerm,\n loading = false,\n errorMessage,\n hasMorePages = false,\n morePagesMessage,\n availableLines = MAX_AVAILABLE_LINES,\n onSubmit,\n inputFixedAreaRef,\n }: SelectInputProps<T>,\n ref: React.ForwardedRef<DOMElement>,\n): JSX.Element | null {\n let noItems = false\n\n if (rawItems.length === 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-param-reassign\n rawItems = [{label: emptyMessage, value: null as any, disabled: true}]\n noItems = true\n }\n\n const hasAnyGroup = rawItems.some((item) => typeof item.group !== 'undefined')\n const items = sortBy(rawItems, 'group')\n const itemsHaveKeys = items.some((item) => typeof item.key !== 'undefined' && item.key.length > 0)\n\n if (itemsHaveKeys) validateKeys(items)\n\n const availableLinesToUse = Math.min(availableLines, MAX_AVAILABLE_LINES)\n\n function maximumLinesLostToGroups(items: Item<T>[]): number {\n // Calculate a safe estimate of the limit needed based on the space available\n const numberOfGroups = new Set(items.map((item) => item.group).filter((group) => group)).size\n // Add 1 to numberOfGroups because we also have a default Other group\n const maxVisibleGroups = Math.ceil(Math.min((availableLinesToUse + 1) / 3, numberOfGroups + 1))\n // If we have x visible groups, we lose 1 line to the first group + 2 lines to the rest\n return numberOfGroups > 0 ? (maxVisibleGroups - 1) * 2 + 1 : 0\n }\n\n const maxLinesLostToGroups = maximumLinesLostToGroups(items)\n const limit = Math.max(2, availableLinesToUse - maxLinesLostToGroups)\n const hasLimit = items.length > limit\n\n const state = useSelectState({\n visibleOptionCount: limit,\n options: items,\n defaultValue,\n })\n\n useEffect(() => {\n if (typeof state.value !== 'undefined' && state.previousValue !== state.value) {\n onChange?.(items.find((item) => item.value === state.value))\n }\n }, [state.previousValue, state.value, items, onChange])\n\n const handleArrows = (key: Key) => {\n if (key.upArrow) {\n state.selectPreviousOption()\n } else if (key.downArrow) {\n state.selectNextOption()\n }\n }\n\n const handleShortcuts = useCallback(\n (input: string) => {\n if (state.visibleOptions.map((item: Item<T>) => item.key).includes(input)) {\n const itemWithKey = state.visibleOptions.find((item: Item<T>) => item.key === input)\n const item = items.find((item) => item.value === itemWithKey?.value)\n\n if (itemWithKey && !itemWithKey.disabled) {\n // keep this order of operations so that there is no flickering\n if (onSubmit && item) {\n onSubmit(item)\n }\n\n state.selectOption({option: itemWithKey})\n }\n }\n },\n [items, onSubmit, state],\n )\n\n useInput(\n (input, key) => {\n handleCtrlC(input, key)\n\n if (typeof state.value !== 'undefined' && key.return) {\n const item = items.find((item) => item.value === state.value)\n\n if (item && onSubmit) {\n onSubmit(item)\n }\n }\n\n // check that no special modifier (shift, control, etc.) is being pressed\n if (enableShortcuts && input.length > 0 && Object.values(key).every((value) => !value)) {\n handleShortcuts(input)\n } else {\n handleArrows(key)\n }\n },\n {isActive: focus},\n )\n const {twoThirds} = useLayout()\n\n if (loading) {\n return (\n <Box marginLeft={3}>\n <Text dimColor>Loading...</Text>\n </Box>\n )\n } else if (errorMessage && errorMessage.length > 0) {\n return (\n <Box marginLeft={3}>\n <Text color=\"red\">{errorMessage}</Text>\n </Box>\n )\n } else {\n const optionsHeight = initialItems.length + maximumLinesLostToGroups(initialItems)\n const minHeight = hasAnyGroup ? 5 : 2\n const sectionHeight = Math.max(minHeight, Math.min(availableLinesToUse, optionsHeight))\n\n return (\n <Box flexDirection=\"column\" ref={ref} gap={1} width={twoThirds}>\n <Box flexDirection=\"row\" height={sectionHeight} width=\"100%\">\n <Box flexDirection=\"column\" overflowY=\"hidden\" flexGrow={1}>\n {state.visibleOptions.map((item: Item<T>, index: number) => (\n <Item\n key={index}\n item={item}\n previousItem={state.visibleOptions[index - 1]}\n highlightedTerm={highlightedTerm}\n isSelected={item.value === state.value}\n items={state.visibleOptions}\n enableShortcuts={enableShortcuts}\n hasAnyGroup={hasAnyGroup}\n index={index}\n />\n ))}\n </Box>\n\n {hasLimit ? (\n <Scrollbar\n containerHeight={sectionHeight}\n visibleListSectionLength={limit}\n fullListLength={items.length}\n visibleFromIndex={state.visibleFromIndex}\n />\n ) : null}\n </Box>\n\n <Box ref={inputFixedAreaRef}>\n {noItems ? (\n <Box marginLeft={3}>\n <Text dimColor>Try again with a different keyword.</Text>\n </Box>\n ) : (\n <Box marginLeft={3} flexDirection=\"column\">\n <Text dimColor>\n {`Press ${figures.arrowUp}${figures.arrowDown} arrows to select, enter ${\n itemsHaveKeys ? 'or a shortcut ' : ''\n }to confirm.`}\n </Text>\n {hasMorePages ? (\n <Text>\n <Text bold>1-{items.length} of many</Text>\n {morePagesMessage ? ` ${morePagesMessage}` : null}\n </Text>\n ) : null}\n </Box>\n )}\n </Box>\n </Box>\n )\n }\n}\n\nexport const SelectInput = forwardRef(SelectInputInner)\n"]}
|
|
1
|
+
{"version":3,"file":"SelectInput.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAA;AAC3D,OAAO,SAAS,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,EAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,OAAO,CAAA;AAC/D,OAAO,EAAC,GAAG,EAAO,QAAQ,EAAE,IAAI,EAAa,MAAM,KAAK,CAAA;AACxD,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,MAAM,MAAM,kBAAkB,CAAA;AAkCrC,SAAS,gBAAgB,CAAC,KAAa,EAAE,IAAwB;IAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,KAAK,CAAA;IACT,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC7B,qDAAqD;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0FAA0F;QAC1F,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QACpC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAsB;IAC1C,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACtE,CAAC;AACH,CAAC;AAaD,+DAA+D;AAC/D,SAAS,IAAI,CAAI,EACf,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,eAAe,EACf,eAAe,EACf,KAAK,EACL,WAAW,EACX,KAAK,GACQ;IACb,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,CAAA;IAC3D,IAAI,KAAyB,CAAA;IAC7B,IAAI,UAAU,CAAA;IAEd,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,GAAG,MAAM,CAAA;IACrB,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,UAAU,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,IAAI,OAAO,YAAY,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC;QAC7E,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IAElE,OAAO,CACL,oBAAC,GAAG,IACF,GAAG,EAAE,KAAK,EACV,aAAa,EAAC,QAAQ,EACtB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACrD,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvB,KAAK,CAAC,CAAC,CAAC,CACP,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;YAChB,oBAAC,IAAI,IAAC,IAAI,UAAE,KAAK,CAAQ,CACrB,CACP,CAAC,CAAC,CAAC,IAAI;QAER,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,oBAAC,GAAG,IAAC,WAAW,EAAE,CAAC,IAAG,UAAU,CAAC,CAAC,CAAC,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,IAAE,GAAG,CAAQ,CAAC,CAAC,CAAC,oBAAC,IAAI,YAAS,CAAO;YAC1F,oBAAC,IAAI,IAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAE,UAAU,IAC/B,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CACtC,CACH,CACF,CACP,CAAA;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,EAAE,CAAA;AAE9B,+DAA+D;AAC/D,SAAS,gBAAgB,CACvB,EACE,KAAK,EAAE,QAAQ,EACf,YAAY,GAAG,QAAQ,EACvB,QAAQ,EACR,eAAe,GAAG,IAAI,EACtB,KAAK,GAAG,IAAI,EACZ,YAAY,GAAG,qBAAqB,EACpC,YAAY,EACZ,eAAe,EACf,OAAO,GAAG,KAAK,EACf,YAAY,EACZ,YAAY,GAAG,KAAK,EACpB,gBAAgB,EAChB,cAAc,GAAG,mBAAmB,EACpC,QAAQ,EACR,iBAAiB,GACG,EACtB,GAAmC;IAEnC,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,iFAAiF;QACjF,QAAQ,GAAG,CAAC,EAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,IAAW,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAA;QACtE,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC,CAAA;IAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACvC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAElG,IAAI,aAAa;QAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IAEtC,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAA;IAEzE,SAAS,wBAAwB,CAAC,KAAgB;QAChD,6EAA6E;QAC7E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QAC7F,qEAAqE;QACrE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,CAAA;QAC/F,uFAAuF;QACvF,OAAO,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAA;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,CAAC,CAAA;IACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAA;IAErC,MAAM,KAAK,GAAG,cAAc,CAAC;QAC3B,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK;QACd,YAAY;KACb,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9E,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEvD,MAAM,YAAY,GAAG,CAAC,GAAQ,EAAE,EAAE;QAChC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAC9B,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YACzB,KAAK,CAAC,gBAAgB,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC,CAAA;IAED,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,KAAa,EAAE,EAAE;QAChB,IAAI,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1E,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,CAAA;YACpF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,KAAK,CAAC,CAAA;YAEpE,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACzC,+DAA+D;gBAC/D,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;oBACrB,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAChB,CAAC;gBAED,KAAK,CAAC,YAAY,CAAC,EAAC,MAAM,EAAE,WAAW,EAAC,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CACzB,CAAA;IAED,QAAQ,CACN,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACb,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAEvB,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAA;YAE7D,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,IAAI,eAAe,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACvF,eAAe,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;IACH,CAAC,EACD,EAAC,QAAQ,EAAE,KAAK,EAAC,CAClB,CAAA;IACD,MAAM,EAAC,SAAS,EAAC,GAAG,SAAS,EAAE,CAAA;IAE/B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;YAChB,oBAAC,IAAI,IAAC,QAAQ,uBAAkB,CAC5B,CACP,CAAA;IACH,CAAC;SAAM,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,CACL,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;YAChB,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,IAAE,YAAY,CAAQ,CACnC,CACP,CAAA;IACH,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAA;QAClF,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC,CAAA;QAEvF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS;YAC5D,oBAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAC,MAAM;gBAC1D,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,IACvD,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAa,EAAE,KAAa,EAAE,EAAE,CAAC,CAC1D,oBAAC,IAAI,IACH,GAAG,EAAE,KAAK,EACV,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC,EAC7C,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EACtC,KAAK,EAAE,KAAK,CAAC,cAAc,EAC3B,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,GACZ,CACH,CAAC,CACE;gBAEL,QAAQ,CAAC,CAAC,CAAC,CACV,oBAAC,SAAS,IACR,eAAe,EAAE,aAAa,EAC9B,wBAAwB,EAAE,KAAK,EAC/B,cAAc,EAAE,KAAK,CAAC,MAAM,EAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GACxC,CACH,CAAC,CAAC,CAAC,IAAI,CACJ;YAEN,oBAAC,GAAG,IAAC,GAAG,EAAE,iBAAiB,IACxB,OAAO,CAAC,CAAC,CAAC,CACT,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;gBAChB,oBAAC,IAAI,IAAC,QAAQ,gDAA2C,CACrD,CACP,CAAC,CAAC,CAAC,CACF,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;gBACxC,oBAAC,IAAI,IAAC,QAAQ,UACX,SAAS,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,SAAS,4BAC3C,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EACrC,aAAa,CACR;gBACN,YAAY,CAAC,CAAC,CAAC,CACd,oBAAC,IAAI;oBACH,oBAAC,IAAI,IAAC,IAAI;;wBAAI,KAAK,CAAC,MAAM;mCAAgB;oBACzC,gBAAgB,CAAC,CAAC,CAAC,KAAK,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7C,CACR,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CACG,CACF,CACP,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAA","sourcesContent":["import {Scrollbar} from './Scrollbar.js'\nimport {useSelectState} from '../hooks/use-select-state.js'\nimport useLayout from '../hooks/use-layout.js'\nimport {handleCtrlC} from '../../ui.js'\nimport React, {useCallback, forwardRef, useEffect} from 'react'\nimport {Box, Key, useInput, Text, DOMElement} from 'ink'\nimport chalk from 'chalk'\nimport figures from 'figures'\nimport sortBy from 'lodash/sortBy.js'\n\ndeclare module 'react' {\n function forwardRef<T, P>(\n render: (props: P, ref: React.Ref<T>) => JSX.Element | null,\n ): (props: P & React.RefAttributes<T>) => JSX.Element | null\n}\nexport interface SelectInputProps<T> {\n items: Item<T>[]\n initialItems?: Item<T>[]\n onChange?: (item: Item<T> | undefined) => void\n enableShortcuts?: boolean\n focus?: boolean\n emptyMessage?: string\n defaultValue?: T\n highlightedTerm?: string\n loading?: boolean\n errorMessage?: string\n hasMorePages?: boolean\n morePagesMessage?: string\n availableLines?: number\n onSubmit?: (item: Item<T>) => void\n inputFixedAreaRef?: React.RefObject<DOMElement>\n}\n\nexport interface Item<T> {\n label: string\n value: T\n key?: string\n group?: string\n helperText?: string\n disabled?: boolean\n}\n\nfunction highlightedLabel(label: string, term: string | undefined) {\n if (!term) {\n return label\n }\n\n let regex\n try {\n regex = new RegExp(term, 'i')\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch (error) {\n // term is user provided and could be an invalid regex at that moment (e.g. ending in '\\')\n return label\n }\n return label.replace(regex, (match) => {\n return chalk.bold(match)\n })\n}\n\nfunction validateKeys(items: Item<unknown>[]) {\n if (items.some((item) => (item.key?.length ?? 0) > 1)) {\n throw new Error('SelectInput: Keys must be a single character')\n }\n\n if (!items.every((item) => typeof item.key !== 'undefined' && item.key.length > 0)) {\n throw new Error('SelectInput: All items must have keys if one does')\n }\n}\n\ninterface ItemProps<T> {\n item: Item<T>\n previousItem: Item<T> | undefined\n items: Item<T>[]\n isSelected: boolean\n highlightedTerm?: string\n enableShortcuts: boolean\n hasAnyGroup: boolean\n index: number\n}\n\n// eslint-disable-next-line react/function-component-definition\nfunction Item<T>({\n item,\n previousItem,\n isSelected,\n highlightedTerm,\n enableShortcuts,\n items,\n hasAnyGroup,\n index,\n}: ItemProps<T>): JSX.Element {\n const label = highlightedLabel(item.label, highlightedTerm)\n let title: string | undefined\n let labelColor\n\n if (isSelected) {\n labelColor = 'cyan'\n } else if (item.disabled) {\n labelColor = 'dim'\n }\n\n if (typeof previousItem === 'undefined' || item.group !== previousItem.group) {\n title = item.group ?? (hasAnyGroup ? 'Other' : undefined)\n }\n\n const showKey = enableShortcuts && item.key && item.key.length > 0\n\n return (\n <Box\n key={index}\n flexDirection=\"column\"\n marginTop={items.indexOf(item) !== 0 && title ? 1 : 0}\n minHeight={title ? 2 : 1}\n >\n {title ? (\n <Box marginLeft={3}>\n <Text bold>{title}</Text>\n </Box>\n ) : null}\n\n <Box key={index} marginLeft={hasAnyGroup ? 3 : 0}>\n <Box marginRight={2}>{isSelected ? <Text color=\"cyan\">{`>`}</Text> : <Text> </Text>}</Box>\n <Text wrap=\"end\" color={labelColor}>\n {showKey ? `(${item.key}) ${label}` : label}\n </Text>\n </Box>\n </Box>\n )\n}\n\nconst MAX_AVAILABLE_LINES = 25\n\n// eslint-disable-next-line react/function-component-definition\nfunction SelectInputInner<T>(\n {\n items: rawItems,\n initialItems = rawItems,\n onChange,\n enableShortcuts = true,\n focus = true,\n emptyMessage = 'No items to select.',\n defaultValue,\n highlightedTerm,\n loading = false,\n errorMessage,\n hasMorePages = false,\n morePagesMessage,\n availableLines = MAX_AVAILABLE_LINES,\n onSubmit,\n inputFixedAreaRef,\n }: SelectInputProps<T>,\n ref: React.ForwardedRef<DOMElement>,\n): JSX.Element | null {\n let noItems = false\n\n if (rawItems.length === 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-param-reassign\n rawItems = [{label: emptyMessage, value: null as any, disabled: true}]\n noItems = true\n }\n\n const hasAnyGroup = rawItems.some((item) => typeof item.group !== 'undefined')\n const items = sortBy(rawItems, 'group')\n const itemsHaveKeys = items.some((item) => typeof item.key !== 'undefined' && item.key.length > 0)\n\n if (itemsHaveKeys) validateKeys(items)\n\n const availableLinesToUse = Math.min(availableLines, MAX_AVAILABLE_LINES)\n\n function maximumLinesLostToGroups(items: Item<T>[]): number {\n // Calculate a safe estimate of the limit needed based on the space available\n const numberOfGroups = new Set(items.map((item) => item.group).filter((group) => group)).size\n // Add 1 to numberOfGroups because we also have a default Other group\n const maxVisibleGroups = Math.ceil(Math.min((availableLinesToUse + 1) / 3, numberOfGroups + 1))\n // If we have x visible groups, we lose 1 line to the first group + 2 lines to the rest\n return numberOfGroups > 0 ? (maxVisibleGroups - 1) * 2 + 1 : 0\n }\n\n const maxLinesLostToGroups = maximumLinesLostToGroups(items)\n const limit = Math.max(2, availableLinesToUse - maxLinesLostToGroups)\n const hasLimit = items.length > limit\n\n const state = useSelectState({\n visibleOptionCount: limit,\n options: items,\n defaultValue,\n })\n\n useEffect(() => {\n if (typeof state.value !== 'undefined' && state.previousValue !== state.value) {\n onChange?.(items.find((item) => item.value === state.value))\n }\n }, [state.previousValue, state.value, items, onChange])\n\n const handleArrows = (key: Key) => {\n if (key.upArrow) {\n state.selectPreviousOption()\n } else if (key.downArrow) {\n state.selectNextOption()\n }\n }\n\n const handleShortcuts = useCallback(\n (input: string) => {\n if (state.visibleOptions.map((item: Item<T>) => item.key).includes(input)) {\n const itemWithKey = state.visibleOptions.find((item: Item<T>) => item.key === input)\n const item = items.find((item) => item.value === itemWithKey?.value)\n\n if (itemWithKey && !itemWithKey.disabled) {\n // keep this order of operations so that there is no flickering\n if (onSubmit && item) {\n onSubmit(item)\n }\n\n state.selectOption({option: itemWithKey})\n }\n }\n },\n [items, onSubmit, state],\n )\n\n useInput(\n (input, key) => {\n handleCtrlC(input, key)\n\n if (typeof state.value !== 'undefined' && key.return) {\n const item = items.find((item) => item.value === state.value)\n\n if (item && onSubmit) {\n onSubmit(item)\n }\n }\n\n // check that no special modifier (shift, control, etc.) is being pressed\n if (enableShortcuts && input.length > 0 && Object.values(key).every((value) => !value)) {\n handleShortcuts(input)\n } else {\n handleArrows(key)\n }\n },\n {isActive: focus},\n )\n const {twoThirds} = useLayout()\n\n if (loading) {\n return (\n <Box marginLeft={3}>\n <Text dimColor>Loading...</Text>\n </Box>\n )\n } else if (errorMessage && errorMessage.length > 0) {\n return (\n <Box marginLeft={3}>\n <Text color=\"red\">{errorMessage}</Text>\n </Box>\n )\n } else {\n const optionsHeight = initialItems.length + maximumLinesLostToGroups(initialItems)\n const minHeight = hasAnyGroup ? 5 : 2\n const sectionHeight = Math.max(minHeight, Math.min(availableLinesToUse, optionsHeight))\n\n return (\n <Box flexDirection=\"column\" ref={ref} gap={1} width={twoThirds}>\n <Box flexDirection=\"row\" height={sectionHeight} width=\"100%\">\n <Box flexDirection=\"column\" overflowY=\"hidden\" flexGrow={1}>\n {state.visibleOptions.map((item: Item<T>, index: number) => (\n <Item\n key={index}\n item={item}\n previousItem={state.visibleOptions[index - 1]}\n highlightedTerm={highlightedTerm}\n isSelected={item.value === state.value}\n items={state.visibleOptions}\n enableShortcuts={enableShortcuts}\n hasAnyGroup={hasAnyGroup}\n index={index}\n />\n ))}\n </Box>\n\n {hasLimit ? (\n <Scrollbar\n containerHeight={sectionHeight}\n visibleListSectionLength={limit}\n fullListLength={items.length}\n visibleFromIndex={state.visibleFromIndex}\n />\n ) : null}\n </Box>\n\n <Box ref={inputFixedAreaRef}>\n {noItems ? (\n <Box marginLeft={3}>\n <Text dimColor>Try again with a different keyword.</Text>\n </Box>\n ) : (\n <Box marginLeft={3} flexDirection=\"column\">\n <Text dimColor>\n {`Press ${figures.arrowUp}${figures.arrowDown} arrows to select, enter ${\n itemsHaveKeys ? 'or a shortcut ' : ''\n }to confirm.`}\n </Text>\n {hasMorePages ? (\n <Text>\n <Text bold>1-{items.length} of many</Text>\n {morePagesMessage ? ` ${morePagesMessage}` : null}\n </Text>\n ) : null}\n </Box>\n )}\n </Box>\n </Box>\n )\n }\n}\n\nexport const SelectInput = forwardRef(SelectInputInner)\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectPrompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAuC,MAAM,kBAAkB,CAAA;AAGlF,OAAO,EAAU,YAAY,EAAC,MAAM,2BAA2B,CAAA;AAE/D,OAAO,SAAS,EAAE,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,EAAe,WAAW,EAAE,SAAS,EAAC,MAAM,OAAO,CAAA;AACjE,OAAO,EAAC,MAAM,EAAC,MAAM,KAAK,CAAA;AAY1B,+DAA+D;AAC/D,SAAS,YAAY,CAAI,EACvB,OAAO,EACP,OAAO,EACP,SAAS,EACT,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,WAAW,GACmC;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"SelectPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SelectPrompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAuC,MAAM,kBAAkB,CAAA;AAGlF,OAAO,EAAU,YAAY,EAAC,MAAM,2BAA2B,CAAA;AAE/D,OAAO,SAAS,EAAE,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,EAAe,WAAW,EAAE,SAAS,EAAC,MAAM,OAAO,CAAA;AACjE,OAAO,EAAC,MAAM,EAAC,MAAM,KAAK,CAAA;AAY1B,+DAA+D;AAC/D,SAAS,YAAY,CAAI,EACvB,OAAO,EACP,OAAO,EACP,SAAS,EACT,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,WAAW,GACmC;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC9D,CAAC;IACD,MAAM,EAAC,IAAI,EAAE,UAAU,EAAC,GAAG,MAAM,EAAE,CAAA;IACnC,MAAM,EAAC,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAC,GAAG,SAAS,CAA4B;QAC5F,aAAa,EAAE,SAAS;KACzB,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,MAAqB,EAAE,EAAE;QACxB,SAAS,CAAC,MAAM,CAAC,CAAA;QACjB,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC,EACD,CAAC,SAAS,EAAE,cAAc,CAAC,CAC5B,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,KAAK,WAAW,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC;YACpD,UAAU,EAAE,CAAA;YACZ,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAA;IAE/C,OAAO,CACL,oBAAC,YAAY,IACX,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,oBAAoB,EAAE,MAAM,EAAE,KAAK,EACnC,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,oBAAC,WAAW,IAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,GAAI,GAC1F,CACH,CAAA;AACH,CAAC;AAED,OAAO,EAAC,YAAY,EAAC,CAAA","sourcesContent":["import {SelectInput, SelectInputProps, Item as SelectItem} from './SelectInput.js'\nimport {InfoTableProps} from './Prompts/InfoTable.js'\nimport {InfoMessageProps} from './Prompts/InfoMessage.js'\nimport {Message, PromptLayout} from './Prompts/PromptLayout.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport usePrompt, {PromptState} from '../hooks/use-prompt.js'\nimport React, {ReactElement, useCallback, useEffect} from 'react'\nimport {useApp} from 'ink'\n\nexport interface SelectPromptProps<T> {\n message: Message\n choices: SelectInputProps<T>['items']\n onSubmit: (value: T) => void\n infoTable?: InfoTableProps['table']\n defaultValue?: T\n abortSignal?: AbortSignal\n infoMessage?: InfoMessageProps['message']\n}\n\n// eslint-disable-next-line react/function-component-definition\nfunction SelectPrompt<T>({\n message,\n choices,\n infoTable,\n infoMessage,\n onSubmit,\n defaultValue,\n abortSignal,\n}: React.PropsWithChildren<SelectPromptProps<T>>): ReactElement | null {\n if (choices.length === 0) {\n throw new Error('SelectPrompt requires at least one choice')\n }\n const {exit: unmountInk} = useApp()\n const {promptState, setPromptState, answer, setAnswer} = usePrompt<SelectItem<T> | undefined>({\n initialAnswer: undefined,\n })\n\n const submitAnswer = useCallback(\n (answer: SelectItem<T>) => {\n setAnswer(answer)\n setPromptState(PromptState.Submitted)\n },\n [setAnswer, setPromptState],\n )\n\n useEffect(() => {\n if (promptState === PromptState.Submitted && answer) {\n unmountInk()\n onSubmit(answer.value)\n }\n }, [answer, onSubmit, promptState, unmountInk])\n\n return (\n <PromptLayout\n message={message}\n state={promptState}\n submittedAnswerLabel={answer?.label}\n infoTable={infoTable}\n infoMessage={infoMessage}\n abortSignal={abortSignal}\n input={<SelectInput defaultValue={defaultValue} items={choices} onSubmit={submitAnswer} />}\n />\n )\n}\n\nexport {SelectPrompt}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Row.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Table/Row.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAC,QAAQ,EAAC,MAAM,sCAAsC,CAAA;AAC7D,OAAO,EAAC,GAAG,EAAE,IAAI,EAAC,MAAM,KAAK,CAAA;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAA;AAUzB,SAAS,IAAI,CAAQ,QAAa,EAAE,SAAgC;IAClE,OAAO,QAAQ,CAAC,MAAM,CAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"Row.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Table/Row.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAC,QAAQ,EAAC,MAAM,sCAAsC,CAAA;AAC7D,OAAO,EAAC,GAAG,EAAE,IAAI,EAAC,MAAM,KAAK,CAAA;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAA;AAUzB,SAAS,IAAI,CAAQ,QAAa,EAAE,SAAgC;IAClE,OAAO,QAAQ,CAAC,MAAM,CAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,OAAO,CAAC,CAAA;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC;AAED,MAAM,GAAG,GAAG,CAAuB,EAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,EAAc,EAAE,EAAE;IACxG,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,KAAK,OAClB,IAAI,CACN,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,GAAG,GAAG,GAAG,MAAM,SAAS,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAA;QACtD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;QAEzE,OAAO,CACL,oBAAC,IAAI,IAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;YAChE,OAAO;YACP,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAC1B,CACR,CAAA;IACH,CAAC,CAAC,EAEF,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,GAAG,GAAG,GAAG,MAAM,yBAAyB,KAAK,EAAE,CAAA;QACrD,OAAO,oBAAC,IAAI,IAAC,GAAG,EAAE,GAAG,IAAG,IAAI,CAAQ,CAAA;IACtC,CAAC,CACF,CACG,CACP,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAC,GAAG,EAAC,CAAA","sourcesContent":["import ScalarDict from './ScalarDict.js'\nimport {Column} from './Column.js'\nimport {unstyled} from '../../../../../public/node/output.js'\nimport {Box, Text} from 'ink'\nimport React from 'react'\n\ninterface RowProps<T extends ScalarDict> {\n fillerChar: string\n rowKey: string\n data: Partial<T>\n columns: Column<T>[]\n ignoreColumnColor?: boolean\n}\n\nfunction join<T, TI>(elements: T[], separator: (index: number) => TI): (T | TI)[] {\n return elements.reduce<(T | TI)[]>((elements, element, index) => {\n if (elements.length === 0) {\n return [element]\n }\n return [...elements, separator(index), element]\n }, [])\n}\n\nconst Row = <T extends ScalarDict>({rowKey, columns, data, fillerChar, ignoreColumnColor}: RowProps<T>) => {\n return (\n <Box flexDirection=\"row\">\n {...join(\n columns.map((column) => {\n const content = data[column.name]\n const key = `${rowKey}-cell-${column.name.toString()}`\n const marginRight = column.width - unstyled(String(content ?? '')).length\n\n return (\n <Text key={key} color={ignoreColumnColor ? undefined : column.color}>\n {content}\n {fillerChar.repeat(marginRight)}\n </Text>\n )\n }),\n\n (index) => {\n const key = `${rowKey}-horizontal-separator-${index}`\n return <Text key={key}>{' '}</Text>\n },\n )}\n </Box>\n )\n}\n\nexport {Row}\n"]}
|
|
@@ -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;
|
|
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"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { InlineToken } from './TokenizedText.js';
|
|
2
|
+
import { FunctionComponent } from 'react';
|
|
3
|
+
export interface TabularDataProps {
|
|
4
|
+
tabularData: InlineToken[][];
|
|
5
|
+
firstColumnSubdued?: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare const TabularData: FunctionComponent<TabularDataProps>;
|
|
8
|
+
export { TabularData };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { TokenizedText, tokenItemToString } from './TokenizedText.js';
|
|
2
|
+
import { unstyled } from '../../../../public/node/output.js';
|
|
3
|
+
import { Box } from 'ink';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
const TabularData = ({ tabularData: data, firstColumnSubdued }) => {
|
|
6
|
+
const columnWidths = data.reduce((acc, row) => {
|
|
7
|
+
row.forEach((cell, index) => {
|
|
8
|
+
acc[index] = Math.max(acc[index] ?? 0, unstyled(tokenItemToString(cell)).length);
|
|
9
|
+
});
|
|
10
|
+
return acc;
|
|
11
|
+
}, []);
|
|
12
|
+
return (React.createElement(Box, { flexDirection: "column" }, data.map((row, index) => (React.createElement(Box, { key: index, flexDirection: "row", gap: 2 }, row.map((cell, index) => (React.createElement(Box, { key: index, width: columnWidths[index] ?? 0, flexShrink: index === 0 ? 0 : 1 },
|
|
13
|
+
React.createElement(TokenizedText, { item: index === 0 && firstColumnSubdued && typeof cell === 'string' ? { subdued: cell } : cell })))))))));
|
|
14
|
+
};
|
|
15
|
+
export { TabularData };
|
|
16
|
+
//# sourceMappingURL=TabularData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabularData.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TabularData.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,aAAa,EAAE,iBAAiB,EAAC,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAC,QAAQ,EAAC,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAA;AACvB,OAAO,KAA0B,MAAM,OAAO,CAAA;AAO9C,MAAM,WAAW,GAAwC,CAAC,EAAC,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAC,EAAE,EAAE;IACnG,MAAM,YAAY,GAAa,IAAI,CAAC,MAAM,CAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAChE,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC1B,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,CAAC,CAAC,CAAA;QACF,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,IACxB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK,EAAE,aAAa,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,IACxC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,oBAAC,aAAa,IACZ,IAAI,EAAE,KAAK,KAAK,CAAC,IAAI,kBAAkB,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,IAAI,GAC5F,CACE,CACP,CAAC,CACE,CACP,CAAC,CACE,CACP,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAC,WAAW,EAAC,CAAA","sourcesContent":["import {InlineToken, TokenizedText, tokenItemToString} from './TokenizedText.js'\nimport {unstyled} from '../../../../public/node/output.js'\nimport {Box} from 'ink'\nimport React, {FunctionComponent} from 'react'\n\nexport interface TabularDataProps {\n tabularData: InlineToken[][]\n firstColumnSubdued?: boolean\n}\n\nconst TabularData: FunctionComponent<TabularDataProps> = ({tabularData: data, firstColumnSubdued}) => {\n const columnWidths: number[] = data.reduce<number[]>((acc, row) => {\n row.forEach((cell, index) => {\n acc[index] = Math.max(acc[index] ?? 0, unstyled(tokenItemToString(cell)).length)\n })\n return acc\n }, [])\n\n return (\n <Box flexDirection=\"column\">\n {data.map((row, index) => (\n <Box key={index} flexDirection=\"row\" gap={2}>\n {row.map((cell, index) => (\n <Box key={index} width={columnWidths[index] ?? 0} flexShrink={index === 0 ? 0 : 1}>\n <TokenizedText\n item={index === 0 && firstColumnSubdued && typeof cell === 'string' ? {subdued: cell} : cell}\n />\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n )\n}\n\nexport {TabularData}\n"]}
|
|
@@ -8,7 +8,7 @@ export interface Task<TContext = unknown> {
|
|
|
8
8
|
errors?: Error[];
|
|
9
9
|
skip?: (ctx: TContext) => boolean;
|
|
10
10
|
}
|
|
11
|
-
|
|
11
|
+
interface TasksProps<TContext> {
|
|
12
12
|
tasks: Task<TContext>[];
|
|
13
13
|
silent?: boolean;
|
|
14
14
|
onComplete?: (ctx: TContext) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tasks.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/Tasks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAA;AAChD,OAAO,SAAS,MAAM,wBAAwB,CAAA;AAC9C,OAAO,kBAAkB,MAAM,mCAAmC,CAAA;AAClE,OAAO,EAAC,UAAU,EAAC,MAAM,0CAA0C,CAAA;AAEnE,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAA;AACvC,OAAO,EAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,KAAK,CAAA;AACjD,OAAO,KAAK,EAAE,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AAE7C,MAAM,cAAc,GAAG,GAAG,CAAA;AAmB1B,IAAK,UAIJ;AAJD,WAAK,UAAU;IACb,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;AACrB,CAAC,EAJI,UAAU,KAAV,UAAU,QAId;AAED,KAAK,UAAU,OAAO,CAAW,IAAoB,EAAE,GAAa;IAClE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;IACnB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;IAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAE/D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"Tasks.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/Tasks.tsx"],"names":[],"mappings":"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","sourcesContent":["import {TextAnimation} from './TextAnimation.js'\nimport useLayout from '../hooks/use-layout.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 {handleCtrlC} from '../../ui.js'\nimport {Box, Text, useStdin, useInput} from 'ink'\nimport React, {useRef, useState} from 'react'\n\nconst loadingBarChar = '▀'\n\nexport interface Task<TContext = unknown> {\n title: string\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}\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}: React.PropsWithChildren<TasksProps<TContext>>) {\n const {twoThirds} = useLayout()\n const loadingBar = new Array(twoThirds).fill(loadingBarChar).join('')\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 const {isRawModeSupported} = useStdin()\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 useInput(\n (input, key) => {\n handleCtrlC(input, key)\n\n if (key.return) {\n return null\n }\n },\n {isActive: Boolean(isRawModeSupported)},\n )\n\n const {isAborted} = useAbortSignal(abortSignal)\n\n if (silent) {\n return null\n }\n\n return state === TasksState.Loading && !isAborted ? (\n <Box flexDirection=\"column\">\n <TextAnimation text={loadingBar} />\n <Text>{currentTask.title} ...</Text>\n </Box>\n ) : null\n}\n\nexport {Tasks}\n"]}
|
|
@@ -1 +1 @@
|
|
|
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,wBAAwB,EAAE,MAAM,EAAC,MAAM,qBAAqB,CAAA;AACpE,OAAO,EAAC,QAAQ,EAAC,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAC,eAAe,EAAC,MAAM,kCAAkC,CAAA;AAChE,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAC,MAAM,QAAQ,CAAA;AAEjD,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACpD,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,IAAI,CAAC,CAAC,CAAA;QAC3D,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,GAAI,CAAC,CAAA;QAC3E,MAAM,eAAe,EAAE,CAAA;QAEvB,OAAO;QACP,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAGnE,CAAC,CAAA;QACF,MAAM,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,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;QAEpC,OAAO;QACP,MAAM,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC9E,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,IAAI,CAAC,CAAC,CAAA;QAC3D,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;qBAC3B;oBACD;wBACE,KAAK,EAAE,WAAW;wBAClB,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;qBACrB;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;QAEvF,MAAM,eAAe,EAAE,CAAA;QAEvB,OAAO;QACP,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAGnE,CAAC,CAAA;QAEF,MAAM,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,EAAE,CAAA;IACjD,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,IAAI,CAAC,CAAC,CAAA;QAC3D,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,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;YAC3D,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,MAAM,eAAe,EAAE,CAAA;QAEvB,OAAO;QACP,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAGnE,CAAC,CAAA;QACF,MAAM,CAAC,iBAAiB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IACpD,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,IAAI,CAAC,CAAC,CAAA;QAC3D,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,IAAI,CAAC,CAAC,CAAA;QAC3D,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;QAE3E,MAAM,eAAe,EAAE,CAAA;QAEvB,OAAO;QACP,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAGnE,CAAC,CAAA;QAEF,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;gBAChC,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;aAC1D;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;QAC3D,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;QAE3E,MAAM,eAAe,EAAE,CAAA;QAEvB,OAAO;QACP,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAGnE,CAAC,CAAA;QACF,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;gBACjC,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;aAC1D;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;QAC3D,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,MAAM,eAAe,EAAE,CAAA;QAEvB,OAAO;QACP,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,cAAc,CAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QACvF,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;gBAChC,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;aAC1D;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;QAC3D,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;QAE3E,MAAM,eAAe,EAAE,CAAA;QAEvB,OAAO;QACP,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;KAGnE,CAAC,CAAA;QACF,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;gBACjC,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;aAC1D;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;QAC3D,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,MAAM,eAAe,EAAE,CAAA;QAEvB,OAAO;QACP,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,cAAc,CAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QACvF,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;oBACrB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;iBACrC;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,CAAC,QAAQ,CAAC,wBAAwB,CAAC,cAAc,CAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvE,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACnD,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 {getLastFrameAfterUnmount, render} from '../../testing/ui.js'\nimport {unstyled} from '../../../../public/node/output.js'\nimport {AbortController} from '../../../../public/node/abort.js'\nimport React from 'react'\nimport {describe, expect, test, vi} from 'vitest'\n\ndescribe('Tasks', () => {\n test('shows a loading state at the start', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\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} />)\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n task 1 ...\"\n `)\n expect(firstTaskFunction).toHaveBeenCalled()\n })\n\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, 2000))\n })\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: async () => {},\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\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n subtask 1 ...\"\n `)\n\n expect(firstSubtaskFunction).toHaveBeenCalled()\n })\n\n test('supports skipping', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\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: async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n task 2 ...\"\n `)\n expect(firstTaskFunction).toHaveBeenCalledTimes(0)\n })\n\n test('supports skipping a subtask', async () => {\n // Given\n const firstSubTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\n })\n\n const secondSubTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\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\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n subtask 2 ...\"\n `)\n\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 await new Promise((resolve) => setTimeout(resolve, 2000))\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\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n task 1 ...\"\n `)\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 await new Promise((resolve) => setTimeout(resolve, 2000))\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 await taskHasRendered()\n\n // Then\n expect(unstyled(getLastFrameAfterUnmount(renderInstance)!)).toMatchInlineSnapshot('\"\"')\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 await new Promise((resolve) => setTimeout(resolve, 2000))\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\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n subtask 1 ...\"\n `)\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 await new Promise((resolve) => setTimeout(resolve, 2000))\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 await taskHasRendered()\n\n // Then\n expect(unstyled(getLastFrameAfterUnmount(renderInstance)!)).toMatchInlineSnapshot('\"\"')\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\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":"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","sourcesContent":["import {Task, Tasks} from './Tasks.js'\nimport {getLastFrameAfterUnmount, render} from '../../testing/ui.js'\nimport {unstyled} from '../../../../public/node/output.js'\nimport {AbortController} from '../../../../public/node/abort.js'\nimport React from 'react'\nimport {describe, expect, test, vi} from 'vitest'\n\ndescribe('Tasks', () => {\n test('shows a loading state at the start', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\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} />)\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n task 1 ...\"\n `)\n expect(firstTaskFunction).toHaveBeenCalled()\n })\n\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, 2000))\n })\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: async () => {},\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\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n subtask 1 ...\"\n `)\n\n expect(firstSubtaskFunction).toHaveBeenCalled()\n })\n\n test('supports skipping', async () => {\n // Given\n const firstTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\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: async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\n },\n }\n\n // When\n const renderInstance = render(<Tasks tasks={[firstTask, secondTask]} silent={false} />)\n\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n task 2 ...\"\n `)\n expect(firstTaskFunction).toHaveBeenCalledTimes(0)\n })\n\n test('supports skipping a subtask', async () => {\n // Given\n const firstSubTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\n })\n\n const secondSubTaskFunction = vi.fn(async () => {\n await new Promise((resolve) => setTimeout(resolve, 2000))\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\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n subtask 2 ...\"\n `)\n\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 await new Promise((resolve) => setTimeout(resolve, 2000))\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\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n task 1 ...\"\n `)\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 await new Promise((resolve) => setTimeout(resolve, 2000))\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 await taskHasRendered()\n\n // Then\n expect(unstyled(getLastFrameAfterUnmount(renderInstance)!)).toMatchInlineSnapshot('\"\"')\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 await new Promise((resolve) => setTimeout(resolve, 2000))\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\n await taskHasRendered()\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!)).toMatchInlineSnapshot(`\n \"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n subtask 1 ...\"\n `)\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 await new Promise((resolve) => setTimeout(resolve, 2000))\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 await taskHasRendered()\n\n // Then\n expect(unstyled(getLastFrameAfterUnmount(renderInstance)!)).toMatchInlineSnapshot('\"\"')\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\nasync function taskHasRendered() {\n await new Promise((resolve) => setTimeout(resolve, 100))\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextInput.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextInput.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAA;AACrE,OAAO,KAAK,EAAE,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AAChD,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAC,MAAM,KAAK,CAAA;AAClC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,OAAO,MAAM,SAAS,CAAA;AAc7B,MAAM,SAAS,GAAsC,CAAC,EACpD,KAAK,EAAE,aAAa,EACpB,YAAY,GAAG,EAAE,EACjB,QAAQ,EACR,WAAW,GAAG,EAAE,EAChB,OAAO,GAAG,CAAC,mBAAmB,EAAE,EAChC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EACpC,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,IAAI,GACG,EAAE,EAAE;IACnB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAE9E,gFAAgF;IAChF,SAAS,CAAC,GAAG,EAAE;QACb,eAAe,CAAC,CAAC,cAAc,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,aAAa,IAAI,EAAE,CAAA;YAEpC,IAAI,cAAc,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"TextInput.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextInput.tsx"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-nested-ternary */\nimport {shouldDisplayColors} from '../../../../public/node/output.js'\nimport React, {useEffect, useState} from 'react'\nimport {Text, useInput} from 'ink'\nimport chalk from 'chalk'\nimport figures from 'figures'\nimport type {FunctionComponent} from 'react'\n\ninterface TextInputProps {\n defaultValue?: string\n value: string\n onChange: (value: string) => void\n color?: string\n password?: boolean\n focus?: boolean\n placeholder?: string\n noColor?: boolean\n}\n\nconst TextInput: FunctionComponent<TextInputProps> = ({\n value: originalValue,\n defaultValue = '',\n onChange,\n placeholder = '',\n noColor = !shouldDisplayColors(),\n color = noColor ? undefined : 'cyan',\n password = false,\n focus = true,\n}: TextInputProps) => {\n const [cursorOffset, setCursorOffset] = useState((originalValue || '').length)\n\n // if the updated value is shorter than the last one we need to reset the cursor\n useEffect(() => {\n setCursorOffset((previousOffset) => {\n const newValue = originalValue || ''\n\n if (previousOffset > newValue.length - 1) {\n return newValue.length\n }\n\n return previousOffset\n })\n }, [originalValue])\n\n const value = password ? '*'.repeat(originalValue.length) : originalValue\n let renderedValue\n\n const renderPlaceholder = (value: string) => {\n return chalk.inverse(value[0]) + chalk.dim(value.slice(1))\n }\n\n const cursorChar = figures.square\n const defaultCursor = <Text backgroundColor={color}>{cursorChar}</Text>\n\n const placeholderText = defaultValue.length > 0 ? defaultValue : placeholder.length > 0 ? placeholder : ''\n\n const renderedPlaceholder = placeholderText.length > 0 ? renderPlaceholder(placeholderText) : defaultCursor\n\n // render cursor\n renderedValue = value\n .split('')\n .map((char, index) => {\n if (index === cursorOffset) {\n return noColor ? cursorChar : chalk.inverse(char)\n } else {\n return char\n }\n })\n .join('')\n\n if (cursorOffset === value.length) {\n renderedValue = (\n <Text>\n {renderedValue}\n {defaultCursor}\n </Text>\n )\n }\n\n useInput(\n (input, key) => {\n if (key.upArrow || key.downArrow || (key.ctrl && input === 'c') || (key.shift && key.tab) || key.return) {\n return\n } else if (key.tab) {\n if (originalValue.length === 0 && placeholderText) {\n onChange(placeholderText)\n setCursorOffset(placeholderText.length)\n return\n }\n }\n\n let nextCursorOffset = cursorOffset\n let nextValue = originalValue\n\n if (key.leftArrow) {\n if (cursorOffset > 0) {\n nextCursorOffset--\n }\n } else if (key.rightArrow) {\n if (cursorOffset < originalValue.length) {\n nextCursorOffset++\n }\n } else if (key.backspace || key.delete) {\n if (cursorOffset > 0) {\n nextValue = originalValue.slice(0, cursorOffset - 1) + originalValue.slice(cursorOffset, originalValue.length)\n nextCursorOffset--\n }\n } else {\n nextValue =\n originalValue.slice(0, cursorOffset) + input + originalValue.slice(cursorOffset, originalValue.length)\n nextCursorOffset += input.length\n }\n\n setCursorOffset(nextCursorOffset)\n\n if (nextValue !== originalValue) {\n onChange(nextValue)\n }\n },\n {isActive: focus},\n )\n\n return <Text color={color}>{value.length > 0 ? renderedValue : renderedPlaceholder}</Text>\n}\n\nexport {TextInput}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextPrompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAyB,aAAa,EAAC,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAA;AACvC,OAAO,SAAS,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAC,sBAAsB,EAAC,MAAM,iBAAiB,CAAA;AAEtD,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,SAAS,EAAE,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,EAAoB,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AAChF,OAAO,EAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAC,MAAM,KAAK,CAAA;AAC/C,OAAO,OAAO,MAAM,SAAS,CAAA;AAe7B,MAAM,UAAU,GAAuC,CAAC,EACtD,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,YAAY,GAAG,EAAE,EACjB,QAAQ,GAAG,KAAK,EAChB,UAAU,GAAG,KAAK,EAClB,mBAAmB,GAAG,SAAS,EAC/B,WAAW,EACX,OAAO,EACP,aAAa,GAAG,EAAE,GACnB,EAAE,EAAE;IACH,IAAI,QAAQ,IAAI,YAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"TextPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["import {TextInput} from './TextInput.js'\nimport {InlineToken, TokenItem, TokenizedText} from './TokenizedText.js'\nimport {handleCtrlC} from '../../ui.js'\nimport useLayout from '../hooks/use-layout.js'\nimport {messageWithPunctuation} from '../utilities.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport useAbortSignal from '../hooks/use-abort-signal.js'\nimport usePrompt, {PromptState} from '../hooks/use-prompt.js'\nimport React, {FunctionComponent, useCallback, useEffect, useState} from 'react'\nimport {Box, useApp, useInput, Text} from 'ink'\nimport figures from 'figures'\n\nexport interface TextPromptProps {\n message: TokenItem\n onSubmit: (value: string) => void\n defaultValue?: string\n password?: boolean\n validate?: (value: string) => string | undefined\n allowEmpty?: boolean\n emptyDisplayedValue?: string\n abortSignal?: AbortSignal\n preview?: (value: string) => TokenItem<InlineToken>\n initialAnswer?: string\n}\n\nconst TextPrompt: FunctionComponent<TextPromptProps> = ({\n message,\n onSubmit,\n validate,\n defaultValue = '',\n password = false,\n allowEmpty = false,\n emptyDisplayedValue = '(empty)',\n abortSignal,\n preview,\n initialAnswer = '',\n}) => {\n if (password && defaultValue) {\n throw new Error(\"Can't use defaultValue with password\")\n }\n\n const validateAnswer = useCallback(\n (value: string): string | undefined => {\n if (validate) {\n return validate(value)\n }\n\n if (value.length === 0 && !allowEmpty) return 'Type an answer to the prompt.'\n\n return undefined\n },\n [allowEmpty, validate],\n )\n\n const {oneThird} = useLayout()\n const {promptState, setPromptState, answer, setAnswer} = usePrompt<string>({\n initialAnswer,\n })\n const answerOrDefault = answer.length > 0 ? answer : defaultValue\n const displayEmptyValue = answerOrDefault === ''\n const displayedAnswer = displayEmptyValue ? emptyDisplayedValue : answerOrDefault\n const {exit: unmountInk} = useApp()\n const [error, setError] = useState<string | undefined>(undefined)\n const color = promptState === PromptState.Error ? 'red' : 'cyan'\n const underline = new Array(oneThird - 3).fill('▔')\n const {isAborted} = useAbortSignal(abortSignal)\n\n useInput((input, key) => {\n handleCtrlC(input, key)\n\n if (key.return) {\n const error = validateAnswer(answerOrDefault)\n\n if (error) {\n setPromptState(PromptState.Error)\n setError(error)\n } else {\n setPromptState(PromptState.Submitted)\n }\n }\n })\n\n useEffect(() => {\n if (promptState === PromptState.Submitted) {\n onSubmit(answerOrDefault)\n unmountInk()\n }\n }, [answerOrDefault, onSubmit, promptState, unmountInk])\n\n return isAborted ? null : (\n <Box flexDirection=\"column\" marginBottom={1} width={oneThird}>\n <Box>\n <Box marginRight={2}>\n <Text>?</Text>\n </Box>\n <TokenizedText item={messageWithPunctuation(message)} />\n </Box>\n {promptState === PromptState.Submitted ? (\n <Box>\n <Box marginRight={2}>\n <Text color=\"cyan\">{figures.tick}</Text>\n </Box>\n\n <Box flexGrow={1}>\n <Text color=\"cyan\" dimColor={displayEmptyValue}>\n {password ? '*'.repeat(answer.length) : displayedAnswer}\n </Text>\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n <Box>\n <Box marginRight={2}>\n <Text color={color}>{`>`}</Text>\n </Box>\n <Box flexGrow={1}>\n <TextInput\n value={answer}\n onChange={(answer) => {\n setAnswer(answer)\n setPromptState(PromptState.Idle)\n }}\n defaultValue={defaultValue}\n color={color}\n password={password}\n />\n </Box>\n </Box>\n <Box marginLeft={3}>\n <Text color={color}>{underline}</Text>\n </Box>\n {promptState === PromptState.Error ? (\n <Box marginLeft={3}>\n <Text color={color}>{error}</Text>\n </Box>\n ) : null}\n {promptState !== PromptState.Error && preview ? (\n <Box marginLeft={3}>\n <TokenizedText item={preview(answerOrDefault)} />\n </Box>\n ) : null}\n </Box>\n )}\n </Box>\n )\n}\n\nexport {TextPrompt}\n"]}
|
|
@@ -1,25 +1,13 @@
|
|
|
1
1
|
import { FunctionComponent } from 'react';
|
|
2
|
-
export interface CommandToken {
|
|
3
|
-
command: string;
|
|
4
|
-
}
|
|
5
2
|
export interface LinkToken {
|
|
6
3
|
link: {
|
|
7
4
|
label?: string;
|
|
8
5
|
url: string;
|
|
9
6
|
};
|
|
10
7
|
}
|
|
11
|
-
export interface CharToken {
|
|
12
|
-
char: string;
|
|
13
|
-
}
|
|
14
8
|
export interface UserInputToken {
|
|
15
9
|
userInput: string;
|
|
16
10
|
}
|
|
17
|
-
export interface SubduedToken {
|
|
18
|
-
subdued: string;
|
|
19
|
-
}
|
|
20
|
-
export interface FilePathToken {
|
|
21
|
-
filePath: string;
|
|
22
|
-
}
|
|
23
11
|
export interface ListToken {
|
|
24
12
|
list: {
|
|
25
13
|
title?: TokenItem<InlineToken>;
|
|
@@ -30,16 +18,21 @@ export interface ListToken {
|
|
|
30
18
|
export interface BoldToken {
|
|
31
19
|
bold: string;
|
|
32
20
|
}
|
|
33
|
-
export
|
|
21
|
+
export type Token = string | {
|
|
22
|
+
command: string;
|
|
23
|
+
} | LinkToken | {
|
|
24
|
+
char: string;
|
|
25
|
+
} | UserInputToken | {
|
|
26
|
+
subdued: string;
|
|
27
|
+
} | {
|
|
28
|
+
filePath: string;
|
|
29
|
+
} | ListToken | BoldToken | {
|
|
34
30
|
info: string;
|
|
35
|
-
}
|
|
36
|
-
export interface WarnToken {
|
|
31
|
+
} | {
|
|
37
32
|
warn: string;
|
|
38
|
-
}
|
|
39
|
-
export interface ErrorToken {
|
|
33
|
+
} | {
|
|
40
34
|
error: string;
|
|
41
|
-
}
|
|
42
|
-
export type Token = string | CommandToken | LinkToken | CharToken | UserInputToken | SubduedToken | FilePathToken | ListToken | BoldToken | InfoToken | WarnToken | ErrorToken;
|
|
35
|
+
};
|
|
43
36
|
export type InlineToken = Exclude<Token, ListToken>;
|
|
44
37
|
export type TokenItem<T extends Token = Token> = T | T[];
|
|
45
38
|
export declare function tokenItemToString(token: TokenItem): string;
|