diff --git a/.changeset/perfect-guests-hunt.md b/.changeset/perfect-guests-hunt.md new file mode 100644 index 000000000000..f90ddd650ce9 --- /dev/null +++ b/.changeset/perfect-guests-hunt.md @@ -0,0 +1,5 @@ +--- +"vercel": patch +--- + +[cli] refactor confirm component to use `client.input.confirm` interface diff --git a/packages/cli/src/commands/alias/rm.ts b/packages/cli/src/commands/alias/rm.ts index 508059798e7a..58c8e99f689c 100644 --- a/packages/cli/src/commands/alias/rm.ts +++ b/packages/cli/src/commands/alias/rm.ts @@ -5,7 +5,6 @@ import type Client from '../../util/client'; import getScope from '../../util/get-scope'; import removeAliasById from '../../util/alias/remove-alias-by-id'; import stamp from '../../util/output/stamp'; -import confirm from '../../util/input/confirm'; import findAliasByAliasOrId from '../../util/alias/find-alias-by-alias-or-id'; import { isValidName } from '../../util/is-valid-name'; import { getCommandName } from '../../util/pkg-name'; @@ -100,5 +99,5 @@ async function confirmAliasRemove(client: Client, alias: Alias) { output.log('The following alias will be removed permanently'); output.print(` ${tbl}\n`); - return confirm(client, chalk.red('Are you sure?'), false); + return client.input.confirm(chalk.red('Are you sure?'), false); } diff --git a/packages/cli/src/commands/build/index.ts b/packages/cli/src/commands/build/index.ts index 0eb6144617b3..3ba61c6f9d1d 100644 --- a/packages/cli/src/commands/build/index.ts +++ b/packages/cli/src/commands/build/index.ts @@ -60,7 +60,6 @@ import { CantParseJSONFile } from '../../util/errors-ts'; import { parseArguments } from '../../util/get-args'; import { staticFiles as getFiles } from '../../util/get-files'; import { getFlagsSpecification } from '../../util/get-flags-specification'; -import confirm from '../../util/input/confirm'; import cmd from '../../util/output/cmd'; import stamp from '../../util/output/stamp'; import parseTarget from '../../util/parse-target'; @@ -206,8 +205,7 @@ export default async function main(client: Client): Promise { return 1; } - confirmed = await confirm( - client, + confirmed = await client.input.confirm( `No Project Settings found locally. Run ${cli.getCommandName( 'pull' )} for retrieving them?`, diff --git a/packages/cli/src/commands/domains/buy.ts b/packages/cli/src/commands/domains/buy.ts index 15c725501c64..7ab83a7a1488 100644 --- a/packages/cli/src/commands/domains/buy.ts +++ b/packages/cli/src/commands/domains/buy.ts @@ -6,7 +6,6 @@ import getDomainPrice from '../../util/domains/get-domain-price'; import getDomainStatus from '../../util/domains/get-domain-status'; import getScope from '../../util/get-scope'; import param from '../../util/output/param'; -import confirm from '../../util/input/confirm'; import purchaseDomain from '../../util/domains/purchase-domain'; import stamp from '../../util/output/stamp'; import { getCommandName } from '../../util/pkg-name'; @@ -97,8 +96,7 @@ export default async function buy(client: Client, argv: string[]) { autoRenew = true; } else { if ( - !(await confirm( - client, + !(await client.input.confirm( `Buy now for ${chalk.bold(`$${price}`)} (${`${period}yr${ period > 1 ? 's' : '' }`})?`, @@ -108,8 +106,7 @@ export default async function buy(client: Client, argv: string[]) { return 0; } - autoRenew = await confirm( - client, + autoRenew = await client.input.confirm( renewalPrice.period === 1 ? `Auto renew yearly for ${chalk.bold(`$${price}`)}?` : `Auto renew every ${renewalPrice.period} years for ${chalk.bold( diff --git a/packages/cli/src/commands/domains/move.ts b/packages/cli/src/commands/domains/move.ts index 1c23c66a640e..afb24bd262d0 100644 --- a/packages/cli/src/commands/domains/move.ts +++ b/packages/cli/src/commands/domains/move.ts @@ -7,7 +7,6 @@ import isRootDomain from '../../util/is-root-domain'; import param from '../../util/output/param'; import getDomainAliases from '../../util/alias/get-domain-aliases'; import getDomainByName from '../../util/domains/get-domain-by-name'; -import confirm from '../../util/input/confirm'; import getTeams from '../../util/teams/get-teams'; import { getCommandName } from '../../util/pkg-name'; import output from '../../output-manager'; @@ -82,8 +81,7 @@ export default async function move(client: Client, argv: string[]) { )} will have 24 hours to accept your move request before it expires.` ); if ( - !(await confirm( - client, + !(await client.input.confirm( `Are you sure you want to move ${param(domainName)} to ${param( destination )}?`, @@ -104,8 +102,7 @@ export default async function move(client: Client, argv: string[]) { )} will be removed. Run ${getCommandName(`alias ls`)} to list them.` ); if ( - !(await confirm( - client, + !(await client.input.confirm( `Are you sure you want to move ${param(domainName)}?`, false )) diff --git a/packages/cli/src/commands/domains/rm.ts b/packages/cli/src/commands/domains/rm.ts index 193fa8194874..236f7685bb6b 100644 --- a/packages/cli/src/commands/domains/rm.ts +++ b/packages/cli/src/commands/domains/rm.ts @@ -11,7 +11,6 @@ import removeDomainByName from '../../util/domains/remove-domain-by-name'; import stamp from '../../util/output/stamp'; import * as ERRORS from '../../util/errors-ts'; import param from '../../util/output/param'; -import confirm from '../../util/input/confirm'; import setCustomSuffix from '../../util/domains/set-custom-suffix'; import { findProjectsForDomain } from '../../util/projects/find-projects-for-domain'; import { getCommandName } from '../../util/pkg-name'; @@ -95,8 +94,7 @@ export default async function rm(client: Client, argv: string[]) { const skipConfirmation = opts['--yes'] || false; if ( !skipConfirmation && - !(await confirm( - client, + !(await client.input.confirm( `Are you sure you want to remove ${param(domainName)}?`, false )) @@ -236,8 +234,7 @@ async function removeDomain( if ( !skipConfirmation && - !(await confirm( - client, + !(await client.input.confirm( `Remove conflicts associated with domain?`, false )) diff --git a/packages/cli/src/commands/domains/transfer-in.ts b/packages/cli/src/commands/domains/transfer-in.ts index f14e6782889e..e4ee7ba2e2a3 100644 --- a/packages/cli/src/commands/domains/transfer-in.ts +++ b/packages/cli/src/commands/domains/transfer-in.ts @@ -8,7 +8,6 @@ import stamp from '../../util/output/stamp'; import getAuthCode from '../../util/domains/get-auth-code'; import getDomainPrice from '../../util/domains/get-domain-price'; import checkTransfer from '../../util/domains/check-transfer'; -import confirm from '../../util/input/confirm'; import isRootDomain from '../../util/is-root-domain'; import { getCommandName } from '../../util/pkg-name'; import { DomainsTransferInTelemetryClient } from '../../util/telemetry/commands/domains/transfer-in'; @@ -84,8 +83,7 @@ export default async function transferIn(client: Client, argv: string[]) { const authCode = await getAuthCode(client, opts['--code']); - const shouldTransfer = await confirm( - client, + const shouldTransfer = await client.input.confirm( transferPolicy === 'no-change' ? `Transfer now for ${chalk.bold(`$${price}`)}?` : `Transfer now with 1yr renewal for ${chalk.bold(`$${price}`)}?`, diff --git a/packages/cli/src/commands/env/pull.ts b/packages/cli/src/commands/env/pull.ts index b5ab9c0b0e63..ddce36a20c66 100644 --- a/packages/cli/src/commands/env/pull.ts +++ b/packages/cli/src/commands/env/pull.ts @@ -4,7 +4,6 @@ import { closeSync, openSync, readSync } from 'fs'; import { resolve } from 'path'; import type Client from '../../util/client'; import { emoji, prependEmoji } from '../../util/emoji'; -import confirm from '../../util/input/confirm'; import param from '../../util/output/param'; import stamp from '../../util/output/stamp'; import { getCommandName } from '../../util/pkg-name'; @@ -148,8 +147,7 @@ export async function envPullCommandLogic( } else if ( exists && !skipConfirmation && - !(await confirm( - client, + !(await client.input.confirm( `Found existing file ${param(filename)}. Do you want to overwrite?`, false )) diff --git a/packages/cli/src/commands/env/rm.ts b/packages/cli/src/commands/env/rm.ts index cfcc8f923400..5e9344350252 100644 --- a/packages/cli/src/commands/env/rm.ts +++ b/packages/cli/src/commands/env/rm.ts @@ -1,5 +1,4 @@ import chalk from 'chalk'; -import confirm from '../../util/input/confirm'; import removeEnvRecord from '../../util/env/remove-env-record'; import getEnvRecords from '../../util/env/get-env-records'; import formatEnvironments from '../../util/env/format-environments'; @@ -109,8 +108,7 @@ export default async function rm(client: Client, argv: string[]) { const skipConfirmation = opts['--yes']; if ( !skipConfirmation && - !(await confirm( - client, + !(await client.input.confirm( `Removing Environment Variable ${param(env.key)} from ${formatEnvironments( link, env, diff --git a/packages/cli/src/commands/git/connect.ts b/packages/cli/src/commands/git/connect.ts index 8bb80bfdfba3..278cf2d787f0 100644 --- a/packages/cli/src/commands/git/connect.ts +++ b/packages/cli/src/commands/git/connect.ts @@ -4,7 +4,6 @@ import { join } from 'path'; import type { Org, Project, ProjectLinkData } from '@vercel-internals/types'; import type Client from '../../util/client'; import { parseGitConfig, pluckRemoteUrls } from '../../util/create-git-meta'; -import confirm from '../../util/input/confirm'; import list, { type ListChoice } from '../../util/input/list'; import link from '../../util/output/link'; import { getCommandName } from '../../util/pkg-name'; @@ -327,8 +326,7 @@ async function promptConnectArg({ let shouldConnect = yes; if (!shouldConnect) { const { url: repoUrlFromArg } = repoInfoFromArg; - shouldConnect = await confirm( - client, + shouldConnect = await client.input.confirm( `Do you still want to connect ${link(repoUrlFromArg)}?`, false ); @@ -408,8 +406,7 @@ async function confirmRepoConnect( ) { let shouldReplaceProject = yes; if (!shouldReplaceProject) { - shouldReplaceProject = await confirm( - client, + shouldReplaceProject = await client.input.confirm( `Looks like you already have a ${formatProvider( connectedProvider )} repository connected: ${chalk.cyan( diff --git a/packages/cli/src/commands/git/disconnect.ts b/packages/cli/src/commands/git/disconnect.ts index 48b896119744..afced4b3eaa2 100644 --- a/packages/cli/src/commands/git/disconnect.ts +++ b/packages/cli/src/commands/git/disconnect.ts @@ -1,5 +1,5 @@ import chalk from 'chalk'; -import confirm from '../../util/input/confirm'; + import { getCommandName } from '../../util/pkg-name'; import { disconnectGitProvider } from '../../util/git/connect-git-provider'; import output from '../../output-manager'; @@ -64,8 +64,7 @@ export default async function disconnect(client: Client, argv: string[]) { ); const confirmDisconnect = autoConfirm || - (await confirm( - client, + (await client.input.confirm( `Are you sure you want to disconnect ${chalk.cyan( `${linkOrg}/${repo}` )} from your project?`, diff --git a/packages/cli/src/commands/init/init.ts b/packages/cli/src/commands/init/init.ts index 32751c6e80bd..e0cdf4288a21 100644 --- a/packages/cli/src/commands/init/init.ts +++ b/packages/cli/src/commands/init/init.ts @@ -6,7 +6,6 @@ import chalk from 'chalk'; // @ts-ignore import listInput from '../../util/input/list'; import listItem from '../../util/output/list-item'; -import confirm from '../../util/input/confirm'; import toHumanPath from '../../util/humanize-path'; import type Client from '../../util/client'; import cmd from '../../util/output/cmd'; @@ -224,7 +223,9 @@ async function guess(client: Client, exampleList: string[], name: string) { const found = didYouMean(name, exampleList, 0.7); if (typeof found === 'string') { - if (await confirm(client, `Did you mean ${chalk.bold(found)}?`, false)) { + if ( + await client.input.confirm(`Did you mean ${chalk.bold(found)}?`, false) + ) { return found; } } else { diff --git a/packages/cli/src/commands/integration-resource/disconnect.ts b/packages/cli/src/commands/integration-resource/disconnect.ts index 3c0c158713c6..ee7ac3db1a1d 100644 --- a/packages/cli/src/commands/integration-resource/disconnect.ts +++ b/packages/cli/src/commands/integration-resource/disconnect.ts @@ -5,7 +5,6 @@ import { parseArguments } from '../../util/get-args'; import { getFlagsSpecification } from '../../util/get-flags-specification'; import getScope from '../../util/get-scope'; import { printError } from '../../util/error'; -import confirm from '../../util/input/confirm'; import { disconnectResourceFromAllProjects, disconnectResourceFromProject, @@ -217,7 +216,7 @@ async function confirmDisconnectProject( output.log( `The resource ${chalk.bold(resource.name)} will be disconnected from project ${chalk.bold(project.name)}.` ); - return confirm(client, `${chalk.red('Are you sure?')}`, false); + return client.input.confirm(`${chalk.red('Are you sure?')}`, false); } async function confirmDisconnectAllProjects( @@ -231,5 +230,5 @@ async function confirmDisconnectAllProjects( for (const project of resource.projectsMetadata) { output.print(` ${project.name}\n`); } - return confirm(client, chalk.red('Are you sure?'), false); + return client.input.confirm(chalk.red('Are you sure?'), false); } diff --git a/packages/cli/src/commands/integration-resource/remove-resource.ts b/packages/cli/src/commands/integration-resource/remove-resource.ts index 81d240aec455..fee757451fa8 100644 --- a/packages/cli/src/commands/integration-resource/remove-resource.ts +++ b/packages/cli/src/commands/integration-resource/remove-resource.ts @@ -6,7 +6,6 @@ import { parseArguments } from '../../util/get-args'; import { getFlagsSpecification } from '../../util/get-flags-specification'; import getScope from '../../util/get-scope'; import { printError } from '../../util/error'; -import confirm from '../../util/input/confirm'; import { deleteResource as _deleteResource } from '../../util/integration-resource/delete-resource'; import { getResources } from '../../util/integration-resource/get-resources'; import { @@ -144,5 +143,5 @@ async function confirmDeleteResource( resource: Resource ): Promise { output.log(`${chalk.bold(resource.name)} will be deleted permanently.`); - return confirm(client, `${chalk.red('Are you sure?')}`, false); + return client.input.confirm(`${chalk.red('Are you sure?')}`, false); } diff --git a/packages/cli/src/commands/integration/add.ts b/packages/cli/src/commands/integration/add.ts index 5915aefa6fa2..99508f816e52 100644 --- a/packages/cli/src/commands/integration/add.ts +++ b/packages/cli/src/commands/integration/add.ts @@ -23,7 +23,6 @@ import { fetchInstallations } from '../../util/integration/fetch-installations'; import { fetchIntegration } from '../../util/integration/fetch-integration'; import output from '../../output-manager'; import { IntegrationAddTelemetryClient } from '../../util/telemetry/commands/integration/add'; -import confirm from '../../util/input/confirm'; export async function add(client: Client, args: string[]) { const telemetry = new IntegrationAddTelemetryClient({ @@ -139,8 +138,7 @@ export async function add(client: Client, args: string[]) { return projectLink.exitCode; } - const openInWeb = await confirm( - client, + const openInWeb = await client.input.confirm( !installation ? 'Terms have not been accepted. Open Vercel Dashboard?' : 'This resource must be provisioned through the Web UI. Open Vercel Dashboard?', @@ -175,8 +173,7 @@ async function getOptionalLinkedProject(client: Client) { return; } - const shouldLinkToProject = await confirm( - client, + const shouldLinkToProject = await client.input.confirm( 'Do you want to link this resource to the current project?', true ); @@ -375,7 +372,7 @@ async function confirmProductSelection( `${chalk.dim(`- ${chalk.bold('Plan:')} ${billingPlan.name}`)}\n` ); - return confirm(client, 'Confirm selection?', true); + return client.input.confirm('Confirm selection?', true); } async function provisionStorageProduct( diff --git a/packages/cli/src/commands/integration/remove-integration.ts b/packages/cli/src/commands/integration/remove-integration.ts index 289da52b26e0..eca05a384cfc 100644 --- a/packages/cli/src/commands/integration/remove-integration.ts +++ b/packages/cli/src/commands/integration/remove-integration.ts @@ -6,7 +6,6 @@ import { parseArguments } from '../../util/get-args'; import { getFlagsSpecification } from '../../util/get-flags-specification'; import getScope from '../../util/get-scope'; import { printError } from '../../util/error'; -import confirm from '../../util/input/confirm'; import { getFirstConfiguration } from '../../util/integration/fetch-marketplace-integrations'; import { removeIntegration } from '../../util/integration/remove-integration'; import { removeSubcommand } from './command'; @@ -102,5 +101,5 @@ async function confirmIntegrationRemoval( output.log( `The ${chalk.bold(integration)} integration will be removed permanently from team ${chalk.bold(team.name)}.` ); - return confirm(client, `${chalk.red('Are you sure?')}`, false); + return client.input.confirm(`${chalk.red('Are you sure?')}`, false); } diff --git a/packages/cli/src/commands/project/rm.ts b/packages/cli/src/commands/project/rm.ts index 8894b0d715c2..f9b6a9b404f3 100644 --- a/packages/cli/src/commands/project/rm.ts +++ b/packages/cli/src/commands/project/rm.ts @@ -3,7 +3,6 @@ import ms from 'ms'; import type Client from '../../util/client'; import { emoji, prependEmoji } from '../../util/emoji'; import { isAPIError } from '../../util/errors-ts'; -import confirm from '../../util/input/confirm'; import { getCommandName } from '../../util/pkg-name'; import { ProjectRmTelemetryClient } from '../../util/telemetry/commands/project/rm'; import output from '../../output-manager'; @@ -87,5 +86,8 @@ async function readConfirmation( ) ); - return await confirm(client, `${chalk.bold.red('Are you sure?')}`, false); + return await client.input.confirm( + `${chalk.bold.red('Are you sure?')}`, + false + ); } diff --git a/packages/cli/src/commands/promote/request-promote.ts b/packages/cli/src/commands/promote/request-promote.ts index 72fb05717436..81fe78484669 100644 --- a/packages/cli/src/commands/promote/request-promote.ts +++ b/packages/cli/src/commands/promote/request-promote.ts @@ -4,7 +4,6 @@ import { getCommandName } from '../../util/pkg-name'; import getProjectByDeployment from '../../util/projects/get-project-by-deployment'; import ms from 'ms'; import promoteStatus from './status'; -import confirm from '../../util/input/confirm'; import output from '../../output-manager'; interface DeploymentCreateResponsePartial { @@ -41,7 +40,7 @@ export default async function requestPromote({ } else { const question = 'This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?'; - promoteByCreation = await confirm(client, question, false); + promoteByCreation = await client.input.confirm(question, false); if (!promoteByCreation) { output.error('Canceled'); return 0; diff --git a/packages/cli/src/util/client.ts b/packages/cli/src/util/client.ts index b6710fbea079..b433586d1a73 100644 --- a/packages/cli/src/util/client.ts +++ b/packages/cli/src/util/client.ts @@ -111,8 +111,11 @@ export default class Client extends EventEmitter implements Stdio { ), expand: (opts: Parameters[0]) => expand({ theme, ...opts }, { input: this.stdin, output: this.stderr }), - confirm: (opts: Parameters[0]) => - confirm({ theme, ...opts }, { input: this.stdin, output: this.stderr }), + confirm: (message: string, default_value: boolean) => + confirm( + { theme, message, default: default_value }, + { input: this.stdin, output: this.stderr } + ), select: (opts: Parameters>[0]) => select( { theme, ...opts }, diff --git a/packages/cli/src/util/dns/get-dns-data.ts b/packages/cli/src/util/dns/get-dns-data.ts index fd8dd50a8a4a..f97ddff44c3b 100644 --- a/packages/cli/src/util/dns/get-dns-data.ts +++ b/packages/cli/src/util/dns/get-dns-data.ts @@ -1,6 +1,5 @@ import chalk from 'chalk'; import type { DNSRecordData } from '@vercel-internals/types'; -import confirm from '../input/confirm'; import type Client from '../client'; import output from '../../output-manager'; @@ -88,7 +87,7 @@ export default async function getDNSData( } async function verifyData(client: Client) { - return confirm(client, 'Is this correct?', false); + return client.input.confirm('Is this correct?', false); } async function getRecordName(client: Client, type: string) { diff --git a/packages/cli/src/util/domains/purchase-domain-if-available.ts b/packages/cli/src/util/domains/purchase-domain-if-available.ts index 3f55702ce7ba..0f3536c1da98 100644 --- a/packages/cli/src/util/domains/purchase-domain-if-available.ts +++ b/packages/cli/src/util/domains/purchase-domain-if-available.ts @@ -5,7 +5,6 @@ import type Client from '../client'; import eraseLines from '../output/erase-lines'; import getDomainPrice from './get-domain-price'; import getDomainStatus from './get-domain-status'; -import confirm from '../input/confirm'; import purchaseDomain from './purchase-domain'; import stamp from '../output/stamp'; import * as ERRORS from '../errors-ts'; @@ -50,8 +49,7 @@ export default async function purchaseDomainIfAvailable( ); if ( - !(await confirm( - client, + !(await client.input.confirm( `Buy ${chalk.underline(domain)} for ${chalk.bold( `$${price}` )} (${plural('yr', period, true)})?`, diff --git a/packages/cli/src/util/input/confirm.ts b/packages/cli/src/util/input/confirm.ts deleted file mode 100644 index 7ebe3377ad12..000000000000 --- a/packages/cli/src/util/input/confirm.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type Client from '../client'; - -export default async function confirm( - client: Client, - message: string, - preferred: boolean -): Promise { - return client.input.confirm({ - message, - default: preferred, - }); -} diff --git a/packages/cli/src/util/input/edit-project-settings.ts b/packages/cli/src/util/input/edit-project-settings.ts index 758a92b7527f..37bdffaca85c 100644 --- a/packages/cli/src/util/input/edit-project-settings.ts +++ b/packages/cli/src/util/input/edit-project-settings.ts @@ -1,4 +1,3 @@ -import confirm from './confirm'; import chalk from 'chalk'; import { frameworkList, type Framework } from '@vercel/frameworks'; import type Client from '../client'; @@ -118,7 +117,7 @@ export async function editProjectSettings( // Prompt the user if they want to modify any settings not defined by local configuration. if ( autoConfirm || - !(await confirm(client, 'Want to modify these settings?', false)) + !(await client.input.confirm('Want to modify these settings?', false)) ) { return settings; } diff --git a/packages/cli/src/util/input/input-project.ts b/packages/cli/src/util/input/input-project.ts index 6246fa440318..bcab68300353 100644 --- a/packages/cli/src/util/input/input-project.ts +++ b/packages/cli/src/util/input/input-project.ts @@ -1,5 +1,4 @@ import type Client from '../client'; -import confirm from './confirm'; import getProjectByIdOrName from '../projects/get-project-by-id-or-name'; import chalk from 'chalk'; import { ProjectNotFound } from '../../util/errors-ts'; @@ -46,16 +45,14 @@ export default async function inputProject( if (!detectedProject) { // did not auto-detect a project to link - shouldLinkProject = await confirm( - client, + shouldLinkProject = await client.input.confirm( `Link to existing project?`, false ); } else { // auto-detected a project to link if ( - await confirm( - client, + await client.input.confirm( `Found project ${chalk.cyan( `“${org.slug}/${detectedProject.name}”` )}. Link to it?`, @@ -66,8 +63,7 @@ export default async function inputProject( } // user doesn't want to link the auto-detected project - shouldLinkProject = await confirm( - client, + shouldLinkProject = await client.input.confirm( `Link to different existing project?`, true ); diff --git a/packages/cli/src/util/link/repo.ts b/packages/cli/src/util/link/repo.ts index ee903244fa3d..8824be49a03e 100644 --- a/packages/cli/src/util/link/repo.ts +++ b/packages/cli/src/util/link/repo.ts @@ -6,7 +6,6 @@ import slugify from '@sindresorhus/slugify'; import { basename, join, normalize } from 'path'; import { normalizePath, traverseUpDirectories } from '@vercel/build-utils'; import { lstat, readJSON, outputJSON } from 'fs-extra'; -import confirm from '../input/confirm'; import toHumanPath from '../humanize-path'; import { VERCEL_DIR, VERCEL_DIR_REPO, writeReadme } from '../projects/link'; import { getRemoteUrls } from '../create-git-meta'; @@ -105,8 +104,7 @@ export async function ensureRepoLink( // Not yet linked, so prompt user to begin linking const shouldLink = yes || - (await confirm( - client, + (await client.input.confirm( `Link Git repository at ${chalk.cyan( `“${toHumanPath(rootPath)}”` )} to your Project(s)?`, diff --git a/packages/cli/src/util/link/setup-and-link.ts b/packages/cli/src/util/link/setup-and-link.ts index cffe21af1aab..d3984aa123e5 100644 --- a/packages/cli/src/util/link/setup-and-link.ts +++ b/packages/cli/src/util/link/setup-and-link.ts @@ -15,7 +15,7 @@ import { import createProject from '../projects/create-project'; import type Client from '../client'; import { printError } from '../error'; -import confirm from '../input/confirm'; + import toHumanPath from '../humanize-path'; import { isDirectory } from '../config/global-path'; import selectOrg from '../input/select-org'; @@ -84,8 +84,7 @@ export default async function setupAndLink( const shouldStartSetup = autoConfirm || - (await confirm( - client, + (await client.input.confirm( `${setupMsg} ${chalk.cyan(`“${toHumanPath(path)}”`)}?`, true )); diff --git a/packages/cli/src/util/login/reauthenticate.ts b/packages/cli/src/util/login/reauthenticate.ts index 026a32e224b4..91e7c4aefb94 100644 --- a/packages/cli/src/util/login/reauthenticate.ts +++ b/packages/cli/src/util/login/reauthenticate.ts @@ -2,7 +2,6 @@ import { bold } from 'chalk'; import doSamlLogin from './saml'; import showLoginPrompt from './prompt'; import type { LoginResult, SAMLError } from './types'; -import confirm from '../input/confirm'; import type Client from '../client'; import output from '../../output-manager'; @@ -15,7 +14,7 @@ export default async function reauthenticate( output.log( `You must re-authenticate with SAML to use ${bold(error.scope)} scope.` ); - if (await confirm(client, `Log in with SAML?`, true)) { + if (await client.input.confirm(`Log in with SAML?`, true)) { return doSamlLogin(client, error.teamId); } } else { diff --git a/packages/cli/src/util/validate-paths.ts b/packages/cli/src/util/validate-paths.ts index 751639df47c1..fe6c0dd85caa 100644 --- a/packages/cli/src/util/validate-paths.ts +++ b/packages/cli/src/util/validate-paths.ts @@ -1,7 +1,6 @@ import { lstat } from 'fs-extra'; import chalk from 'chalk'; import { homedir } from 'os'; -import confirm from './input/confirm'; import toHumanPath from './humanize-path'; import type Client from './client'; import output from '../output-manager'; @@ -77,8 +76,7 @@ export default async function validatePaths( // ask confirmation if the directory is home if (path === homedir()) { - const shouldDeployHomeDirectory = await confirm( - client, + const shouldDeployHomeDirectory = await client.input.confirm( `You are deploying your home directory. Do you want to continue?`, false ); diff --git a/packages/cli/test/unit/util/confirm.test.ts b/packages/cli/test/unit/util/confirm.test.ts index f9de8a9cd062..b09258679257 100644 --- a/packages/cli/test/unit/util/confirm.test.ts +++ b/packages/cli/test/unit/util/confirm.test.ts @@ -1,32 +1,31 @@ import { describe, expect, it } from 'vitest'; -import confirm from '../../../src/util/input/confirm'; import { client } from '../../mocks/client'; describe('confirm()', () => { it('should work with multiple prompts', async () => { // true (explicit) - let confirmedPromise = confirm(client, 'Explictly true?', false); + let confirmedPromise = client.input.confirm('Explictly true?', false); await expect(client.stderr).toOutput('Explictly true? (y/N)'); client.stdin.write('yes\n'); let confirmed = await confirmedPromise; expect(confirmed).toEqual(true); // false (explicit) - confirmedPromise = confirm(client, 'Explicitly false?', true); + confirmedPromise = client.input.confirm('Explicitly false?', true); await expect(client.stderr).toOutput('Explicitly false? (Y/n)'); client.stdin.write('no\n'); confirmed = await confirmedPromise; expect(confirmed).toEqual(false); // true (default) - confirmedPromise = confirm(client, 'Default true?', true); + confirmedPromise = client.input.confirm('Default true?', true); await expect(client.stderr).toOutput('Default true? (Y/n)'); client.stdin.write('\n'); confirmed = await confirmedPromise; expect(confirmed).toEqual(true); // false (default) - confirmedPromise = confirm(client, 'Default false?', false); + confirmedPromise = client.input.confirm('Default false?', false); await expect(client.stderr).toOutput('Default false? (y/N)'); client.stdin.write('\n'); confirmed = await confirmedPromise; diff --git a/packages/cli/test/unit/util/input/playground.test.ts b/packages/cli/test/unit/util/input/playground.test.ts index c672a126fed8..0cb0346ac510 100644 --- a/packages/cli/test/unit/util/input/playground.test.ts +++ b/packages/cli/test/unit/util/input/playground.test.ts @@ -195,9 +195,7 @@ describe.skipIf(isWindows)('client.input', () => { }); describe('confirm', () => { it(`defaults to true if no default is provided`, async () => { - const answer = client.input.confirm({ - message: 'Confirm the value', - }); + const answer = client.input.confirm('Confirm the value', true); expect(client.getScreen()).toMatchInlineSnapshot( `"? Confirm the value (Y/n)"` ); @@ -205,10 +203,7 @@ describe.skipIf(isWindows)('client.input', () => { await expect(answer).resolves.toEqual(true); }); it(`defaulting to false works`, async () => { - const answer = client.input.confirm({ - message: 'Confirm the value', - default: false, - }); + const answer = client.input.confirm('Confirm the value', false); expect(client.getScreen()).toMatchInlineSnapshot( `"? Confirm the value (y/N)"` ); @@ -216,9 +211,7 @@ describe.skipIf(isWindows)('client.input', () => { await expect(answer).resolves.toEqual(false); }); it(`typing "n" for the value`, async () => { - const answer = client.input.confirm({ - message: 'Confirm the value', - }); + const answer = client.input.confirm('Confirm the value', true); expect(client.getScreen()).toMatchInlineSnapshot( `"? Confirm the value (Y/n)"` ); @@ -230,9 +223,7 @@ describe.skipIf(isWindows)('client.input', () => { await expect(answer).resolves.toEqual(false); }); it(`typing "y" for the value`, async () => { - const answer = client.input.confirm({ - message: 'Confirm the value', - }); + const answer = client.input.confirm('Confirm the value', true); expect(client.getScreen()).toMatchInlineSnapshot( `"? Confirm the value (Y/n)"` );