@hubspot/cli 7.7.20-experimental.0 → 7.7.21-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 +48 -53
- 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 -11
- 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 +1 -1
- package/commands/config/set.js +23 -25
- 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 +124 -130
- 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 +93 -131
- package/commands/project/__tests__/devUnifiedFlow.test.js +135 -140
- 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 +62 -67
- package/commands/project/deploy.d.ts +1 -1
- package/commands/project/deploy.js +72 -77
- 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 +50 -55
- package/commands/testAccount/createConfig.d.ts +2 -2
- 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 +0 -1
- package/lang/en.js +369 -376
- package/lib/__tests__/accountTypes.test.js +20 -22
- package/lib/__tests__/buildAccount.test.js +26 -61
- 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 +6 -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 +59 -67
- package/lib/commonOpts.d.ts +1 -1
- package/lib/commonOpts.js +42 -59
- package/lib/configMigrate.js +34 -38
- package/lib/configOptions.js +34 -40
- package/lib/constants.js +31 -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 +69 -97
- 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 +23 -29
- package/lib/projects/add/v3AddComponent.d.ts +1 -1
- package/lib/projects/add/v3AddComponent.js +35 -41
- 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 +24 -26
- package/lib/projects/localDev/DevServerManagerV2.d.ts +2 -2
- package/lib/projects/localDev/DevServerManagerV2.js +17 -22
- package/lib/projects/localDev/LocalDevLogger.d.ts +1 -1
- package/lib/projects/localDev/LocalDevLogger.js +59 -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 +4 -4
- package/lib/projects/localDev/LocalDevProcess.js +25 -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 +25 -27
- package/lib/projects/localDev/helpers.d.ts +3 -3
- package/lib/projects/localDev/helpers.js +156 -174
- package/lib/projects/structure.d.ts +3 -3
- package/lib/projects/structure.js +32 -78
- package/lib/projects/ui.js +10 -13
- package/lib/projects/upload.d.ts +1 -1
- package/lib/projects/upload.js +55 -64
- package/lib/projects/urls.js +14 -24
- 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 +16 -19
- 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 +15 -22
- 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 +12 -23
- 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 +44 -50
- package/lib/utils/hasFlag.js +2 -8
- package/lib/validation.js +48 -87
- package/lib/yargsUtils.d.ts +1 -1
- package/lib/yargsUtils.js +13 -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 +33 -37
- package/mcp-server/tools/project/CreateProjectTool.d.ts +1 -1
- package/mcp-server/tools/project/CreateProjectTool.js +44 -48
- package/mcp-server/tools/project/DeployProject.d.ts +1 -1
- package/mcp-server/tools/project/DeployProject.js +16 -20
- package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +1 -1
- package/mcp-server/tools/project/GuidedWalkthroughTool.js +19 -23
- package/mcp-server/tools/project/UploadProjectTools.d.ts +1 -1
- package/mcp-server/tools/project/UploadProjectTools.js +10 -17
- package/mcp-server/tools/project/ValidateProjectTool.d.ts +1 -1
- package/mcp-server/tools/project/ValidateProjectTool.js +11 -15
- 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/package.json +15 -11
- 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/Yargs.js +1 -2
- package/types/{Cms.d.ts → cms.d.ts} +1 -1
- package/types/cms.js +1 -0
- package/types/sandboxes.js +1 -0
- package/types/Cms.js +0 -2
- package/types/Sandboxes.js +0 -2
- /package/types/{Sandboxes.d.ts → sandboxes.d.ts} +0 -0
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const en_1 = require("../../lang/en");
|
|
9
|
-
const ui_1 = require("../ui");
|
|
10
|
-
const logger_1 = require("../ui/logger");
|
|
11
|
-
const exitCodes_1 = require("../enums/exitCodes");
|
|
12
|
-
const projectProfiles_1 = require("../projectProfiles");
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { loadHsProfileFile, getHsProfileFilename, getAllHsProfiles, } from '@hubspot/project-parsing-lib';
|
|
3
|
+
import { lib } from '../../lang/en.js';
|
|
4
|
+
import { uiBetaTag, uiLine } from '../ui/index.js';
|
|
5
|
+
import { uiLogger } from '../ui/logger.js';
|
|
6
|
+
import { EXIT_CODES } from '../enums/exitCodes.js';
|
|
7
|
+
import { logProfileHeader, logProfileFooter, loadProfile, exitIfUsingProfiles, } from '../projectProfiles.js';
|
|
13
8
|
// Mock dependencies
|
|
14
9
|
vi.mock('@hubspot/project-parsing-lib');
|
|
15
10
|
vi.mock('../ui');
|
|
@@ -19,21 +14,21 @@ vi.mock('../../lang/en');
|
|
|
19
14
|
const mockExit = vi.spyOn(process, 'exit').mockImplementation(code => {
|
|
20
15
|
throw new Error(`Process.exit called with code ${code}`);
|
|
21
16
|
});
|
|
22
|
-
const mockedLoadHsProfileFile =
|
|
23
|
-
const mockedGetHsProfileFilename =
|
|
24
|
-
const mockedGetAllHsProfiles =
|
|
25
|
-
const mockedUiBetaTag =
|
|
26
|
-
const mockedUiLine =
|
|
27
|
-
const mockedUiLogger =
|
|
17
|
+
const mockedLoadHsProfileFile = loadHsProfileFile;
|
|
18
|
+
const mockedGetHsProfileFilename = getHsProfileFilename;
|
|
19
|
+
const mockedGetAllHsProfiles = getAllHsProfiles;
|
|
20
|
+
const mockedUiBetaTag = uiBetaTag;
|
|
21
|
+
const mockedUiLine = uiLine;
|
|
22
|
+
const mockedUiLogger = uiLogger;
|
|
28
23
|
describe('lib/projectProfiles', () => {
|
|
29
24
|
describe('logProfileHeader()', () => {
|
|
30
25
|
it('should log profile header with correct format', () => {
|
|
31
26
|
const profileName = 'test-profile';
|
|
32
27
|
const filename = 'test-profile.hsprofile';
|
|
33
28
|
mockedGetHsProfileFilename.mockReturnValue(filename);
|
|
34
|
-
|
|
29
|
+
logProfileHeader(profileName);
|
|
35
30
|
expect(mockedUiLine).toHaveBeenCalled();
|
|
36
|
-
expect(mockedUiBetaTag).toHaveBeenCalledWith(
|
|
31
|
+
expect(mockedUiBetaTag).toHaveBeenCalledWith(lib.projectProfiles.logs.usingProfile(filename));
|
|
37
32
|
expect(mockedUiLogger.log).toHaveBeenCalledWith('');
|
|
38
33
|
});
|
|
39
34
|
});
|
|
@@ -46,16 +41,16 @@ describe('lib/projectProfiles', () => {
|
|
|
46
41
|
},
|
|
47
42
|
};
|
|
48
43
|
it('should log profile footer with account ID', () => {
|
|
49
|
-
|
|
50
|
-
expect(mockedUiLogger.log).toHaveBeenCalledWith(
|
|
44
|
+
logProfileFooter(mockProfile);
|
|
45
|
+
expect(mockedUiLogger.log).toHaveBeenCalledWith(lib.projectProfiles.logs.profileTargetAccount(mockProfile.accountId));
|
|
51
46
|
expect(mockedUiLine).toHaveBeenCalled();
|
|
52
47
|
expect(mockedUiLogger.log).toHaveBeenCalledWith('');
|
|
53
48
|
});
|
|
54
49
|
it('should log variables when includeVariables is true', () => {
|
|
55
|
-
|
|
56
|
-
expect(mockedUiLogger.log).toHaveBeenCalledWith(
|
|
50
|
+
logProfileFooter(mockProfile, true);
|
|
51
|
+
expect(mockedUiLogger.log).toHaveBeenCalledWith(lib.projectProfiles.logs.profileTargetAccount(mockProfile.accountId));
|
|
57
52
|
expect(mockedUiLogger.log).toHaveBeenCalledWith('');
|
|
58
|
-
expect(mockedUiLogger.log).toHaveBeenCalledWith(
|
|
53
|
+
expect(mockedUiLogger.log).toHaveBeenCalledWith(lib.projectProfiles.logs.profileVariables);
|
|
59
54
|
expect(mockedUiLogger.log).toHaveBeenCalledWith(' key1: value1');
|
|
60
55
|
expect(mockedUiLogger.log).toHaveBeenCalledWith(' key2: value2');
|
|
61
56
|
expect(mockedUiLine).toHaveBeenCalled();
|
|
@@ -74,25 +69,25 @@ describe('lib/projectProfiles', () => {
|
|
|
74
69
|
accountId: 123,
|
|
75
70
|
};
|
|
76
71
|
it('should return undefined when project config is missing', () => {
|
|
77
|
-
const result =
|
|
72
|
+
const result = loadProfile(null, mockProjectDir, mockProfileName);
|
|
78
73
|
expect(result).toBeUndefined();
|
|
79
|
-
expect(mockedUiLogger.error).toHaveBeenCalledWith(
|
|
74
|
+
expect(mockedUiLogger.error).toHaveBeenCalledWith(lib.projectProfiles.loadProfile.errors.noProjectConfig);
|
|
80
75
|
});
|
|
81
76
|
it('should return undefined when profile is not found', () => {
|
|
82
77
|
mockedLoadHsProfileFile.mockReturnValue(null);
|
|
83
78
|
const filename = 'test-profile.hsprofile';
|
|
84
79
|
mockedGetHsProfileFilename.mockReturnValue(filename);
|
|
85
|
-
const result =
|
|
80
|
+
const result = loadProfile(mockProjectConfig, mockProjectDir, mockProfileName);
|
|
86
81
|
expect(result).toBeUndefined();
|
|
87
|
-
expect(mockedUiLogger.error).toHaveBeenCalledWith(
|
|
82
|
+
expect(mockedUiLogger.error).toHaveBeenCalledWith(lib.projectProfiles.loadProfile.errors.profileNotFound(filename));
|
|
88
83
|
});
|
|
89
84
|
it('should return undefined when profile has no account ID', () => {
|
|
90
85
|
mockedLoadHsProfileFile.mockReturnValue({});
|
|
91
86
|
const filename = 'test-profile.hsprofile';
|
|
92
87
|
mockedGetHsProfileFilename.mockReturnValue(filename);
|
|
93
|
-
const result =
|
|
88
|
+
const result = loadProfile(mockProjectConfig, mockProjectDir, mockProfileName);
|
|
94
89
|
expect(result).toBeUndefined();
|
|
95
|
-
expect(mockedUiLogger.error).toHaveBeenCalledWith(
|
|
90
|
+
expect(mockedUiLogger.error).toHaveBeenCalledWith(lib.projectProfiles.loadProfile.errors.missingAccountId(filename));
|
|
96
91
|
});
|
|
97
92
|
it('should return undefined when profile loading fails', () => {
|
|
98
93
|
mockedLoadHsProfileFile.mockImplementation(() => {
|
|
@@ -100,15 +95,15 @@ describe('lib/projectProfiles', () => {
|
|
|
100
95
|
});
|
|
101
96
|
const filename = 'test-profile.hsprofile';
|
|
102
97
|
mockedGetHsProfileFilename.mockReturnValue(filename);
|
|
103
|
-
const result =
|
|
98
|
+
const result = loadProfile(mockProjectConfig, mockProjectDir, mockProfileName);
|
|
104
99
|
expect(result).toBeUndefined();
|
|
105
|
-
expect(mockedUiLogger.error).toHaveBeenCalledWith(
|
|
100
|
+
expect(mockedUiLogger.error).toHaveBeenCalledWith(lib.projectProfiles.loadProfile.errors.failedToLoadProfile(filename));
|
|
106
101
|
});
|
|
107
102
|
it('should return profile when loading succeeds', () => {
|
|
108
103
|
mockedLoadHsProfileFile.mockReturnValue(mockProfile);
|
|
109
|
-
const result =
|
|
104
|
+
const result = loadProfile(mockProjectConfig, mockProjectDir, mockProfileName);
|
|
110
105
|
expect(result).toEqual(mockProfile);
|
|
111
|
-
expect(mockedLoadHsProfileFile).toHaveBeenCalledWith(
|
|
106
|
+
expect(mockedLoadHsProfileFile).toHaveBeenCalledWith(path.join(mockProjectDir, mockProjectConfig.srcDir), mockProfileName);
|
|
112
107
|
});
|
|
113
108
|
});
|
|
114
109
|
describe('exitIfUsingProfiles()', () => {
|
|
@@ -120,15 +115,15 @@ describe('lib/projectProfiles', () => {
|
|
|
120
115
|
const mockProjectDir = '/test/project';
|
|
121
116
|
it('should not exit when no profiles exist', async () => {
|
|
122
117
|
mockedGetAllHsProfiles.mockResolvedValue([]);
|
|
123
|
-
await
|
|
118
|
+
await exitIfUsingProfiles(mockProjectConfig, mockProjectDir);
|
|
124
119
|
expect(mockedUiLogger.error).not.toHaveBeenCalled();
|
|
125
120
|
expect(mockExit).not.toHaveBeenCalled();
|
|
126
121
|
});
|
|
127
122
|
it('should exit with error when profiles exist', async () => {
|
|
128
123
|
mockedGetAllHsProfiles.mockResolvedValue(['profile1', 'profile2']);
|
|
129
|
-
await expect(
|
|
130
|
-
expect(mockedUiLogger.error).toHaveBeenCalledWith(
|
|
131
|
-
expect(mockExit).toHaveBeenCalledWith(
|
|
124
|
+
await expect(exitIfUsingProfiles(mockProjectConfig, mockProjectDir)).rejects.toThrow(`Process.exit called with code ${EXIT_CODES.ERROR}`);
|
|
125
|
+
expect(mockedUiLogger.error).toHaveBeenCalledWith(lib.projectProfiles.exitIfUsingProfiles.errors.noProfileSpecified);
|
|
126
|
+
expect(mockExit).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
132
127
|
});
|
|
133
128
|
});
|
|
134
129
|
});
|
|
@@ -1,41 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const config_2 = require("@hubspot/local-dev-lib/constants/config");
|
|
10
|
-
const testUtils_1 = require("../testUtils");
|
|
11
|
-
const sandboxes_1 = require("../sandboxes");
|
|
12
|
-
const sandboxSync_2 = require("../sandboxSync");
|
|
13
|
-
const SpinniesManager_1 = __importDefault(require("../ui/SpinniesManager"));
|
|
1
|
+
import { logger } from '@hubspot/local-dev-lib/logger';
|
|
2
|
+
import { initiateSync } from '@hubspot/local-dev-lib/api/sandboxSync';
|
|
3
|
+
import { getAccountId } from '@hubspot/local-dev-lib/config';
|
|
4
|
+
import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
|
|
5
|
+
import { mockHubSpotHttpError } from '../testUtils.js';
|
|
6
|
+
import { getAvailableSyncTypes } from '../sandboxes.js';
|
|
7
|
+
import { syncSandbox } from '../sandboxSync.js';
|
|
8
|
+
import SpinniesManager from '../ui/SpinniesManager.js';
|
|
14
9
|
vi.mock('@hubspot/local-dev-lib/logger');
|
|
15
10
|
vi.mock('@hubspot/local-dev-lib/api/sandboxSync');
|
|
16
11
|
vi.mock('@hubspot/local-dev-lib/config');
|
|
17
12
|
vi.mock('../sandboxes');
|
|
18
13
|
vi.mock('../ui/SpinniesManager');
|
|
19
|
-
const mockedLogger =
|
|
20
|
-
const mockedInitiateSync =
|
|
21
|
-
const mockedGetAccountId =
|
|
22
|
-
const mockedGetAvailableSyncTypes =
|
|
23
|
-
const mockedSpinniesInit =
|
|
24
|
-
const mockedSpinniesAdd =
|
|
25
|
-
const mockedSpinniesSucceed =
|
|
26
|
-
const mockedSpinniesFail =
|
|
14
|
+
const mockedLogger = logger;
|
|
15
|
+
const mockedInitiateSync = initiateSync;
|
|
16
|
+
const mockedGetAccountId = getAccountId;
|
|
17
|
+
const mockedGetAvailableSyncTypes = getAvailableSyncTypes;
|
|
18
|
+
const mockedSpinniesInit = SpinniesManager.init;
|
|
19
|
+
const mockedSpinniesAdd = SpinniesManager.add;
|
|
20
|
+
const mockedSpinniesSucceed = SpinniesManager.succeed;
|
|
21
|
+
const mockedSpinniesFail = SpinniesManager.fail;
|
|
27
22
|
describe('lib/sandboxSync', () => {
|
|
28
23
|
const mockEnv = 'qa';
|
|
29
24
|
const mockParentAccount = {
|
|
30
25
|
name: 'Parent Account',
|
|
31
26
|
portalId: 123,
|
|
32
|
-
accountType:
|
|
27
|
+
accountType: HUBSPOT_ACCOUNT_TYPES.STANDARD_SANDBOX,
|
|
33
28
|
env: mockEnv,
|
|
34
29
|
};
|
|
35
30
|
const mockChildAccount = {
|
|
36
31
|
name: 'Child Account',
|
|
37
32
|
portalId: 456,
|
|
38
|
-
accountType:
|
|
33
|
+
accountType: HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX,
|
|
39
34
|
env: mockEnv,
|
|
40
35
|
};
|
|
41
36
|
const mockSyncTasks = [{ type: 'mock-sync-type' }];
|
|
@@ -48,7 +43,7 @@ describe('lib/sandboxSync', () => {
|
|
|
48
43
|
describe('syncSandbox()', () => {
|
|
49
44
|
it('successfully syncs a sandbox with provided sync tasks', async () => {
|
|
50
45
|
mockedInitiateSync.mockResolvedValue({ status: 'SUCCESS' });
|
|
51
|
-
await
|
|
46
|
+
await syncSandbox(mockChildAccount, mockParentAccount, mockEnv, mockSyncTasks);
|
|
52
47
|
expect(mockedSpinniesInit).toHaveBeenCalled();
|
|
53
48
|
expect(mockedSpinniesAdd).toHaveBeenCalled();
|
|
54
49
|
expect(mockedInitiateSync).toHaveBeenCalledWith(mockParentAccount.portalId, mockChildAccount.portalId, mockSyncTasks, mockChildAccount.portalId);
|
|
@@ -56,7 +51,7 @@ describe('lib/sandboxSync', () => {
|
|
|
56
51
|
});
|
|
57
52
|
it('fetches sync types when no tasks are provided', async () => {
|
|
58
53
|
mockedInitiateSync.mockResolvedValue({ status: 'SUCCESS' });
|
|
59
|
-
await
|
|
54
|
+
await syncSandbox(mockChildAccount, mockParentAccount, mockEnv, []);
|
|
60
55
|
expect(mockedGetAvailableSyncTypes).toHaveBeenCalledWith(mockParentAccount, mockChildAccount);
|
|
61
56
|
expect(mockedGetAvailableSyncTypes).toHaveBeenCalledWith(mockParentAccount, mockChildAccount);
|
|
62
57
|
expect(mockedInitiateSync).toHaveBeenCalled();
|
|
@@ -65,10 +60,10 @@ describe('lib/sandboxSync', () => {
|
|
|
65
60
|
mockedGetAccountId.mockReset();
|
|
66
61
|
mockedGetAccountId.mockReturnValue(null);
|
|
67
62
|
const errorRegex = new RegExp(`Couldn't sync ${mockChildAccount.portalId} because your account has been removed from`);
|
|
68
|
-
await expect(
|
|
63
|
+
await expect(syncSandbox(mockChildAccount, mockParentAccount, mockEnv, mockSyncTasks)).rejects.toThrow(errorRegex);
|
|
69
64
|
});
|
|
70
65
|
it('handles sync in progress error', async () => {
|
|
71
|
-
const error =
|
|
66
|
+
const error = mockHubSpotHttpError('', {
|
|
72
67
|
status: 429,
|
|
73
68
|
data: {
|
|
74
69
|
category: 'RATE_LIMITS',
|
|
@@ -76,12 +71,12 @@ describe('lib/sandboxSync', () => {
|
|
|
76
71
|
},
|
|
77
72
|
});
|
|
78
73
|
mockedInitiateSync.mockRejectedValue(error);
|
|
79
|
-
await expect(
|
|
74
|
+
await expect(syncSandbox(mockChildAccount, mockParentAccount, mockEnv, mockSyncTasks)).rejects.toEqual(error);
|
|
80
75
|
expect(mockedSpinniesFail).toHaveBeenCalled();
|
|
81
76
|
expect(mockedLogger.error).toHaveBeenCalledWith(expect.stringMatching(/Couldn't run the sync because there's another sync in progress/));
|
|
82
77
|
});
|
|
83
78
|
it('handles invalid user error', async () => {
|
|
84
|
-
const error =
|
|
79
|
+
const error = mockHubSpotHttpError('', {
|
|
85
80
|
status: 403,
|
|
86
81
|
data: {
|
|
87
82
|
category: 'BANNED',
|
|
@@ -89,12 +84,12 @@ describe('lib/sandboxSync', () => {
|
|
|
89
84
|
},
|
|
90
85
|
});
|
|
91
86
|
mockedInitiateSync.mockRejectedValue(error);
|
|
92
|
-
await expect(
|
|
87
|
+
await expect(syncSandbox(mockChildAccount, mockParentAccount, mockEnv, mockSyncTasks)).rejects.toEqual(error);
|
|
93
88
|
expect(mockedSpinniesFail).toHaveBeenCalled();
|
|
94
89
|
expect(mockedLogger.error).toHaveBeenCalledWith(expect.stringMatching(/because your account has been removed from/));
|
|
95
90
|
});
|
|
96
91
|
it('handles not super admin error', async () => {
|
|
97
|
-
const error =
|
|
92
|
+
const error = mockHubSpotHttpError('', {
|
|
98
93
|
status: 403,
|
|
99
94
|
data: {
|
|
100
95
|
category: 'BANNED',
|
|
@@ -102,12 +97,12 @@ describe('lib/sandboxSync', () => {
|
|
|
102
97
|
},
|
|
103
98
|
});
|
|
104
99
|
mockedInitiateSync.mockRejectedValue(error);
|
|
105
|
-
await expect(
|
|
100
|
+
await expect(syncSandbox(mockChildAccount, mockParentAccount, mockEnv, mockSyncTasks)).rejects.toEqual(error);
|
|
106
101
|
expect(mockedSpinniesFail).toHaveBeenCalled();
|
|
107
102
|
expect(mockedLogger.error).toHaveBeenCalledWith(expect.stringMatching(/Couldn't run the sync because you are not a super admin in/));
|
|
108
103
|
});
|
|
109
104
|
it('handles sandbox not found error', async () => {
|
|
110
|
-
const error =
|
|
105
|
+
const error = mockHubSpotHttpError('', {
|
|
111
106
|
status: 404,
|
|
112
107
|
data: {
|
|
113
108
|
category: 'OBJECT_NOT_FOUND',
|
|
@@ -115,13 +110,13 @@ describe('lib/sandboxSync', () => {
|
|
|
115
110
|
},
|
|
116
111
|
});
|
|
117
112
|
mockedInitiateSync.mockRejectedValue(error);
|
|
118
|
-
await expect(
|
|
113
|
+
await expect(syncSandbox(mockChildAccount, mockParentAccount, mockEnv, mockSyncTasks)).rejects.toEqual(error);
|
|
119
114
|
expect(mockedSpinniesFail).toHaveBeenCalled();
|
|
120
115
|
expect(mockedLogger.error).toHaveBeenCalledWith(expect.stringMatching(/may have been deleted through the UI/));
|
|
121
116
|
});
|
|
122
117
|
it('displays slim info message when specified', async () => {
|
|
123
118
|
mockedInitiateSync.mockResolvedValue({ status: 'SUCCESS' });
|
|
124
|
-
await
|
|
119
|
+
await syncSandbox(mockChildAccount, mockParentAccount, mockEnv, mockSyncTasks, true);
|
|
125
120
|
expect(mockedLogger.info).not.toHaveBeenCalled();
|
|
126
121
|
expect(mockedSpinniesSucceed).toHaveBeenCalledWith('sandboxSync', expect.objectContaining({
|
|
127
122
|
text: expect.stringMatching(/Initiated sync of object definitions from production to /),
|
|
@@ -1,31 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const testUtils_1 = require("../testUtils");
|
|
9
|
-
const sandboxes_1 = require("../sandboxes");
|
|
1
|
+
import { logger } from '@hubspot/local-dev-lib/logger';
|
|
2
|
+
import { getSandboxUsageLimits } from '@hubspot/local-dev-lib/api/sandboxHubs';
|
|
3
|
+
import { fetchTypes } from '@hubspot/local-dev-lib/api/sandboxSync';
|
|
4
|
+
import { getAccountId, getConfigAccounts } from '@hubspot/local-dev-lib/config';
|
|
5
|
+
import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
|
|
6
|
+
import { mockHubSpotHttpError } from '../testUtils.js';
|
|
7
|
+
import { getSandboxTypeAsString, getHasSandboxesByType, getAvailableSyncTypes, validateSandboxUsageLimits, handleSandboxCreateError, } from '../sandboxes.js';
|
|
10
8
|
vi.mock('@hubspot/local-dev-lib/logger');
|
|
11
9
|
vi.mock('@hubspot/local-dev-lib/api/sandboxHubs');
|
|
12
10
|
vi.mock('@hubspot/local-dev-lib/api/sandboxSync');
|
|
13
11
|
vi.mock('@hubspot/local-dev-lib/config');
|
|
14
|
-
const mockedGetAccountId =
|
|
15
|
-
const mockedGetSandboxUsageLimits =
|
|
16
|
-
const mockedFetchTypes =
|
|
17
|
-
const mockedGetConfigAccounts =
|
|
18
|
-
const mockedLogger =
|
|
12
|
+
const mockedGetAccountId = getAccountId;
|
|
13
|
+
const mockedGetSandboxUsageLimits = getSandboxUsageLimits;
|
|
14
|
+
const mockedFetchTypes = fetchTypes;
|
|
15
|
+
const mockedGetConfigAccounts = getConfigAccounts;
|
|
16
|
+
const mockedLogger = logger;
|
|
19
17
|
describe('lib/sandboxes', () => {
|
|
20
18
|
describe('getSandboxTypeAsString()', () => {
|
|
21
19
|
it('returns "development" for development sandbox type', () => {
|
|
22
|
-
expect(
|
|
20
|
+
expect(getSandboxTypeAsString(HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX)).toBe('development');
|
|
23
21
|
});
|
|
24
22
|
it('returns "standard" for standard sandbox type', () => {
|
|
25
|
-
expect(
|
|
23
|
+
expect(getSandboxTypeAsString(HUBSPOT_ACCOUNT_TYPES.STANDARD_SANDBOX)).toBe('standard');
|
|
26
24
|
});
|
|
27
25
|
it('returns "standard" for undefined input', () => {
|
|
28
|
-
expect(
|
|
26
|
+
expect(getSandboxTypeAsString(undefined)).toBe('standard');
|
|
29
27
|
});
|
|
30
28
|
});
|
|
31
29
|
describe('getHasSandboxesByType()', () => {
|
|
@@ -33,7 +31,7 @@ describe('lib/sandboxes', () => {
|
|
|
33
31
|
name: 'Parent Account',
|
|
34
32
|
portalId: 123,
|
|
35
33
|
authType: undefined,
|
|
36
|
-
accountType:
|
|
34
|
+
accountType: HUBSPOT_ACCOUNT_TYPES.STANDARD_SANDBOX,
|
|
37
35
|
env: 'qa',
|
|
38
36
|
};
|
|
39
37
|
it('returns true when sandbox of specified type exists', () => {
|
|
@@ -43,14 +41,14 @@ describe('lib/sandboxes', () => {
|
|
|
43
41
|
{
|
|
44
42
|
...mockParentAccount,
|
|
45
43
|
parentAccountId: 123,
|
|
46
|
-
accountType:
|
|
44
|
+
accountType: HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX,
|
|
47
45
|
},
|
|
48
46
|
]);
|
|
49
|
-
expect(
|
|
47
|
+
expect(getHasSandboxesByType(mockParentAccount, HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX)).toBe(true);
|
|
50
48
|
});
|
|
51
49
|
it('returns false when no sandbox of specified type exists', () => {
|
|
52
50
|
mockedGetConfigAccounts.mockReturnValue([mockParentAccount]);
|
|
53
|
-
expect(
|
|
51
|
+
expect(getHasSandboxesByType(mockParentAccount, HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX)).toBe(false);
|
|
54
52
|
});
|
|
55
53
|
});
|
|
56
54
|
describe('getAvailableSyncTypes()', () => {
|
|
@@ -71,12 +69,12 @@ describe('lib/sandboxes', () => {
|
|
|
71
69
|
mockedFetchTypes.mockResolvedValue({
|
|
72
70
|
data: { results: mockSyncTypes },
|
|
73
71
|
});
|
|
74
|
-
const result = await
|
|
72
|
+
const result = await getAvailableSyncTypes(mockParentAccount, mockChildAccount);
|
|
75
73
|
expect(result).toEqual([{ type: 'type1' }, { type: 'type2' }]);
|
|
76
74
|
});
|
|
77
75
|
it('throws error when sync types fetch fails', async () => {
|
|
78
76
|
mockedFetchTypes.mockResolvedValue({ data: { results: null } });
|
|
79
|
-
await expect(
|
|
77
|
+
await expect(getAvailableSyncTypes(mockParentAccount, mockChildAccount)).rejects.toThrow(/Unable to fetch available sandbox sync types/);
|
|
80
78
|
});
|
|
81
79
|
});
|
|
82
80
|
describe('validateSandboxUsageLimits()', () => {
|
|
@@ -93,7 +91,7 @@ describe('lib/sandboxes', () => {
|
|
|
93
91
|
usage: { DEVELOPER: { available: 1, limit: 3 } },
|
|
94
92
|
},
|
|
95
93
|
});
|
|
96
|
-
await expect(
|
|
94
|
+
await expect(validateSandboxUsageLimits(mockAccount, HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX, 'qa')).resolves.not.toThrow();
|
|
97
95
|
});
|
|
98
96
|
it('throws error when development sandbox limit is reached', async () => {
|
|
99
97
|
mockedGetAccountId.mockReturnValue(mockAccount.portalId);
|
|
@@ -103,7 +101,7 @@ describe('lib/sandboxes', () => {
|
|
|
103
101
|
usage: { DEVELOPER: { available: 0, limit: 1 } },
|
|
104
102
|
},
|
|
105
103
|
});
|
|
106
|
-
await expect(
|
|
104
|
+
await expect(validateSandboxUsageLimits(mockAccount, HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX, 'qa')).rejects.toThrow(/reached the limit of 1 development sandbox/);
|
|
107
105
|
});
|
|
108
106
|
});
|
|
109
107
|
describe('handleSandboxCreateError()', () => {
|
|
@@ -111,37 +109,37 @@ describe('lib/sandboxes', () => {
|
|
|
111
109
|
const mockName = 'Test Sandbox';
|
|
112
110
|
const mockAccountId = 123;
|
|
113
111
|
it('handles missing scope error', () => {
|
|
114
|
-
const error =
|
|
112
|
+
const error = mockHubSpotHttpError('missing scopes error', {
|
|
115
113
|
status: 403,
|
|
116
114
|
data: {
|
|
117
115
|
message: 'Missing scopes error',
|
|
118
116
|
category: 'MISSING_SCOPES',
|
|
119
117
|
},
|
|
120
118
|
});
|
|
121
|
-
expect(() =>
|
|
119
|
+
expect(() => handleSandboxCreateError(error, mockEnv, mockName, mockAccountId)).toThrow(error);
|
|
122
120
|
expect(mockedLogger.error).toHaveBeenCalledWith(expect.stringMatching(/The personal access key you provided doesn't include sandbox permissions/));
|
|
123
121
|
expect(mockedLogger.info).toHaveBeenCalledWith(expect.stringMatching(/To update CLI permissions for/));
|
|
124
122
|
});
|
|
125
123
|
it('handles user access not allowed error', () => {
|
|
126
|
-
const error =
|
|
124
|
+
const error = mockHubSpotHttpError('user access not allowed error', {
|
|
127
125
|
status: 403,
|
|
128
126
|
data: {
|
|
129
127
|
category: 'BANNED',
|
|
130
128
|
subCategory: 'SandboxErrors.USER_ACCESS_NOT_ALLOWED',
|
|
131
129
|
},
|
|
132
130
|
});
|
|
133
|
-
expect(() =>
|
|
131
|
+
expect(() => handleSandboxCreateError(error, mockEnv, mockName, mockAccountId)).toThrow(error);
|
|
134
132
|
expect(mockedLogger.error).toHaveBeenCalledWith(expect.stringMatching(/your permission set doesn't allow you to create the sandbox/));
|
|
135
133
|
});
|
|
136
134
|
it('handles 403 gating error', () => {
|
|
137
|
-
const error =
|
|
135
|
+
const error = mockHubSpotHttpError('403 gating error', {
|
|
138
136
|
status: 403,
|
|
139
137
|
data: {
|
|
140
138
|
category: 'BANNED',
|
|
141
139
|
subCategory: 'SandboxErrors.DEVELOPMENT_SANDBOX_ACCESS_NOT_ALLOWED',
|
|
142
140
|
},
|
|
143
141
|
});
|
|
144
|
-
expect(() =>
|
|
142
|
+
expect(() => handleSandboxCreateError(error, mockEnv, mockName, mockAccountId)).toThrow(error);
|
|
145
143
|
expect(mockedLogger.error).toHaveBeenCalledWith(expect.stringMatching(/does not have access to development sandboxes/));
|
|
146
144
|
});
|
|
147
145
|
});
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const mock_stdin_1 = __importDefault(require("mock-stdin"));
|
|
7
|
-
const serverlessFunctionLogs_1 = require("../ui/serverlessFunctionLogs");
|
|
8
|
-
const serverlessLogs_1 = require("../serverlessLogs");
|
|
1
|
+
import mockStdIn from 'mock-stdin';
|
|
2
|
+
import { outputLogs } from '../ui/serverlessFunctionLogs.js';
|
|
3
|
+
import { tailLogs } from '../serverlessLogs.js';
|
|
9
4
|
vi.mock('../ui/serverlessFunctionLogs');
|
|
10
5
|
vi.mock('@hubspot/local-dev-lib/logger');
|
|
11
6
|
vi.mock('../ui/SpinniesManager', () => ({
|
|
@@ -26,7 +21,7 @@ describe('lib/serverlessLogs', () => {
|
|
|
26
21
|
beforeEach(() => {
|
|
27
22
|
// @ts-ignore - we don't need to mock the entire process object
|
|
28
23
|
vi.spyOn(process, 'exit').mockImplementation(() => { });
|
|
29
|
-
stdinMock =
|
|
24
|
+
stdinMock = mockStdIn.stdin();
|
|
30
25
|
});
|
|
31
26
|
afterEach(() => {
|
|
32
27
|
vi.clearAllTimers();
|
|
@@ -69,7 +64,7 @@ describe('lib/serverlessLogs', () => {
|
|
|
69
64
|
});
|
|
70
65
|
});
|
|
71
66
|
// @ts-ignore - headers is not used in the actual function and does not need to be mocked
|
|
72
|
-
await
|
|
67
|
+
await tailLogs(ACCOUNT_ID, 'name', fetchLatest, tailCall, compact);
|
|
73
68
|
vi.runOnlyPendingTimers();
|
|
74
69
|
expect(fetchLatest).toHaveBeenCalled();
|
|
75
70
|
expect(tailCall).toHaveBeenCalledTimes(2);
|
|
@@ -125,9 +120,9 @@ describe('lib/serverlessLogs', () => {
|
|
|
125
120
|
};
|
|
126
121
|
const tailCall = vi.fn(() => Promise.resolve({ data: latestLogResponse }));
|
|
127
122
|
// @ts-ignore - headers is not used in the actual function and does not need to be mocked
|
|
128
|
-
await
|
|
123
|
+
await tailLogs(ACCOUNT_ID, 'name', fetchLatest, tailCall, compact);
|
|
129
124
|
vi.runOnlyPendingTimers();
|
|
130
|
-
expect(
|
|
125
|
+
expect(outputLogs).toHaveBeenCalledWith(latestLogResponse, expect.objectContaining({ compact }));
|
|
131
126
|
expect(tailCall).toHaveBeenCalledTimes(2);
|
|
132
127
|
});
|
|
133
128
|
it('handles no logs', async () => {
|
|
@@ -146,7 +141,7 @@ describe('lib/serverlessLogs', () => {
|
|
|
146
141
|
stackTrace: [],
|
|
147
142
|
statusCode: 404,
|
|
148
143
|
}));
|
|
149
|
-
await
|
|
144
|
+
await tailLogs(ACCOUNT_ID, 'name', fetchLatest, tailCall, compact);
|
|
150
145
|
vi.runOnlyPendingTimers();
|
|
151
146
|
expect(tailCall).toHaveBeenCalledTimes(2);
|
|
152
147
|
});
|