@shopify/cli-kit 4.9.5 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.d.ts +5 -0
  2. package/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.js +22 -0
  3. package/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.js.map +1 -1
  4. package/dist/private/node/api/graphql.d.ts +2 -1
  5. package/dist/private/node/api/graphql.js +12 -1
  6. package/dist/private/node/api/graphql.js.map +1 -1
  7. package/dist/private/node/api.d.ts +2 -0
  8. package/dist/private/node/api.js +49 -22
  9. package/dist/private/node/api.js.map +1 -1
  10. package/dist/private/node/command-json-schema.js +1 -0
  11. package/dist/private/node/command-json-schema.js.map +1 -1
  12. package/dist/private/node/constants.d.ts +1 -0
  13. package/dist/private/node/constants.js +1 -0
  14. package/dist/private/node/constants.js.map +1 -1
  15. package/dist/private/node/dev-instance-output.d.ts +47 -0
  16. package/dist/private/node/dev-instance-output.js +143 -0
  17. package/dist/private/node/dev-instance-output.js.map +1 -0
  18. package/dist/private/node/json-error.d.ts +1 -15
  19. package/dist/private/node/json-error.js +4 -98
  20. package/dist/private/node/json-error.js.map +1 -1
  21. package/dist/private/node/output-context.d.ts +8 -0
  22. package/dist/private/node/output-context.js +10 -0
  23. package/dist/private/node/output-context.js.map +1 -0
  24. package/dist/private/node/output.test.js +4 -4
  25. package/dist/private/node/output.test.js.map +1 -1
  26. package/dist/private/node/session/automation-token.d.ts +50 -0
  27. package/dist/private/node/session/automation-token.js +77 -0
  28. package/dist/private/node/session/automation-token.js.map +1 -0
  29. package/dist/private/node/session/exchange.d.ts +2 -1
  30. package/dist/private/node/session/exchange.js +5 -3
  31. package/dist/private/node/session/exchange.js.map +1 -1
  32. package/dist/private/node/session/permanent-store-domain.d.ts +21 -0
  33. package/dist/private/node/session/permanent-store-domain.js +72 -0
  34. package/dist/private/node/session/permanent-store-domain.js.map +1 -0
  35. package/dist/private/node/session.d.ts +3 -2
  36. package/dist/private/node/session.js +12 -3
  37. package/dist/private/node/session.js.map +1 -1
  38. package/dist/private/node/themes/trust-challenge.d.ts +31 -0
  39. package/dist/private/node/themes/trust-challenge.js +143 -0
  40. package/dist/private/node/themes/trust-challenge.js.map +1 -0
  41. package/dist/private/node/ui/alert.js +1 -1
  42. package/dist/private/node/ui/alert.js.map +1 -1
  43. package/dist/private/node/ui/components/ConcurrentOutput.d.ts +2 -7
  44. package/dist/private/node/ui/components/ConcurrentOutput.js +4 -8
  45. package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
  46. package/dist/private/node/ui/components/LoadingBar.js +9 -15
  47. package/dist/private/node/ui/components/LoadingBar.js.map +1 -1
  48. package/dist/private/node/ui/components/LoadingBar.test.js +45 -107
  49. package/dist/private/node/ui/components/LoadingBar.test.js.map +1 -1
  50. package/dist/private/node/ui/components/LoadingIndicator.d.ts +7 -0
  51. package/dist/private/node/ui/components/LoadingIndicator.js +22 -0
  52. package/dist/private/node/ui/components/LoadingIndicator.js.map +1 -0
  53. package/dist/public/common/version.d.ts +1 -1
  54. package/dist/public/common/version.js +1 -1
  55. package/dist/public/common/version.js.map +1 -1
  56. package/dist/public/node/api/admin.js +13 -0
  57. package/dist/public/node/api/admin.js.map +1 -1
  58. package/dist/public/node/api/graphql.js +38 -7
  59. package/dist/public/node/api/graphql.js.map +1 -1
  60. package/dist/public/node/archiver.js +13 -6
  61. package/dist/public/node/archiver.js.map +1 -1
  62. package/dist/public/node/base-command.d.ts +6 -0
  63. package/dist/public/node/base-command.js +97 -16
  64. package/dist/public/node/base-command.js.map +1 -1
  65. package/dist/public/node/dev-instance.d.ts +138 -0
  66. package/dist/public/node/dev-instance.js +365 -0
  67. package/dist/public/node/dev-instance.js.map +1 -0
  68. package/dist/public/node/environment.d.ts +6 -3
  69. package/dist/public/node/environment.js +11 -4
  70. package/dist/public/node/environment.js.map +1 -1
  71. package/dist/public/node/error/index.js +2 -1
  72. package/dist/public/node/error/index.js.map +1 -1
  73. package/dist/public/node/error/schema.d.ts +24 -24
  74. package/dist/public/node/error/serialization.d.ts +8 -0
  75. package/dist/public/node/error/serialization.js +103 -0
  76. package/dist/public/node/error/serialization.js.map +1 -0
  77. package/dist/public/node/graphiql/server.js +18 -2
  78. package/dist/public/node/graphiql/server.js.map +1 -1
  79. package/dist/public/node/is-global.js +2 -1
  80. package/dist/public/node/is-global.js.map +1 -1
  81. package/dist/public/node/notifications-system.d.ts +6 -6
  82. package/dist/public/node/path.d.ts +19 -3
  83. package/dist/public/node/path.js +21 -3
  84. package/dist/public/node/path.js.map +1 -1
  85. package/dist/public/node/session.d.ts +36 -2
  86. package/dist/public/node/session.js +48 -4
  87. package/dist/public/node/session.js.map +1 -1
  88. package/dist/public/node/system.d.ts +4 -0
  89. package/dist/public/node/system.js +39 -9
  90. package/dist/public/node/system.js.map +1 -1
  91. package/dist/public/node/themes/api.d.ts +9 -0
  92. package/dist/public/node/themes/api.js +50 -22
  93. package/dist/public/node/themes/api.js.map +1 -1
  94. package/dist/public/node/themes/theme-manager.d.ts +8 -1
  95. package/dist/public/node/themes/theme-manager.js +1 -1
  96. package/dist/public/node/themes/theme-manager.js.map +1 -1
  97. package/dist/public/node/tree-kill.js +12 -2
  98. package/dist/public/node/tree-kill.js.map +1 -1
  99. package/dist/public/node/ui/components.d.ts +1 -0
  100. package/dist/public/node/ui/components.js +1 -0
  101. package/dist/public/node/ui/components.js.map +1 -1
  102. package/dist/public/node/ui.d.ts +24 -4
  103. package/dist/public/node/ui.js +41 -18
  104. package/dist/public/node/ui.js.map +1 -1
  105. package/dist/public/node/upgrade/output.d.ts +17 -0
  106. package/dist/public/node/upgrade/output.js +51 -0
  107. package/dist/public/node/upgrade/output.js.map +1 -0
  108. package/dist/public/node/upgrade/result.d.ts +8 -0
  109. package/dist/public/node/upgrade/result.js +21 -0
  110. package/dist/public/node/upgrade/result.js.map +1 -0
  111. package/dist/public/node/upgrade/types.d.ts +61 -0
  112. package/dist/public/node/upgrade/types.js +46 -0
  113. package/dist/public/node/upgrade/types.js.map +1 -0
  114. package/dist/public/node/upgrade.d.ts +8 -0
  115. package/dist/public/node/upgrade.js +57 -22
  116. package/dist/public/node/upgrade.js.map +1 -1
  117. package/dist/tsconfig.tsbuildinfo +1 -1
  118. package/package.json +3 -3
  119. package/dist/private/node/ui/components/TextAnimation.d.ts +0 -10
  120. package/dist/private/node/ui/components/TextAnimation.js +0 -56
  121. package/dist/private/node/ui/components/TextAnimation.js.map +0 -1
  122. package/dist/private/node/ui/components/TextAnimation.test.d.ts +0 -1
  123. package/dist/private/node/ui/components/TextAnimation.test.js +0 -73
  124. package/dist/private/node/ui/components/TextAnimation.test.js.map +0 -1
