@hubspot/cli 7.8.12-experimental.0 → 7.9.0-beta.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/bin/cli.js +31 -25
- package/commands/__tests__/auth.test.js +5 -0
- package/commands/__tests__/cms.test.js +44 -1
- package/commands/__tests__/customObject.test.js +22 -1
- package/commands/__tests__/doctor.test.js +16 -16
- package/commands/__tests__/project.test.js +2 -0
- package/commands/account/auth.js +1 -0
- package/commands/account/clean.js +18 -27
- package/commands/account/createOverride.js +13 -31
- package/commands/account/info.js +20 -31
- package/commands/account/list.js +16 -22
- package/commands/account/remove.js +12 -20
- package/commands/account/removeOverride.js +11 -21
- package/commands/account/rename.js +6 -9
- package/commands/account/use.js +12 -26
- package/commands/account.js +2 -2
- package/commands/app/__tests__/migrate.test.js +5 -5
- package/commands/app/migrate.js +13 -18
- package/commands/app.js +1 -6
- package/commands/auth.d.ts +1 -0
- package/commands/auth.js +17 -7
- package/commands/{__tests__/remove.test.js → cms/__tests__/delete.test.js} +8 -8
- package/commands/{__tests__ → cms/__tests__}/fetch.test.js +3 -3
- package/commands/{__tests__ → cms/__tests__}/function.test.js +7 -3
- package/commands/{__tests__ → cms/__tests__}/lint.test.js +3 -3
- package/commands/{__tests__ → cms/__tests__}/list.test.js +3 -3
- package/commands/{__tests__ → cms/__tests__}/mv.test.js +3 -3
- package/commands/{__tests__ → cms/__tests__}/theme.test.js +9 -2
- package/commands/cms/app/create.d.ts +9 -0
- package/commands/cms/app/create.js +82 -0
- package/commands/cms/app.d.ts +3 -0
- package/commands/cms/app.js +17 -0
- package/commands/cms/convertFields.js +7 -9
- package/commands/cms/delete.d.ts +6 -0
- package/commands/cms/delete.js +43 -0
- package/commands/cms/fetch.d.ts +12 -0
- package/commands/cms/fetch.js +79 -0
- package/commands/{__tests__ → cms/function/__tests__}/logs.test.js +4 -5
- package/commands/cms/function/create.d.ts +12 -0
- package/commands/cms/function/create.js +84 -0
- package/commands/cms/function/deploy.d.ts +6 -0
- package/commands/cms/function/deploy.js +89 -0
- package/commands/cms/function/list.d.ts +6 -0
- package/commands/cms/function/list.js +60 -0
- package/commands/cms/function/logs.d.ts +10 -0
- package/commands/cms/function/logs.js +135 -0
- package/commands/cms/function/server.d.ts +10 -0
- package/commands/cms/function/server.js +69 -0
- package/commands/cms/function.d.ts +3 -0
- package/commands/cms/function.js +27 -0
- package/commands/cms/getReactModule.js +9 -14
- package/commands/cms/lighthouseScore.js +33 -36
- package/commands/cms/lint.d.ts +6 -0
- package/commands/cms/lint.js +83 -0
- package/commands/cms/list.d.ts +6 -0
- package/commands/cms/list.js +96 -0
- package/commands/cms/module/create.d.ts +11 -0
- package/commands/cms/module/create.js +84 -0
- package/commands/cms/module/marketplace-validate.d.ts +6 -0
- package/commands/cms/module/marketplace-validate.js +45 -0
- package/commands/cms/module.d.ts +3 -0
- package/commands/cms/module.js +17 -0
- package/commands/cms/mv.d.ts +7 -0
- package/commands/cms/mv.js +60 -0
- package/commands/cms/template/create.d.ts +9 -0
- package/commands/cms/template/create.js +72 -0
- package/commands/cms/template.d.ts +3 -0
- package/commands/cms/template.js +17 -0
- package/commands/{theme → cms/theme}/__tests__/marketplace-validate.test.js +2 -2
- package/commands/{theme → cms/theme}/__tests__/preview.test.js +2 -2
- package/commands/cms/theme/create.d.ts +6 -0
- package/commands/cms/theme/create.js +58 -0
- package/commands/cms/theme/generate-selectors.d.ts +6 -0
- package/commands/cms/theme/generate-selectors.js +171 -0
- package/commands/cms/theme/marketplace-validate.d.ts +6 -0
- package/commands/cms/theme/marketplace-validate.js +46 -0
- package/commands/cms/theme/preview.d.ts +12 -0
- package/commands/cms/theme/preview.js +224 -0
- package/commands/cms/theme.d.ts +3 -0
- package/commands/cms/theme.js +25 -0
- package/commands/cms/upload.d.ts +12 -0
- package/commands/cms/upload.js +212 -0
- package/commands/cms/watch.d.ts +14 -0
- package/commands/cms/watch.js +138 -0
- package/commands/cms/webpack/create.d.ts +6 -0
- package/commands/cms/webpack/create.js +58 -0
- package/commands/cms/webpack.d.ts +3 -0
- package/commands/cms/webpack.js +17 -0
- package/commands/cms.js +28 -2
- package/commands/completion.js +3 -3
- package/commands/config/set.d.ts +1 -1
- package/commands/config/set.js +64 -36
- package/commands/config.js +2 -2
- package/commands/create.js +6 -4
- package/commands/customObject/{schema/__tests__/create.test.js → __tests__/createSchema.test.js} +5 -5
- package/commands/customObject/{schema/__tests__/delete.test.js → __tests__/deleteSchema.test.js} +5 -5
- package/commands/customObject/{schema/__tests__/fetch-all.test.js → __tests__/fetch-all-schemas.test.js} +5 -5
- package/commands/customObject/{schema/__tests__/fetch.test.js → __tests__/fetchSchema.test.js} +5 -5
- package/commands/customObject/{schema/__tests__/list.test.js → __tests__/listSchemas.test.js} +5 -5
- package/commands/customObject/{schema/__tests__/update.test.js → __tests__/updateSchema.test.js} +5 -5
- package/commands/customObject/create.js +10 -12
- package/commands/customObject/createSchema.d.ts +6 -0
- package/commands/customObject/createSchema.js +56 -0
- package/commands/customObject/deleteSchema.d.ts +7 -0
- package/commands/customObject/deleteSchema.js +69 -0
- package/commands/customObject/fetchAllSchemas.d.ts +6 -0
- package/commands/customObject/fetchAllSchemas.js +57 -0
- package/commands/customObject/fetchSchema.d.ts +7 -0
- package/commands/customObject/fetchSchema.js +67 -0
- package/commands/customObject/listSchemas.d.ts +4 -0
- package/commands/customObject/listSchemas.js +35 -0
- package/commands/customObject/schema/create.d.ts +4 -6
- package/commands/customObject/schema/create.js +13 -38
- package/commands/customObject/schema/delete.d.ts +4 -7
- package/commands/customObject/schema/delete.js +15 -50
- package/commands/customObject/schema/fetch-all.d.ts +4 -6
- package/commands/customObject/schema/fetch-all.js +14 -40
- package/commands/customObject/schema/fetch.d.ts +4 -7
- package/commands/customObject/schema/fetch.js +14 -49
- package/commands/customObject/schema/list.d.ts +4 -4
- package/commands/customObject/schema/list.js +10 -19
- package/commands/customObject/schema/update.d.ts +4 -7
- package/commands/customObject/schema/update.js +15 -50
- package/commands/customObject/schema.js +5 -3
- package/commands/customObject/updateSchema.d.ts +7 -0
- package/commands/customObject/updateSchema.js +71 -0
- package/commands/customObject.js +22 -8
- package/commands/doctor.js +8 -11
- package/commands/feedback.js +7 -12
- package/commands/fetch.d.ts +4 -12
- package/commands/fetch.js +20 -47
- package/commands/filemanager/fetch.js +7 -7
- package/commands/filemanager/upload.js +15 -34
- package/commands/filemanager.js +2 -2
- package/commands/function/deploy.d.ts +4 -6
- package/commands/function/deploy.js +14 -89
- package/commands/function/list.d.ts +4 -6
- package/commands/function/list.js +14 -40
- package/commands/function/server.d.ts +4 -10
- package/commands/function/server.js +22 -31
- package/commands/function.d.ts +2 -4
- package/commands/function.js +25 -14
- package/commands/getStarted.js +2 -2
- package/commands/hubdb/clear.js +7 -15
- package/commands/hubdb/create.js +9 -15
- package/commands/hubdb/delete.js +8 -15
- package/commands/hubdb/fetch.js +6 -9
- package/commands/hubdb.d.ts +1 -1
- package/commands/hubdb.js +2 -2
- package/commands/init.js +2 -3
- package/commands/lint.d.ts +4 -6
- package/commands/lint.js +13 -65
- package/commands/list.d.ts +4 -6
- package/commands/list.js +14 -81
- package/commands/logs.d.ts +4 -10
- package/commands/logs.js +25 -94
- package/commands/module/marketplace-validate.d.ts +4 -6
- package/commands/module/marketplace-validate.js +15 -27
- package/commands/module.d.ts +2 -2
- package/commands/module.js +17 -15
- package/commands/mv.d.ts +4 -7
- package/commands/mv.js +14 -51
- package/commands/open.js +5 -5
- package/commands/project/__tests__/add.test.js +15 -13
- package/commands/project/__tests__/deploy.test.js +3 -4
- package/commands/project/__tests__/devUnifiedFlow.test.js +32 -0
- package/commands/project/__tests__/installDeps.test.js +8 -8
- package/commands/project/__tests__/list.test.js +31 -0
- package/commands/project/__tests__/logs.test.js +1 -1
- package/commands/project/__tests__/migrate.test.js +6 -5
- package/commands/project/__tests__/migrateApp.test.js +2 -5
- package/commands/project/__tests__/validate.test.js +98 -0
- package/commands/project/add.d.ts +2 -2
- package/commands/project/add.js +6 -5
- package/commands/project/cloneApp.js +14 -19
- package/commands/project/create.js +1 -2
- package/commands/project/deploy.js +3 -3
- package/commands/project/dev/deprecatedFlow.js +9 -18
- package/commands/project/dev/index.js +19 -17
- package/commands/project/dev/unifiedFlow.js +11 -4
- package/commands/project/download.js +15 -15
- package/commands/project/installDeps.d.ts +2 -2
- package/commands/project/installDeps.js +9 -8
- package/commands/project/list.d.ts +4 -0
- package/commands/project/list.js +62 -0
- package/commands/project/listBuilds.js +11 -20
- package/commands/project/logs.js +21 -24
- package/commands/project/migrate.js +5 -2
- package/commands/project/migrateApp.js +9 -15
- package/commands/project/open.js +6 -13
- package/commands/project/upload.d.ts +2 -2
- package/commands/project/upload.js +17 -26
- package/commands/project/validate.js +6 -6
- package/commands/project/watch.js +13 -22
- package/commands/project.js +4 -2
- package/commands/remove.d.ts +4 -6
- package/commands/remove.js +12 -24
- package/commands/sandbox/__tests__/create.test.js +5 -5
- package/commands/sandbox/create.js +22 -32
- package/commands/sandbox/delete.js +38 -63
- package/commands/sandbox.js +2 -2
- package/commands/secret/addSecret.js +7 -17
- package/commands/secret/deleteSecret.js +10 -20
- package/commands/secret/listSecret.js +8 -10
- package/commands/secret/updateSecret.js +9 -17
- package/commands/secret.js +2 -2
- package/commands/testAccount/__tests__/delete.test.js +2 -4
- package/commands/testAccount/create.js +2 -5
- package/commands/testAccount/delete.d.ts +4 -3
- package/commands/testAccount/delete.js +155 -14
- package/commands/theme/generate-selectors.d.ts +4 -6
- package/commands/theme/generate-selectors.js +14 -152
- package/commands/theme/marketplace-validate.d.ts +4 -6
- package/commands/theme/marketplace-validate.js +14 -25
- package/commands/theme/preview.d.ts +4 -12
- package/commands/theme/preview.js +18 -183
- package/commands/theme.d.ts +2 -2
- package/commands/theme.js +19 -13
- package/commands/upload.d.ts +4 -12
- package/commands/upload.js +19 -169
- package/commands/watch.d.ts +4 -14
- package/commands/watch.js +23 -88
- package/lang/en.d.ts +863 -542
- package/lang/en.js +912 -595
- package/lang/en.lyaml +4 -4
- package/lib/__tests__/buildAccount.test.js +4 -3
- package/lib/__tests__/commonOpts.test.js +1 -1
- package/lib/__tests__/dependencyManagement.test.js +1 -1
- package/lib/__tests__/developerTestAccounts.test.js +3 -3
- package/lib/__tests__/npm.test.js +1 -1
- package/lib/__tests__/oauth.test.js +4 -4
- package/lib/__tests__/process.test.js +10 -5
- package/lib/__tests__/sandboxSync.test.js +8 -8
- package/lib/__tests__/sandboxes.test.js +8 -8
- package/lib/__tests__/serverlessLogs.test.js +1 -1
- package/lib/__tests__/usageTracking.test.js +5 -5
- package/lib/__tests__/validation.test.js +2 -1
- package/lib/__tests__/yargsUtils.test.js +83 -9
- package/lib/app/__tests__/migrate.test.js +5 -5
- package/lib/app/__tests__/migrate_legacy.test.js +1 -1
- package/lib/app/migrate.js +1 -1
- package/lib/app/migrate_legacy.js +20 -24
- package/lib/buildAccount.d.ts +2 -2
- package/lib/buildAccount.js +32 -64
- package/lib/commonOpts.d.ts +1 -1
- package/lib/commonOpts.js +25 -22
- package/lib/configMigrate.js +88 -9
- package/lib/configOptions.js +7 -0
- package/lib/constants.d.ts +15 -1
- package/lib/constants.js +19 -1
- package/lib/dependencyManagement.js +9 -27
- package/lib/developerTestAccounts.js +9 -23
- package/lib/doctor/Diagnosis.js +11 -23
- package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
- package/lib/doctor/Doctor.js +42 -90
- package/lib/doctor/__tests__/Doctor.test.js +4 -4
- package/lib/errorHandlers/index.js +12 -20
- package/lib/errorHandlers/suppressError.js +11 -18
- package/lib/generateSelectors.js +1 -1
- package/lib/lang.js +6 -5
- package/lib/links.js +4 -4
- package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
- package/lib/middleware/__test__/configMiddleware.test.js +11 -11
- package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
- package/lib/middleware/autoUpdateMiddleware.d.ts +2 -1
- package/lib/middleware/autoUpdateMiddleware.js +12 -2
- package/lib/middleware/commandTargetingUtils.d.ts +8 -0
- package/lib/middleware/commandTargetingUtils.js +74 -0
- package/lib/middleware/configMiddleware.d.ts +1 -1
- package/lib/middleware/configMiddleware.js +21 -81
- package/lib/middleware/gitMiddleware.js +5 -1
- package/lib/middleware/notificationsMiddleware.js +5 -11
- package/lib/middleware/yargsChecksMiddleware.js +6 -9
- package/lib/npm.js +2 -2
- package/lib/oauth.js +5 -5
- package/lib/process.js +5 -4
- package/lib/projectProfiles.d.ts +1 -1
- package/lib/projectProfiles.js +2 -10
- package/lib/projects/__tests__/AppDevModeInterface.test.js +101 -135
- package/lib/projects/__tests__/DevServerManager.test.js +183 -0
- package/lib/projects/__tests__/LocalDevProcess.test.js +6 -5
- package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +76 -45
- package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.d.ts +1 -0
- package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.js +161 -0
- package/lib/projects/__tests__/deploy.test.js +9 -9
- package/lib/projects/__tests__/localDevProjectHelpers.test.js +2 -0
- package/lib/projects/__tests__/platformVersion.test.js +8 -8
- package/lib/projects/__tests__/projects.test.js +12 -12
- package/lib/projects/__tests__/structure.test.js +3 -3
- package/lib/projects/__tests__/upload.test.d.ts +1 -0
- package/lib/projects/__tests__/upload.test.js +82 -0
- package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
- package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +1 -0
- package/lib/projects/add/__tests__/{v3AddComponent.test.js → v2AddComponent.test.js} +39 -39
- package/lib/projects/add/{v3AddComponent.d.ts → v2AddComponent.d.ts} +1 -1
- package/lib/projects/add/{v3AddComponent.js → v2AddComponent.js} +5 -5
- package/lib/projects/create/__tests__/legacy.test.js +5 -5
- package/lib/projects/create/__tests__/v2.test.d.ts +1 -0
- package/lib/projects/create/__tests__/{v3.test.js → v2.test.js} +3 -3
- package/lib/projects/create/index.js +4 -4
- package/lib/projects/create/legacy.js +2 -2
- package/lib/projects/create/{v3.d.ts → v2.d.ts} +3 -3
- package/lib/projects/create/{v3.js → v2.js} +5 -5
- package/lib/projects/deploy.d.ts +1 -1
- package/lib/projects/deploy.js +2 -2
- package/lib/projects/localDev/AppDevModeInterface.d.ts +11 -3
- package/lib/projects/localDev/AppDevModeInterface.js +128 -115
- package/lib/projects/localDev/DevServerManager.d.ts +10 -29
- package/lib/projects/localDev/DevServerManager.js +20 -76
- package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +40 -0
- package/lib/projects/localDev/DevServerManager_DEPRECATED.js +120 -0
- package/lib/projects/localDev/LocalDevLogger.js +10 -11
- package/lib/projects/localDev/{LocalDevManager.js → LocalDevManager_DEPRECATED.js} +10 -11
- package/lib/projects/localDev/LocalDevProcess.js +3 -2
- package/lib/projects/localDev/LocalDevState.d.ts +3 -0
- package/lib/projects/localDev/LocalDevState.js +9 -0
- package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +4 -1
- package/lib/projects/localDev/LocalDevWebsocketServer.js +46 -16
- package/lib/projects/localDev/UIExtensionsDevModeInterface.d.ts +13 -0
- package/lib/projects/localDev/UIExtensionsDevModeInterface.js +37 -0
- package/lib/projects/localDev/helpers/account.d.ts +1 -1
- package/lib/projects/localDev/helpers/account.js +2 -2
- package/lib/projects/localDev/helpers/process.d.ts +1 -0
- package/lib/projects/localDev/helpers/process.js +15 -0
- package/lib/projects/localDev/helpers/project.d.ts +1 -0
- package/lib/projects/localDev/helpers/project.js +39 -3
- package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +3 -0
- package/lib/projects/localDev/localDevWebsocketServerUtils.js +9 -0
- package/lib/projects/platformVersion.d.ts +1 -1
- package/lib/projects/platformVersion.js +1 -1
- package/lib/projects/structure.d.ts +2 -2
- package/lib/projects/structure.js +6 -6
- package/lib/projects/upload.d.ts +2 -3
- package/lib/projects/upload.js +17 -9
- package/lib/projects/urls.d.ts +0 -1
- package/lib/projects/urls.js +0 -3
- package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
- package/lib/prompts/__tests__/projectAddPrompt.test.js +10 -10
- package/lib/prompts/accountNamePrompt.js +14 -19
- package/lib/prompts/accountsPrompt.js +2 -2
- package/lib/prompts/cmsFieldPrompt.js +2 -2
- package/lib/prompts/createApiSamplePrompt.js +5 -5
- package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
- package/lib/prompts/createFunctionPrompt.js +14 -14
- package/lib/prompts/createModulePrompt.js +9 -9
- package/lib/prompts/createTemplatePrompt.js +2 -2
- package/lib/prompts/downloadProjectPrompt.js +5 -8
- package/lib/prompts/installAppPrompt.d.ts +1 -6
- package/lib/prompts/installAppPrompt.js +1 -6
- package/lib/prompts/personalAccessKeyPrompt.js +3 -3
- package/lib/prompts/previewPrompt.js +6 -6
- package/lib/prompts/projectAddPrompt.d.ts +2 -2
- package/lib/prompts/projectAddPrompt.js +7 -1
- package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
- package/lib/prompts/projectNamePrompt.js +4 -8
- package/lib/prompts/projectsLogsPrompt.js +2 -4
- package/lib/prompts/promptUtils.js +27 -9
- package/lib/prompts/sandboxesPrompt.js +7 -7
- package/lib/prompts/secretPrompt.js +3 -3
- package/lib/prompts/selectAppPrompt.js +3 -3
- package/lib/prompts/selectHubDBTablePrompt.js +9 -13
- package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
- package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
- package/lib/prompts/uploadPrompt.js +5 -5
- package/lib/sandboxSync.js +24 -41
- package/lib/sandboxes.js +19 -47
- package/lib/schema.js +3 -3
- package/lib/serverlessLogs.js +11 -13
- package/lib/theme/__tests__/migrate.test.js +6 -6
- package/lib/theme/migrate.js +2 -2
- package/lib/ui/SpinniesManager.d.ts +2 -0
- package/lib/ui/SpinniesManager.js +7 -0
- package/lib/ui/boxen.js +1 -2
- package/lib/ui/git.js +13 -10
- package/lib/ui/index.d.ts +6 -0
- package/lib/ui/index.js +55 -38
- package/lib/ui/serverlessFunctionLogs.js +9 -7
- package/lib/ui/uiMessages.d.ts +73 -0
- package/lib/ui/uiMessages.js +76 -0
- package/lib/usageTracking.js +7 -7
- package/lib/validation.js +20 -23
- package/lib/yargsUtils.d.ts +1 -1
- package/lib/yargsUtils.js +12 -5
- package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +4 -4
- package/mcp-server/tools/index.js +4 -0
- package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
- package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
- package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
- package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
- package/mcp-server/tools/project/GetConfigValuesTool.js +2 -2
- package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
- package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +1 -1
- package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
- package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
- package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
- package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
- package/mcp-server/utils/toolUsageTracking.js +2 -2
- package/package.json +8 -7
- package/types/Cms.d.ts +6 -6
- package/types/Yargs.d.ts +1 -1
- package/commands/app/__tests__/install.test.js +0 -47
- package/commands/app/install.d.ts +0 -8
- package/commands/app/install.js +0 -122
- package/lib/middleware/__test__/utils.test.js +0 -51
- package/lib/middleware/utils.d.ts +0 -8
- package/lib/middleware/utils.js +0 -14
- package/lib/projects/localDev/DevServerManagerV2.d.ts +0 -22
- package/lib/projects/localDev/DevServerManagerV2.js +0 -81
- /package/commands/{customObject/schema → cms}/__tests__/delete.test.d.ts +0 -0
- /package/commands/{__tests__ → cms/__tests__}/fetch.test.d.ts +0 -0
- /package/commands/{__tests__ → cms/__tests__}/function.test.d.ts +0 -0
- /package/commands/{__tests__ → cms/__tests__}/lint.test.d.ts +0 -0
- /package/commands/{__tests__ → cms/__tests__}/list.test.d.ts +0 -0
- /package/commands/{__tests__ → cms/__tests__}/mv.test.d.ts +0 -0
- /package/commands/{__tests__ → cms/__tests__}/theme.test.d.ts +0 -0
- /package/commands/{__tests__ → cms/function/__tests__}/logs.test.d.ts +0 -0
- /package/commands/{theme → cms/theme}/__tests__/generate-selectors.test.d.ts +0 -0
- /package/commands/{theme → cms/theme}/__tests__/generate-selectors.test.js +0 -0
- /package/commands/{theme → cms/theme}/__tests__/marketplace-validate.test.d.ts +0 -0
- /package/commands/{theme → cms/theme}/__tests__/preview.test.d.ts +0 -0
- /package/commands/{__tests__/remove.test.d.ts → customObject/__tests__/createSchema.test.d.ts} +0 -0
- /package/commands/{app/__tests__/install.test.d.ts → customObject/__tests__/deleteSchema.test.d.ts} +0 -0
- /package/commands/customObject/{schema/__tests__/create.test.d.ts → __tests__/fetch-all-schemas.test.d.ts} +0 -0
- /package/commands/customObject/{schema/__tests__/fetch-all.test.d.ts → __tests__/fetchSchema.test.d.ts} +0 -0
- /package/commands/customObject/{schema/__tests__/fetch.test.d.ts → __tests__/listSchemas.test.d.ts} +0 -0
- /package/commands/customObject/{schema/__tests__/list.test.d.ts → __tests__/updateSchema.test.d.ts} +0 -0
- /package/commands/{customObject/schema/__tests__/update.test.d.ts → project/__tests__/list.test.d.ts} +0 -0
- /package/{lib/middleware/__test__/utils.test.d.ts → commands/project/__tests__/validate.test.d.ts} +0 -0
- /package/{commands/create → lib/cmsAssets}/api-sample.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/api-sample.js +0 -0
- /package/{commands/create → lib/cmsAssets}/app.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/app.js +0 -0
- /package/{commands/create → lib/cmsAssets}/function.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/function.js +0 -0
- /package/{commands/create → lib/cmsAssets}/index.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/index.js +0 -0
- /package/{commands/create → lib/cmsAssets}/module.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/module.js +0 -0
- /package/{commands/create → lib/cmsAssets}/react-app.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/react-app.js +0 -0
- /package/{commands/create → lib/cmsAssets}/template.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/template.js +0 -0
- /package/{commands/create → lib/cmsAssets}/vue-app.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/vue-app.js +0 -0
- /package/{commands/create → lib/cmsAssets}/webpack-serverless.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/webpack-serverless.js +0 -0
- /package/{commands/create → lib/cmsAssets}/website-theme.d.ts +0 -0
- /package/{commands/create → lib/cmsAssets}/website-theme.js +0 -0
- /package/lib/{projects/add/__tests__/v3AddComponent.test.d.ts → middleware/__test__/commandTargetingUtils.test.d.ts} +0 -0
- /package/lib/projects/{create/__tests__/v3.test.d.ts → __tests__/DevServerManager.test.d.ts} +0 -0
- /package/lib/projects/localDev/{LocalDevManager.d.ts → LocalDevManager_DEPRECATED.d.ts} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { WebSocketServer } from 'ws';
|
|
2
2
|
import { isPortManagerServerRunning, requestPorts, } from '@hubspot/local-dev-lib/portManager';
|
|
3
|
-
import {
|
|
3
|
+
import { uiLogger } from '../../ui/logger.js';
|
|
4
4
|
import { LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES, LOCAL_DEV_UI_MESSAGE_SEND_TYPES, LOCAL_DEV_SERVER_MESSAGE_TYPES, } from '../../constants.js';
|
|
5
5
|
import LocalDevWebsocketServer from '../localDev/LocalDevWebsocketServer.js';
|
|
6
6
|
import { lib } from '../../../lang/en.js';
|
|
7
7
|
vi.mock('ws');
|
|
8
8
|
vi.mock('@hubspot/local-dev-lib/portManager');
|
|
9
|
-
vi.mock('
|
|
9
|
+
vi.mock('../../ui/logger.js');
|
|
10
10
|
describe('LocalDevWebsocketServer', () => {
|
|
11
11
|
let mockLocalDevProcess;
|
|
12
12
|
let mockWebSocket;
|
|
@@ -59,39 +59,68 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
59
59
|
await server.start();
|
|
60
60
|
expect(WebSocketServer).toHaveBeenCalledWith({ port: 1234 });
|
|
61
61
|
expect(mockWebSocketServer.on).toHaveBeenCalledWith('connection', expect.any(Function));
|
|
62
|
-
expect(
|
|
62
|
+
expect(uiLogger.log).toHaveBeenCalled();
|
|
63
63
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
'
|
|
64
|
+
describe('valid origins', () => {
|
|
65
|
+
const validOrigins = [
|
|
66
|
+
'https://app.hubspot.com',
|
|
67
|
+
'https://app.hubspotqa.com',
|
|
68
|
+
'https://local.hubspot.com',
|
|
69
|
+
'https://local.hubspotqa.com',
|
|
70
|
+
'https://app-na2.hubspot.com',
|
|
71
|
+
'https://app-na2.hubspotqa.com',
|
|
72
|
+
'https://app-na3.hubspot.com',
|
|
73
|
+
'https://app-na3.hubspotqa.com',
|
|
74
|
+
'https://app-ap1.hubspot.com',
|
|
75
|
+
'https://app-ap1.hubspotqa.com',
|
|
76
|
+
'https://app-eu1.hubspot.com',
|
|
77
|
+
'https://app-eu1.hubspotqa.com',
|
|
78
|
+
];
|
|
79
|
+
validOrigins.forEach(origin => {
|
|
80
|
+
it(`should accept connection from ${origin}`, async () => {
|
|
81
|
+
isPortManagerServerRunning.mockResolvedValue(true);
|
|
82
|
+
requestPorts.mockResolvedValue({
|
|
83
|
+
'local-dev-ui-websocket-server': 1234,
|
|
84
|
+
});
|
|
85
|
+
await server.start();
|
|
86
|
+
// Get the connection callback
|
|
87
|
+
const connectionCallback = mockWebSocketServer.on.mock
|
|
88
|
+
.calls[0][1];
|
|
89
|
+
// Simulate connection from valid origin
|
|
90
|
+
connectionCallback(mockWebSocket, {
|
|
91
|
+
headers: { origin },
|
|
92
|
+
});
|
|
93
|
+
expect(mockWebSocket.on).toHaveBeenCalledWith('message', expect.any(Function));
|
|
94
|
+
expect(mockLocalDevProcess.addStateListener).toHaveBeenCalledWith('projectNodes', expect.any(Function));
|
|
95
|
+
expect(mockWebSocket.close).not.toHaveBeenCalled();
|
|
96
|
+
});
|
|
68
97
|
});
|
|
69
|
-
await server.start();
|
|
70
|
-
// Get the connection callback
|
|
71
|
-
const connectionCallback = mockWebSocketServer.on.mock.calls[0][1];
|
|
72
|
-
// Simulate connection from valid origin
|
|
73
|
-
connectionCallback(mockWebSocket, {
|
|
74
|
-
headers: { origin: 'https://app.hubspot.com' },
|
|
75
|
-
});
|
|
76
|
-
expect(mockWebSocket.on).toHaveBeenCalledWith('message', expect.any(Function));
|
|
77
|
-
expect(mockLocalDevProcess.addStateListener).toHaveBeenCalledWith('projectNodes', expect.any(Function));
|
|
78
|
-
expect(mockWebSocket.close).not.toHaveBeenCalled();
|
|
79
98
|
});
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
'
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
99
|
+
describe('invalid origins', () => {
|
|
100
|
+
const invalidOrigins = [
|
|
101
|
+
'https://malicious-site.com',
|
|
102
|
+
'https://app.malicious-site.com',
|
|
103
|
+
'https://app.hubspot.com.evil.com',
|
|
104
|
+
];
|
|
105
|
+
invalidOrigins.forEach(origin => {
|
|
106
|
+
it(`should reject connection from "${origin}"`, async () => {
|
|
107
|
+
isPortManagerServerRunning.mockResolvedValue(true);
|
|
108
|
+
requestPorts.mockResolvedValue({
|
|
109
|
+
'local-dev-ui-websocket-server': 1234,
|
|
110
|
+
});
|
|
111
|
+
await server.start();
|
|
112
|
+
// Get the connection callback
|
|
113
|
+
const connectionCallback = mockWebSocketServer.on.mock
|
|
114
|
+
.calls[0][1];
|
|
115
|
+
// Simulate connection from invalid origin
|
|
116
|
+
connectionCallback(mockWebSocket, {
|
|
117
|
+
headers: { origin },
|
|
118
|
+
});
|
|
119
|
+
expect(mockWebSocket.close).toHaveBeenCalledWith(1008, lib.LocalDevWebsocketServer.errors.originNotAllowed(origin));
|
|
120
|
+
expect(mockWebSocket.on).not.toHaveBeenCalled();
|
|
121
|
+
expect(mockLocalDevProcess.addStateListener).not.toHaveBeenCalled();
|
|
122
|
+
});
|
|
91
123
|
});
|
|
92
|
-
expect(mockWebSocket.close).toHaveBeenCalledWith(1008, lib.LocalDevWebsocketServer.errors.originNotAllowed('https://malicious-site.com'));
|
|
93
|
-
expect(mockWebSocket.on).not.toHaveBeenCalled();
|
|
94
|
-
expect(mockLocalDevProcess.addStateListener).not.toHaveBeenCalled();
|
|
95
124
|
});
|
|
96
125
|
it('should reject connection with no origin header', async () => {
|
|
97
126
|
isPortManagerServerRunning.mockResolvedValue(true);
|
|
@@ -119,7 +148,7 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
119
148
|
const connectionCallback = mockWebSocketServer.on.mock.calls[0][1];
|
|
120
149
|
// Simulate connection from valid origin
|
|
121
150
|
connectionCallback(mockWebSocket, {
|
|
122
|
-
headers: { origin: 'https://app.hubspot.com' },
|
|
151
|
+
headers: { origin: 'https://app-na3.hubspot.com' },
|
|
123
152
|
});
|
|
124
153
|
expect(mockLocalDevProcess.sendDevServerMessage).toHaveBeenCalledWith(LOCAL_DEV_SERVER_MESSAGE_TYPES.WEBSOCKET_SERVER_CONNECTED);
|
|
125
154
|
});
|
|
@@ -148,7 +177,7 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
148
177
|
const messageCallback = mockWebSocket.on.mock.calls[0][1];
|
|
149
178
|
const message = {};
|
|
150
179
|
messageCallback(JSON.stringify(message));
|
|
151
|
-
expect(
|
|
180
|
+
expect(uiLogger.error).toHaveBeenCalled();
|
|
152
181
|
});
|
|
153
182
|
it('should log error for unknown message type', () => {
|
|
154
183
|
const messageCallback = mockWebSocket.on.mock.calls[0][1];
|
|
@@ -156,13 +185,13 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
156
185
|
type: 'UNKNOWN_TYPE',
|
|
157
186
|
};
|
|
158
187
|
messageCallback(JSON.stringify(message));
|
|
159
|
-
expect(
|
|
188
|
+
expect(uiLogger.error).toHaveBeenCalled();
|
|
160
189
|
});
|
|
161
190
|
it('should log error for invalid JSON', () => {
|
|
162
191
|
const messageCallback = mockWebSocket.on.mock.calls[0][1];
|
|
163
192
|
const invalidJson = 'invalid json';
|
|
164
193
|
messageCallback(invalidJson);
|
|
165
|
-
expect(
|
|
194
|
+
expect(uiLogger.error).toHaveBeenCalled();
|
|
166
195
|
});
|
|
167
196
|
});
|
|
168
197
|
describe('shutdown()', () => {
|
|
@@ -213,7 +242,7 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
213
242
|
headers: { origin: 'https://app.hubspot.com' },
|
|
214
243
|
});
|
|
215
244
|
connectionCallback(mockWebSocket2, {
|
|
216
|
-
headers: { origin: 'https://app.hubspotqa.com' },
|
|
245
|
+
headers: { origin: 'https://app-na2.hubspotqa.com' },
|
|
217
246
|
});
|
|
218
247
|
connectionCallback(mockWebSocket3, {
|
|
219
248
|
headers: { origin: 'https://local.hubspot.com' },
|
|
@@ -223,7 +252,7 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
223
252
|
expect(mockWebSocket2.on).toHaveBeenCalledWith('message', expect.any(Function));
|
|
224
253
|
expect(mockWebSocket3.on).toHaveBeenCalledWith('message', expect.any(Function));
|
|
225
254
|
// Each connection should trigger state listener setup
|
|
226
|
-
expect(mockLocalDevProcess.addStateListener).toHaveBeenCalledTimes(
|
|
255
|
+
expect(mockLocalDevProcess.addStateListener).toHaveBeenCalledTimes(12); // 4 listeners per connection * 3 connections
|
|
227
256
|
// Each connection should trigger dev server message
|
|
228
257
|
expect(mockLocalDevProcess.sendDevServerMessage).toHaveBeenCalledTimes(3);
|
|
229
258
|
expect(mockLocalDevProcess.sendDevServerMessage).toHaveBeenCalledWith(LOCAL_DEV_SERVER_MESSAGE_TYPES.WEBSOCKET_SERVER_CONNECTED);
|
|
@@ -238,7 +267,7 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
238
267
|
headers: { origin: 'https://app.hubspot.com' },
|
|
239
268
|
});
|
|
240
269
|
connectionCallback(mockWebSocket2, {
|
|
241
|
-
headers: { origin: 'https://app.hubspotqa.com' },
|
|
270
|
+
headers: { origin: 'https://app-eu1.hubspotqa.com' },
|
|
242
271
|
});
|
|
243
272
|
// Each websocket should receive project data
|
|
244
273
|
expect(mockWebSocket1.send).toHaveBeenCalledWith(JSON.stringify({
|
|
@@ -270,7 +299,7 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
270
299
|
headers: { origin: 'https://app.hubspot.com' },
|
|
271
300
|
});
|
|
272
301
|
connectionCallback(mockWebSocket2, {
|
|
273
|
-
headers: { origin: 'https://app.hubspotqa.com' },
|
|
302
|
+
headers: { origin: 'https://app-ap1.hubspotqa.com' },
|
|
274
303
|
});
|
|
275
304
|
// Get all the close callbacks for both connections (there should be 2 per connection)
|
|
276
305
|
const closeCallbacks1 = mockWebSocket1.on.mock.calls
|
|
@@ -279,16 +308,16 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
279
308
|
const closeCallbacks2 = mockWebSocket2.on.mock.calls
|
|
280
309
|
.filter(call => call[0] === 'close')
|
|
281
310
|
.map(call => call[1]);
|
|
282
|
-
expect(closeCallbacks1).toHaveLength(
|
|
283
|
-
expect(closeCallbacks2).toHaveLength(
|
|
311
|
+
expect(closeCallbacks1).toHaveLength(4); // projectNodes, appData, devServersStarted, and uploadWarnings listeners
|
|
312
|
+
expect(closeCallbacks2).toHaveLength(4); // projectNodes, appData, devServersStarted, and uploadWarnings listeners
|
|
284
313
|
// Simulate first connection closing (call all close callbacks)
|
|
285
314
|
closeCallbacks1.forEach(callback => callback());
|
|
286
|
-
// Should have removed listeners for first connection (
|
|
287
|
-
expect(mockLocalDevProcess.removeStateListener).toHaveBeenCalledTimes(
|
|
315
|
+
// Should have removed listeners for first connection (4 listeners: projectNodes, appData, devServersStarted, and uploadWarnings)
|
|
316
|
+
expect(mockLocalDevProcess.removeStateListener).toHaveBeenCalledTimes(4);
|
|
288
317
|
// Simulate second connection closing
|
|
289
318
|
closeCallbacks2.forEach(callback => callback());
|
|
290
319
|
// Should have removed listeners for second connection as well
|
|
291
|
-
expect(mockLocalDevProcess.removeStateListener).toHaveBeenCalledTimes(
|
|
320
|
+
expect(mockLocalDevProcess.removeStateListener).toHaveBeenCalledTimes(8);
|
|
292
321
|
});
|
|
293
322
|
it('should broadcast state changes to all connected clients', () => {
|
|
294
323
|
// Establish connections
|
|
@@ -296,7 +325,7 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
296
325
|
headers: { origin: 'https://app.hubspot.com' },
|
|
297
326
|
});
|
|
298
327
|
connectionCallback(mockWebSocket2, {
|
|
299
|
-
headers: { origin: 'https://
|
|
328
|
+
headers: { origin: 'https://local.hubspotqa.com' },
|
|
300
329
|
});
|
|
301
330
|
// Get the projectNodes listeners that were registered
|
|
302
331
|
const projectNodesListeners = mockLocalDevProcess.addStateListener.mock.calls
|
|
@@ -312,6 +341,8 @@ describe('LocalDevWebsocketServer', () => {
|
|
|
312
341
|
componentRoot: '/test/path',
|
|
313
342
|
componentConfigPath: '/test/path/config.json',
|
|
314
343
|
configUpdatedSinceLastUpload: false,
|
|
344
|
+
removed: false,
|
|
345
|
+
parsingErrors: [],
|
|
315
346
|
},
|
|
316
347
|
componentDeps: {},
|
|
317
348
|
metaFilePath: '/test/path',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import UIExtensionsDevModeInterface from '../localDev/UIExtensionsDevModeInterface.js';
|
|
3
|
+
import LocalDevState from '../localDev/LocalDevState.js';
|
|
4
|
+
import { DevModeUnifiedInterface } from '@hubspot/ui-extensions-dev-server';
|
|
5
|
+
import { requestPorts } from '@hubspot/local-dev-lib/portManager';
|
|
6
|
+
import { logger } from '@hubspot/local-dev-lib/logger';
|
|
7
|
+
import { getHubSpotApiOrigin, getHubSpotWebsiteOrigin, } from '@hubspot/local-dev-lib/urls';
|
|
8
|
+
import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
|
|
9
|
+
vi.mock('@hubspot/ui-extensions-dev-server', () => ({
|
|
10
|
+
DevModeUnifiedInterface: {
|
|
11
|
+
setup: vi.fn().mockResolvedValue(undefined),
|
|
12
|
+
start: vi.fn().mockResolvedValue(undefined),
|
|
13
|
+
fileChange: vi.fn().mockResolvedValue(undefined),
|
|
14
|
+
cleanup: vi.fn().mockResolvedValue(undefined),
|
|
15
|
+
},
|
|
16
|
+
}));
|
|
17
|
+
vi.mock('@hubspot/local-dev-lib/portManager', () => ({
|
|
18
|
+
requestPorts: vi.fn().mockResolvedValue({ 'test-port': 8080 }),
|
|
19
|
+
}));
|
|
20
|
+
vi.mock('@hubspot/local-dev-lib/urls', () => ({
|
|
21
|
+
getHubSpotApiOrigin: vi.fn().mockReturnValue('https://api.hubspot.com'),
|
|
22
|
+
getHubSpotWebsiteOrigin: vi.fn().mockReturnValue('https://app.hubspot.com'),
|
|
23
|
+
}));
|
|
24
|
+
describe('UIExtensionsDevModeInterface', () => {
|
|
25
|
+
let uiExtensionsInterface;
|
|
26
|
+
let mockLocalDevState;
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
vi.clearAllMocks();
|
|
29
|
+
vi.mocked(DevModeUnifiedInterface.setup).mockResolvedValue(undefined);
|
|
30
|
+
vi.mocked(DevModeUnifiedInterface.start).mockResolvedValue(undefined);
|
|
31
|
+
vi.mocked(DevModeUnifiedInterface.fileChange).mockResolvedValue(undefined);
|
|
32
|
+
vi.mocked(DevModeUnifiedInterface.cleanup).mockResolvedValue(undefined);
|
|
33
|
+
mockLocalDevState = new LocalDevState({
|
|
34
|
+
targetProjectAccountId: 123,
|
|
35
|
+
targetTestingAccountId: 456,
|
|
36
|
+
projectConfig: {
|
|
37
|
+
name: 'test-ui-extensions-project',
|
|
38
|
+
srcDir: 'src',
|
|
39
|
+
platformVersion: '1.0.0',
|
|
40
|
+
},
|
|
41
|
+
projectDir: '/test/ui-extensions-project',
|
|
42
|
+
projectData: {
|
|
43
|
+
name: 'test-ui-extensions-project',
|
|
44
|
+
id: 789,
|
|
45
|
+
createdAt: Date.now(),
|
|
46
|
+
deletedAt: 0,
|
|
47
|
+
isLocked: false,
|
|
48
|
+
portalId: 123,
|
|
49
|
+
updatedAt: Date.now(),
|
|
50
|
+
},
|
|
51
|
+
debug: false,
|
|
52
|
+
initialProjectNodes: {
|
|
53
|
+
'test-component': {
|
|
54
|
+
uid: 'test-component-uid',
|
|
55
|
+
componentType: 'UI_EXTENSION',
|
|
56
|
+
config: {
|
|
57
|
+
name: 'Test UI Extension',
|
|
58
|
+
type: 'card',
|
|
59
|
+
},
|
|
60
|
+
localDev: {
|
|
61
|
+
componentRoot: '/test/path',
|
|
62
|
+
componentConfigPath: '/test/path/config.json',
|
|
63
|
+
configUpdatedSinceLastUpload: false,
|
|
64
|
+
removed: false,
|
|
65
|
+
parsingErrors: [],
|
|
66
|
+
},
|
|
67
|
+
componentDeps: {},
|
|
68
|
+
metaFilePath: '/test/path',
|
|
69
|
+
files: [],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
initialProjectProfileData: {
|
|
73
|
+
testVariable: 'testValue',
|
|
74
|
+
},
|
|
75
|
+
profile: 'test',
|
|
76
|
+
env: ENVIRONMENTS.QA,
|
|
77
|
+
});
|
|
78
|
+
uiExtensionsInterface = new UIExtensionsDevModeInterface({
|
|
79
|
+
localDevState: mockLocalDevState,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('constructor', () => {
|
|
83
|
+
it('should store the localDevState reference', () => {
|
|
84
|
+
expect(uiExtensionsInterface.localDevState).toBe(mockLocalDevState);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('setup', () => {
|
|
88
|
+
it('should call DevModeUnifiedInterface.setup with correct parameters', async () => {
|
|
89
|
+
await uiExtensionsInterface.setup();
|
|
90
|
+
expect(DevModeUnifiedInterface.setup).toHaveBeenCalledWith({
|
|
91
|
+
components: mockLocalDevState.projectNodes,
|
|
92
|
+
profileData: mockLocalDevState.projectProfileData,
|
|
93
|
+
logger,
|
|
94
|
+
urls: {
|
|
95
|
+
api: 'https://api.hubspot.com',
|
|
96
|
+
web: 'https://app.hubspot.com',
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
it('should use correct URLs based on environment', async () => {
|
|
101
|
+
await uiExtensionsInterface.setup();
|
|
102
|
+
expect(getHubSpotApiOrigin).toHaveBeenCalledWith(mockLocalDevState.env);
|
|
103
|
+
expect(getHubSpotWebsiteOrigin).toHaveBeenCalledWith(mockLocalDevState.env);
|
|
104
|
+
});
|
|
105
|
+
it('should pass project nodes and profile data from state', async () => {
|
|
106
|
+
await uiExtensionsInterface.setup();
|
|
107
|
+
const setupCall = vi.mocked(DevModeUnifiedInterface.setup).mock
|
|
108
|
+
.calls[0][0];
|
|
109
|
+
expect(setupCall.components).toStrictEqual(mockLocalDevState.projectNodes);
|
|
110
|
+
expect(setupCall.profileData).toStrictEqual(mockLocalDevState.projectProfileData);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('start', () => {
|
|
114
|
+
it('should call DevModeUnifiedInterface.start with correct parameters', async () => {
|
|
115
|
+
await uiExtensionsInterface.start();
|
|
116
|
+
expect(DevModeUnifiedInterface.start).toHaveBeenCalledWith({
|
|
117
|
+
accountId: mockLocalDevState.targetTestingAccountId,
|
|
118
|
+
projectConfig: mockLocalDevState.projectConfig,
|
|
119
|
+
requestPorts,
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
it('should use targetTestingAccountId from state', async () => {
|
|
123
|
+
await uiExtensionsInterface.start();
|
|
124
|
+
const startCall = vi.mocked(DevModeUnifiedInterface.start).mock
|
|
125
|
+
.calls[0][0];
|
|
126
|
+
expect(startCall.accountId).toBe(456); // targetTestingAccountId
|
|
127
|
+
});
|
|
128
|
+
it('should pass project config from state', async () => {
|
|
129
|
+
await uiExtensionsInterface.start();
|
|
130
|
+
const startCall = vi.mocked(DevModeUnifiedInterface.start).mock
|
|
131
|
+
.calls[0][0];
|
|
132
|
+
expect(startCall.projectConfig).toStrictEqual(mockLocalDevState.projectConfig);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
describe('fileChange', () => {
|
|
136
|
+
it('should call DevModeUnifiedInterface.fileChange with correct parameters', async () => {
|
|
137
|
+
const filePath = 'src/components/TestCard.tsx';
|
|
138
|
+
const event = 'change';
|
|
139
|
+
await uiExtensionsInterface.fileChange(filePath, event);
|
|
140
|
+
expect(DevModeUnifiedInterface.fileChange).toHaveBeenCalledWith(filePath, event);
|
|
141
|
+
});
|
|
142
|
+
it('should handle different file events', async () => {
|
|
143
|
+
const testCases = [
|
|
144
|
+
{ filePath: 'src/components/Card.tsx', event: 'add' },
|
|
145
|
+
{ filePath: 'src/styles/main.css', event: 'change' },
|
|
146
|
+
{ filePath: 'src/config.json', event: 'unlink' },
|
|
147
|
+
];
|
|
148
|
+
for (const testCase of testCases) {
|
|
149
|
+
await uiExtensionsInterface.fileChange(testCase.filePath, testCase.event);
|
|
150
|
+
expect(DevModeUnifiedInterface.fileChange).toHaveBeenCalledWith(testCase.filePath, testCase.event);
|
|
151
|
+
}
|
|
152
|
+
expect(DevModeUnifiedInterface.fileChange).toHaveBeenCalledTimes(3);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe('cleanup', () => {
|
|
156
|
+
it('should call DevModeUnifiedInterface.cleanup', async () => {
|
|
157
|
+
await uiExtensionsInterface.cleanup();
|
|
158
|
+
expect(DevModeUnifiedInterface.cleanup).toHaveBeenCalledWith();
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
});
|
|
@@ -99,7 +99,7 @@ describe('lib/projects/deploy', () => {
|
|
|
99
99
|
const targetAccountId = 12345;
|
|
100
100
|
const projectName = 'test-project';
|
|
101
101
|
const buildId = 5;
|
|
102
|
-
const
|
|
102
|
+
const useV2Api = true;
|
|
103
103
|
const force = false;
|
|
104
104
|
it('successfully deploys and returns deploy result', async () => {
|
|
105
105
|
const mockDeployResponseData = {
|
|
@@ -126,8 +126,8 @@ describe('lib/projects/deploy', () => {
|
|
|
126
126
|
data: mockDeployResponseData,
|
|
127
127
|
});
|
|
128
128
|
mockPollDeployStatus.mockResolvedValue(mockDeployResult);
|
|
129
|
-
const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId,
|
|
130
|
-
expect(mockDeployProject).toHaveBeenCalledWith(targetAccountId, projectName, buildId,
|
|
129
|
+
const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
|
|
130
|
+
expect(mockDeployProject).toHaveBeenCalledWith(targetAccountId, projectName, buildId, useV2Api, force);
|
|
131
131
|
expect(deploy).toEqual(mockDeployResult);
|
|
132
132
|
});
|
|
133
133
|
it('handles blocked deploy with warnings', async () => {
|
|
@@ -150,7 +150,7 @@ describe('lib/projects/deploy', () => {
|
|
|
150
150
|
mockDeployProject.mockResolvedValue({
|
|
151
151
|
data: mockBlockedResponse,
|
|
152
152
|
});
|
|
153
|
-
await handleProjectDeploy(targetAccountId, projectName, buildId,
|
|
153
|
+
await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
|
|
154
154
|
expect(mockUiLogger.warn).toHaveBeenCalledWith(commands.project.deploy.errors.deployWarningsHeader);
|
|
155
155
|
});
|
|
156
156
|
it('handles blocked deploy with errors (cannot be forced)', async () => {
|
|
@@ -173,7 +173,7 @@ describe('lib/projects/deploy', () => {
|
|
|
173
173
|
mockDeployProject.mockResolvedValue({
|
|
174
174
|
data: mockBlockedResponse,
|
|
175
175
|
});
|
|
176
|
-
await handleProjectDeploy(targetAccountId, projectName, buildId,
|
|
176
|
+
await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
|
|
177
177
|
expect(mockUiLogger.error).toHaveBeenCalledWith(commands.project.deploy.errors.deployBlockedHeader);
|
|
178
178
|
expect(mockUiLogger.log).toHaveBeenCalledWith(commands.project.deploy.errors.deployIssueComponentWarning('component-1', 'module', 'This is an error'));
|
|
179
179
|
});
|
|
@@ -192,19 +192,19 @@ describe('lib/projects/deploy', () => {
|
|
|
192
192
|
mockDeployProject.mockResolvedValue({
|
|
193
193
|
data: mockBlockedResponse,
|
|
194
194
|
});
|
|
195
|
-
await handleProjectDeploy(targetAccountId, projectName, buildId,
|
|
195
|
+
await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
|
|
196
196
|
expect(mockUiLogger.warn).toHaveBeenCalledWith(commands.project.deploy.errors.deployWarningsHeader);
|
|
197
197
|
expect(mockUiLogger.log).toHaveBeenCalledWith(commands.project.deploy.errors.deployIssueComponentGeneric('component-1', 'module'));
|
|
198
198
|
});
|
|
199
199
|
it('handles general deploy failure', async () => {
|
|
200
200
|
mockDeployProject.mockResolvedValue({ data: null });
|
|
201
|
-
const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId,
|
|
201
|
+
const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
|
|
202
202
|
expect(mockUiLogger.error).toHaveBeenCalledWith(commands.project.deploy.errors.deploy);
|
|
203
203
|
expect(deploy).toBeUndefined();
|
|
204
204
|
});
|
|
205
205
|
it('handles undefined deploy response', async () => {
|
|
206
206
|
mockDeployProject.mockResolvedValue({ data: undefined });
|
|
207
|
-
const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId,
|
|
207
|
+
const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
|
|
208
208
|
expect(mockUiLogger.error).toHaveBeenCalledWith(commands.project.deploy.errors.deploy);
|
|
209
209
|
expect(deploy).toBeUndefined();
|
|
210
210
|
});
|
|
@@ -221,7 +221,7 @@ describe('lib/projects/deploy', () => {
|
|
|
221
221
|
});
|
|
222
222
|
mockPollDeployStatus.mockResolvedValue({});
|
|
223
223
|
await handleProjectDeploy(targetAccountId, projectName, buildId, false, true);
|
|
224
|
-
expect(mockDeployProject).toHaveBeenCalledWith(targetAccountId, projectName, buildId, false, //
|
|
224
|
+
expect(mockDeployProject).toHaveBeenCalledWith(targetAccountId, projectName, buildId, false, // useV2Api
|
|
225
225
|
true // force
|
|
226
226
|
);
|
|
227
227
|
});
|
|
@@ -30,6 +30,8 @@ describe('isDeployedProjectUpToDateWithLocal', () => {
|
|
|
30
30
|
componentRoot: '/local/path',
|
|
31
31
|
componentConfigPath: '/local/path/config.json',
|
|
32
32
|
configUpdatedSinceLastUpload: false,
|
|
33
|
+
removed: false,
|
|
34
|
+
parsingErrors: [],
|
|
33
35
|
},
|
|
34
36
|
componentDeps: {},
|
|
35
37
|
metaFilePath: '/local/path',
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isV2Project } from '../platformVersion.js';
|
|
2
2
|
describe('platformVersion', () => {
|
|
3
|
-
describe('
|
|
3
|
+
describe('isV2Project', () => {
|
|
4
4
|
it('returns true if platform version is UNSTABLE', () => {
|
|
5
|
-
expect(
|
|
5
|
+
expect(isV2Project('UNSTABLE')).toBe(true);
|
|
6
6
|
});
|
|
7
7
|
it('returns true if platform version is equal to the minimum', () => {
|
|
8
|
-
expect(
|
|
8
|
+
expect(isV2Project('2025.2')).toBe(true);
|
|
9
9
|
});
|
|
10
10
|
it('returns true if platform version is greater than the minimum', () => {
|
|
11
|
-
expect(
|
|
11
|
+
expect(isV2Project('2026.2')).toBe(true);
|
|
12
12
|
});
|
|
13
13
|
it('returns false if platform version is less than the minimum', () => {
|
|
14
|
-
expect(
|
|
14
|
+
expect(isV2Project('2025.0')).toBe(false);
|
|
15
15
|
});
|
|
16
16
|
it('returns false if platform version is invalid', () => {
|
|
17
|
-
expect(
|
|
17
|
+
expect(isV2Project(null)).toBe(false);
|
|
18
18
|
});
|
|
19
19
|
it('returns false for an invalid platform version', () => {
|
|
20
|
-
expect(
|
|
20
|
+
expect(isV2Project('notplaformversion')).toBe(false);
|
|
21
21
|
});
|
|
22
22
|
});
|
|
23
23
|
});
|
|
@@ -3,8 +3,8 @@ import os from 'os';
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { EXIT_CODES } from '../../enums/exitCodes.js';
|
|
5
5
|
import { validateProjectConfig } from '../../projects/config.js';
|
|
6
|
-
import {
|
|
7
|
-
vi.mock('
|
|
6
|
+
import { uiLogger } from '../../ui/logger.js';
|
|
7
|
+
vi.mock('../../ui/logger.js');
|
|
8
8
|
describe('lib/projects', () => {
|
|
9
9
|
describe('validateProjectConfig()', () => {
|
|
10
10
|
let projectDir;
|
|
@@ -26,58 +26,58 @@ describe('lib/projects', () => {
|
|
|
26
26
|
// @ts-ignore Testing invalid input
|
|
27
27
|
validateProjectConfig(null, projectDir);
|
|
28
28
|
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
29
|
-
expect(
|
|
29
|
+
expect(uiLogger.error).toHaveBeenCalledWith(expect.stringMatching(/.*Unable to locate a project configuration file. Try running again from a project directory, or run*/));
|
|
30
30
|
});
|
|
31
31
|
it('rejects configuration with missing name', () => {
|
|
32
32
|
// @ts-ignore Testing invalid input
|
|
33
33
|
validateProjectConfig({ srcDir: '.' }, projectDir);
|
|
34
34
|
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
35
|
-
expect(
|
|
35
|
+
expect(uiLogger.error).toHaveBeenCalledWith(expect.stringMatching(/.*missing required fields*/));
|
|
36
36
|
});
|
|
37
37
|
it('rejects configuration with missing srcDir', () => {
|
|
38
38
|
// @ts-ignore Testing invalid input
|
|
39
39
|
validateProjectConfig({ name: 'hello' }, projectDir);
|
|
40
40
|
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
41
|
-
expect(
|
|
41
|
+
expect(uiLogger.error).toHaveBeenCalledWith(expect.stringMatching(/.*missing required fields.*/));
|
|
42
42
|
});
|
|
43
43
|
describe('rejects configuration with srcDir outside project directory', () => {
|
|
44
44
|
it('for parent directory', () => {
|
|
45
45
|
validateProjectConfig({ name: 'hello', srcDir: '..', platformVersion: '' }, projectDir);
|
|
46
46
|
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
47
|
-
expect(
|
|
47
|
+
expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('srcDir: ".."'));
|
|
48
48
|
});
|
|
49
49
|
it('for root directory', () => {
|
|
50
50
|
validateProjectConfig({ name: 'hello', srcDir: '/', platformVersion: '' }, projectDir);
|
|
51
51
|
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
52
|
-
expect(
|
|
52
|
+
expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('srcDir: "/"'));
|
|
53
53
|
});
|
|
54
54
|
it('for complicated directory', () => {
|
|
55
55
|
const srcDir = './src/././../src/../../src';
|
|
56
56
|
validateProjectConfig({ name: 'hello', srcDir, platformVersion: '' }, projectDir);
|
|
57
57
|
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
58
|
-
expect(
|
|
58
|
+
expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining(`srcDir: "${srcDir}"`));
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
61
|
it('rejects configuration with srcDir that does not exist', () => {
|
|
62
62
|
validateProjectConfig({ name: 'hello', srcDir: 'foo', platformVersion: '' }, projectDir);
|
|
63
63
|
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
64
|
-
expect(
|
|
64
|
+
expect(uiLogger.error).toHaveBeenCalledWith(expect.stringMatching(/.*could not be found in.*/));
|
|
65
65
|
});
|
|
66
66
|
describe('accepts configuration with valid srcDir', () => {
|
|
67
67
|
it('for current directory', () => {
|
|
68
68
|
validateProjectConfig({ name: 'hello', srcDir: '.', platformVersion: '' }, projectDir);
|
|
69
69
|
expect(exitMock).not.toHaveBeenCalled();
|
|
70
|
-
expect(
|
|
70
|
+
expect(uiLogger.error).not.toHaveBeenCalled();
|
|
71
71
|
});
|
|
72
72
|
it('for relative directory', () => {
|
|
73
73
|
validateProjectConfig({ name: 'hello', srcDir: './src', platformVersion: '' }, projectDir);
|
|
74
74
|
expect(exitMock).not.toHaveBeenCalled();
|
|
75
|
-
expect(
|
|
75
|
+
expect(uiLogger.error).not.toHaveBeenCalled();
|
|
76
76
|
});
|
|
77
77
|
it('for implied relative directory', () => {
|
|
78
78
|
validateProjectConfig({ name: 'hello', srcDir: 'src', platformVersion: '' }, projectDir);
|
|
79
79
|
expect(exitMock).not.toHaveBeenCalled();
|
|
80
|
-
expect(
|
|
80
|
+
expect(uiLogger.error).not.toHaveBeenCalled();
|
|
81
81
|
});
|
|
82
82
|
});
|
|
83
83
|
});
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import * as HSfs from '@hubspot/local-dev-lib/fs';
|
|
3
|
-
import {
|
|
3
|
+
import { uiLogger } from '../../ui/logger.js';
|
|
4
4
|
import { getComponentTypeFromConfigFile, loadConfigFile, getAppCardConfigs, getIsLegacyApp, componentIsApp, findProjectComponents, getProjectComponentTypes, getComponentUid, componentIsPublicApp, } from '../structure.js';
|
|
5
5
|
import { ComponentTypes } from '../../../types/Projects.js';
|
|
6
6
|
vi.mock('fs');
|
|
7
7
|
vi.mock('@hubspot/local-dev-lib/fs');
|
|
8
|
-
vi.mock('
|
|
8
|
+
vi.mock('../../ui/logger.js');
|
|
9
9
|
const mockedReadFileSync = fs.readFileSync;
|
|
10
10
|
const mockedWalk = HSfs.walk;
|
|
11
11
|
const getMockPrivateAppConfig = (cards = []) => ({
|
|
@@ -46,7 +46,7 @@ describe('lib/projects/structure', () => {
|
|
|
46
46
|
throw new Error('File not found');
|
|
47
47
|
});
|
|
48
48
|
expect(loadConfigFile('nonexistent/path/app.json')).toBeNull();
|
|
49
|
-
expect(
|
|
49
|
+
expect(uiLogger.debug).toHaveBeenCalled();
|
|
50
50
|
});
|
|
51
51
|
});
|
|
52
52
|
describe('getAppCardConfigs()', () => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|