From 17a0158539e50dbab98b38adc62be14e1e555ef7 Mon Sep 17 00:00:00 2001 From: Donald Merand Date: Thu, 9 Apr 2026 20:31:02 -0400 Subject: [PATCH] Use Project follow-up command helper for display-only paths --- packages/app/src/cli/services/deploy.ts | 9 +++++---- packages/app/src/cli/services/dev.ts | 5 +++-- packages/app/src/cli/services/generate.ts | 13 ++++++------- packages/app/src/cli/services/info.ts | 10 +++------- .../app/src/cli/utilities/project-command.ts | 16 ++++++++++++++++ 5 files changed, 33 insertions(+), 20 deletions(-) create mode 100644 packages/app/src/cli/utilities/project-command.ts diff --git a/packages/app/src/cli/services/deploy.ts b/packages/app/src/cli/services/deploy.ts index 66848fa8666..52cc63030bb 100644 --- a/packages/app/src/cli/services/deploy.ts +++ b/packages/app/src/cli/services/deploy.ts @@ -8,6 +8,7 @@ import {AppLinkedInterface} from '../models/app/app.js' import {Project} from '../models/project/project.js' import {updateAppIdentifiers} from '../models/app/identifiers.js' import {DeveloperPlatformClient} from '../utilities/developer-platform-client.js' +import {formatProjectFollowUpCommand} from '../utilities/project-command.js' import {Organization, OrganizationApp} from '../models/organization.js' import {reloadApp} from '../models/app/loader.js' import {ExtensionRegistration} from '../api/graphql/all_app_extension_registrations.js' @@ -15,7 +16,7 @@ import {getTomls} from '../utilities/app/config/getTomls.js' import {renderInfo, renderSuccess, renderTasks, renderConfirmationPrompt, isTTY} from '@shopify/cli-kit/node/ui' import {mkdir} from '@shopify/cli-kit/node/fs' import {joinPath, dirname} from '@shopify/cli-kit/node/path' -import {outputNewline, outputInfo, formatPackageManagerCommand} from '@shopify/cli-kit/node/output' +import {outputNewline, outputInfo} from '@shopify/cli-kit/node/output' import {getArrayRejectingUndefined} from '@shopify/cli-kit/common/array' import {AbortError, AbortSilentError} from '@shopify/cli-kit/node/error' import type {AlertCustomSection, Task, TokenItem} from '@shopify/cli-kit/node/ui' @@ -327,7 +328,7 @@ async function outputCompletionMessage({ body.push( '• Map extension IDs to other copies of your app by running', { - command: formatPackageManagerCommand(project.packageManager, 'shopify app deploy'), + command: formatProjectFollowUpCommand(project, 'shopify app deploy'), }, 'for: ', { @@ -378,8 +379,8 @@ async function outputCompletionMessage({ [ 'Run', { - command: formatPackageManagerCommand( - project.packageManager, + command: formatProjectFollowUpCommand( + project, 'shopify app release', `--version=${uploadExtensionsBundleResult.versionTag}`, ), diff --git a/packages/app/src/cli/services/dev.ts b/packages/app/src/cli/services/dev.ts index 63201dca8b4..cf1fe96d9cf 100644 --- a/packages/app/src/cli/services/dev.ts +++ b/packages/app/src/cli/services/dev.ts @@ -28,6 +28,7 @@ import {DevSessionStatusManager} from './dev/processes/dev-session/dev-session-s import {TunnelMode} from './dev/tunnel-mode.js' import {PortDetail, renderPortWarnings} from './dev/port-warnings.js' import {DeveloperPlatformClient} from '../utilities/developer-platform-client.js' +import {formatProjectFollowUpCommand} from '../utilities/project-command.js' import {Web, getAppScopesArray, AppLinkedInterface} from '../models/app/app.js' import {Project} from '../models/project/project.js' import {Organization, OrganizationApp, OrganizationStore} from '../models/organization.js' @@ -47,7 +48,7 @@ import {getBackendPort} from '@shopify/cli-kit/node/environment' import {basename} from '@shopify/cli-kit/node/path' import {renderWarning} from '@shopify/cli-kit/node/ui' import {reportAnalyticsEvent} from '@shopify/cli-kit/node/analytics' -import {OutputProcess, formatPackageManagerCommand} from '@shopify/cli-kit/node/output' +import {OutputProcess} from '@shopify/cli-kit/node/output' import {hashString} from '@shopify/cli-kit/node/crypto' import {AbortError} from '@shopify/cli-kit/node/error' @@ -221,7 +222,7 @@ export async function warnIfScopesDifferBeforeDev({ const nextSteps = [ [ 'Run', - {command: formatPackageManagerCommand(commandOptions.project.packageManager, 'shopify app deploy')}, + {command: formatProjectFollowUpCommand(commandOptions.project, 'shopify app deploy')}, 'to push your scopes to the Partner Dashboard', ], ] diff --git a/packages/app/src/cli/services/generate.ts b/packages/app/src/cli/services/generate.ts index 866a2e136ca..11f42072c0c 100644 --- a/packages/app/src/cli/services/generate.ts +++ b/packages/app/src/cli/services/generate.ts @@ -6,6 +6,7 @@ import { ExtensionFlavorValue, } from './generate/extension.js' import {DeveloperPlatformClient} from '../utilities/developer-platform-client.js' +import {formatProjectFollowUpCommand} from '../utilities/project-command.js' import {AppInterface, AppLinkedInterface} from '../models/app/app.js' import {Project} from '../models/project/project.js' import generateExtensionPrompts, { @@ -16,12 +17,10 @@ import metadata from '../metadata.js' import {ExtensionTemplate} from '../models/app/template.js' import {ExtensionSpecification, RemoteAwareExtensionSpecification} from '../models/extensions/specification.js' import {OrganizationApp} from '../models/organization.js' -import {PackageManager} from '@shopify/cli-kit/node/node-package-manager' import {isShopify} from '@shopify/cli-kit/node/context/local' import {joinPath} from '@shopify/cli-kit/node/path' import {RenderAlertOptions, renderSuccess} from '@shopify/cli-kit/node/ui' import {AbortError} from '@shopify/cli-kit/node/error' -import {formatPackageManagerCommand} from '@shopify/cli-kit/node/output' import {groupBy} from '@shopify/cli-kit/common/collection' interface GenerateOptions { @@ -56,7 +55,7 @@ async function generate(options: GenerateOptions) { const generateExtensionOptions = buildGenerateOptions(promptAnswers, app, options, developerPlatformClient) const generatedExtension = await generateExtensionTemplate(generateExtensionOptions) - renderSuccessMessage(generatedExtension, options.project.packageManager) + renderSuccessMessage(generatedExtension, options.project) } async function buildPromptOptions( @@ -128,11 +127,11 @@ function buildGenerateOptions( } } -function renderSuccessMessage(extension: GeneratedExtension, packageManager: PackageManager) { +function renderSuccessMessage(extension: GeneratedExtension, project: Project) { const formattedSuccessfulMessage = formatSuccessfulRunMessage( extension.extensionTemplate, extension.directory, - packageManager, + project, ) renderSuccess(formattedSuccessfulMessage) } @@ -153,7 +152,7 @@ function validateExtensionFlavor(extensionTemplate?: ExtensionTemplate, flavor?: function formatSuccessfulRunMessage( extensionTemplate: ExtensionTemplate, extensionDirectory: string, - depndencyManager: PackageManager, + project: Project, ): RenderAlertOptions { const options: RenderAlertOptions = { headline: ['Your extension was created in', {filePath: extensionDirectory}, {char: '.'}], @@ -164,7 +163,7 @@ function formatSuccessfulRunMessage( if (extensionTemplate.type !== 'function') { options.nextSteps!.push([ 'To preview this extension along with the rest of the project, run', - {command: formatPackageManagerCommand(depndencyManager, 'shopify app dev')}, + {command: formatProjectFollowUpCommand(project, 'shopify app dev')}, ]) } diff --git a/packages/app/src/cli/services/info.ts b/packages/app/src/cli/services/info.ts index 3230ea2ae29..611c94db179 100644 --- a/packages/app/src/cli/services/info.ts +++ b/packages/app/src/cli/services/info.ts @@ -1,5 +1,6 @@ import {outputEnv} from './app/env/show.js' import {DeveloperPlatformClient} from '../utilities/developer-platform-client.js' +import {formatProjectFollowUpCommand} from '../utilities/project-command.js' import {AppLinkedInterface, getAppScopes} from '../models/app/app.js' import {Project} from '../models/project/project.js' import {configurationFileNames} from '../constants.js' @@ -8,12 +9,7 @@ import {Organization, OrganizationApp} from '../models/organization.js' import {isServiceAccount, isUserAccount} from '@shopify/cli-kit/node/session' import {platformAndArch} from '@shopify/cli-kit/node/os' import {basename, relativePath} from '@shopify/cli-kit/node/path' -import { - OutputMessage, - formatPackageManagerCommand, - outputContent, - shouldDisplayColors, -} from '@shopify/cli-kit/node/output' +import {OutputMessage, outputContent, shouldDisplayColors} from '@shopify/cli-kit/node/output' import {AlertCustomSection, InlineToken} from '@shopify/cli-kit/node/ui' import {CLI_KIT_VERSION} from '@shopify/cli-kit/common/version' @@ -172,7 +168,7 @@ class AppInfo { { body: [ '💡 To change these, run', - {command: formatPackageManagerCommand(this.project.packageManager, 'shopify app config link')}, + {command: formatProjectFollowUpCommand(this.project, 'shopify app config link')}, ], }, ] diff --git a/packages/app/src/cli/utilities/project-command.ts b/packages/app/src/cli/utilities/project-command.ts new file mode 100644 index 00000000000..1dd2b2741b9 --- /dev/null +++ b/packages/app/src/cli/utilities/project-command.ts @@ -0,0 +1,16 @@ +import {Project} from '../models/project/project.js' +import {formatPackageManagerCommand} from '@shopify/cli-kit/node/output' + +/** + * Formats a follow-up command for the current project. + * + * Display-only paths should use this helper instead of branching on the + * project's package manager directly. + */ +export function formatProjectFollowUpCommand( + project: Pick, + command: string, + ...args: string[] +) { + return formatPackageManagerCommand(project.packageManager, command, ...args) +}