@@ -3,9 +3,10 @@ import { isDevelopment } from './context/local.js';
3
3
  import { currentProcessIsGlobal, inferPackageManagerForGlobalCLI, getProjectDir } from './is-global.js';
4
4
  import { checkForCachedNewVersion, findUpAndReadPackageJson, checkForNewVersion, usesWorkspaces, addNPMDependencies, getPackageManager, } from './node-package-manager.js';
5
5
  import { outputContent, outputDebug, outputInfo, outputToken, outputWarn } from './output.js';
6
- import { renderSuccess } from './ui.js';
6
+ import { presentUpgradeResult } from './upgrade/result.js';
7
+ import { execUpgradeCommand, upgradeOutputStreams } from './upgrade/output.js';
7
8
  import { cwd, moduleDirectory, sniffForPath } from './path.js';
8
- import { exec, isCI } from './system.js';
9
+ import { isCI } from './system.js';
9
10
  import { globalCLIVersion, isPreReleaseVersion } from './version.js';
10
11
  import { AbortError } from './error.js';
11
12
  import { getAutoUpgradeEnabled, setAutoUpgradeEnabled, runAtMinimumInterval } from '../../private/node/conf-store.js';
@@ -41,6 +42,15 @@ export function cliInstallCommand() {
41
42
  * @throws AbortError if the package manager or command cannot be determined.
42
43
  */
43
44
  export async function runCLIUpgrade(options = {}) {
45
+ presentUpgradeResult(await upgradeCLI(options), 'text');
46
+ }
47
+ /**
48
+ * Upgrades the CLI and returns the outcome independently of final presentation.
49
+ *
50
+ * @param options - Whether the upgrade was triggered automatically.
51
+ * @returns The verified global version, local dependency update, or skip reason.
52
+ */
53
+ export async function upgradeCLI(options = {}) {
44
54
  // Path where the current project is (app/hydrogen)
45
55
  const path = sniffForPath() ?? cwd();
46
56
  const projectDir = getProjectDir(path);
@@ -49,19 +59,20 @@ export async function runCLIUpgrade(options = {}) {
49
59
  // Don't auto-upgrade for development mode
50
60
  if (isDevelopment()) {
51
61
  outputInfo('Skipping upgrade in development mode.');
52
- return;
62
+ return { status: 'skipped', reason: 'development', scope: isGlobal ? 'global' : 'local' };
53
63
  }
54
64
  // When triggered by the automatic postrun hook, skip project-local upgrades.
55
65
  // Bumping `package.json` / lockfile silently in the background would surprise users
56
66
  // and produce noisy diffs; explicit `shopify upgrade` invocations still upgrade the
57
67
  // local project.
58
68
  if (options.autoupgrade && !isGlobal) {
59
- return;
69
+ return { status: 'skipped', reason: 'local-autoupgrade', scope: 'local' };
60
70
  }
61
71
  // Generate the install command for the global CLI and execute it
62
72
  if (isGlobal) {
73
+ const packageManager = inferPackageManagerForGlobalCLI();
63
74
  const installCommand = cliInstallCommand();
64
- if (!installCommand) {
75
+ if (!installCommand || packageManager === 'unknown') {
65
76
  throw new Error('Could not determine the package manager');
66
77
  }
67
78
  const [command, ...args] = installCommand.split(' ');
@@ -76,7 +87,7 @@ export async function runCLIUpgrade(options = {}) {
76
87
  : '✨ New version of Shopify CLI available!';
77
88
  outputInfo(outputContent `${headline}
78
89
  Now upgrading by running: ${outputToken.genericShellCommand(installCommand)}...`);
79
- await exec(command, args, { stdio: 'inherit' });
90
+ await execUpgradeCommand(command, args);
80
91
  // A zero exit code doesn't guarantee the right version landed: the version check above
81
92
  // queries the public npm registry, while the install goes through whatever registry the
82
93
  // user has configured. A private registry with a stale `latest` tag (or one that serves
@@ -90,13 +101,17 @@ export async function runCLIUpgrade(options = {}) {
90
101
  if (semverLt(installedVersion, expectedVersion)) {
91
102
  throw new AbortError(`Failed to upgrade Shopify CLI. Expected to be on version ${expectedVersion}, but version ${installedVersion} is now installed.`, 'Your package manager may be resolving @shopify/cli from a registry with outdated versions. Check your npm registry configuration and try again.');
92
103
  }
93
- renderSuccess({
94
- headline: 'Shopify CLI upgraded.',
95
- body: `You're now on version ${installedVersion}.`,
96
- });
104
+ return {
105
+ status: 'success',
106
+ changed: installedVersion !== CLI_KIT_VERSION,
107
+ scope: 'global',
108
+ previousVersion: CLI_KIT_VERSION,
109
+ version: installedVersion,
110
+ packageManager,
111
+ };
97
112
  }
98
113
  else if (projectDir) {
99
- await upgradeLocalShopify(projectDir, CLI_KIT_VERSION);
114
+ return upgradeLocalShopify(projectDir, CLI_KIT_VERSION);
100
115
  }
101
116
  else {
102
117
  throw new Error('Could not determine the local project directory');
@@ -205,7 +220,7 @@ async function upgradeLocalShopify(projectDir, currentVersion) {
205
220
  let resolvedCLIVersion = allDependencies[await cliDependency()];
206
221
  if (!resolvedCLIVersion) {
207
222
  outputDebug('Auto-upgrade: CLI dependency not found in project dependencies, skipping local upgrade.');
208
- return;
223
+ return { status: 'skipped', reason: 'dependency-not-found', scope: 'local' };
209
224
  }
210
225
  if (resolvedCLIVersion.slice(0, 1).match(/[\^~]/))
211
226
  resolvedCLIVersion = currentVersion;
@@ -216,8 +231,18 @@ async function upgradeLocalShopify(projectDir, currentVersion) {
216
231
  else {
217
232
  outputWontInstallMessage(resolvedCLIVersion);
218
233
  }
219
- await installJsonDependencies('prod', packageJsonDependencies, projectDir);
220
- await installJsonDependencies('dev', packageJsonDevDependencies, projectDir);
234
+ const dependencies = await installJsonDependencies('prod', packageJsonDependencies, projectDir);
235
+ const devDependencies = await installJsonDependencies('dev', packageJsonDevDependencies, projectDir);
236
+ // Local installs are not verified, so the registry version is not an installed-version claim.
237
+ return {
238
+ status: 'success',
239
+ changed: null,
240
+ scope: 'local',
241
+ directory: projectDir,
242
+ previousVersion: resolvedCLIVersion,
243
+ availableVersion: newestCLIVersion ?? null,
244
+ packages: [...new Set([...dependencies, ...devDependencies])],
245
+ };
221
246
  }
222
247
  async function installJsonDependencies(depsEnv, deps, directory) {
223
248
  const packagesToUpdate = [await cliDependency(), ...(await oclifPlugins())]
@@ -230,15 +255,25 @@ async function installJsonDependencies(depsEnv, deps, directory) {
230
255
  });
231
256
  const appUsesWorkspaces = await usesWorkspaces(directory);
232
257
  if (packagesToUpdate.length > 0) {
233
- await addNPMDependencies(packagesToUpdate, {
234
- packageManager: await getPackageManager(directory),
235
- type: depsEnv,
236
- directory,
237
- stdout: process.stdout,
238
- stderr: process.stderr,
239
- addToRootDirectory: appUsesWorkspaces,
240
- });
258
+ const packageManager = await getPackageManager(directory);
259
+ const streams = upgradeOutputStreams();
260
+ try {
261
+ await addNPMDependencies(packagesToUpdate, {
262
+ packageManager,
263
+ type: depsEnv,
264
+ directory,
265
+ ...streams,
266
+ addToRootDirectory: appUsesWorkspaces,
267
+ });
268
+ }
269
+ finally {
270
+ if (streams.stdout !== process.stdout)
271
+ streams.stdout.end();
272
+ if (streams.stderr !== process.stderr)
273
+ streams.stderr.end();
274
+ }
241
275
  }
276
+ return packagesToUpdate.map(({ name }) => name);
242
277
  }
243
278
  async function cliDependency() {
244
279
  return (await packageJsonContents()).name;
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../src/public/node/upgrade.ts"],"names":[],"mappings":"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","sourcesContent":["import {fetchNotifications, filterNotifications} from './notifications-system.js'\nimport {isDevelopment} from './context/local.js'\nimport {currentProcessIsGlobal, inferPackageManagerForGlobalCLI, getProjectDir} from './is-global.js'\nimport {\n checkForCachedNewVersion,\n findUpAndReadPackageJson,\n PackageJson,\n checkForNewVersion,\n DependencyType,\n usesWorkspaces,\n addNPMDependencies,\n getPackageManager,\n} from './node-package-manager.js'\nimport {outputContent, outputDebug, outputInfo, outputToken, outputWarn} from './output.js'\nimport {renderSuccess} from './ui.js'\nimport {cwd, moduleDirectory, sniffForPath} from './path.js'\nimport {exec, isCI} from './system.js'\nimport {globalCLIVersion, isPreReleaseVersion} from './version.js'\nimport {AbortError} from './error.js'\nimport {getAutoUpgradeEnabled, setAutoUpgradeEnabled, runAtMinimumInterval} from '../../private/node/conf-store.js'\nimport {CLI_KIT_VERSION} from '../common/version.js'\nimport {lt as semverLt} from 'semver'\n\nexport {getAutoUpgradeEnabled, setAutoUpgradeEnabled}\n\n/**\n * Utility function for generating an install command for the user to run\n * to install an updated version of Shopify CLI.\n *\n * @returns A string with the command to run, or undefined if the package manager cannot be determined.\n */\nexport function cliInstallCommand(): string | undefined {\n const packageManager = inferPackageManagerForGlobalCLI()\n if (!packageManager || packageManager === 'unknown') return undefined\n\n if (packageManager === 'homebrew') {\n return 'brew upgrade shopify-cli'\n } else if (packageManager === 'yarn') {\n return `${packageManager} global add @shopify/cli@latest`\n } else {\n const verb = packageManager === 'pnpm' ? 'add' : 'install'\n return `${packageManager} ${verb} -g @shopify/cli@latest`\n }\n}\n\n/**\n * Options for {@link runCLIUpgrade}.\n */\nexport interface RunCLIUpgradeOptions {\n /**\n * `true` when the upgrade is being triggered by the automatic postrun hook.\n * In that case we skip project-local upgrades — those should only happen when the\n * user explicitly runs `shopify upgrade` so we don't surprise them by mutating\n * their `package.json` / lockfile in the background.\n */\n autoupgrade?: boolean\n}\n\n/**\n * Runs the CLI upgrade using the appropriate package manager.\n * Determines the install command and executes it.\n *\n * @param options - See {@link RunCLIUpgradeOptions}.\n * @throws AbortError if the package manager or command cannot be determined.\n */\nexport async function runCLIUpgrade(options: RunCLIUpgradeOptions = {}): Promise<void> {\n // Path where the current project is (app/hydrogen)\n const path = sniffForPath() ?? cwd()\n const projectDir = getProjectDir(path)\n\n // Check if we are running in a global context if not, return\n const isGlobal = currentProcessIsGlobal()\n\n // Don't auto-upgrade for development mode\n if (isDevelopment()) {\n outputInfo('Skipping upgrade in development mode.')\n return\n }\n\n // When triggered by the automatic postrun hook, skip project-local upgrades.\n // Bumping `package.json` / lockfile silently in the background would surprise users\n // and produce noisy diffs; explicit `shopify upgrade` invocations still upgrade the\n // local project.\n if (options.autoupgrade && !isGlobal) {\n return\n }\n\n // Generate the install command for the global CLI and execute it\n if (isGlobal) {\n const installCommand = cliInstallCommand()\n if (!installCommand) {\n throw new Error('Could not determine the package manager')\n }\n const [command, ...args] = installCommand.split(' ')\n if (!command) {\n throw new Error('Could not determine the command to run')\n }\n // Cache lookup — already populated by versionToAutoUpgrade() upstream, so this\n // is just a synchronous cache read, no extra network call.\n const newerVersion = checkForCachedNewVersion('@shopify/cli', CLI_KIT_VERSION)\n const headline = newerVersion\n ? `✨ New version of Shopify CLI available! (${CLI_KIT_VERSION} → ${newerVersion})`\n : '✨ New version of Shopify CLI available!'\n outputInfo(\n outputContent`${headline}\n Now upgrading by running: ${outputToken.genericShellCommand(installCommand)}...`,\n )\n await exec(command, args, {stdio: 'inherit'})\n\n // A zero exit code doesn't guarantee the right version landed: the version check above\n // queries the public npm registry, while the install goes through whatever registry the\n // user has configured. A private registry with a stale `latest` tag (or one that serves\n // stale metadata on auth errors) can \"successfully\" install an outdated version. Verify\n // what's actually installed before claiming success.\n const installedVersion = await globalCLIVersion()\n if (!installedVersion) {\n throw new AbortError(\n \"Couldn't verify the Shopify CLI version after upgrading.\",\n outputContent`Check the installed version by running ${outputToken.genericShellCommand('shopify version')}.`,\n )\n }\n const expectedVersion = newerVersion ?? CLI_KIT_VERSION\n if (semverLt(installedVersion, expectedVersion)) {\n throw new AbortError(\n `Failed to upgrade Shopify CLI. Expected to be on version ${expectedVersion}, but version ${installedVersion} is now installed.`,\n 'Your package manager may be resolving @shopify/cli from a registry with outdated versions. Check your npm registry configuration and try again.',\n )\n }\n renderSuccess({\n headline: 'Shopify CLI upgraded.',\n body: `You're now on version ${installedVersion}.`,\n })\n } else if (projectDir) {\n await upgradeLocalShopify(projectDir, CLI_KIT_VERSION)\n } else {\n throw new Error('Could not determine the local project directory')\n }\n}\n\n/**\n * Returns the version to auto-upgrade to, or undefined if auto-upgrade should be skipped.\n * Auto-upgrade is enabled by default and can be disabled via `setAutoUpgradeEnabled(false)`.\n * Also skips for CI, pre-release versions, or when no newer version is available.\n *\n * @returns The version string to upgrade to, or undefined if no upgrade should happen.\n */\nexport function versionToAutoUpgrade(): string | undefined {\n const currentVersion = CLI_KIT_VERSION\n const newerVersion = checkForCachedNewVersion('@shopify/cli', currentVersion)\n if (!newerVersion) {\n outputDebug('Auto-upgrade: No newer version available.')\n return undefined\n }\n if (process.env.SHOPIFY_CLI_FORCE_AUTO_UPGRADE === '1') {\n outputDebug('Auto-upgrade: Forcing auto-upgrade because of SHOPIFY_CLI_FORCE_AUTO_UPGRADE.')\n return newerVersion\n }\n if (!getAutoUpgradeEnabled()) {\n outputDebug('Auto-upgrade: Skipping because auto-upgrade is not enabled.')\n return undefined\n }\n if (isCI()) {\n outputDebug('Auto-upgrade: Skipping auto-upgrade in CI.')\n return undefined\n }\n if (isPreReleaseVersion(currentVersion)) {\n outputDebug('Auto-upgrade: Skipping auto-upgrade for pre-release version.')\n return undefined\n }\n return newerVersion\n}\n\n/**\n * Checks the freshly fetched notifications feed for a kill-switch notification that\n * disables auto-upgrade. A blocking notification is one with `surface: \"autoupgrade\"`,\n * `type: \"error\"`, and matching version/date ranges for the current CLI.\n *\n * Fails open: any error fetching or parsing the feed results in `false`, so a broken\n * notifications endpoint never prevents users from auto-upgrading. Intentionally silent\n * (no logs) — this is invoked on the auto-upgrade hot path.\n *\n * @returns `true` when an active blocking notification is found, `false` otherwise.\n */\nexport async function hasBlockingAutoUpgradeNotification(): Promise<boolean> {\n try {\n const {notifications} = await fetchNotifications()\n // Reuse the standard notifications filtering for version/date/surface. The empty\n // commandId disables the command filter; ['autoupgrade'] scopes to our surface.\n // The frequency filter is a no-op here because we never render, so nothing gets\n // written to the lastShown cache for these notifications.\n const matching = filterNotifications(notifications, '', ['autoupgrade'])\n return matching.some((notification) => notification.type === 'error')\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch {\n return false\n }\n}\n\n/**\n * Shows a daily upgrade-available warning for users who have not enabled auto-upgrade.\n * Skipped in CI and for pre-release versions. When auto-upgrade is enabled this is a no-op\n * because the postrun hook will handle the upgrade directly.\n */\nexport async function warnIfUpgradeAvailable(): Promise<void> {\n if (isCI() || isPreReleaseVersion(CLI_KIT_VERSION) || getAutoUpgradeEnabled()) return\n\n const newerVersion = checkForCachedNewVersion('@shopify/cli', CLI_KIT_VERSION)\n if (!newerVersion) return\n\n await runAtMinimumInterval('warn-on-available-upgrade', {days: 1}, async () => {\n outputWarn(getOutputUpdateCLIReminder(newerVersion))\n })\n}\n\n/**\n * Generates a message to remind the user to update the CLI.\n * For major version bumps, appends a link to the GitHub release notes so users\n * can review breaking changes before deciding to upgrade.\n *\n * @param version - The version to update to.\n * @param isMajor - Whether the version bump is a major version change.\n * @returns The message to remind the user to update the CLI.\n */\nexport function getOutputUpdateCLIReminder(version: string, isMajor = false): string {\n const installCommand = cliInstallCommand()\n const base = installCommand\n ? outputContent`💡 Version ${version} available! Run ${outputToken.genericShellCommand(installCommand)}`.value\n : outputContent`💡 Version ${version} available!`.value\n\n if (isMajor) {\n const releaseUrl = `https://github.com/Shopify/cli/releases/tag/${version}`\n const majorNotice =\n outputContent`⚠️ This is a major version — review breaking changes before upgrading:\\n ${outputToken.link(releaseUrl, releaseUrl)}`\n .value\n return `${base}\\n\\n${majorNotice}`\n }\n\n return base\n}\n\nasync function upgradeLocalShopify(projectDir: string, currentVersion: string) {\n const packageJson = (await findUpAndReadPackageJson(projectDir)).content\n const packageJsonDependencies = packageJson.dependencies ?? {}\n const packageJsonDevDependencies = packageJson.devDependencies ?? {}\n const allDependencies = {...packageJsonDependencies, ...packageJsonDevDependencies}\n\n let resolvedCLIVersion = allDependencies[await cliDependency()]\n if (!resolvedCLIVersion) {\n outputDebug('Auto-upgrade: CLI dependency not found in project dependencies, skipping local upgrade.')\n return\n }\n\n if (resolvedCLIVersion.slice(0, 1).match(/[\\^~]/)) resolvedCLIVersion = currentVersion\n const newestCLIVersion = await checkForNewVersion(await cliDependency(), resolvedCLIVersion)\n\n if (newestCLIVersion) {\n outputUpgradeMessage(resolvedCLIVersion, newestCLIVersion)\n } else {\n outputWontInstallMessage(resolvedCLIVersion)\n }\n\n await installJsonDependencies('prod', packageJsonDependencies, projectDir)\n await installJsonDependencies('dev', packageJsonDevDependencies, projectDir)\n}\n\nasync function installJsonDependencies(\n depsEnv: DependencyType,\n deps: {[key: string]: string},\n directory: string,\n): Promise<void> {\n const packagesToUpdate = [await cliDependency(), ...(await oclifPlugins())]\n .filter((pkg: string): boolean => {\n const pkgRequirement: string | undefined = deps[pkg]\n return Boolean(pkgRequirement)\n })\n .map((pkg) => {\n return {name: pkg, version: 'latest'}\n })\n\n const appUsesWorkspaces = await usesWorkspaces(directory)\n\n if (packagesToUpdate.length > 0) {\n await addNPMDependencies(packagesToUpdate, {\n packageManager: await getPackageManager(directory),\n type: depsEnv,\n directory,\n stdout: process.stdout,\n stderr: process.stderr,\n addToRootDirectory: appUsesWorkspaces,\n })\n }\n}\n\nasync function cliDependency(): Promise<string> {\n return (await packageJsonContents()).name\n}\n\nasync function oclifPlugins(): Promise<string[]> {\n return (await packageJsonContents())?.oclif?.plugins ?? []\n}\n\ntype PackageJsonWithName = Omit<PackageJson, 'name'> & {name: string}\nlet _packageJsonContents: PackageJsonWithName | undefined\n\nasync function packageJsonContents(): Promise<PackageJsonWithName> {\n if (!_packageJsonContents) {\n const packageJson = await findUpAndReadPackageJson(moduleDirectory(import.meta.url))\n _packageJsonContents = _packageJsonContents ?? (packageJson.content as PackageJsonWithName)\n }\n return _packageJsonContents\n}\n\nfunction outputWontInstallMessage(currentVersion: string): void {\n outputInfo(outputContent`You're on the latest version, ${outputToken.yellow(currentVersion)}, no need to upgrade!`)\n}\n\nfunction outputUpgradeMessage(currentVersion: string, newestVersion: string): void {\n outputInfo(\n outputContent`Upgrading CLI from ${outputToken.yellow(currentVersion)} to ${outputToken.yellow(newestVersion)}...`,\n )\n}\n"]}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../../src/public/node/upgrade.ts"],"names":[],"mappings":"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","sourcesContent":["import {fetchNotifications, filterNotifications} from './notifications-system.js'\nimport {isDevelopment} from './context/local.js'\nimport {currentProcessIsGlobal, inferPackageManagerForGlobalCLI, getProjectDir} from './is-global.js'\nimport {\n checkForCachedNewVersion,\n findUpAndReadPackageJson,\n PackageJson,\n checkForNewVersion,\n DependencyType,\n usesWorkspaces,\n addNPMDependencies,\n getPackageManager,\n} from './node-package-manager.js'\nimport {outputContent, outputDebug, outputInfo, outputToken, outputWarn} from './output.js'\nimport {presentUpgradeResult} from './upgrade/result.js'\nimport {execUpgradeCommand, upgradeOutputStreams} from './upgrade/output.js'\nimport {cwd, moduleDirectory, sniffForPath} from './path.js'\nimport {isCI} from './system.js'\nimport {globalCLIVersion, isPreReleaseVersion} from './version.js'\nimport {AbortError} from './error.js'\nimport {getAutoUpgradeEnabled, setAutoUpgradeEnabled, runAtMinimumInterval} from '../../private/node/conf-store.js'\nimport {CLI_KIT_VERSION} from '../common/version.js'\nimport {lt as semverLt} from 'semver'\nimport type {UpgradeResult} from './upgrade/types.js'\n\nexport {getAutoUpgradeEnabled, setAutoUpgradeEnabled}\n\n/**\n * Utility function for generating an install command for the user to run\n * to install an updated version of Shopify CLI.\n *\n * @returns A string with the command to run, or undefined if the package manager cannot be determined.\n */\nexport function cliInstallCommand(): string | undefined {\n const packageManager = inferPackageManagerForGlobalCLI()\n if (!packageManager || packageManager === 'unknown') return undefined\n\n if (packageManager === 'homebrew') {\n return 'brew upgrade shopify-cli'\n } else if (packageManager === 'yarn') {\n return `${packageManager} global add @shopify/cli@latest`\n } else {\n const verb = packageManager === 'pnpm' ? 'add' : 'install'\n return `${packageManager} ${verb} -g @shopify/cli@latest`\n }\n}\n\n/**\n * Options for {@link runCLIUpgrade}.\n */\nexport interface RunCLIUpgradeOptions {\n /**\n * `true` when the upgrade is being triggered by the automatic postrun hook.\n * In that case we skip project-local upgrades — those should only happen when the\n * user explicitly runs `shopify upgrade` so we don't surprise them by mutating\n * their `package.json` / lockfile in the background.\n */\n autoupgrade?: boolean\n}\n\n/**\n * Runs the CLI upgrade using the appropriate package manager.\n * Determines the install command and executes it.\n *\n * @param options - See {@link RunCLIUpgradeOptions}.\n * @throws AbortError if the package manager or command cannot be determined.\n */\nexport async function runCLIUpgrade(options: RunCLIUpgradeOptions = {}): Promise<void> {\n presentUpgradeResult(await upgradeCLI(options), 'text')\n}\n\n/**\n * Upgrades the CLI and returns the outcome independently of final presentation.\n *\n * @param options - Whether the upgrade was triggered automatically.\n * @returns The verified global version, local dependency update, or skip reason.\n */\nexport async function upgradeCLI(options: RunCLIUpgradeOptions = {}): Promise<UpgradeResult> {\n // Path where the current project is (app/hydrogen)\n const path = sniffForPath() ?? cwd()\n const projectDir = getProjectDir(path)\n\n // Check if we are running in a global context if not, return\n const isGlobal = currentProcessIsGlobal()\n\n // Don't auto-upgrade for development mode\n if (isDevelopment()) {\n outputInfo('Skipping upgrade in development mode.')\n return {status: 'skipped', reason: 'development', scope: isGlobal ? 'global' : 'local'}\n }\n\n // When triggered by the automatic postrun hook, skip project-local upgrades.\n // Bumping `package.json` / lockfile silently in the background would surprise users\n // and produce noisy diffs; explicit `shopify upgrade` invocations still upgrade the\n // local project.\n if (options.autoupgrade && !isGlobal) {\n return {status: 'skipped', reason: 'local-autoupgrade', scope: 'local'}\n }\n\n // Generate the install command for the global CLI and execute it\n if (isGlobal) {\n const packageManager = inferPackageManagerForGlobalCLI()\n const installCommand = cliInstallCommand()\n if (!installCommand || packageManager === 'unknown') {\n throw new Error('Could not determine the package manager')\n }\n const [command, ...args] = installCommand.split(' ')\n if (!command) {\n throw new Error('Could not determine the command to run')\n }\n // Cache lookup — already populated by versionToAutoUpgrade() upstream, so this\n // is just a synchronous cache read, no extra network call.\n const newerVersion = checkForCachedNewVersion('@shopify/cli', CLI_KIT_VERSION)\n const headline = newerVersion\n ? `✨ New version of Shopify CLI available! (${CLI_KIT_VERSION} → ${newerVersion})`\n : '✨ New version of Shopify CLI available!'\n outputInfo(\n outputContent`${headline}\n Now upgrading by running: ${outputToken.genericShellCommand(installCommand)}...`,\n )\n await execUpgradeCommand(command, args)\n\n // A zero exit code doesn't guarantee the right version landed: the version check above\n // queries the public npm registry, while the install goes through whatever registry the\n // user has configured. A private registry with a stale `latest` tag (or one that serves\n // stale metadata on auth errors) can \"successfully\" install an outdated version. Verify\n // what's actually installed before claiming success.\n const installedVersion = await globalCLIVersion()\n if (!installedVersion) {\n throw new AbortError(\n \"Couldn't verify the Shopify CLI version after upgrading.\",\n outputContent`Check the installed version by running ${outputToken.genericShellCommand('shopify version')}.`,\n )\n }\n const expectedVersion = newerVersion ?? CLI_KIT_VERSION\n if (semverLt(installedVersion, expectedVersion)) {\n throw new AbortError(\n `Failed to upgrade Shopify CLI. Expected to be on version ${expectedVersion}, but version ${installedVersion} is now installed.`,\n 'Your package manager may be resolving @shopify/cli from a registry with outdated versions. Check your npm registry configuration and try again.',\n )\n }\n return {\n status: 'success',\n changed: installedVersion !== CLI_KIT_VERSION,\n scope: 'global',\n previousVersion: CLI_KIT_VERSION,\n version: installedVersion,\n packageManager,\n }\n } else if (projectDir) {\n return upgradeLocalShopify(projectDir, CLI_KIT_VERSION)\n } else {\n throw new Error('Could not determine the local project directory')\n }\n}\n\n/**\n * Returns the version to auto-upgrade to, or undefined if auto-upgrade should be skipped.\n * Auto-upgrade is enabled by default and can be disabled via `setAutoUpgradeEnabled(false)`.\n * Also skips for CI, pre-release versions, or when no newer version is available.\n *\n * @returns The version string to upgrade to, or undefined if no upgrade should happen.\n */\nexport function versionToAutoUpgrade(): string | undefined {\n const currentVersion = CLI_KIT_VERSION\n const newerVersion = checkForCachedNewVersion('@shopify/cli', currentVersion)\n if (!newerVersion) {\n outputDebug('Auto-upgrade: No newer version available.')\n return undefined\n }\n if (process.env.SHOPIFY_CLI_FORCE_AUTO_UPGRADE === '1') {\n outputDebug('Auto-upgrade: Forcing auto-upgrade because of SHOPIFY_CLI_FORCE_AUTO_UPGRADE.')\n return newerVersion\n }\n if (!getAutoUpgradeEnabled()) {\n outputDebug('Auto-upgrade: Skipping because auto-upgrade is not enabled.')\n return undefined\n }\n if (isCI()) {\n outputDebug('Auto-upgrade: Skipping auto-upgrade in CI.')\n return undefined\n }\n if (isPreReleaseVersion(currentVersion)) {\n outputDebug('Auto-upgrade: Skipping auto-upgrade for pre-release version.')\n return undefined\n }\n return newerVersion\n}\n\n/**\n * Checks the freshly fetched notifications feed for a kill-switch notification that\n * disables auto-upgrade. A blocking notification is one with `surface: \"autoupgrade\"`,\n * `type: \"error\"`, and matching version/date ranges for the current CLI.\n *\n * Fails open: any error fetching or parsing the feed results in `false`, so a broken\n * notifications endpoint never prevents users from auto-upgrading. Intentionally silent\n * (no logs) — this is invoked on the auto-upgrade hot path.\n *\n * @returns `true` when an active blocking notification is found, `false` otherwise.\n */\nexport async function hasBlockingAutoUpgradeNotification(): Promise<boolean> {\n try {\n const {notifications} = await fetchNotifications()\n // Reuse the standard notifications filtering for version/date/surface. The empty\n // commandId disables the command filter; ['autoupgrade'] scopes to our surface.\n // The frequency filter is a no-op here because we never render, so nothing gets\n // written to the lastShown cache for these notifications.\n const matching = filterNotifications(notifications, '', ['autoupgrade'])\n return matching.some((notification) => notification.type === 'error')\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch {\n return false\n }\n}\n\n/**\n * Shows a daily upgrade-available warning for users who have not enabled auto-upgrade.\n * Skipped in CI and for pre-release versions. When auto-upgrade is enabled this is a no-op\n * because the postrun hook will handle the upgrade directly.\n */\nexport async function warnIfUpgradeAvailable(): Promise<void> {\n if (isCI() || isPreReleaseVersion(CLI_KIT_VERSION) || getAutoUpgradeEnabled()) return\n\n const newerVersion = checkForCachedNewVersion('@shopify/cli', CLI_KIT_VERSION)\n if (!newerVersion) return\n\n await runAtMinimumInterval('warn-on-available-upgrade', {days: 1}, async () => {\n outputWarn(getOutputUpdateCLIReminder(newerVersion))\n })\n}\n\n/**\n * Generates a message to remind the user to update the CLI.\n * For major version bumps, appends a link to the GitHub release notes so users\n * can review breaking changes before deciding to upgrade.\n *\n * @param version - The version to update to.\n * @param isMajor - Whether the version bump is a major version change.\n * @returns The message to remind the user to update the CLI.\n */\nexport function getOutputUpdateCLIReminder(version: string, isMajor = false): string {\n const installCommand = cliInstallCommand()\n const base = installCommand\n ? outputContent`💡 Version ${version} available! Run ${outputToken.genericShellCommand(installCommand)}`.value\n : outputContent`💡 Version ${version} available!`.value\n\n if (isMajor) {\n const releaseUrl = `https://github.com/Shopify/cli/releases/tag/${version}`\n const majorNotice =\n outputContent`⚠️ This is a major version — review breaking changes before upgrading:\\n ${outputToken.link(releaseUrl, releaseUrl)}`\n .value\n return `${base}\\n\\n${majorNotice}`\n }\n\n return base\n}\n\nasync function upgradeLocalShopify(projectDir: string, currentVersion: string): Promise<UpgradeResult> {\n const packageJson = (await findUpAndReadPackageJson(projectDir)).content\n const packageJsonDependencies = packageJson.dependencies ?? {}\n const packageJsonDevDependencies = packageJson.devDependencies ?? {}\n const allDependencies = {...packageJsonDependencies, ...packageJsonDevDependencies}\n\n let resolvedCLIVersion = allDependencies[await cliDependency()]\n if (!resolvedCLIVersion) {\n outputDebug('Auto-upgrade: CLI dependency not found in project dependencies, skipping local upgrade.')\n return {status: 'skipped', reason: 'dependency-not-found', scope: 'local'}\n }\n\n if (resolvedCLIVersion.slice(0, 1).match(/[\\^~]/)) resolvedCLIVersion = currentVersion\n const newestCLIVersion = await checkForNewVersion(await cliDependency(), resolvedCLIVersion)\n\n if (newestCLIVersion) {\n outputUpgradeMessage(resolvedCLIVersion, newestCLIVersion)\n } else {\n outputWontInstallMessage(resolvedCLIVersion)\n }\n\n const dependencies = await installJsonDependencies('prod', packageJsonDependencies, projectDir)\n const devDependencies = await installJsonDependencies('dev', packageJsonDevDependencies, projectDir)\n // Local installs are not verified, so the registry version is not an installed-version claim.\n return {\n status: 'success',\n changed: null,\n scope: 'local',\n directory: projectDir,\n previousVersion: resolvedCLIVersion,\n availableVersion: newestCLIVersion ?? null,\n packages: [...new Set([...dependencies, ...devDependencies])],\n }\n}\n\nasync function installJsonDependencies(\n depsEnv: DependencyType,\n deps: {[key: string]: string},\n directory: string,\n): Promise<string[]> {\n const packagesToUpdate = [await cliDependency(), ...(await oclifPlugins())]\n .filter((pkg: string): boolean => {\n const pkgRequirement: string | undefined = deps[pkg]\n return Boolean(pkgRequirement)\n })\n .map((pkg) => {\n return {name: pkg, version: 'latest'}\n })\n\n const appUsesWorkspaces = await usesWorkspaces(directory)\n\n if (packagesToUpdate.length > 0) {\n const packageManager = await getPackageManager(directory)\n const streams = upgradeOutputStreams()\n try {\n await addNPMDependencies(packagesToUpdate, {\n packageManager,\n type: depsEnv,\n directory,\n ...streams,\n addToRootDirectory: appUsesWorkspaces,\n })\n } finally {\n if (streams.stdout !== process.stdout) streams.stdout.end()\n if (streams.stderr !== process.stderr) streams.stderr.end()\n }\n }\n return packagesToUpdate.map(({name}) => name)\n}\n\nasync function cliDependency(): Promise<string> {\n return (await packageJsonContents()).name\n}\n\nasync function oclifPlugins(): Promise<string[]> {\n return (await packageJsonContents())?.oclif?.plugins ?? []\n}\n\ntype PackageJsonWithName = Omit<PackageJson, 'name'> & {name: string}\nlet _packageJsonContents: PackageJsonWithName | undefined\n\nasync function packageJsonContents(): Promise<PackageJsonWithName> {\n if (!_packageJsonContents) {\n const packageJson = await findUpAndReadPackageJson(moduleDirectory(import.meta.url))\n _packageJsonContents = _packageJsonContents ?? (packageJson.content as PackageJsonWithName)\n }\n return _packageJsonContents\n}\n\nfunction outputWontInstallMessage(currentVersion: string): void {\n outputInfo(outputContent`You're on the latest version, ${outputToken.yellow(currentVersion)}, no need to upgrade!`)\n}\n\nfunction outputUpgradeMessage(currentVersion: string, newestVersion: string): void {\n outputInfo(\n outputContent`Upgrading CLI from ${outputToken.yellow(currentVersion)} to ${outputToken.yellow(newestVersion)}...`,\n )\n}\n"]}