@hubspot/cli 7.7.21-experimental.1 → 7.7.23-experimental.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.
- package/api/__tests__/migrate.test.js +27 -29
- package/api/migrate.js +14 -22
- package/bin/cli.js +92 -97
- package/bin/hs +2 -2
- package/bin/hscms +2 -2
- package/bin/silenceErrors.js +1 -2
- package/commands/__tests__/account.test.js +29 -34
- package/commands/__tests__/auth.test.js +11 -16
- package/commands/__tests__/cms.test.js +15 -20
- package/commands/__tests__/config.test.js +14 -19
- package/commands/__tests__/create.test.js +10 -15
- package/commands/__tests__/customObject.test.js +14 -19
- package/commands/__tests__/doctor.test.js +43 -48
- package/commands/__tests__/feedback.test.js +7 -45
- package/commands/__tests__/fetch.test.js +29 -28
- package/commands/__tests__/filemanager.test.js +14 -19
- package/commands/__tests__/function.test.js +16 -21
- package/commands/__tests__/getStarted.test.js +45 -50
- package/commands/__tests__/hubdb.test.js +17 -22
- package/commands/__tests__/init.test.js +12 -17
- package/commands/__tests__/lint.test.js +13 -18
- package/commands/__tests__/list.test.js +18 -23
- package/commands/__tests__/logs.test.js +28 -27
- package/commands/__tests__/mcp.test.js +14 -19
- package/commands/__tests__/mv.test.js +14 -52
- package/commands/__tests__/open.test.js +13 -51
- package/commands/__tests__/project.test.js +44 -49
- package/commands/__tests__/remove.test.js +13 -51
- package/commands/__tests__/sandbox.test.js +14 -19
- package/commands/__tests__/secret.test.js +16 -21
- package/commands/__tests__/testAccount.test.js +16 -21
- package/commands/__tests__/theme.test.js +15 -20
- package/commands/account/__tests__/auth.test.js +11 -16
- package/commands/account/__tests__/clean.test.js +12 -17
- package/commands/account/__tests__/createOverride.test.js +10 -15
- package/commands/account/__tests__/info.test.js +11 -16
- package/commands/account/__tests__/list.test.js +11 -16
- package/commands/account/__tests__/remove.test.js +13 -18
- package/commands/account/__tests__/removeOverride.js +8 -13
- package/commands/account/__tests__/rename.test.js +15 -20
- package/commands/account/__tests__/use.test.js +10 -15
- package/commands/account/auth.d.ts +1 -1
- package/commands/account/auth.js +65 -67
- package/commands/account/clean.d.ts +1 -1
- package/commands/account/clean.js +55 -60
- package/commands/account/createOverride.d.ts +1 -1
- package/commands/account/createOverride.js +52 -57
- package/commands/account/info.d.ts +1 -1
- package/commands/account/info.js +33 -35
- package/commands/account/list.d.ts +1 -1
- package/commands/account/list.js +43 -45
- package/commands/account/remove.d.ts +1 -1
- package/commands/account/remove.js +37 -42
- package/commands/account/removeOverride.d.ts +1 -1
- package/commands/account/removeOverride.js +38 -43
- package/commands/account/rename.d.ts +1 -1
- package/commands/account/rename.js +18 -20
- package/commands/account/use.d.ts +1 -1
- package/commands/account/use.js +29 -31
- package/commands/account.d.ts +1 -1
- package/commands/account.js +23 -28
- package/commands/app/__tests__/migrate.test.js +29 -34
- package/commands/app/migrate.d.ts +2 -2
- package/commands/app/migrate.js +40 -43
- package/commands/app/secret/__tests__/add.test.js +6 -11
- package/commands/app/secret/__tests__/delete.test.js +6 -11
- package/commands/app/secret/__tests__/list.test.js +6 -11
- package/commands/app/secret/__tests__/update.test.js +6 -11
- package/commands/app/secret/add.d.ts +1 -1
- package/commands/app/secret/add.js +28 -30
- package/commands/app/secret/delete.d.ts +1 -1
- package/commands/app/secret/delete.js +34 -36
- package/commands/app/secret/list.d.ts +1 -1
- package/commands/app/secret/list.js +25 -27
- package/commands/app/secret/update.d.ts +1 -1
- package/commands/app/secret/update.js +32 -34
- package/commands/app/secret.d.ts +1 -1
- package/commands/app/secret.js +12 -17
- package/commands/app.d.ts +1 -1
- package/commands/app.js +6 -16
- package/commands/auth.d.ts +1 -1
- package/commands/auth.js +70 -72
- package/commands/cms/convertFields.d.ts +1 -1
- package/commands/cms/convertFields.js +34 -39
- package/commands/cms/getReactModule.d.ts +1 -1
- package/commands/cms/getReactModule.js +32 -37
- package/commands/cms/lighthouseScore.d.ts +1 -1
- package/commands/cms/lighthouseScore.js +67 -72
- package/commands/cms.d.ts +1 -1
- package/commands/cms.js +11 -16
- package/commands/completion.d.ts +1 -1
- package/commands/completion.js +10 -15
- package/commands/config/migrate.d.ts +1 -1
- package/commands/config/migrate.js +27 -32
- package/commands/config/set.d.ts +2 -1
- package/commands/config/set.js +40 -32
- package/commands/config.d.ts +1 -1
- package/commands/config.js +8 -13
- package/commands/create/api-sample.d.ts +1 -1
- package/commands/create/api-sample.js +28 -33
- package/commands/create/app.d.ts +1 -1
- package/commands/create/app.js +3 -5
- package/commands/create/function.d.ts +1 -1
- package/commands/create/function.js +9 -11
- package/commands/create/index.d.ts +1 -1
- package/commands/create/index.js +19 -24
- package/commands/create/module.d.ts +1 -1
- package/commands/create/module.js +12 -14
- package/commands/create/react-app.d.ts +1 -1
- package/commands/create/react-app.js +3 -5
- package/commands/create/template.d.ts +1 -1
- package/commands/create/template.js +12 -14
- package/commands/create/vue-app.d.ts +1 -1
- package/commands/create/vue-app.js +3 -5
- package/commands/create/webpack-serverless.d.ts +1 -1
- package/commands/create/webpack-serverless.js +3 -5
- package/commands/create/website-theme.d.ts +1 -1
- package/commands/create/website-theme.js +5 -7
- package/commands/create.d.ts +2 -2
- package/commands/create.js +30 -35
- package/commands/customObject/__tests__/create.test.js +13 -18
- package/commands/customObject/__tests__/schema.test.js +18 -23
- package/commands/customObject/create.d.ts +1 -1
- package/commands/customObject/create.js +28 -30
- package/commands/customObject/schema/__tests__/create.test.js +13 -18
- package/commands/customObject/schema/__tests__/delete.test.js +13 -18
- package/commands/customObject/schema/__tests__/fetch-all.test.js +13 -18
- package/commands/customObject/schema/__tests__/fetch.test.js +13 -18
- package/commands/customObject/schema/__tests__/list.test.js +13 -18
- package/commands/customObject/schema/__tests__/update.test.js +13 -18
- package/commands/customObject/schema/create.d.ts +1 -1
- package/commands/customObject/schema/create.js +28 -30
- package/commands/customObject/schema/delete.d.ts +1 -1
- package/commands/customObject/schema/delete.js +24 -26
- package/commands/customObject/schema/fetch-all.d.ts +1 -1
- package/commands/customObject/schema/fetch-all.js +22 -24
- package/commands/customObject/schema/fetch.d.ts +1 -1
- package/commands/customObject/schema/fetch.js +24 -26
- package/commands/customObject/schema/list.d.ts +1 -1
- package/commands/customObject/schema/list.js +13 -15
- package/commands/customObject/schema/update.d.ts +1 -1
- package/commands/customObject/schema/update.js +32 -34
- package/commands/customObject/schema.d.ts +1 -1
- package/commands/customObject/schema.js +17 -22
- package/commands/customObject.d.ts +1 -1
- package/commands/customObject.js +13 -18
- package/commands/doctor.d.ts +1 -1
- package/commands/doctor.js +28 -33
- package/commands/feedback.d.ts +1 -1
- package/commands/feedback.js +19 -24
- package/commands/fetch.d.ts +1 -1
- package/commands/fetch.js +28 -30
- package/commands/filemanager/__tests__/fetch.test.js +17 -22
- package/commands/filemanager/__tests__/upload.test.js +15 -20
- package/commands/filemanager/fetch.d.ts +1 -1
- package/commands/filemanager/fetch.js +23 -25
- package/commands/filemanager/upload.d.ts +1 -1
- package/commands/filemanager/upload.js +39 -44
- package/commands/filemanager.d.ts +1 -1
- package/commands/filemanager.js +8 -13
- package/commands/function/deploy.d.ts +1 -1
- package/commands/function/deploy.js +35 -40
- package/commands/function/list.d.ts +1 -1
- package/commands/function/list.js +24 -29
- package/commands/function/server.d.ts +1 -1
- package/commands/function/server.js +15 -17
- package/commands/function.d.ts +1 -1
- package/commands/function.js +12 -18
- package/commands/getStarted.d.ts +1 -1
- package/commands/getStarted.js +119 -125
- package/commands/hubdb/__tests__/clear.test.js +13 -18
- package/commands/hubdb/__tests__/create.test.js +13 -18
- package/commands/hubdb/__tests__/delete.test.js +13 -18
- package/commands/hubdb/__tests__/fetch.test.js +13 -18
- package/commands/hubdb/__tests__/list.test.js +23 -28
- package/commands/hubdb/clear.d.ts +1 -1
- package/commands/hubdb/clear.js +20 -22
- package/commands/hubdb/create.d.ts +1 -1
- package/commands/hubdb/create.js +30 -35
- package/commands/hubdb/delete.d.ts +1 -1
- package/commands/hubdb/delete.js +24 -26
- package/commands/hubdb/fetch.d.ts +1 -1
- package/commands/hubdb/fetch.js +17 -19
- package/commands/hubdb/list.d.ts +1 -1
- package/commands/hubdb/list.js +33 -35
- package/commands/hubdb.d.ts +1 -1
- package/commands/hubdb.js +18 -24
- package/commands/init.d.ts +1 -1
- package/commands/init.js +83 -88
- package/commands/lint.d.ts +1 -1
- package/commands/lint.js +24 -26
- package/commands/list.d.ts +1 -1
- package/commands/list.js +32 -37
- package/commands/logs.d.ts +1 -1
- package/commands/logs.js +35 -37
- package/commands/mcp/__tests__/setup.test.js +7 -12
- package/commands/mcp/__tests__/start.test.js +7 -12
- package/commands/mcp/setup.d.ts +1 -1
- package/commands/mcp/setup.js +17 -19
- package/commands/mcp/start.d.ts +1 -1
- package/commands/mcp/start.js +29 -34
- package/commands/mcp.d.ts +1 -1
- package/commands/mcp.js +7 -12
- package/commands/module/marketplace-validate.d.ts +1 -1
- package/commands/module/marketplace-validate.js +21 -26
- package/commands/module.d.ts +1 -1
- package/commands/module.js +7 -13
- package/commands/mv.d.ts +1 -1
- package/commands/mv.js +20 -22
- package/commands/open.d.ts +1 -1
- package/commands/open.js +19 -21
- package/commands/project/__tests__/add.test.js +10 -15
- package/commands/project/__tests__/create.test.js +14 -19
- package/commands/project/__tests__/deploy.test.js +96 -134
- package/commands/project/__tests__/devUnifiedFlow.test.js +133 -139
- package/commands/project/__tests__/download.test.js +14 -19
- package/commands/project/__tests__/installDeps.test.js +32 -70
- package/commands/project/__tests__/listBuilds.test.js +14 -19
- package/commands/project/__tests__/logs.test.js +56 -94
- package/commands/project/__tests__/migrate.test.js +25 -30
- package/commands/project/__tests__/migrateApp.test.js +17 -22
- package/commands/project/__tests__/open.test.js +16 -21
- package/commands/project/__tests__/profile.test.js +14 -19
- package/commands/project/__tests__/upload.test.js +18 -23
- package/commands/project/__tests__/watch.test.js +14 -19
- package/commands/project/add.d.ts +1 -1
- package/commands/project/add.js +34 -36
- package/commands/project/cloneApp.d.ts +1 -1
- package/commands/project/cloneApp.js +67 -72
- package/commands/project/create.d.ts +2 -2
- package/commands/project/create.js +63 -68
- package/commands/project/deploy.d.ts +1 -1
- package/commands/project/deploy.js +67 -69
- package/commands/project/dev/deprecatedFlow.d.ts +2 -2
- package/commands/project/dev/deprecatedFlow.js +52 -58
- package/commands/project/dev/index.d.ts +1 -1
- package/commands/project/dev/index.js +44 -47
- package/commands/project/dev/unifiedFlow.d.ts +3 -3
- package/commands/project/dev/unifiedFlow.js +62 -68
- package/commands/project/download.d.ts +1 -1
- package/commands/project/download.js +35 -40
- package/commands/project/installDeps.d.ts +1 -1
- package/commands/project/installDeps.js +29 -34
- package/commands/project/listBuilds.d.ts +1 -1
- package/commands/project/listBuilds.js +40 -45
- package/commands/project/logs.d.ts +1 -1
- package/commands/project/logs.js +52 -54
- package/commands/project/migrate.d.ts +1 -1
- package/commands/project/migrate.js +24 -26
- package/commands/project/migrateApp.d.ts +2 -2
- package/commands/project/migrateApp.js +18 -20
- package/commands/project/open.d.ts +1 -1
- package/commands/project/open.js +25 -30
- package/commands/project/profile/add.d.ts +1 -1
- package/commands/project/profile/add.js +68 -73
- package/commands/project/profile/delete.d.ts +1 -1
- package/commands/project/profile/delete.js +51 -56
- package/commands/project/profile.d.ts +1 -1
- package/commands/project/profile.js +9 -14
- package/commands/project/upload.d.ts +1 -1
- package/commands/project/upload.js +50 -55
- package/commands/project/validate.d.ts +1 -1
- package/commands/project/validate.js +35 -40
- package/commands/project/watch.d.ts +1 -1
- package/commands/project/watch.js +59 -61
- package/commands/project.d.ts +1 -1
- package/commands/project.js +38 -43
- package/commands/remove.d.ts +1 -1
- package/commands/remove.js +15 -17
- package/commands/sandbox/__tests__/create.test.js +15 -20
- package/commands/sandbox/__tests__/delete.test.js +15 -20
- package/commands/sandbox/create.d.ts +1 -1
- package/commands/sandbox/create.js +67 -69
- package/commands/sandbox/delete.d.ts +1 -1
- package/commands/sandbox/delete.js +94 -96
- package/commands/sandbox.d.ts +1 -1
- package/commands/sandbox.js +9 -14
- package/commands/secret/__tests__/addSecret.test.js +13 -18
- package/commands/secret/__tests__/deleteSecret.test.js +13 -18
- package/commands/secret/__tests__/listSecret.test.js +13 -18
- package/commands/secret/__tests__/updateSecret.test.js +13 -18
- package/commands/secret/addSecret.d.ts +1 -1
- package/commands/secret/addSecret.js +26 -28
- package/commands/secret/deleteSecret.d.ts +1 -1
- package/commands/secret/deleteSecret.js +27 -29
- package/commands/secret/listSecret.d.ts +1 -1
- package/commands/secret/listSecret.js +19 -21
- package/commands/secret/updateSecret.d.ts +1 -1
- package/commands/secret/updateSecret.js +25 -27
- package/commands/secret.d.ts +1 -1
- package/commands/secret.js +13 -18
- package/commands/testAccount/__tests__/create.test.js +17 -22
- package/commands/testAccount/__tests__/createConfig.test.js +6 -11
- package/commands/testAccount/__tests__/delete.test.js +15 -20
- package/commands/testAccount/create.d.ts +1 -1
- package/commands/testAccount/create.js +45 -53
- package/commands/testAccount/createConfig.d.ts +1 -1
- package/commands/testAccount/createConfig.js +36 -41
- package/commands/testAccount/delete.d.ts +1 -1
- package/commands/testAccount/delete.js +17 -19
- package/commands/testAccount.d.ts +1 -1
- package/commands/testAccount.js +10 -15
- package/commands/theme/__tests__/generate-selectors.test.js +7 -12
- package/commands/theme/__tests__/marketplace-validate.test.js +14 -19
- package/commands/theme/__tests__/preview.test.js +12 -17
- package/commands/theme/generate-selectors.d.ts +1 -1
- package/commands/theme/generate-selectors.js +23 -28
- package/commands/theme/marketplace-validate.d.ts +1 -1
- package/commands/theme/marketplace-validate.js +19 -24
- package/commands/theme/preview.d.ts +1 -1
- package/commands/theme/preview.js +60 -65
- package/commands/theme.d.ts +1 -1
- package/commands/theme.js +11 -16
- package/commands/upload.d.ts +1 -1
- package/commands/upload.js +77 -82
- package/commands/watch.d.ts +1 -1
- package/commands/watch.js +45 -51
- package/lang/en.d.ts +10 -23
- package/lang/en.js +380 -399
- package/lib/__tests__/accountTypes.test.js +20 -22
- package/lib/__tests__/buildAccount.test.js +28 -63
- package/lib/__tests__/commonOpts.test.js +20 -22
- package/lib/__tests__/dependencyManagement.test.js +46 -51
- package/lib/__tests__/developerTestAccounts.test.js +27 -62
- package/lib/__tests__/hasFeature.test.js +6 -8
- package/lib/__tests__/npm.test.js +15 -20
- package/lib/__tests__/oauth.test.js +23 -28
- package/lib/__tests__/parsing.test.js +18 -20
- package/lib/__tests__/polling.test.js +24 -26
- package/lib/__tests__/process.test.js +14 -19
- package/lib/__tests__/projectProfiles.test.js +34 -39
- package/lib/__tests__/sandboxSync.test.js +30 -35
- package/lib/__tests__/sandboxes.test.js +29 -31
- package/lib/__tests__/serverlessLogs.test.js +8 -13
- package/lib/__tests__/usageTracking.test.js +33 -34
- package/lib/__tests__/validation.test.js +18 -20
- package/lib/__tests__/yargsUtils.test.js +17 -41
- package/lib/accountTypes.js +24 -34
- package/lib/app/__tests__/migrate.test.js +94 -99
- package/lib/app/__tests__/migrate_legacy.test.js +29 -31
- package/lib/app/migrate.d.ts +3 -3
- package/lib/app/migrate.js +127 -145
- package/lib/app/migrate_legacy.d.ts +1 -1
- package/lib/app/migrate_legacy.js +72 -78
- package/lib/app/urls.js +5 -9
- package/lib/buildAccount.d.ts +1 -1
- package/lib/buildAccount.js +71 -80
- package/lib/commonOpts.d.ts +1 -1
- package/lib/commonOpts.js +42 -59
- package/lib/configMigrate.js +34 -38
- package/lib/configOptions.d.ts +5 -0
- package/lib/configOptions.js +44 -40
- package/lib/constants.d.ts +4 -0
- package/lib/constants.js +35 -34
- package/lib/customObject.js +2 -6
- package/lib/dependencyManagement.js +37 -45
- package/lib/developerTestAccounts.d.ts +1 -1
- package/lib/developerTestAccounts.js +34 -39
- package/lib/doctor/Diagnosis.d.ts +1 -1
- package/lib/doctor/Diagnosis.js +25 -29
- package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
- package/lib/doctor/DiagnosticInfoBuilder.js +30 -37
- package/lib/doctor/Doctor.d.ts +1 -1
- package/lib/doctor/Doctor.js +94 -101
- package/lib/doctor/__tests__/Diagnosis.test.js +9 -14
- package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +29 -34
- package/lib/doctor/__tests__/Doctor.test.js +24 -26
- package/lib/enums/exitCodes.js +1 -4
- package/lib/errorHandlers/index.js +32 -41
- package/lib/errorHandlers/suppressError.d.ts +1 -1
- package/lib/errorHandlers/suppressError.js +28 -31
- package/lib/filesystem.js +8 -15
- package/lib/generateSelectors.js +18 -29
- package/lib/hasFeature.d.ts +1 -1
- package/lib/hasFeature.js +3 -6
- package/lib/interpolation.js +11 -18
- package/lib/lang.d.ts +1 -1
- package/lib/lang.js +22 -27
- package/lib/links.js +16 -24
- package/lib/marketplaceValidate.js +29 -39
- package/lib/mcp/setup.js +70 -82
- package/lib/middleware/__test__/configMiddleware.test.js +20 -55
- package/lib/middleware/__test__/gitMiddleware.test.js +7 -42
- package/lib/middleware/__test__/notificationsMiddleware.test.js +2 -4
- package/lib/middleware/__test__/requestMiddleware.test.js +6 -11
- package/lib/middleware/__test__/utils.test.js +9 -11
- package/lib/middleware/__test__/yargsChecksMiddleware.test.js +9 -44
- package/lib/middleware/autoUpdateMiddleware.js +33 -40
- package/lib/middleware/configMiddleware.js +36 -42
- package/lib/middleware/fireAlarmMiddleware.js +12 -18
- package/lib/middleware/gitMiddleware.js +5 -8
- package/lib/middleware/notificationsMiddleware.js +16 -23
- package/lib/middleware/requestMiddleware.js +4 -10
- package/lib/middleware/utils.js +1 -4
- package/lib/middleware/yargsChecksMiddleware.js +10 -13
- package/lib/npm.js +14 -23
- package/lib/oauth.js +29 -35
- package/lib/parsing.js +3 -6
- package/lib/polling.js +11 -15
- package/lib/process.js +11 -19
- package/lib/projectProfiles.d.ts +2 -2
- package/lib/projectProfiles.js +32 -42
- package/lib/projects/ProjectLogsManager.js +18 -21
- package/lib/projects/__tests__/AppDevModeInterface.test.js +140 -145
- package/lib/projects/__tests__/LocalDevProcess.test.js +68 -73
- package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +32 -37
- package/lib/projects/__tests__/ProjectLogsManager.test.js +56 -58
- package/lib/projects/__tests__/buildAndDeploy.test.js +7 -9
- package/lib/projects/__tests__/components.test.js +9 -14
- package/lib/projects/__tests__/projects.test.js +35 -40
- package/lib/projects/__tests__/structure.test.js +43 -81
- package/lib/projects/add/__tests__/legacyAddComponent.test.js +26 -28
- package/lib/projects/add/__tests__/v3AddComponent.test.js +25 -30
- package/lib/projects/add/legacyAddComponent.d.ts +1 -1
- package/lib/projects/add/legacyAddComponent.js +24 -30
- package/lib/projects/add/v3AddComponent.d.ts +1 -1
- package/lib/projects/add/v3AddComponent.js +36 -42
- package/lib/projects/buildAndDeploy.d.ts +1 -1
- package/lib/projects/buildAndDeploy.js +88 -97
- package/lib/projects/components.js +19 -25
- package/lib/projects/config.d.ts +1 -1
- package/lib/projects/config.js +32 -41
- package/lib/projects/create/__tests__/legacy.test.js +22 -57
- package/lib/projects/create/__tests__/v3.test.js +5 -7
- package/lib/projects/create/index.d.ts +3 -3
- package/lib/projects/create/index.js +19 -22
- package/lib/projects/create/legacy.d.ts +1 -1
- package/lib/projects/create/legacy.js +25 -31
- package/lib/projects/create/v3.d.ts +3 -3
- package/lib/projects/create/v3.js +49 -59
- package/lib/projects/ensureProjectExists.js +31 -37
- package/lib/projects/localDev/AppDevModeInterface.d.ts +3 -3
- package/lib/projects/localDev/AppDevModeInterface.js +58 -60
- package/lib/projects/localDev/DevServerManager.d.ts +1 -1
- package/lib/projects/localDev/DevServerManager.js +22 -24
- package/lib/projects/localDev/DevServerManagerV2.d.ts +2 -2
- package/lib/projects/localDev/DevServerManagerV2.js +15 -20
- package/lib/projects/localDev/LocalDevLogger.d.ts +1 -1
- package/lib/projects/localDev/LocalDevLogger.js +68 -64
- package/lib/projects/localDev/LocalDevManager.d.ts +1 -1
- package/lib/projects/localDev/LocalDevManager.js +106 -111
- package/lib/projects/localDev/LocalDevProcess.d.ts +5 -4
- package/lib/projects/localDev/LocalDevProcess.js +37 -30
- package/lib/projects/localDev/LocalDevState.d.ts +3 -3
- package/lib/projects/localDev/LocalDevState.js +3 -5
- package/lib/projects/localDev/LocalDevWatcher.d.ts +1 -1
- package/lib/projects/localDev/LocalDevWatcher.js +6 -11
- package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +1 -1
- package/lib/projects/localDev/LocalDevWebsocketServer.js +29 -27
- package/lib/projects/localDev/helpers.d.ts +3 -3
- package/lib/projects/localDev/helpers.js +156 -174
- package/lib/projects/structure.d.ts +4 -4
- package/lib/projects/structure.js +32 -78
- package/lib/projects/ui.js +10 -13
- package/lib/projects/upload.d.ts +2 -3
- package/lib/projects/upload.js +55 -65
- package/lib/projects/urls.d.ts +1 -1
- package/lib/projects/urls.js +15 -25
- package/lib/projects/watch.d.ts +1 -1
- package/lib/projects/watch.js +48 -54
- package/lib/prompts/__tests__/downloadProjectPrompt.test.js +9 -11
- package/lib/prompts/__tests__/projectsLogsPrompt.test.js +11 -16
- package/lib/prompts/accountNamePrompt.d.ts +1 -1
- package/lib/prompts/accountNamePrompt.js +26 -31
- package/lib/prompts/accountsPrompt.js +12 -15
- package/lib/prompts/cmsFieldPrompt.js +13 -19
- package/lib/prompts/createApiSamplePrompt.d.ts +1 -1
- package/lib/prompts/createApiSamplePrompt.js +9 -12
- package/lib/prompts/createDeveloperTestAccountConfigPrompt.d.ts +1 -1
- package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +23 -26
- package/lib/prompts/createFunctionPrompt.js +17 -20
- package/lib/prompts/createModulePrompt.js +12 -15
- package/lib/prompts/createTemplatePrompt.js +5 -8
- package/lib/prompts/downloadProjectPrompt.js +17 -20
- package/lib/prompts/installAppPrompt.js +19 -26
- package/lib/prompts/personalAccessKeyPrompt.d.ts +2 -2
- package/lib/prompts/personalAccessKeyPrompt.js +40 -47
- package/lib/prompts/previewPrompt.js +15 -22
- package/lib/prompts/projectAddPrompt.d.ts +1 -1
- package/lib/prompts/projectAddPrompt.js +14 -18
- package/lib/prompts/projectDevTargetAccountPrompt.d.ts +1 -1
- package/lib/prompts/projectDevTargetAccountPrompt.js +48 -54
- package/lib/prompts/projectNameAndDestPrompt.d.ts +1 -1
- package/lib/prompts/projectNameAndDestPrompt.js +22 -29
- package/lib/prompts/projectNamePrompt.js +11 -14
- package/lib/prompts/projectsLogsPrompt.js +5 -8
- package/lib/prompts/promptUtils.d.ts +1 -1
- package/lib/prompts/promptUtils.js +17 -24
- package/lib/prompts/sandboxesPrompt.d.ts +1 -1
- package/lib/prompts/sandboxesPrompt.js +26 -30
- package/lib/prompts/secretPrompt.js +10 -15
- package/lib/prompts/selectAppPrompt.js +11 -14
- package/lib/prompts/selectHubDBTablePrompt.js +24 -30
- package/lib/prompts/selectProjectTemplatePrompt.d.ts +1 -1
- package/lib/prompts/selectProjectTemplatePrompt.js +10 -13
- package/lib/prompts/selectPublicAppForMigrationPrompt.js +22 -25
- package/lib/prompts/setAsDefaultAccountPrompt.js +13 -16
- package/lib/prompts/uploadPrompt.js +11 -17
- package/lib/sandboxSync.d.ts +1 -1
- package/lib/sandboxSync.js +58 -65
- package/lib/sandboxes.d.ts +1 -1
- package/lib/sandboxes.js +68 -76
- package/lib/schema.js +13 -20
- package/lib/serverlessLogs.js +45 -52
- package/lib/testUtils.js +4 -8
- package/lib/ui/SpinniesManager.d.ts +1 -1
- package/lib/ui/SpinniesManager.js +29 -34
- package/lib/ui/boxen.js +11 -14
- package/lib/ui/git.js +14 -20
- package/lib/ui/index.js +55 -73
- package/lib/ui/logger.js +10 -13
- package/lib/ui/serverlessFunctionLogs.js +14 -20
- package/lib/ui/spinniesUtils.js +24 -39
- package/lib/ui/supportHyperlinks.js +3 -6
- package/lib/ui/supportsColor.js +11 -17
- package/lib/ui/table.js +6 -13
- package/lib/upload.js +15 -21
- package/lib/usageTracking.js +35 -44
- package/lib/utils/hasFlag.js +2 -8
- package/lib/validation.js +48 -87
- package/lib/yargsUtils.d.ts +2 -1
- package/lib/yargsUtils.js +19 -16
- package/mcp-server/server.js +6 -8
- package/mcp-server/tools/index.js +13 -16
- package/mcp-server/tools/project/AddFeatureToProject.d.ts +1 -1
- package/mcp-server/tools/project/AddFeatureToProject.js +35 -39
- package/mcp-server/tools/project/CreateProjectTool.d.ts +1 -1
- package/mcp-server/tools/project/CreateProjectTool.js +46 -50
- package/mcp-server/tools/project/DeployProject.d.ts +1 -1
- package/mcp-server/tools/project/DeployProject.js +18 -22
- package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +1 -1
- package/mcp-server/tools/project/GuidedWalkthroughTool.js +21 -25
- package/mcp-server/tools/project/UploadProjectTools.d.ts +1 -1
- package/mcp-server/tools/project/UploadProjectTools.js +12 -19
- package/mcp-server/tools/project/ValidateProjectTool.d.ts +1 -1
- package/mcp-server/tools/project/ValidateProjectTool.js +13 -17
- package/mcp-server/tools/project/__tests__/AddFeatureToProject.test.js +12 -14
- package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +13 -15
- package/mcp-server/tools/project/__tests__/DeployProject.test.js +6 -8
- package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.js +4 -6
- package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +4 -6
- package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.js +4 -6
- package/mcp-server/tools/project/constants.js +3 -9
- package/mcp-server/types.js +1 -5
- package/mcp-server/utils/__tests__/command.test.js +9 -11
- package/mcp-server/utils/__tests__/project.test.js +12 -17
- package/mcp-server/utils/command.d.ts +1 -1
- package/mcp-server/utils/command.js +4 -11
- package/mcp-server/utils/content.d.ts +1 -1
- package/mcp-server/utils/content.js +2 -6
- package/mcp-server/utils/project.js +8 -14
- package/mcp-server/utils/toolUsageTracking.js +11 -14
- package/package.json +15 -11
- package/types/Cms.d.ts +1 -1
- package/types/Cms.js +1 -2
- package/types/LocalDev.d.ts +4 -4
- package/types/LocalDev.js +1 -2
- package/types/ProjectComponents.d.ts +2 -2
- package/types/ProjectComponents.js +1 -2
- package/types/Projects.d.ts +1 -1
- package/types/Projects.js +2 -5
- package/types/Prompts.js +1 -2
- package/types/Sandboxes.js +1 -2
- package/types/Yargs.js +1 -2
- package/commands/app/__tests__/install.test.d.ts +0 -1
- package/commands/app/__tests__/install.test.js +0 -52
- package/commands/app/install.d.ts +0 -8
- package/commands/app/install.js +0 -127
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const polling_1 = require("../../polling");
|
|
17
|
-
const migrate_1 = require("../../../api/migrate");
|
|
18
|
-
const en_1 = require("../../../lang/en");
|
|
19
|
-
const hasFeature_1 = require("../../hasFeature");
|
|
20
|
-
const migrate_2 = require("../migrate");
|
|
1
|
+
import { logger } from '@hubspot/local-dev-lib/logger';
|
|
2
|
+
import { getCwd, sanitizeFileName } from '@hubspot/local-dev-lib/path';
|
|
3
|
+
import { extractZipArchive } from '@hubspot/local-dev-lib/archive';
|
|
4
|
+
import { validateUid } from '@hubspot/project-parsing-lib';
|
|
5
|
+
import { UNMIGRATABLE_REASONS } from '@hubspot/local-dev-lib/constants/projects';
|
|
6
|
+
import { MIGRATION_STATUS } from '@hubspot/local-dev-lib/types/Migration';
|
|
7
|
+
import { downloadProject } from '@hubspot/local-dev-lib/api/projects';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import { confirmPrompt, inputPrompt, listPrompt, } from '../../prompts/promptUtils.js';
|
|
10
|
+
import { ensureProjectExists } from '../../projects/ensureProjectExists.js';
|
|
11
|
+
import { poll } from '../../polling.js';
|
|
12
|
+
import { CLI_UNMIGRATABLE_REASONS, continueMigration, initializeMigration, listAppsForMigration, } from '../../../api/migrate.js';
|
|
13
|
+
import { lib } from '../../../lang/en.js';
|
|
14
|
+
import { hasFeature } from '../../hasFeature.js';
|
|
15
|
+
import { getUnmigratableReason, generateFilterAppsByProjectNameFunction, buildErrorMessageFromMigrationStatus, fetchMigrationApps, promptForAppToMigrate, selectAppToMigrate, handleMigrationSetup, beginMigration, pollMigrationStatus, finalizeMigration, downloadProjectFiles, migrateApp2025_2, logInvalidAccountError, } from '../migrate.js';
|
|
21
16
|
vi.mock('@hubspot/local-dev-lib/logger');
|
|
22
17
|
vi.mock('@hubspot/local-dev-lib/path');
|
|
23
18
|
vi.mock('@hubspot/local-dev-lib/archive');
|
|
@@ -33,22 +28,22 @@ vi.mock('../../../api/migrate');
|
|
|
33
28
|
vi.mock('../../hasFeature');
|
|
34
29
|
vi.mock('../../projects/urls');
|
|
35
30
|
vi.mock('fs');
|
|
36
|
-
const mockedLogger =
|
|
37
|
-
const mockedGetCwd =
|
|
38
|
-
const mockedSanitizeFileName =
|
|
39
|
-
const mockedExtractZipArchive =
|
|
40
|
-
const mockedValidateUid =
|
|
41
|
-
const mockedDownloadProject =
|
|
42
|
-
const mockedConfirmPrompt =
|
|
43
|
-
const mockedInputPrompt =
|
|
44
|
-
const mockedListPrompt =
|
|
45
|
-
const mockedEnsureProjectExists =
|
|
46
|
-
const mockedPoll =
|
|
47
|
-
const mockedListAppsForMigration =
|
|
48
|
-
const mockedInitializeMigration =
|
|
49
|
-
const mockedContinueMigration =
|
|
50
|
-
const mockedHasFeature =
|
|
51
|
-
const mockedFs =
|
|
31
|
+
const mockedLogger = logger;
|
|
32
|
+
const mockedGetCwd = getCwd;
|
|
33
|
+
const mockedSanitizeFileName = sanitizeFileName;
|
|
34
|
+
const mockedExtractZipArchive = extractZipArchive;
|
|
35
|
+
const mockedValidateUid = validateUid;
|
|
36
|
+
const mockedDownloadProject = downloadProject;
|
|
37
|
+
const mockedConfirmPrompt = confirmPrompt;
|
|
38
|
+
const mockedInputPrompt = inputPrompt;
|
|
39
|
+
const mockedListPrompt = listPrompt;
|
|
40
|
+
const mockedEnsureProjectExists = ensureProjectExists;
|
|
41
|
+
const mockedPoll = poll;
|
|
42
|
+
const mockedListAppsForMigration = listAppsForMigration;
|
|
43
|
+
const mockedInitializeMigration = initializeMigration;
|
|
44
|
+
const mockedContinueMigration = continueMigration;
|
|
45
|
+
const mockedHasFeature = hasFeature;
|
|
46
|
+
const mockedFs = fs;
|
|
52
47
|
const createMockMigratableApp = (id, name, projectName) => ({
|
|
53
48
|
appId: id,
|
|
54
49
|
appName: name,
|
|
@@ -78,8 +73,8 @@ const PROJECT_DEST = '/mock/dest';
|
|
|
78
73
|
const MOCK_CWD = '/mock/cwd';
|
|
79
74
|
const MOCK_PROJECT_DIR = '/mock/project/dir';
|
|
80
75
|
const mockUnmigratableApps = [
|
|
81
|
-
createMockUnmigratableApp(3, 'App 3',
|
|
82
|
-
createMockUnmigratableApp(4, 'App 4',
|
|
76
|
+
createMockUnmigratableApp(3, 'App 3', UNMIGRATABLE_REASONS.UP_TO_DATE),
|
|
77
|
+
createMockUnmigratableApp(4, 'App 4', UNMIGRATABLE_REASONS.IS_A_PRIVATE_APP),
|
|
83
78
|
];
|
|
84
79
|
describe('lib/app/migrate', () => {
|
|
85
80
|
beforeEach(() => {
|
|
@@ -93,38 +88,38 @@ describe('lib/app/migrate', () => {
|
|
|
93
88
|
const testCases = [
|
|
94
89
|
{
|
|
95
90
|
name: 'UP_TO_DATE',
|
|
96
|
-
reason:
|
|
97
|
-
expected:
|
|
91
|
+
reason: UNMIGRATABLE_REASONS.UP_TO_DATE,
|
|
92
|
+
expected: lib.migrate.errors.unmigratableReasons.upToDate,
|
|
98
93
|
},
|
|
99
94
|
{
|
|
100
95
|
name: 'IS_A_PRIVATE_APP',
|
|
101
|
-
reason:
|
|
102
|
-
expected:
|
|
96
|
+
reason: UNMIGRATABLE_REASONS.IS_A_PRIVATE_APP,
|
|
97
|
+
expected: lib.migrate.errors.unmigratableReasons.isPrivateApp,
|
|
103
98
|
},
|
|
104
99
|
{
|
|
105
100
|
name: 'LISTED_IN_MARKETPLACE',
|
|
106
|
-
reason:
|
|
107
|
-
expected:
|
|
101
|
+
reason: UNMIGRATABLE_REASONS.LISTED_IN_MARKETPLACE,
|
|
102
|
+
expected: lib.migrate.errors.unmigratableReasons.listedInMarketplace,
|
|
108
103
|
},
|
|
109
104
|
{
|
|
110
105
|
name: 'PROJECT_CONNECTED_TO_GITHUB',
|
|
111
|
-
reason:
|
|
112
|
-
expected:
|
|
106
|
+
reason: UNMIGRATABLE_REASONS.PROJECT_CONNECTED_TO_GITHUB,
|
|
107
|
+
expected: lib.migrate.errors.unmigratableReasons.projectConnectedToGitHub(PROJECT_NAME, ACCOUNT_ID),
|
|
113
108
|
},
|
|
114
109
|
{
|
|
115
110
|
name: 'PART_OF_PROJECT_ALREADY',
|
|
116
|
-
reason:
|
|
117
|
-
expected:
|
|
111
|
+
reason: CLI_UNMIGRATABLE_REASONS.PART_OF_PROJECT_ALREADY,
|
|
112
|
+
expected: lib.migrate.errors.unmigratableReasons.partOfProjectAlready,
|
|
118
113
|
},
|
|
119
114
|
{
|
|
120
115
|
name: 'UNKNOWN_REASON',
|
|
121
116
|
reason: 'UNKNOWN_REASON',
|
|
122
|
-
expected:
|
|
117
|
+
expected: lib.migrate.errors.unmigratableReasons.generic('UNKNOWN_REASON'),
|
|
123
118
|
},
|
|
124
119
|
];
|
|
125
120
|
testCases.forEach(testCase => {
|
|
126
121
|
it(`should return the correct message for ${testCase.name}`, () => {
|
|
127
|
-
const result =
|
|
122
|
+
const result = getUnmigratableReason(testCase.reason, PROJECT_NAME, ACCOUNT_ID);
|
|
128
123
|
expect(result).toBe(testCase.expected);
|
|
129
124
|
});
|
|
130
125
|
});
|
|
@@ -132,14 +127,14 @@ describe('lib/app/migrate', () => {
|
|
|
132
127
|
describe('generateFilterAppsByProjectNameFunction', () => {
|
|
133
128
|
it('should return a function that filters by project name when projectConfig is provided', () => {
|
|
134
129
|
const projectConfig = createLoadedProjectConfig(PROJECT_NAME);
|
|
135
|
-
const filterFn =
|
|
130
|
+
const filterFn = generateFilterAppsByProjectNameFunction(projectConfig);
|
|
136
131
|
const matchingApp = createMockMigratableApp(1, 'App 1', PROJECT_NAME);
|
|
137
132
|
const nonMatchingApp = createMockMigratableApp(2, 'App 2', 'Other Project');
|
|
138
133
|
expect(filterFn(matchingApp)).toBe(true);
|
|
139
134
|
expect(filterFn(nonMatchingApp)).toBe(false);
|
|
140
135
|
});
|
|
141
136
|
it('should return a function that always returns true when projectConfig is not provided', () => {
|
|
142
|
-
const filterFn =
|
|
137
|
+
const filterFn = generateFilterAppsByProjectNameFunction(undefined);
|
|
143
138
|
const app1 = createMockMigratableApp(1, 'App 1', PROJECT_NAME);
|
|
144
139
|
const app2 = createMockMigratableApp(2, 'App 2', 'Other Project');
|
|
145
140
|
expect(filterFn(app1)).toBe(true);
|
|
@@ -150,17 +145,17 @@ describe('lib/app/migrate', () => {
|
|
|
150
145
|
it('should return projectErrorDetail when there are no component errors', () => {
|
|
151
146
|
const error = {
|
|
152
147
|
id: 123,
|
|
153
|
-
status:
|
|
148
|
+
status: MIGRATION_STATUS.FAILURE,
|
|
154
149
|
projectErrorDetail: 'Project error',
|
|
155
150
|
componentErrors: [],
|
|
156
151
|
};
|
|
157
|
-
const result =
|
|
152
|
+
const result = buildErrorMessageFromMigrationStatus(error);
|
|
158
153
|
expect(result).toBe('Project error');
|
|
159
154
|
});
|
|
160
155
|
it('should return formatted error message with component errors', () => {
|
|
161
156
|
const error = {
|
|
162
157
|
id: 123,
|
|
163
|
-
status:
|
|
158
|
+
status: MIGRATION_STATUS.FAILURE,
|
|
164
159
|
projectErrorDetail: 'Project error',
|
|
165
160
|
componentErrors: [
|
|
166
161
|
{
|
|
@@ -174,7 +169,7 @@ describe('lib/app/migrate', () => {
|
|
|
174
169
|
},
|
|
175
170
|
],
|
|
176
171
|
};
|
|
177
|
-
const result =
|
|
172
|
+
const result = buildErrorMessageFromMigrationStatus(error);
|
|
178
173
|
expect(result).toBe('Project error: \n\t- CARD (card1): Card error\n\t- FUNCTION: Function error');
|
|
179
174
|
});
|
|
180
175
|
});
|
|
@@ -192,18 +187,18 @@ describe('lib/app/migrate', () => {
|
|
|
192
187
|
setupMockApps([
|
|
193
188
|
createMockMigratableApp(1, 'App 1', PROJECT_NAME),
|
|
194
189
|
createMockMigratableApp(2, 'App 2', PROJECT_NAME),
|
|
195
|
-
], [createMockUnmigratableApp(3, 'App 3',
|
|
190
|
+
], [createMockUnmigratableApp(3, 'App 3', UNMIGRATABLE_REASONS.UP_TO_DATE)]);
|
|
196
191
|
});
|
|
197
192
|
it('should return all apps when no projectConfig is provided', async () => {
|
|
198
193
|
setupMockApps([createMockMigratableApp(1, 'App 1')]);
|
|
199
|
-
const result = await
|
|
194
|
+
const result = await fetchMigrationApps(undefined, ACCOUNT_ID, PLATFORM_VERSION);
|
|
200
195
|
expect(result).toHaveLength(1);
|
|
201
196
|
expect(result[0].appId).toBe(1);
|
|
202
197
|
});
|
|
203
198
|
it('should filter apps by project name when projectConfig is provided', async () => {
|
|
204
199
|
const projectConfig = createLoadedProjectConfig(PROJECT_NAME);
|
|
205
200
|
setupMockApps([createMockMigratableApp(1, 'App 1', PROJECT_NAME)]);
|
|
206
|
-
const result = await
|
|
201
|
+
const result = await fetchMigrationApps(undefined, ACCOUNT_ID, PLATFORM_VERSION, projectConfig);
|
|
207
202
|
expect(result).toHaveLength(1);
|
|
208
203
|
expect(result[0].projectName).toBe(PROJECT_NAME);
|
|
209
204
|
});
|
|
@@ -213,36 +208,36 @@ describe('lib/app/migrate', () => {
|
|
|
213
208
|
createMockMigratableApp(1, 'App 1', PROJECT_NAME),
|
|
214
209
|
createMockMigratableApp(2, 'App 2', PROJECT_NAME),
|
|
215
210
|
]);
|
|
216
|
-
await expect(
|
|
211
|
+
await expect(fetchMigrationApps(undefined, ACCOUNT_ID, PLATFORM_VERSION, projectConfig)).rejects.toThrow(lib.migrate.errors.project.multipleApps);
|
|
217
212
|
});
|
|
218
213
|
it('should throw an error when no apps are found for a project', async () => {
|
|
219
214
|
const projectConfig = createLoadedProjectConfig(PROJECT_NAME);
|
|
220
215
|
setupMockApps([], []);
|
|
221
|
-
await expect(
|
|
216
|
+
await expect(fetchMigrationApps(undefined, ACCOUNT_ID, PLATFORM_VERSION, projectConfig)).rejects.toThrow(lib.migrate.errors.noAppsForProject(PROJECT_NAME));
|
|
222
217
|
});
|
|
223
218
|
it('should throw an error when no migratable apps are found', async () => {
|
|
224
219
|
setupMockApps([], mockUnmigratableApps);
|
|
225
|
-
await expect(
|
|
220
|
+
await expect(fetchMigrationApps(undefined, ACCOUNT_ID, PLATFORM_VERSION)).rejects.toThrow(/No apps in account/);
|
|
226
221
|
});
|
|
227
222
|
it('should throw an error when appId is provided but not found', async () => {
|
|
228
|
-
await expect(
|
|
223
|
+
await expect(fetchMigrationApps(999, ACCOUNT_ID, PLATFORM_VERSION)).rejects.toThrow(/No apps in account/);
|
|
229
224
|
});
|
|
230
225
|
});
|
|
231
226
|
describe('promptForAppToMigrate', () => {
|
|
232
227
|
const mockApps = [
|
|
233
228
|
createMockMigratableApp(1, 'App 1'),
|
|
234
|
-
createMockUnmigratableApp(2, 'App 2',
|
|
229
|
+
createMockUnmigratableApp(2, 'App 2', UNMIGRATABLE_REASONS.UP_TO_DATE),
|
|
235
230
|
];
|
|
236
231
|
beforeEach(() => {
|
|
237
232
|
mockedListPrompt.mockResolvedValue(mockApps[0]);
|
|
238
233
|
});
|
|
239
234
|
it('should prompt the user to select an app', async () => {
|
|
240
|
-
await
|
|
241
|
-
expect(mockedListPrompt).toHaveBeenCalledWith(
|
|
235
|
+
await promptForAppToMigrate(mockApps, ACCOUNT_ID);
|
|
236
|
+
expect(mockedListPrompt).toHaveBeenCalledWith(lib.migrate.prompt.chooseApp, expect.any(Object));
|
|
242
237
|
});
|
|
243
238
|
it('should return the selected app', async () => {
|
|
244
239
|
mockedListPrompt.mockResolvedValue({ appId: mockApps[0].appId });
|
|
245
|
-
const result = await
|
|
240
|
+
const result = await promptForAppToMigrate(mockApps, ACCOUNT_ID);
|
|
246
241
|
expect(result).toBe(mockApps[0].appId);
|
|
247
242
|
});
|
|
248
243
|
});
|
|
@@ -257,26 +252,26 @@ describe('lib/app/migrate', () => {
|
|
|
257
252
|
{ id: '2', componentType: 'FUNCTION', isSupported: false },
|
|
258
253
|
],
|
|
259
254
|
},
|
|
260
|
-
createMockUnmigratableApp(2, 'App 2',
|
|
255
|
+
createMockUnmigratableApp(2, 'App 2', UNMIGRATABLE_REASONS.UP_TO_DATE),
|
|
261
256
|
];
|
|
262
257
|
beforeEach(() => {
|
|
263
258
|
mockedListPrompt.mockResolvedValue({ appId: 1 });
|
|
264
259
|
mockedConfirmPrompt.mockResolvedValue(true);
|
|
265
260
|
});
|
|
266
261
|
it('should throw an error when appId is provided but not found', async () => {
|
|
267
|
-
await expect(
|
|
262
|
+
await expect(selectAppToMigrate(mockApps, ACCOUNT_ID, 999)).rejects.toThrow(lib.migrate.errors.appWithAppIdNotFound(999));
|
|
268
263
|
});
|
|
269
264
|
it('should call listPrompt when appId is not provided', async () => {
|
|
270
|
-
await
|
|
271
|
-
expect(mockedListPrompt).toHaveBeenCalledWith(
|
|
265
|
+
await selectAppToMigrate(mockApps, ACCOUNT_ID);
|
|
266
|
+
expect(mockedListPrompt).toHaveBeenCalledWith(lib.migrate.prompt.chooseApp, expect.any(Object));
|
|
272
267
|
});
|
|
273
268
|
it('should return proceed: false and appIdToMigrate when user cancels', async () => {
|
|
274
269
|
mockedConfirmPrompt.mockResolvedValue(false);
|
|
275
|
-
const result = await
|
|
270
|
+
const result = await selectAppToMigrate(mockApps, ACCOUNT_ID);
|
|
276
271
|
expect(result).toEqual({ proceed: false, appIdToMigrate: 1 });
|
|
277
272
|
});
|
|
278
273
|
it('should return proceed: true and appIdToMigrate when user confirms', async () => {
|
|
279
|
-
const result = await
|
|
274
|
+
const result = await selectAppToMigrate(mockApps, ACCOUNT_ID);
|
|
280
275
|
expect(result).toEqual({ proceed: true, appIdToMigrate: 1 });
|
|
281
276
|
});
|
|
282
277
|
});
|
|
@@ -305,7 +300,7 @@ describe('lib/app/migrate', () => {
|
|
|
305
300
|
}
|
|
306
301
|
it('should return early when user cancels', async () => {
|
|
307
302
|
mockedConfirmPrompt.mockResolvedValueOnce(false);
|
|
308
|
-
const result = await
|
|
303
|
+
const result = await handleMigrationSetup(ACCOUNT_ID, defaultOptions);
|
|
309
304
|
expect(result).toEqual({});
|
|
310
305
|
});
|
|
311
306
|
it('should return project details when projectConfig is provided', async () => {
|
|
@@ -317,7 +312,7 @@ describe('lib/app/migrate', () => {
|
|
|
317
312
|
unmigratableApps: [],
|
|
318
313
|
},
|
|
319
314
|
});
|
|
320
|
-
const result = await
|
|
315
|
+
const result = await handleMigrationSetup(ACCOUNT_ID, defaultOptions, projectConfig);
|
|
321
316
|
expect(result).toEqual({
|
|
322
317
|
appIdToMigrate: 1,
|
|
323
318
|
projectName: PROJECT_NAME,
|
|
@@ -327,18 +322,18 @@ describe('lib/app/migrate', () => {
|
|
|
327
322
|
it('should prompt for project name when not provided', async () => {
|
|
328
323
|
const optionsWithoutName = { ...defaultOptions, name: undefined };
|
|
329
324
|
mockedInputPrompt.mockResolvedValue('New Project');
|
|
330
|
-
await
|
|
331
|
-
expect(mockedInputPrompt).toHaveBeenCalledWith(
|
|
325
|
+
await handleMigrationSetup(ACCOUNT_ID, optionsWithoutName);
|
|
326
|
+
expect(mockedInputPrompt).toHaveBeenCalledWith(lib.migrate.prompt.inputName, expect.any(Object));
|
|
332
327
|
});
|
|
333
328
|
it('should prompt for project destination when not provided', async () => {
|
|
334
329
|
const optionsWithoutDest = { ...defaultOptions, dest: undefined };
|
|
335
330
|
mockedInputPrompt.mockResolvedValue('/mock/new/dest');
|
|
336
|
-
await
|
|
337
|
-
expect(mockedInputPrompt).toHaveBeenCalledWith(
|
|
331
|
+
await handleMigrationSetup(ACCOUNT_ID, optionsWithoutDest);
|
|
332
|
+
expect(mockedInputPrompt).toHaveBeenCalledWith(lib.migrate.prompt.inputDest, expect.any(Object));
|
|
338
333
|
});
|
|
339
334
|
it('should throw an error when project already exists', async () => {
|
|
340
335
|
mockedEnsureProjectExists.mockResolvedValue({ projectExists: true });
|
|
341
|
-
await expect(
|
|
336
|
+
await expect(handleMigrationSetup(ACCOUNT_ID, defaultOptions)).rejects.toThrow(lib.migrate.errors.project.alreadyExists(PROJECT_NAME));
|
|
342
337
|
});
|
|
343
338
|
});
|
|
344
339
|
describe('beginMigration', () => {
|
|
@@ -348,14 +343,14 @@ describe('lib/app/migrate', () => {
|
|
|
348
343
|
data: { migrationId: MIGRATION_ID },
|
|
349
344
|
});
|
|
350
345
|
mockedPoll.mockResolvedValue({
|
|
351
|
-
status:
|
|
346
|
+
status: MIGRATION_STATUS.INPUT_REQUIRED,
|
|
352
347
|
// @ts-expect-error
|
|
353
348
|
componentsRequiringUids: {},
|
|
354
349
|
});
|
|
355
350
|
mockedInputPrompt.mockResolvedValue('test-uid');
|
|
356
351
|
});
|
|
357
352
|
it('should initialize migration and return migrationId and uidMap', async () => {
|
|
358
|
-
const result = await
|
|
353
|
+
const result = await beginMigration(ACCOUNT_ID, APP_ID, PLATFORM_VERSION);
|
|
359
354
|
expect(result).toEqual({
|
|
360
355
|
migrationId: MIGRATION_ID,
|
|
361
356
|
uidMap: {},
|
|
@@ -364,7 +359,7 @@ describe('lib/app/migrate', () => {
|
|
|
364
359
|
it('should prompt for UIDs when components require them', async () => {
|
|
365
360
|
const componentHint = 'test-card';
|
|
366
361
|
mockedPoll.mockResolvedValue({
|
|
367
|
-
status:
|
|
362
|
+
status: MIGRATION_STATUS.INPUT_REQUIRED,
|
|
368
363
|
// @ts-expect-error
|
|
369
364
|
componentsRequiringUids: {
|
|
370
365
|
'1': {
|
|
@@ -373,26 +368,26 @@ describe('lib/app/migrate', () => {
|
|
|
373
368
|
},
|
|
374
369
|
},
|
|
375
370
|
});
|
|
376
|
-
await
|
|
377
|
-
expect(mockedInputPrompt).toHaveBeenCalledWith(
|
|
371
|
+
await beginMigration(ACCOUNT_ID, APP_ID, PLATFORM_VERSION);
|
|
372
|
+
expect(mockedInputPrompt).toHaveBeenCalledWith(lib.migrate.prompt.uidForComponent("card 'test-card' (ID: 1)"), {
|
|
378
373
|
defaultAnswer: componentHint,
|
|
379
374
|
validate: expect.any(Function),
|
|
380
375
|
});
|
|
381
376
|
});
|
|
382
377
|
it('should throw an error when migration fails', async () => {
|
|
383
378
|
mockedPoll.mockRejectedValue(new Error('Failed'));
|
|
384
|
-
await expect(
|
|
379
|
+
await expect(beginMigration(ACCOUNT_ID, APP_ID, PLATFORM_VERSION)).rejects.toThrow(/Migration Failed/);
|
|
385
380
|
});
|
|
386
381
|
});
|
|
387
382
|
describe('pollMigrationStatus', () => {
|
|
388
383
|
it('should call poll with checkMigrationStatusV2', async () => {
|
|
389
384
|
const mockStatus = {
|
|
390
385
|
id: MIGRATION_ID,
|
|
391
|
-
status:
|
|
386
|
+
status: MIGRATION_STATUS.SUCCESS,
|
|
392
387
|
buildId: BUILD_ID,
|
|
393
388
|
};
|
|
394
389
|
mockedPoll.mockResolvedValue(mockStatus);
|
|
395
|
-
const result = await
|
|
390
|
+
const result = await pollMigrationStatus(ACCOUNT_ID, MIGRATION_ID);
|
|
396
391
|
expect(mockedPoll).toHaveBeenCalledWith(expect.any(Function), expect.any(Object));
|
|
397
392
|
expect(result).toBe(mockStatus);
|
|
398
393
|
});
|
|
@@ -405,18 +400,18 @@ describe('lib/app/migrate', () => {
|
|
|
405
400
|
data: { migrationId: MIGRATION_ID },
|
|
406
401
|
});
|
|
407
402
|
mockedPoll.mockResolvedValue({
|
|
408
|
-
status:
|
|
403
|
+
status: MIGRATION_STATUS.SUCCESS,
|
|
409
404
|
// @ts-expect-error
|
|
410
405
|
buildId: BUILD_ID,
|
|
411
406
|
});
|
|
412
407
|
});
|
|
413
408
|
it('should continue migration and return buildId', async () => {
|
|
414
|
-
const result = await
|
|
409
|
+
const result = await finalizeMigration(ACCOUNT_ID, MIGRATION_ID, uidMap, PROJECT_NAME);
|
|
415
410
|
expect(result).toBe(BUILD_ID);
|
|
416
411
|
});
|
|
417
412
|
it('should throw an error when migration fails', async () => {
|
|
418
413
|
mockedPoll.mockRejectedValue(new Error('Test error'));
|
|
419
|
-
await expect(
|
|
414
|
+
await expect(finalizeMigration(ACCOUNT_ID, MIGRATION_ID, uidMap, PROJECT_NAME)).rejects.toThrow(/Migration Failed/);
|
|
420
415
|
});
|
|
421
416
|
});
|
|
422
417
|
describe('downloadProjectFiles', () => {
|
|
@@ -430,7 +425,7 @@ describe('lib/app/migrate', () => {
|
|
|
430
425
|
mockedSanitizeFileName.mockReturnValue(PROJECT_NAME);
|
|
431
426
|
});
|
|
432
427
|
it('should download and extract project files', async () => {
|
|
433
|
-
await
|
|
428
|
+
await downloadProjectFiles(ACCOUNT_ID, PROJECT_NAME, BUILD_ID, PROJECT_DEST);
|
|
434
429
|
expect(mockedDownloadProject).toHaveBeenCalledWith(ACCOUNT_ID, PROJECT_NAME, BUILD_ID);
|
|
435
430
|
expect(mockedExtractZipArchive).toHaveBeenCalledWith(expect.any(Buffer), PROJECT_NAME, expect.stringContaining(PROJECT_DEST), {
|
|
436
431
|
includesRootDir: true,
|
|
@@ -442,7 +437,7 @@ describe('lib/app/migrate', () => {
|
|
|
442
437
|
projectConfig: { name: PROJECT_NAME, srcDir: 'src' },
|
|
443
438
|
projectDir: MOCK_PROJECT_DIR,
|
|
444
439
|
};
|
|
445
|
-
await
|
|
440
|
+
await downloadProjectFiles(ACCOUNT_ID, PROJECT_NAME, BUILD_ID, PROJECT_DEST, projectConfig);
|
|
446
441
|
expect(mockedFs.renameSync).toHaveBeenCalledWith(`${MOCK_PROJECT_DIR}/src`, `${MOCK_PROJECT_DIR}/archive`);
|
|
447
442
|
expect(mockedExtractZipArchive).toHaveBeenCalledWith(expect.any(Buffer), PROJECT_NAME, MOCK_PROJECT_DIR, {
|
|
448
443
|
includesRootDir: true,
|
|
@@ -452,7 +447,7 @@ describe('lib/app/migrate', () => {
|
|
|
452
447
|
it('should throw an error when download fails', async () => {
|
|
453
448
|
const error = new Error('Download failed');
|
|
454
449
|
mockedDownloadProject.mockRejectedValue(error);
|
|
455
|
-
await expect(
|
|
450
|
+
await expect(downloadProjectFiles(ACCOUNT_ID, PROJECT_NAME, BUILD_ID, PROJECT_DEST)).rejects.toThrow(error);
|
|
456
451
|
});
|
|
457
452
|
});
|
|
458
453
|
describe('migrateApp2025_2', () => {
|
|
@@ -468,27 +463,27 @@ describe('lib/app/migrate', () => {
|
|
|
468
463
|
});
|
|
469
464
|
it('should throw an error when account is not ungated for unified apps', async () => {
|
|
470
465
|
mockedHasFeature.mockResolvedValueOnce(false);
|
|
471
|
-
await expect(
|
|
466
|
+
await expect(migrateApp2025_2(ACCOUNT_ID, options)).rejects.toThrowError(/isn't enrolled in the required product beta to access this command./);
|
|
472
467
|
});
|
|
473
468
|
it('should throw an error when projectConfig is invalid', async () => {
|
|
474
469
|
const invalidProjectConfig = {
|
|
475
470
|
projectConfig: undefined,
|
|
476
471
|
projectDir: '/mock/project/dir',
|
|
477
472
|
};
|
|
478
|
-
await expect(
|
|
473
|
+
await expect(migrateApp2025_2(ACCOUNT_ID, options, invalidProjectConfig)).rejects.toThrow(/The project configuration file is invalid/);
|
|
479
474
|
});
|
|
480
475
|
it('should throw an error when project does not exist', async () => {
|
|
481
476
|
const projectConfig = createLoadedProjectConfig(PROJECT_NAME);
|
|
482
477
|
mockedEnsureProjectExists.mockResolvedValueOnce({
|
|
483
478
|
projectExists: false,
|
|
484
479
|
});
|
|
485
|
-
await expect(
|
|
480
|
+
await expect(migrateApp2025_2(ACCOUNT_ID, options, projectConfig)).rejects.toThrow(/Migrations are only supported for existing projects/);
|
|
486
481
|
});
|
|
487
482
|
});
|
|
488
483
|
describe('logInvalidAccountError', () => {
|
|
489
484
|
it('should log the invalid account error message', () => {
|
|
490
|
-
|
|
491
|
-
expect(mockedLogger.error).toHaveBeenCalledWith(
|
|
485
|
+
logInvalidAccountError();
|
|
486
|
+
expect(mockedLogger.error).toHaveBeenCalledWith(lib.migrate.errors.invalidAccountTypeTitle);
|
|
492
487
|
expect(mockedLogger.log).toHaveBeenCalledWith(expect.stringContaining('Only public apps created in a developer account can be converted to a project component'));
|
|
493
488
|
});
|
|
494
489
|
});
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const polling_1 = require("../../polling");
|
|
13
|
-
const migrate_legacy_1 = require("../migrate_legacy");
|
|
1
|
+
import { fetchPublicAppMetadata as _fetchPublicAppMetadata } from '@hubspot/local-dev-lib/api/appsDev';
|
|
2
|
+
import { downloadProject as _downloadProject, migrateApp as _migrateNonProjectApp_v2023_2, } from '@hubspot/local-dev-lib/api/projects';
|
|
3
|
+
import { extractZipArchive } from '@hubspot/local-dev-lib/archive';
|
|
4
|
+
import { promptUser as _promptUser } from '../../prompts/promptUtils.js';
|
|
5
|
+
import { EXIT_CODES } from '../../enums/exitCodes.js';
|
|
6
|
+
import { isAppDeveloperAccount as _isAppDeveloperAccount, isUnifiedAccount as _isUnifiedAccount, } from '../../accountTypes.js';
|
|
7
|
+
import { selectPublicAppForMigrationPrompt as _selectPublicAppForMigrationPrompt } from '../../prompts/selectPublicAppForMigrationPrompt.js';
|
|
8
|
+
import { projectNameAndDestPrompt as _projectNameAndDestPrompt } from '../../prompts/projectNameAndDestPrompt.js';
|
|
9
|
+
import { ensureProjectExists as _ensureProjectExists } from '../../projects/ensureProjectExists.js';
|
|
10
|
+
import { poll as _poll } from '../../polling.js';
|
|
11
|
+
import { migrateApp2023_2 } from '../migrate_legacy.js';
|
|
14
12
|
// Mock all external dependencies
|
|
15
13
|
vi.mock('@hubspot/local-dev-lib/api/appsDev');
|
|
16
14
|
vi.mock('@hubspot/local-dev-lib/logger');
|
|
@@ -28,16 +26,16 @@ vi.mock('../../usageTracking');
|
|
|
28
26
|
vi.mock('../../ui/SpinniesManager');
|
|
29
27
|
vi.mock('../../process');
|
|
30
28
|
vi.mock('../../polling');
|
|
31
|
-
const isAppDeveloperAccount =
|
|
32
|
-
const isUnifiedAccount =
|
|
33
|
-
const selectPublicAppForMigrationPrompt =
|
|
34
|
-
const projectNameAndDestPrompt =
|
|
35
|
-
const ensureProjectExists =
|
|
36
|
-
const poll =
|
|
37
|
-
const fetchPublicAppMetadata =
|
|
38
|
-
const migrateNonProjectApp_v2023_2 =
|
|
39
|
-
const downloadProject =
|
|
40
|
-
const promptUser =
|
|
29
|
+
const isAppDeveloperAccount = _isAppDeveloperAccount;
|
|
30
|
+
const isUnifiedAccount = _isUnifiedAccount;
|
|
31
|
+
const selectPublicAppForMigrationPrompt = _selectPublicAppForMigrationPrompt;
|
|
32
|
+
const projectNameAndDestPrompt = _projectNameAndDestPrompt;
|
|
33
|
+
const ensureProjectExists = _ensureProjectExists;
|
|
34
|
+
const poll = _poll;
|
|
35
|
+
const fetchPublicAppMetadata = _fetchPublicAppMetadata;
|
|
36
|
+
const migrateNonProjectApp_v2023_2 = _migrateNonProjectApp_v2023_2;
|
|
37
|
+
const downloadProject = _downloadProject;
|
|
38
|
+
const promptUser = _promptUser;
|
|
41
39
|
describe('migrateApp2023_2', () => {
|
|
42
40
|
const mockDerivedAccountId = 123;
|
|
43
41
|
const mockOptions = {
|
|
@@ -96,12 +94,12 @@ describe('migrateApp2023_2', () => {
|
|
|
96
94
|
});
|
|
97
95
|
it('should exit if account is not an app developer account and not unified', async () => {
|
|
98
96
|
isAppDeveloperAccount.mockReturnValue(false);
|
|
99
|
-
await
|
|
97
|
+
await migrateApp2023_2(mockDerivedAccountId, mockOptions, mockAccountConfig);
|
|
100
98
|
expect(migrateNonProjectApp_v2023_2).not.toHaveBeenCalled();
|
|
101
|
-
expect(process.exit).toHaveBeenCalledWith(
|
|
99
|
+
expect(process.exit).toHaveBeenCalledWith(EXIT_CODES.SUCCESS);
|
|
102
100
|
});
|
|
103
101
|
it('should proceed with migration for valid app developer account', async () => {
|
|
104
|
-
await
|
|
102
|
+
await migrateApp2023_2(mockDerivedAccountId, mockOptions, mockAccountConfig);
|
|
105
103
|
expect(selectPublicAppForMigrationPrompt).toHaveBeenCalled();
|
|
106
104
|
expect(fetchPublicAppMetadata).toHaveBeenCalledWith(appId, mockDerivedAccountId);
|
|
107
105
|
expect(projectNameAndDestPrompt).toHaveBeenCalled();
|
|
@@ -109,12 +107,12 @@ describe('migrateApp2023_2', () => {
|
|
|
109
107
|
expect(migrateNonProjectApp_v2023_2).toHaveBeenCalled();
|
|
110
108
|
expect(poll).toHaveBeenCalled();
|
|
111
109
|
expect(downloadProject).toHaveBeenCalled();
|
|
112
|
-
expect(
|
|
110
|
+
expect(extractZipArchive).toHaveBeenCalled();
|
|
113
111
|
});
|
|
114
112
|
it('should handle migration failure gracefully', async () => {
|
|
115
113
|
const errorMessage = 'Migration failed';
|
|
116
114
|
migrateNonProjectApp_v2023_2.mockRejectedValue(new Error(errorMessage));
|
|
117
|
-
await expect(
|
|
115
|
+
await expect(migrateApp2023_2(mockDerivedAccountId, mockOptions, mockAccountConfig)).rejects.toThrow(errorMessage);
|
|
118
116
|
});
|
|
119
117
|
it('should handle non-migratable apps', async () => {
|
|
120
118
|
fetchPublicAppMetadata.mockResolvedValue({
|
|
@@ -124,13 +122,13 @@ describe('migrateApp2023_2', () => {
|
|
|
124
122
|
listingInfo: { someInfo: 'test' },
|
|
125
123
|
},
|
|
126
124
|
});
|
|
127
|
-
await
|
|
128
|
-
expect(process.exit).toHaveBeenCalledWith(
|
|
125
|
+
await migrateApp2023_2(mockDerivedAccountId, mockOptions, mockAccountConfig);
|
|
126
|
+
expect(process.exit).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
129
127
|
});
|
|
130
128
|
it('should handle existing project error', async () => {
|
|
131
129
|
ensureProjectExists.mockResolvedValue({
|
|
132
130
|
projectExists: true,
|
|
133
131
|
});
|
|
134
|
-
await expect(
|
|
132
|
+
await expect(migrateApp2023_2(mockDerivedAccountId, mockOptions, mockAccountConfig)).rejects.toThrow('A project with name test-project already exists');
|
|
135
133
|
});
|
|
136
134
|
});
|
package/lib/app/migrate.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ArgumentsCamelCase } from 'yargs';
|
|
2
|
-
import { LoadedProjectConfig } from '../projects/config';
|
|
3
|
-
import { MigrationApp, MigrationFailed, MigrationStatus } from '../../api/migrate';
|
|
4
|
-
import { AccountArgs, CommonArgs, ConfigArgs, EnvironmentArgs } from '../../types/Yargs';
|
|
2
|
+
import { LoadedProjectConfig } from '../projects/config.js';
|
|
3
|
+
import { MigrationApp, MigrationFailed, MigrationStatus } from '../../api/migrate.js';
|
|
4
|
+
import { AccountArgs, CommonArgs, ConfigArgs, EnvironmentArgs } from '../../types/Yargs.js';
|
|
5
5
|
export type MigrateAppArgs = CommonArgs & AccountArgs & EnvironmentArgs & ConfigArgs & {
|
|
6
6
|
name?: string;
|
|
7
7
|
dest?: string;
|