From 809f5f4af9b75011915f85c1d80172f0ebcb656d Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Wed, 31 Jul 2024 18:53:42 -0400 Subject: [PATCH 01/14] Fix project upload autodeploy race condition --- packages/cli/lang/en.lyaml | 2 + packages/cli/lib/projects.js | 213 ++++++++++++++++++++--------------- 2 files changed, 125 insertions(+), 90 deletions(-) diff --git a/packages/cli/lang/en.lyaml b/packages/cli/lang/en.lyaml index cc94ab458..f0eb48abf 100644 --- a/packages/cli/lang/en.lyaml +++ b/packages/cli/lang/en.lyaml @@ -1052,9 +1052,11 @@ en: successStatusText: "DONE" failedStatusText: "FAILED" errorFetchingTaskStatus: "Error fetching {{ taskType }} status" + pollBuildAutodeployStatusError: "Error fetching autodeploy status for build #{{ buildId }}" pollProjectBuildAndDeploy: buildSucceededAutomaticallyDeploying: "Build #{{ buildId }} succeeded. {{#bold}}Automatically deploying{{/bold}} to {{ accountIdentifier }}\n" cleanedUpTempFile: "Cleaned up temporary file {{ path }}" + unableToFindAutodeployStatus: "Unable to locate auto deploy for build #{{ buildId }}. This deploy may have been skipped." logFeedbackMessage: feedbackHeader: "We'd love to hear your feedback!" feedbackMessage: "How are you liking the new projects and developer tools? \n > Run `{{#yellow}}hs feedback{{/yellow}}` to let us know what you think!\n" diff --git a/packages/cli/lib/projects.js b/packages/cli/lib/projects.js index d0e880d02..b9e70acf4 100644 --- a/packages/cli/lib/projects.js +++ b/packages/cli/lib/projects.js @@ -407,7 +407,7 @@ const pollProjectBuildAndDeploy = async ( buildId, silenceLogs = false ) => { - const buildStatus = await pollBuildStatus( + let buildStatus = await pollBuildStatus( accountId, projectConfig.name, buildId, @@ -415,16 +415,6 @@ const pollProjectBuildAndDeploy = async ( silenceLogs ); - const { - autoDeployId, - isAutoDeployEnabled, - deployStatusTaskLocator, - } = buildStatus; - - // autoDeployId of 0 indicates a skipped deploy - const isDeploying = - isAutoDeployEnabled && autoDeployId > 0 && deployStatusTaskLocator; - if (!silenceLogs) { uiLine(); } @@ -439,7 +429,7 @@ const pollProjectBuildAndDeploy = async ( if (buildStatus.status === 'FAILURE') { result.succeeded = false; return result; - } else if (isDeploying) { + } else if (buildStatus.isAutoDeployEnabled) { if (!silenceLogs) { logger.log( i18n( @@ -454,17 +444,39 @@ const pollProjectBuildAndDeploy = async ( displayWarnLogs(accountId, projectConfig.name, buildId); } - const deployStatus = await pollDeployStatus( - accountId, - projectConfig.name, - deployStatusTaskLocator.id, - buildId, - silenceLogs - ); - result.deployResult = deployStatus; + // autoDeployId of 0 indicates a skipped deploy + const getIsDeploying = () => + buildStatus.autoDeployId > 0 && buildStatus.deployStatusTaskLocator; - if (deployStatus.status === 'FAILURE') { - result.succeeded = false; + // Sometimes the deploys do not immediately initiate, give them a chance to kick off + if (!getIsDeploying()) { + buildStatus = await pollBuildAutodeployStatus( + accountId, + projectConfig.name, + buildId + ); + } + + if (getIsDeploying()) { + const deployStatus = await pollDeployStatus( + accountId, + projectConfig.name, + buildStatus.deployStatusTaskLocator.id, + buildId, + silenceLogs + ); + result.deployResult = deployStatus; + + if (deployStatus.status === 'FAILURE') { + result.succeeded = false; + } + } else if (!silenceLogs) { + logger.log( + i18n( + `${i18nKey}.pollProjectBuildAndDeploy.unableToFindAutodeployStatus`, + { buildId } + ) + ); } } @@ -590,17 +602,6 @@ const makePollTaskStatusFunc = ({ statusStrings, linkToHubSpot, }) => { - const isTaskComplete = task => { - if ( - !task[statusText.SUBTASK_KEY].length || - task.status === statusText.STATES.FAILURE - ) { - return true; - } else if (task.status === statusText.STATES.SUCCESS) { - return task.isAutoDeployEnabled ? !!task.deployStatusTaskLocator : true; - } - }; - return async ( accountId, taskName, @@ -705,13 +706,7 @@ const makePollTaskStatusFunc = ({ try { taskStatus = await statusFn(accountId, taskName, taskId); } catch (e) { - logApiErrorInstance( - e, - new ApiErrorContext({ - accountId, - projectName: taskName, - }) - ); + logger.debug(e); return reject( new Error( i18n( @@ -787,61 +782,64 @@ const makePollTaskStatusFunc = ({ } }); - if (isTaskComplete(taskStatus)) { - if (status === statusText.STATES.SUCCESS) { - SpinniesManager.succeed(overallTaskSpinniesKey, { - text: statusStrings.SUCCESS(taskName, displayId), - }); - } else if (status === statusText.STATES.FAILURE) { - SpinniesManager.fail(overallTaskSpinniesKey, { - text: statusStrings.FAIL(taskName, displayId), - }); - - if (!silenceLogs) { - const failedSubtasks = subTaskStatus.filter( - subtask => subtask.status === 'FAILURE' - ); - - uiLine(); + if (status === statusText.STATES.SUCCESS) { + SpinniesManager.succeed(overallTaskSpinniesKey, { + text: statusStrings.SUCCESS(taskName, displayId), + }); + clearInterval(pollInterval); + resolve(taskStatus); + } else if (status === statusText.STATES.FAILURE) { + SpinniesManager.fail(overallTaskSpinniesKey, { + text: statusStrings.FAIL(taskName, displayId), + }); + + if (!silenceLogs) { + const failedSubtasks = subTaskStatus.filter( + subtask => subtask.status === 'FAILURE' + ); + + uiLine(); + logger.log( + `${statusStrings.SUBTASK_FAIL( + displayId, + failedSubtasks.length === 1 + ? failedSubtasks[0][statusText.SUBTASK_NAME_KEY] + : failedSubtasks.length + ' components' + )}\n` + ); + logger.log('See below for a summary of errors.'); + uiLine(); + + const displayErrors = failedSubtasks.filter( + subtask => + subtask.standardError.subCategory !== + PROJECT_ERROR_TYPES.SUBBUILD_FAILED && + subtask.standardError.subCategory !== + PROJECT_ERROR_TYPES.SUBDEPLOY_FAILED + ); + + displayErrors.forEach(subTask => { logger.log( - `${statusStrings.SUBTASK_FAIL( - displayId, - failedSubtasks.length === 1 - ? failedSubtasks[0][statusText.SUBTASK_NAME_KEY] - : failedSubtasks.length + ' components' - )}\n` - ); - logger.log('See below for a summary of errors.'); - uiLine(); - - const displayErrors = failedSubtasks.filter( - subtask => - subtask.standardError.subCategory !== - PROJECT_ERROR_TYPES.SUBBUILD_FAILED && - subtask.standardError.subCategory !== - PROJECT_ERROR_TYPES.SUBDEPLOY_FAILED + `\n--- ${chalk.bold( + subTask[statusText.SUBTASK_NAME_KEY] + )} failed with the following error ---` ); - - displayErrors.forEach(subTask => { - logger.log( - `\n--- ${chalk.bold( - subTask[statusText.SUBTASK_NAME_KEY] - )} failed with the following error ---` - ); - logger.error(subTask.errorMessage); - - // Log nested errors - if (subTask.standardError && subTask.standardError.errors) { - logger.log(); - subTask.standardError.errors.forEach(error => { - logger.log(error.message); - }); - } - }); - } + logger.error(subTask.errorMessage); + + // Log nested errors + if (subTask.standardError && subTask.standardError.errors) { + logger.log(); + subTask.standardError.errors.forEach(error => { + logger.log(error.message); + }); + } + }); } clearInterval(pollInterval); resolve(taskStatus); + } else if (!subTaskStatus.length) { + clearInterval(pollInterval); + resolve(taskStatus); } } }, POLLING_DELAY); @@ -849,6 +847,41 @@ const makePollTaskStatusFunc = ({ }; }; +const pollBuildAutodeployStatus = (accountId, taskName, buildId) => { + return new Promise((resolve, reject) => { + let maxIntervals = (60 * 1000) / POLLING_DELAY; // Num of intervals in ~1 min + + const pollInterval = setInterval(async () => { + let taskStatus; + try { + taskStatus = await getBuildStatus(accountId, taskName, buildId); + } catch (e) { + logger.debug(e); + return reject( + new Error( + i18n(`${i18nKey}.pollBuildAutodeployStatusError`, { buildId }) + ) + ); + } + + if (!taskStatus || !taskStatus.status) { + return reject( + new Error( + i18n(`${i18nKey}.pollBuildAutodeployStatusError`, { buildId }) + ) + ); + } + + if (taskStatus.deployStatusTaskLocator || maxIntervals <= 0) { + clearInterval(pollInterval); + resolve(taskStatus); + } else { + maxIntervals -= 1; + } + }, POLLING_DELAY); + }); +}; + const pollBuildStatus = makePollTaskStatusFunc({ linkToHubSpot: (accountId, taskName, taskId) => uiLink( From 057e73f9fd4546aabb6b744a9a5c11f48e5248cc Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Wed, 7 Aug 2024 11:25:47 -0400 Subject: [PATCH 02/14] Drop polling timeout to 30s --- packages/cli/lib/projects.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/lib/projects.js b/packages/cli/lib/projects.js index b9e70acf4..f90d55d57 100644 --- a/packages/cli/lib/projects.js +++ b/packages/cli/lib/projects.js @@ -849,7 +849,7 @@ const makePollTaskStatusFunc = ({ const pollBuildAutodeployStatus = (accountId, taskName, buildId) => { return new Promise((resolve, reject) => { - let maxIntervals = (60 * 1000) / POLLING_DELAY; // Num of intervals in ~1 min + let maxIntervals = (30 * 1000) / POLLING_DELAY; // Num of intervals in ~30s const pollInterval = setInterval(async () => { let taskStatus; From 04f27eb132f9ac85f58d5bf1c56b7f2694dca16f Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Thu, 8 Aug 2024 11:27:58 -0400 Subject: [PATCH 03/14] small tweaks to copy --- packages/cli/lang/en.lyaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/lang/en.lyaml b/packages/cli/lang/en.lyaml index f0eb48abf..3c35a63fb 100644 --- a/packages/cli/lang/en.lyaml +++ b/packages/cli/lang/en.lyaml @@ -1056,7 +1056,7 @@ en: pollProjectBuildAndDeploy: buildSucceededAutomaticallyDeploying: "Build #{{ buildId }} succeeded. {{#bold}}Automatically deploying{{/bold}} to {{ accountIdentifier }}\n" cleanedUpTempFile: "Cleaned up temporary file {{ path }}" - unableToFindAutodeployStatus: "Unable to locate auto deploy for build #{{ buildId }}. This deploy may have been skipped." + unableToFindAutodeployStatus: "Unable to find the auto deploy for build #{{ buildId }}. This deploy may have been skipped." logFeedbackMessage: feedbackHeader: "We'd love to hear your feedback!" feedbackMessage: "How are you liking the new projects and developer tools? \n > Run `{{#yellow}}hs feedback{{/yellow}}` to let us know what you think!\n" From 813ad7e10b03da1921e5eef1903ffcf57fdbc7e6 Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Thu, 8 Aug 2024 14:02:06 -0400 Subject: [PATCH 04/14] add link to deploys in hubspot --- packages/cli/lang/en.lyaml | 3 ++- packages/cli/lib/projects.js | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/cli/lang/en.lyaml b/packages/cli/lang/en.lyaml index 3c35a63fb..2009d518f 100644 --- a/packages/cli/lang/en.lyaml +++ b/packages/cli/lang/en.lyaml @@ -1056,7 +1056,8 @@ en: pollProjectBuildAndDeploy: buildSucceededAutomaticallyDeploying: "Build #{{ buildId }} succeeded. {{#bold}}Automatically deploying{{/bold}} to {{ accountIdentifier }}\n" cleanedUpTempFile: "Cleaned up temporary file {{ path }}" - unableToFindAutodeployStatus: "Unable to find the auto deploy for build #{{ buildId }}. This deploy may have been skipped." + viewDeploys: "View all deploys for this project in HubSpot" + unableToFindAutodeployStatus: "Unable to find the auto deploy for build #{{ buildId }}. This deploy may have been skipped. {{ viewDeploysLink }}." logFeedbackMessage: feedbackHeader: "We'd love to hear your feedback!" feedbackMessage: "How are you liking the new projects and developer tools? \n > Run `{{#yellow}}hs feedback{{/yellow}}` to let us know what you think!\n" diff --git a/packages/cli/lib/projects.js b/packages/cli/lib/projects.js index f90d55d57..c219b13a1 100644 --- a/packages/cli/lib/projects.js +++ b/packages/cli/lib/projects.js @@ -328,17 +328,19 @@ const getProjectDetailUrl = (projectName, accountId) => { return `${getProjectHomeUrl(accountId)}/project/${projectName}`; }; +const getProjectActivityUrl = (projectName, accountId) => { + if (!projectName) return; + return `${getProjectDetailUrl(projectName, accountId)}/activity`; +}; + const getProjectBuildDetailUrl = (projectName, buildId, accountId) => { if (!projectName || !buildId || !accountId) return; - return `${getProjectDetailUrl(projectName, accountId)}/build/${buildId}`; + return `${getProjectActivityUrl(projectName, accountId)}/build/${buildId}`; }; const getProjectDeployDetailUrl = (projectName, deployId, accountId) => { if (!projectName || !deployId || !accountId) return; - return `${getProjectDetailUrl( - projectName, - accountId - )}/activity/deploy/${deployId}`; + return `${getProjectActivityUrl(projectName, accountId)}/deploy/${deployId}`; }; const uploadProjectFiles = async ( @@ -474,7 +476,13 @@ const pollProjectBuildAndDeploy = async ( logger.log( i18n( `${i18nKey}.pollProjectBuildAndDeploy.unableToFindAutodeployStatus`, - { buildId } + { + buildId, + viewDeploysLink: uiLink( + i18n(`${i18nKey}.pollProjectBuildAndDeploy.viewDeploys`), + getProjectActivityUrl(projectConfig.name, accountId) + ), + } ) ); } From 79084cf06c8b900cc179b8d2e52d11aee44dd3bb Mon Sep 17 00:00:00 2001 From: Allison Kemmerle Date: Wed, 14 Aug 2024 09:55:32 -0400 Subject: [PATCH 05/14] Add detailed usage tracking to migration commands --- packages/cli/commands/project/cloneApp.js | 17 ++++++++++++++--- packages/cli/commands/project/migrateApp.js | 17 ++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/cli/commands/project/cloneApp.js b/packages/cli/commands/project/cloneApp.js index 8a0f2e7d5..6ecce568d 100644 --- a/packages/cli/commands/project/cloneApp.js +++ b/packages/cli/commands/project/cloneApp.js @@ -6,7 +6,7 @@ const { getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts'); -const { trackCommandUsage } = require('../../lib/usageTracking'); +const { trackCommandMetadataUsage } = require('../../lib/usageTracking'); const { loadAndValidateOptions } = require('../../lib/validation'); const { i18n } = require('../../lib/lang'); const { @@ -52,8 +52,6 @@ exports.handler = async options => { const accountConfig = getAccountConfig(accountId); const accountName = uiAccountDescription(accountId); - trackCommandUsage('clone-app', {}, accountId); - if (!isAppDeveloperAccount(accountConfig)) { uiLine(); logger.error(i18n(`${i18nKey}.errors.invalidAccountTypeTitle`)); @@ -81,6 +79,7 @@ exports.handler = async options => { }); appId = appIdResponse.appId; } + trackCommandMetadataUsage('clone-app', { appId }, accountId); const projectResponse = await createProjectPrompt('', options, true); name = projectResponse.name; @@ -120,6 +119,12 @@ exports.handler = async options => { }; const success = writeProjectConfig(configPath, configContent); + trackCommandMetadataUsage( + 'clone-app', + { projectName: name, appId, status }, + accountId + ); + SpinniesManager.succeed('cloneApp', { text: i18n(`${i18nKey}.cloneStatus.done`), succeedColor: 'white', @@ -137,6 +142,12 @@ exports.handler = async options => { process.exit(EXIT_CODES.SUCCESS); } } catch (error) { + trackCommandMetadataUsage( + 'clone-app', + { projectName: name, appId, status: 'FAILURE', error }, + accountId + ); + SpinniesManager.fail('cloneApp', { text: i18n(`${i18nKey}.cloneStatus.failure`), failColor: 'white', diff --git a/packages/cli/commands/project/migrateApp.js b/packages/cli/commands/project/migrateApp.js index 576ff113d..05d49bed0 100644 --- a/packages/cli/commands/project/migrateApp.js +++ b/packages/cli/commands/project/migrateApp.js @@ -5,7 +5,7 @@ const { getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts'); -const { trackCommandUsage } = require('../../lib/usageTracking'); +const { trackCommandMetadataUsage } = require('../../lib/usageTracking'); const { loadAndValidateOptions } = require('../../lib/validation'); const { createProjectPrompt, @@ -58,8 +58,6 @@ exports.handler = async options => { const accountConfig = getAccountConfig(accountId); const accountName = uiAccountDescription(accountId); - trackCommandUsage('migrate-app', {}, accountId); - if (!isAppDeveloperAccount(accountConfig)) { uiLine(); logger.error(i18n(`${i18nKey}.errors.invalidAccountTypeTitle`)); @@ -82,6 +80,8 @@ exports.handler = async options => { isMigratingApp: true, }); + trackCommandMetadataUsage('migrate-app', { appId }, accountId); + let appName; try { const selectedApp = await fetchPublicAppMetadata(appId, accountId); @@ -185,6 +185,12 @@ exports.handler = async options => { { includesRootDir: true, hideLogs: true } ); + trackCommandMetadataUsage( + 'migrate-app', + { projectName, appId, status }, + accountId + ); + SpinniesManager.succeed('migrateApp', { text: i18n(`${i18nKey}.migrationStatus.done`), succeedColor: 'white', @@ -202,6 +208,11 @@ exports.handler = async options => { process.exit(EXIT_CODES.SUCCESS); } } catch (error) { + trackCommandMetadataUsage( + 'migrate-app', + { projectName, appId, status: 'FAILURE', error }, + accountId + ); SpinniesManager.fail('migrateApp', { text: i18n(`${i18nKey}.migrationStatus.failure`), failColor: 'white', From 9b3ea21df388ffec4e58eccdfd62c59c04686239 Mon Sep 17 00:00:00 2001 From: Allison Kemmerle Date: Wed, 14 Aug 2024 12:33:02 -0400 Subject: [PATCH 06/14] Add more metadata --- packages/cli/commands/project/cloneApp.js | 13 ++++++++++++- packages/cli/commands/project/migrateApp.js | 7 +++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/cli/commands/project/cloneApp.js b/packages/cli/commands/project/cloneApp.js index 6ecce568d..104033ce1 100644 --- a/packages/cli/commands/project/cloneApp.js +++ b/packages/cli/commands/project/cloneApp.js @@ -39,6 +39,9 @@ const { getCwd } = require('@hubspot/local-dev-lib/path'); const { logger } = require('@hubspot/local-dev-lib/logger'); const { getAccountConfig } = require('@hubspot/local-dev-lib/config'); const { extractZipArchive } = require('@hubspot/local-dev-lib/archive'); +const { + fetchPublicAppMetadata, +} = require('@hubspot/local-dev-lib/api/appsDev'); const i18nKey = 'commands.project.subcommands.cloneApp'; @@ -79,7 +82,15 @@ exports.handler = async options => { }); appId = appIdResponse.appId; } - trackCommandMetadataUsage('clone-app', { appId }, accountId); + const selectedApp = await fetchPublicAppMetadata(appId, accountId); + // preventProjectMigrations returns true if we have not added app to allowlist config. + // listingInfo will only exist for marketplace apps + const { preventProjectMigrations, listingInfo } = selectedApp; + trackCommandMetadataUsage( + 'clone-app', + { appId, preventProjectMigrations, listingInfo }, + accountId + ); const projectResponse = await createProjectPrompt('', options, true); name = projectResponse.name; diff --git a/packages/cli/commands/project/migrateApp.js b/packages/cli/commands/project/migrateApp.js index 05d49bed0..a88fb84c3 100644 --- a/packages/cli/commands/project/migrateApp.js +++ b/packages/cli/commands/project/migrateApp.js @@ -80,14 +80,17 @@ exports.handler = async options => { isMigratingApp: true, }); - trackCommandMetadataUsage('migrate-app', { appId }, accountId); - let appName; try { const selectedApp = await fetchPublicAppMetadata(appId, accountId); // preventProjectMigrations returns true if we have not added app to allowlist config. // listingInfo will only exist for marketplace apps const { preventProjectMigrations, listingInfo } = selectedApp; + trackCommandMetadataUsage( + 'migrate-app', + { appId, preventProjectMigrations, listingInfo }, + accountId + ); if (preventProjectMigrations && listingInfo) { logger.error(i18n(`${i18nKey}.errors.invalidApp`, { appId })); process.exit(EXIT_CODES.ERROR); From 32cd50327d070cff90dc3dc3b07ec5a22bd993d8 Mon Sep 17 00:00:00 2001 From: Allison Kemmerle Date: Wed, 14 Aug 2024 13:10:32 -0400 Subject: [PATCH 07/14] Address feedback p1 --- packages/cli/commands/project/cloneApp.js | 25 ++++++++++++++------- packages/cli/commands/project/migrateApp.js | 19 +++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/packages/cli/commands/project/cloneApp.js b/packages/cli/commands/project/cloneApp.js index 104033ce1..a0050d943 100644 --- a/packages/cli/commands/project/cloneApp.js +++ b/packages/cli/commands/project/cloneApp.js @@ -6,7 +6,10 @@ const { getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts'); -const { trackCommandMetadataUsage } = require('../../lib/usageTracking'); +const { + trackCommandUsage, + trackCommandMetadataUsage, +} = require('../../lib/usageTracking'); const { loadAndValidateOptions } = require('../../lib/validation'); const { i18n } = require('../../lib/lang'); const { @@ -55,6 +58,8 @@ exports.handler = async options => { const accountConfig = getAccountConfig(accountId); const accountName = uiAccountDescription(accountId); + trackCommandUsage('clone-app', {}, accountId); + if (!isAppDeveloperAccount(accountConfig)) { uiLine(); logger.error(i18n(`${i18nKey}.errors.invalidAccountTypeTitle`)); @@ -71,6 +76,8 @@ exports.handler = async options => { let appId; let name; let location; + let preventProjectMigrations; + let listingInfo; try { appId = options.appId; if (!appId) { @@ -85,12 +92,8 @@ exports.handler = async options => { const selectedApp = await fetchPublicAppMetadata(appId, accountId); // preventProjectMigrations returns true if we have not added app to allowlist config. // listingInfo will only exist for marketplace apps - const { preventProjectMigrations, listingInfo } = selectedApp; - trackCommandMetadataUsage( - 'clone-app', - { appId, preventProjectMigrations, listingInfo }, - accountId - ); + preventProjectMigrations = selectedApp.preventProjectMigrations; + listingInfo = selectedApp.listingInfo; const projectResponse = await createProjectPrompt('', options, true); name = projectResponse.name; @@ -132,7 +135,13 @@ exports.handler = async options => { trackCommandMetadataUsage( 'clone-app', - { projectName: name, appId, status }, + { + projectName: name, + appId, + status, + preventProjectMigrations, + listingInfo, + }, accountId ); diff --git a/packages/cli/commands/project/migrateApp.js b/packages/cli/commands/project/migrateApp.js index a88fb84c3..690c6eb4e 100644 --- a/packages/cli/commands/project/migrateApp.js +++ b/packages/cli/commands/project/migrateApp.js @@ -5,7 +5,10 @@ const { getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts'); -const { trackCommandMetadataUsage } = require('../../lib/usageTracking'); +const { + trackCommandUsage, + trackCommandMetadataUsage, +} = require('../../lib/usageTracking'); const { loadAndValidateOptions } = require('../../lib/validation'); const { createProjectPrompt, @@ -58,6 +61,8 @@ exports.handler = async options => { const accountConfig = getAccountConfig(accountId); const accountName = uiAccountDescription(accountId); + trackCommandUsage('migrate-app', {}, accountId); + if (!isAppDeveloperAccount(accountConfig)) { uiLine(); logger.error(i18n(`${i18nKey}.errors.invalidAccountTypeTitle`)); @@ -81,16 +86,14 @@ exports.handler = async options => { }); let appName; + let preventProjectMigrations; + let listingInfo; try { const selectedApp = await fetchPublicAppMetadata(appId, accountId); // preventProjectMigrations returns true if we have not added app to allowlist config. // listingInfo will only exist for marketplace apps - const { preventProjectMigrations, listingInfo } = selectedApp; - trackCommandMetadataUsage( - 'migrate-app', - { appId, preventProjectMigrations, listingInfo }, - accountId - ); + preventProjectMigrations = selectedApp.preventProjectMigrations; + listingInfo = selectedApp.listingInfo; if (preventProjectMigrations && listingInfo) { logger.error(i18n(`${i18nKey}.errors.invalidApp`, { appId })); process.exit(EXIT_CODES.ERROR); @@ -190,7 +193,7 @@ exports.handler = async options => { trackCommandMetadataUsage( 'migrate-app', - { projectName, appId, status }, + { projectName, appId, status, preventProjectMigrations, listingInfo }, accountId ); From b9f3bd85d7238c6c72af57fdb90fbdd283208361 Mon Sep 17 00:00:00 2001 From: Allison Kemmerle Date: Thu, 15 Aug 2024 08:48:31 -0400 Subject: [PATCH 08/14] Replace listingInfo with boolean --- packages/cli/commands/project/cloneApp.js | 3 ++- packages/cli/commands/project/migrateApp.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/cli/commands/project/cloneApp.js b/packages/cli/commands/project/cloneApp.js index a0050d943..4de1cd7f8 100644 --- a/packages/cli/commands/project/cloneApp.js +++ b/packages/cli/commands/project/cloneApp.js @@ -133,6 +133,7 @@ exports.handler = async options => { }; const success = writeProjectConfig(configPath, configContent); + const isListed = Boolean(listingInfo); trackCommandMetadataUsage( 'clone-app', { @@ -140,7 +141,7 @@ exports.handler = async options => { appId, status, preventProjectMigrations, - listingInfo, + isListed, }, accountId ); diff --git a/packages/cli/commands/project/migrateApp.js b/packages/cli/commands/project/migrateApp.js index 690c6eb4e..f9c5d0e15 100644 --- a/packages/cli/commands/project/migrateApp.js +++ b/packages/cli/commands/project/migrateApp.js @@ -191,9 +191,10 @@ exports.handler = async options => { { includesRootDir: true, hideLogs: true } ); + const isListed = Boolean(listingInfo); trackCommandMetadataUsage( 'migrate-app', - { projectName, appId, status, preventProjectMigrations, listingInfo }, + { projectName, appId, status, preventProjectMigrations, isListed }, accountId ); From ecbe8cc44ab8d24bb3b56e1b2f14828655d99663 Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Thu, 15 Aug 2024 13:51:48 -0400 Subject: [PATCH 09/14] fixing project deploy command --- .../commands/project/__tests__/deploy.test.js | 16 +++++++++------- packages/cli/commands/project/deploy.js | 19 ++++++++++--------- packages/cli/commands/project/upload.js | 2 +- packages/cli/lang/en.lyaml | 6 +++--- ...uildIdPrompt.js => deployBuildIdPrompt.js} | 12 ++++-------- 5 files changed, 27 insertions(+), 28 deletions(-) rename packages/cli/lib/prompts/{buildIdPrompt.js => deployBuildIdPrompt.js} (69%) diff --git a/packages/cli/commands/project/__tests__/deploy.test.js b/packages/cli/commands/project/__tests__/deploy.test.js index aa1ad4950..c0397a86f 100644 --- a/packages/cli/commands/project/__tests__/deploy.test.js +++ b/packages/cli/commands/project/__tests__/deploy.test.js @@ -5,7 +5,7 @@ jest.mock('@hubspot/local-dev-lib/api/projects'); jest.mock('../../../lib/validation'); jest.mock('../../../lib/projects'); jest.mock('../../../lib/prompts/projectNamePrompt'); -jest.mock('../../../lib/prompts/buildIdPrompt'); +jest.mock('../../../lib/prompts/deployBuildIdPrompt'); jest.mock('@hubspot/local-dev-lib/config'); jest.mock('../../../lib/usageTracking'); jest.mock('../../../lib/ui'); @@ -45,7 +45,9 @@ const { getProjectDetailUrl, } = require('../../../lib/projects'); const { projectNamePrompt } = require('../../../lib/prompts/projectNamePrompt'); -const { buildIdPrompt } = require('../../../lib/prompts/buildIdPrompt'); +const { + deployBuildIdPrompt, +} = require('../../../lib/prompts/deployBuildIdPrompt'); const { getAccountConfig } = require('@hubspot/local-dev-lib/config'); const yargs = require('yargs'); @@ -163,7 +165,7 @@ describe('commands/project/deploy', () => { getAccountConfig.mockReturnValue({ accountType }); fetchProject.mockResolvedValue(projectDetails); deployProject.mockResolvedValue(deployDetails); - buildIdPrompt.mockResolvedValue({ + deployBuildIdPrompt.mockResolvedValue({ buildId: projectDetails.latestBuild.buildId, }); @@ -294,8 +296,8 @@ describe('commands/project/deploy', () => { it('should prompt for build id if no option is provided', async () => { delete options.buildId; await handler(options); - expect(buildIdPrompt).toHaveBeenCalledTimes(1); - expect(buildIdPrompt).toHaveBeenCalledWith( + expect(deployBuildIdPrompt).toHaveBeenCalledTimes(1); + expect(deployBuildIdPrompt).toHaveBeenCalledWith( projectDetails.latestBuild.buildId, projectDetails.deployedBuildId, options.project, @@ -305,11 +307,11 @@ describe('commands/project/deploy', () => { it('should log an error and exit if the prompted value is invalid', async () => { delete options.buildId; - buildIdPrompt.mockReturnValue({}); + deployBuildIdPrompt.mockReturnValue({}); await handler(options); - expect(buildIdPrompt).toHaveBeenCalledTimes(1); + expect(deployBuildIdPrompt).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledWith( 'You must specify a build to deploy' diff --git a/packages/cli/commands/project/deploy.js b/packages/cli/commands/project/deploy.js index ea33b8c6f..b22bb997a 100644 --- a/packages/cli/commands/project/deploy.js +++ b/packages/cli/commands/project/deploy.js @@ -22,7 +22,9 @@ const { getProjectDetailUrl, } = require('../../lib/projects'); const { projectNamePrompt } = require('../../lib/prompts/projectNamePrompt'); -const { buildIdPrompt } = require('../../lib/prompts/buildIdPrompt'); +const { + deployBuildIdPrompt, +} = require('../../lib/prompts/deployBuildIdPrompt'); const { i18n } = require('../../lib/lang'); const { uiBetaTag, uiLink } = require('../../lib/ui'); const { getAccountConfig } = require('@hubspot/local-dev-lib/config'); @@ -115,20 +117,19 @@ exports.handler = async options => { return process.exit(EXIT_CODES.ERROR); } } else { - const buildIdPromptResponse = await buildIdPrompt( + const deployBuildIdPromptResponse = await deployBuildIdPrompt( latestBuild.buildId, deployedBuildId, - projectName, buildId => validateBuildId( buildId, - latestBuild.buildId, deployedBuildId, + latestBuild.buildId, projectName, accountId ) ); - buildIdToDeploy = buildIdPromptResponse.buildId; + buildIdToDeploy = deployBuildIdPromptResponse.buildId; } if (!buildIdToDeploy) { @@ -181,9 +182,9 @@ exports.builder = yargs => { describe: i18n(`${i18nKey}.options.project.describe`), type: 'string', }, - buildId: { - alias: ['build'], - describe: i18n(`${i18nKey}.options.buildId.describe`), + build: { + alias: ['buildId'], + describe: i18n(`${i18nKey}.options.build.describe`), type: 'number', }, }); @@ -191,7 +192,7 @@ exports.builder = yargs => { yargs.example([ ['$0 project deploy', i18n(`${i18nKey}.examples.default`)], [ - '$0 project deploy --project="my-project" --buildId=5', + '$0 project deploy --project="my-project" --build=5', i18n(`${i18nKey}.examples.withOptions`), ], ]); diff --git a/packages/cli/commands/project/upload.js b/packages/cli/commands/project/upload.js index 74c3bb4b5..bb5a4b1d3 100644 --- a/packages/cli/commands/project/upload.js +++ b/packages/cli/commands/project/upload.js @@ -92,7 +92,7 @@ exports.handler = async options => { logger.log( i18n(`${i18nKey}.logs.autoDeployDisabled`, { deployCommand: uiCommandReference( - `hs project deploy --buildId=${result.buildId}` + `hs project deploy --build=${result.buildId}` ), }) ); diff --git a/packages/cli/lang/en.lyaml b/packages/cli/lang/en.lyaml index 2009d518f..8da186d29 100644 --- a/packages/cli/lang/en.lyaml +++ b/packages/cli/lang/en.lyaml @@ -577,7 +577,7 @@ en: default: "Deploy the latest build of the current project" withOptions: "Deploy build 5 of the project my-project" options: - buildId: + build: describe: "Project build ID to be deployed" project: describe: "Project name" @@ -1296,8 +1296,8 @@ en: general: "[--general] Tell us about your experience with HubSpot's developer tools" bugPrompt: "Create an issue on Github in your browser?" generalPrompt: "Create an issue on Github in your browser?" - buildIdPrompt: - enterBuildId: "[--buildId] Deploy which build?" + deployBuildIdPrompt: + enterBuildId: "[--build] Deploy which build?" previewPrompt: enterSrc: "[--src] Enter a local theme directory to preview." enterDest: "[--dest] Enter the destination path for the src theme in HubSpot Design Tools." diff --git a/packages/cli/lib/prompts/buildIdPrompt.js b/packages/cli/lib/prompts/deployBuildIdPrompt.js similarity index 69% rename from packages/cli/lib/prompts/buildIdPrompt.js rename to packages/cli/lib/prompts/deployBuildIdPrompt.js index af85815a4..dd1edf014 100644 --- a/packages/cli/lib/prompts/buildIdPrompt.js +++ b/packages/cli/lib/prompts/deployBuildIdPrompt.js @@ -1,13 +1,9 @@ const { promptUser } = require('./promptUtils'); const { i18n } = require('../lang'); -const i18nKey = 'lib.prompts.buildIdPrompt'; -const buildIdPrompt = ( - latestBuildId, - deployedBuildId, - projectName, - validate -) => { +const i18nKey = 'lib.prompts.deployBuildIdPrompt'; + +const deployBuildIdPrompt = (latestBuildId, deployedBuildId, validate) => { return promptUser({ name: 'buildId', message: i18n(`${i18nKey}.enterBuildId`), @@ -22,5 +18,5 @@ const buildIdPrompt = ( }; module.exports = { - buildIdPrompt, + deployBuildIdPrompt, }; From 557b7fc4729aee3b84024dd03cce04011f5c68d4 Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Thu, 15 Aug 2024 15:28:51 -0400 Subject: [PATCH 10/14] fix test --- packages/cli/commands/project/__tests__/deploy.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cli/commands/project/__tests__/deploy.test.js b/packages/cli/commands/project/__tests__/deploy.test.js index c0397a86f..cd8afa403 100644 --- a/packages/cli/commands/project/__tests__/deploy.test.js +++ b/packages/cli/commands/project/__tests__/deploy.test.js @@ -300,7 +300,6 @@ describe('commands/project/deploy', () => { expect(deployBuildIdPrompt).toHaveBeenCalledWith( projectDetails.latestBuild.buildId, projectDetails.deployedBuildId, - options.project, expect.any(Function) ); }); From 2b3c6491d7a3263cdf5662b4ba0debbd5c625f2a Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Thu, 15 Aug 2024 15:36:21 -0400 Subject: [PATCH 11/14] fix tests take 2 --- packages/cli/commands/project/__tests__/deploy.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/commands/project/__tests__/deploy.test.js b/packages/cli/commands/project/__tests__/deploy.test.js index cd8afa403..2348cbd14 100644 --- a/packages/cli/commands/project/__tests__/deploy.test.js +++ b/packages/cli/commands/project/__tests__/deploy.test.js @@ -60,8 +60,8 @@ const chalk = require('chalk'); describe('commands/project/deploy', () => { const projectFlag = 'project'; - const buildFlag = 'buildId'; - const buildAliases = ['build']; + const buildFlag = 'build'; + const buildAliases = ['buildId']; describe('describe', () => { it('should contain the beta tag', () => { From 861d1f0eca1aafd26b7be4a5c169d532ce6df979 Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Thu, 15 Aug 2024 15:47:35 -0400 Subject: [PATCH 12/14] Remove nested building label for project upload polling --- packages/cli/lib/projects.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/lib/projects.js b/packages/cli/lib/projects.js index c219b13a1..77ed0a76c 100644 --- a/packages/cli/lib/projects.js +++ b/packages/cli/lib/projects.js @@ -688,7 +688,7 @@ const makePollTaskStatusFunc = ({ const formattedTaskType = PROJECT_TASK_TYPES[taskType] ? `[${PROJECT_TASK_TYPES[taskType]}]` : ''; - const text = `${statusText.STATUS_TEXT} ${chalk.bold( + const text = `${indent <= 2 ? statusText.STATUS_TEXT : ''} ${chalk.bold( taskName )} ${formattedTaskType} ...${newline ? '\n' : ''}`; From 440c12de5244ec17ccfcee8bfe17cdc007fa7dae Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Fri, 16 Aug 2024 11:24:29 -0400 Subject: [PATCH 13/14] bump local dev lib version to 1.10.0 --- packages/cli/package.json | 2 +- packages/serverless-dev-runtime/package.json | 2 +- packages/webpack-cms-plugins/package.json | 2 +- yarn.lock | 39 ++++++++++++++++---- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 11506521f..f014428ff 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -8,7 +8,7 @@ "url": "https://github.com/HubSpot/hubspot-cms-tools" }, "dependencies": { - "@hubspot/local-dev-lib": "1.9.1", + "@hubspot/local-dev-lib": "1.10.0", "@hubspot/serverless-dev-runtime": "5.2.1-beta.11", "@hubspot/theme-preview-dev-server": "0.0.7", "@hubspot/ui-extensions-dev-server": "0.8.20", diff --git a/packages/serverless-dev-runtime/package.json b/packages/serverless-dev-runtime/package.json index ec8fd0ec3..6e2abdfed 100644 --- a/packages/serverless-dev-runtime/package.json +++ b/packages/serverless-dev-runtime/package.json @@ -6,7 +6,7 @@ "repository": "https://github.com/HubSpot/hubspot-cli", "license": "Apache-2.0", "dependencies": { - "@hubspot/local-dev-lib": "1.9.1", + "@hubspot/local-dev-lib": "1.10.0", "body-parser": "^1.19.0", "chalk": "^4.1.0", "chokidar": "^3.4.3", diff --git a/packages/webpack-cms-plugins/package.json b/packages/webpack-cms-plugins/package.json index 0c189155a..b3386be5f 100644 --- a/packages/webpack-cms-plugins/package.json +++ b/packages/webpack-cms-plugins/package.json @@ -17,7 +17,7 @@ "test": "echo \"Error: run tests from root\" && exit 1" }, "dependencies": { - "@hubspot/local-dev-lib": "1.9.1" + "@hubspot/local-dev-lib": "1.10.0" }, "gitHead": "0659fd19cabc3645af431b177c11d0c1b089e0f8" } diff --git a/yarn.lock b/yarn.lock index eb8f254fd..9c1219345 100644 --- a/yarn.lock +++ b/yarn.lock @@ -473,10 +473,10 @@ express "^4.18.2" uuid "^9.0.1" -"@hubspot/local-dev-lib@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@hubspot/local-dev-lib/-/local-dev-lib-1.9.1.tgz#4417a5d15af4cd93d5e7d2c4ff870f550e916a56" - integrity sha512-UhTE+nFU+PP6cZLiE05yMxxmdMpH9R3mTT2WhuHQhsyZNXDVxU/TNqeJ2qity9Cjcng6fnOHkCJK3+z0wKKVPw== +"@hubspot/local-dev-lib@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@hubspot/local-dev-lib/-/local-dev-lib-1.10.0.tgz#08a722c0183e61d43f228d3d41c1dc7f7332c78b" + integrity sha512-ZBywYmrF9hZHP1gF07QXsIJJ6HwMm0GL7O1JWd8sDZJREfz2uhlIvtIF8IvD4Zj8FKuUrwQaVeYLC9FdywneIw== dependencies: address "^2.0.1" axios "^1.3.5" @@ -8098,7 +8098,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8139,7 +8148,7 @@ stringify-object@^3.2.1, stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -8153,6 +8162,13 @@ strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -8841,7 +8857,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -8859,6 +8875,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From f55582baa2ac86396c72861b31998e54580c8c6a Mon Sep 17 00:00:00 2001 From: Branden Rodgers Date: Fri, 16 Aug 2024 13:03:57 -0400 Subject: [PATCH 14/14] v5.3.0 --- lerna.json | 2 +- packages/cli/package.json | 4 ++-- packages/serverless-dev-runtime/package.json | 2 +- packages/webpack-cms-plugins/package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lerna.json b/lerna.json index 25361d9c3..97f6bd49d 100644 --- a/lerna.json +++ b/lerna.json @@ -2,5 +2,5 @@ "npmClient": "yarn", "useWorkspaces": true, "packages": ["packages/*", "acceptance-tests"], - "version": "5.2.1-beta.13" + "version": "5.3.0" } diff --git a/packages/cli/package.json b/packages/cli/package.json index f014428ff..64cabd770 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@hubspot/cli", - "version": "5.2.1-beta.13", + "version": "5.3.0", "description": "CLI for working with HubSpot", "license": "Apache-2.0", "repository": { @@ -9,7 +9,7 @@ }, "dependencies": { "@hubspot/local-dev-lib": "1.10.0", - "@hubspot/serverless-dev-runtime": "5.2.1-beta.11", + "@hubspot/serverless-dev-runtime": "5.3.0", "@hubspot/theme-preview-dev-server": "0.0.7", "@hubspot/ui-extensions-dev-server": "0.8.20", "archiver": "^5.3.0", diff --git a/packages/serverless-dev-runtime/package.json b/packages/serverless-dev-runtime/package.json index 6e2abdfed..0484b6854 100644 --- a/packages/serverless-dev-runtime/package.json +++ b/packages/serverless-dev-runtime/package.json @@ -1,6 +1,6 @@ { "name": "@hubspot/serverless-dev-runtime", - "version": "5.2.1-beta.11", + "version": "5.3.0", "description": "A tool for testing HubSpot CMS serverless functions locally", "main": "index.js", "repository": "https://github.com/HubSpot/hubspot-cli", diff --git a/packages/webpack-cms-plugins/package.json b/packages/webpack-cms-plugins/package.json index b3386be5f..2769bf992 100644 --- a/packages/webpack-cms-plugins/package.json +++ b/packages/webpack-cms-plugins/package.json @@ -1,6 +1,6 @@ { "name": "@hubspot/webpack-cms-plugins", - "version": "5.2.1-beta.11", + "version": "5.3.0", "description": "Webpack plugins for using with the HubSpot CMS", "license": "Apache-2.0", "repository": {