@hubspot/cli 7.4.8 → 7.4.9-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.
Files changed (140) hide show
  1. package/commands/account/createOverride.js +9 -0
  2. package/commands/account/remove.js +6 -1
  3. package/commands/account/removeOverride.js +9 -0
  4. package/commands/cms/convertFields.d.ts +7 -1
  5. package/commands/cms/convertFields.js +57 -41
  6. package/commands/cms/getReactModule.d.ts +7 -1
  7. package/commands/cms/getReactModule.js +52 -34
  8. package/commands/cms/lighthouseScore.d.ts +8 -1
  9. package/commands/cms/lighthouseScore.js +129 -100
  10. package/commands/cms.d.ts +3 -1
  11. package/commands/cms.js +24 -15
  12. package/commands/completion.d.ts +3 -1
  13. package/commands/completion.js +25 -12
  14. package/commands/create/api-sample.d.ts +3 -1
  15. package/commands/create/api-sample.js +34 -38
  16. package/commands/create/app.d.ts +3 -1
  17. package/commands/create/app.js +9 -7
  18. package/commands/create/function.d.ts +3 -1
  19. package/commands/create/function.js +11 -10
  20. package/commands/create/index.d.ts +5 -1
  21. package/commands/create/index.js +23 -11
  22. package/commands/create/module.d.ts +3 -1
  23. package/commands/create/module.js +14 -13
  24. package/commands/create/react-app.d.ts +3 -1
  25. package/commands/create/react-app.js +10 -7
  26. package/commands/create/template.d.ts +3 -1
  27. package/commands/create/template.js +14 -14
  28. package/commands/create/vue-app.d.ts +3 -1
  29. package/commands/create/vue-app.js +10 -7
  30. package/commands/create/webpack-serverless.d.ts +3 -1
  31. package/commands/create/webpack-serverless.js +10 -7
  32. package/commands/create/website-theme.d.ts +3 -1
  33. package/commands/create/website-theme.js +10 -9
  34. package/commands/create.d.ts +4 -24
  35. package/commands/create.js +55 -73
  36. package/commands/customObject/create.d.ts +4 -9
  37. package/commands/customObject/create.js +17 -10
  38. package/commands/customObject/schema/create.d.ts +4 -9
  39. package/commands/customObject/schema/create.js +18 -11
  40. package/commands/customObject/schema/delete.d.ts +4 -9
  41. package/commands/customObject/schema/delete.js +17 -10
  42. package/commands/customObject/schema/fetch-all.d.ts +4 -9
  43. package/commands/customObject/schema/fetch-all.js +17 -10
  44. package/commands/customObject/schema/fetch.d.ts +4 -9
  45. package/commands/customObject/schema/fetch.js +17 -10
  46. package/commands/customObject/schema/list.d.ts +4 -8
  47. package/commands/customObject/schema/list.js +17 -10
  48. package/commands/customObject/schema/update.d.ts +4 -9
  49. package/commands/customObject/schema/update.js +18 -11
  50. package/commands/customObject/schema.d.ts +3 -5
  51. package/commands/customObject/schema.js +27 -54
  52. package/commands/customObject.d.ts +3 -4
  53. package/commands/customObject.js +20 -45
  54. package/commands/feedback.d.ts +7 -1
  55. package/commands/feedback.js +36 -20
  56. package/commands/fetch.d.ts +12 -1
  57. package/commands/fetch.js +49 -33
  58. package/commands/function/deploy.d.ts +6 -1
  59. package/commands/function/deploy.js +70 -50
  60. package/commands/function/list.d.ts +6 -1
  61. package/commands/function/list.js +44 -32
  62. package/commands/function/server.d.ts +10 -1
  63. package/commands/function/server.js +49 -38
  64. package/commands/function.d.ts +5 -1
  65. package/commands/function.js +24 -10
  66. package/commands/hubdb/clear.d.ts +4 -9
  67. package/commands/hubdb/clear.js +17 -10
  68. package/commands/hubdb/create.d.ts +4 -9
  69. package/commands/hubdb/create.js +17 -10
  70. package/commands/hubdb/delete.d.ts +4 -9
  71. package/commands/hubdb/delete.js +17 -10
  72. package/commands/hubdb/fetch.d.ts +4 -9
  73. package/commands/hubdb/fetch.js +17 -10
  74. package/commands/hubdb.d.ts +3 -2
  75. package/commands/hubdb.js +23 -45
  76. package/commands/lint.d.ts +6 -4
  77. package/commands/lint.js +44 -43
  78. package/commands/logs.d.ts +10 -1
  79. package/commands/logs.js +53 -44
  80. package/commands/module/marketplace-validate.d.ts +6 -1
  81. package/commands/module/marketplace-validate.js +39 -27
  82. package/commands/module.d.ts +3 -1
  83. package/commands/module.js +22 -10
  84. package/commands/project/dev/unifiedFlow.js +28 -5
  85. package/commands/sandbox/create.d.ts +4 -9
  86. package/commands/sandbox/create.js +18 -11
  87. package/commands/sandbox/delete.d.ts +4 -9
  88. package/commands/sandbox/delete.js +18 -11
  89. package/commands/sandbox.d.ts +3 -4
  90. package/commands/sandbox.js +20 -43
  91. package/commands/secret/addSecret.d.ts +4 -9
  92. package/commands/secret/addSecret.js +17 -10
  93. package/commands/secret/deleteSecret.d.ts +4 -9
  94. package/commands/secret/deleteSecret.js +17 -10
  95. package/commands/secret/listSecret.d.ts +4 -9
  96. package/commands/secret/listSecret.js +17 -10
  97. package/commands/secret/updateSecret.d.ts +4 -9
  98. package/commands/secret/updateSecret.js +17 -10
  99. package/commands/secret.d.ts +3 -4
  100. package/commands/secret.js +25 -48
  101. package/commands/upload.d.ts +12 -1
  102. package/commands/upload.js +118 -97
  103. package/commands/watch.d.ts +14 -1
  104. package/commands/watch.js +76 -65
  105. package/lang/en.d.ts +565 -543
  106. package/lang/en.js +360 -338
  107. package/lang/en.lyaml +3 -0
  108. package/lib/constants.d.ts +5 -0
  109. package/lib/constants.js +6 -1
  110. package/lib/errorHandlers/suppressError.js +12 -19
  111. package/lib/filesystem.d.ts +1 -1
  112. package/lib/interpolation.d.ts +2 -3
  113. package/lib/lang.d.ts +2 -3
  114. package/lib/projects/buildAndDeploy.js +17 -2
  115. package/lib/projects/localDev/AppDevModeInterface.d.ts +25 -0
  116. package/lib/projects/localDev/AppDevModeInterface.js +117 -0
  117. package/lib/projects/localDev/DevServerManagerV2.d.ts +11 -22
  118. package/lib/projects/localDev/DevServerManagerV2.js +19 -15
  119. package/lib/projects/localDev/LocalDevLogger.d.ts +30 -0
  120. package/lib/projects/localDev/LocalDevLogger.js +158 -0
  121. package/lib/projects/localDev/LocalDevManager.js +2 -3
  122. package/lib/projects/localDev/LocalDevProcess.d.ts +41 -0
  123. package/lib/projects/localDev/LocalDevProcess.js +178 -0
  124. package/lib/projects/localDev/LocalDevWatcher.d.ts +10 -0
  125. package/lib/projects/localDev/LocalDevWatcher.js +55 -0
  126. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +15 -0
  127. package/lib/projects/localDev/LocalDevWebsocketServer.js +80 -0
  128. package/lib/prompts/createApiSamplePrompt.d.ts +2 -10
  129. package/lib/prompts/createTemplatePrompt.d.ts +22 -4
  130. package/lib/upload.d.ts +1 -1
  131. package/lib/yargsUtils.d.ts +4 -0
  132. package/lib/yargsUtils.js +6 -0
  133. package/package.json +5 -3
  134. package/types/Cms.d.ts +30 -0
  135. package/types/Cms.js +2 -0
  136. package/types/LocalDev.d.ts +22 -0
  137. package/types/LocalDev.js +2 -0
  138. package/types/Yargs.d.ts +5 -0
  139. package/lib/projects/localDev/LocalDevManagerV2.d.ts +0 -64
  140. package/lib/projects/localDev/LocalDevManagerV2.js +0 -345
package/lang/en.lyaml CHANGED
@@ -39,6 +39,7 @@ en:
39
39
  prompts:
40
40
  replaceOverrideFile: "Replace existing account override file?"
41
41
  errors:
42
+ globalConfigNotFound: "This command is only compatible with our new global config. Run {{ authCommand }} to get started."
42
43
  accountNotFound: "The specified account could not be found in the config file {{ configPath }}"
43
44
  options:
44
45
  account:
@@ -54,6 +55,8 @@ en:
54
55
  deleteOverrideFile: "Delete account override file?"
55
56
  success: "Removed the default account override file."
56
57
  noOverrideFile: "No default account override file found in the current working directory. No action required."
58
+ errors:
59
+ globalConfigNotFound: "This command is only compatible with our new global config. Run {{ authCommand }} to get started."
57
60
  options:
58
61
  force:
59
62
  describe: "Skip confirmation prompt when removing the override file"
@@ -78,3 +78,8 @@ export declare const FEATURES: {
78
78
  readonly UNIFIED_THEME_PREVIEW: "cms:react:unifiedThemePreview";
79
79
  readonly UNIFIED_APPS: "Developers:UnifiedApps:PrivateBeta";
80
80
  };
81
+ export declare const LOCAL_DEV_UI_WEBSOCKET_MESSAGE_TYPES: {
82
+ readonly UPLOAD: "upload";
83
+ readonly INSTALL_DEPS: "installDeps";
84
+ readonly APP_INSTALLED: "appInstalled";
85
+ };
package/lib/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FEATURES = exports.APP_AUTH_TYPES = exports.APP_DISTRIBUTION_TYPES = exports.IR_COMPONENT_TYPES = exports.PLATFORM_VERSION_ERROR_TYPES = exports.PROJECT_COMPONENT_TYPES = exports.PROJECT_TASK_TYPES = exports.PROJECT_ERROR_TYPES = exports.PROJECT_DEPLOY_TEXT = exports.PROJECT_BUILD_TEXT = exports.PROJECT_DEPLOY_STATES = exports.PROJECT_BUILD_STATES = exports.PROJECT_CONFIG_FILE = exports.DEFAULT_POLLING_DELAY = exports.MARKETPLACE_FOLDER = exports.HUBSPOT_FOLDER = exports.FEEDBACK_INTERVAL = exports.DEFAULT_PROJECT_TEMPLATE_BRANCH = exports.HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH = void 0;
3
+ exports.LOCAL_DEV_UI_WEBSOCKET_MESSAGE_TYPES = exports.FEATURES = exports.APP_AUTH_TYPES = exports.APP_DISTRIBUTION_TYPES = exports.IR_COMPONENT_TYPES = exports.PLATFORM_VERSION_ERROR_TYPES = exports.PROJECT_COMPONENT_TYPES = exports.PROJECT_TASK_TYPES = exports.PROJECT_ERROR_TYPES = exports.PROJECT_DEPLOY_TEXT = exports.PROJECT_BUILD_TEXT = exports.PROJECT_DEPLOY_STATES = exports.PROJECT_BUILD_STATES = exports.PROJECT_CONFIG_FILE = exports.DEFAULT_POLLING_DELAY = exports.MARKETPLACE_FOLDER = exports.HUBSPOT_FOLDER = exports.FEEDBACK_INTERVAL = exports.DEFAULT_PROJECT_TEMPLATE_BRANCH = exports.HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH = void 0;
4
4
  exports.HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH = 'HubSpot/hubspot-project-components';
5
5
  exports.DEFAULT_PROJECT_TEMPLATE_BRANCH = 'main';
6
6
  exports.FEEDBACK_INTERVAL = 10;
@@ -73,3 +73,8 @@ exports.FEATURES = {
73
73
  UNIFIED_THEME_PREVIEW: 'cms:react:unifiedThemePreview',
74
74
  UNIFIED_APPS: 'Developers:UnifiedApps:PrivateBeta',
75
75
  };
76
+ exports.LOCAL_DEV_UI_WEBSOCKET_MESSAGE_TYPES = {
77
+ UPLOAD: 'upload',
78
+ INSTALL_DEPS: 'installDeps',
79
+ APP_INSTALLED: 'appInstalled',
80
+ };
@@ -9,22 +9,15 @@ const ui_1 = require("../ui");
9
9
  function createPlatformVersionError(err, subCategory) {
10
10
  let translationKey = 'unspecifiedPlatformVersion';
11
11
  let platformVersion = 'unspecified platformVersion';
12
- const errorContext = err.data.context;
13
- switch (subCategory) {
14
- case constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_RETIRED:
15
- translationKey = 'platformVersionRetired';
16
- if (errorContext && errorContext[subCategory]) {
17
- platformVersion = errorContext[subCategory];
18
- }
19
- break;
20
- case constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_SPECIFIED_DOES_NOT_EXIST:
21
- translationKey = 'nonExistentPlatformVersion';
22
- if (errorContext && errorContext[subCategory]) {
23
- platformVersion = errorContext[subCategory];
24
- }
25
- break;
26
- default:
27
- break;
12
+ const errorContext = err?.data?.context;
13
+ if (subCategory === constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_RETIRED) {
14
+ platformVersion = errorContext?.RETIRED_PLATFORM_VERSION ?? platformVersion;
15
+ translationKey = 'platformVersionRetired';
16
+ }
17
+ else if (subCategory ===
18
+ constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_SPECIFIED_DOES_NOT_EXIST) {
19
+ platformVersion = errorContext?.PLATFORM_VERSION ?? platformVersion;
20
+ translationKey = 'nonExistentPlatformVersion';
28
21
  }
29
22
  (0, ui_1.uiLine)();
30
23
  logger_1.logger.error((0, lang_1.i18n)(`lib.errorHandlers.suppressErrors.platformVersionErrors.header`));
@@ -51,19 +44,19 @@ function shouldSuppressError(err, context) {
51
44
  if ((0, index_1.isSpecifiedError)(err, {
52
45
  subCategory: constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_NOT_SPECIFIED,
53
46
  })) {
54
- createPlatformVersionError(err.data, constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_NOT_SPECIFIED);
47
+ createPlatformVersionError(err, constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_NOT_SPECIFIED);
55
48
  return true;
56
49
  }
57
50
  if ((0, index_1.isSpecifiedError)(err, {
58
51
  subCategory: constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_RETIRED,
59
52
  })) {
60
- createPlatformVersionError(err.data, constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_RETIRED);
53
+ createPlatformVersionError(err, constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_RETIRED);
61
54
  return true;
62
55
  }
63
56
  if ((0, index_1.isSpecifiedError)(err, {
64
57
  subCategory: constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_SPECIFIED_DOES_NOT_EXIST,
65
58
  })) {
66
- createPlatformVersionError(err.data, constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_SPECIFIED_DOES_NOT_EXIST);
59
+ createPlatformVersionError(err, constants_1.PLATFORM_VERSION_ERROR_TYPES.PLATFORM_VERSION_SPECIFIED_DOES_NOT_EXIST);
67
60
  return true;
68
61
  }
69
62
  return false;
@@ -1,2 +1,2 @@
1
- export declare function resolveLocalPath(filepath: string): string;
1
+ export declare function resolveLocalPath(filepath?: string): string;
2
2
  export declare function isPathFolder(path: string): boolean;
@@ -1,8 +1,7 @@
1
1
  export declare const helpers: {
2
2
  [key: string]: (stringValue: string) => string;
3
3
  };
4
- type InterpolationData = {
5
- [identifier: string]: string | number;
4
+ export type InterpolationData = {
5
+ [identifier: string]: string | undefined | null | number | boolean;
6
6
  };
7
7
  export declare function interpolate(stringValue: string, interpolationData: InterpolationData): string;
8
- export {};
package/lib/lang.d.ts CHANGED
@@ -1,9 +1,8 @@
1
+ import { InterpolationData } from './interpolation';
1
2
  export declare const MISSING_LANGUAGE_DATA_PREFIX = "[Missing language data]";
2
3
  type LanguageObject = {
3
4
  [key: string]: string | LanguageObject;
4
5
  };
5
- export declare function i18n(lookupDotNotation: string, options?: {
6
- [identifier: string]: string | number;
7
- }): string;
6
+ export declare function i18n(lookupDotNotation: string, options?: InterpolationData): string;
8
7
  export declare function setLangData(newLocale: string, newLangObj: LanguageObject): void;
9
8
  export {};
@@ -17,6 +17,8 @@ const urls_1 = require("./urls");
17
17
  const exitCodes_1 = require("../enums/exitCodes");
18
18
  const en_1 = require("../../lang/en");
19
19
  const logger_1 = require("../ui/logger");
20
+ const constants_2 = require("@hubspot/project-parsing-lib/src/lib/constants");
21
+ const project_parsing_lib_1 = require("@hubspot/project-parsing-lib");
20
22
  const SPINNER_STATUS = {
21
23
  SPINNING: 'spinning',
22
24
  };
@@ -71,14 +73,27 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
71
73
  structureFn(accountId, taskName, taskId),
72
74
  ]);
73
75
  const subtasks = getSubtasks(initialTaskStatus);
74
- const tasksById = subtasks.reduce((acc, subtask) => {
76
+ const hiddenComponentBuildIds = [];
77
+ const tasksById = subtasks
78
+ .filter(subtask => {
79
+ // TODO: Remove this filtering logic when visible=false for SERVERLESS_PACKAGE
80
+ const shouldBeVisible = getSubtaskType(subtask) !== (0, project_parsing_lib_1.mapToInternalType)(constants_2.AppFunctionsPackageKey);
81
+ if (!shouldBeVisible) {
82
+ hiddenComponentBuildIds.push(subtask.id);
83
+ }
84
+ return shouldBeVisible;
85
+ })
86
+ .reduce((acc, subtask) => {
75
87
  const { id, visible } = subtask;
76
88
  if (visible) {
77
89
  acc[id] = subtask;
78
90
  }
79
91
  return acc;
80
92
  }, {});
81
- const structuredTasks = Object.keys(taskStructure).map(key => {
93
+ const structuredTasks = Object.keys(taskStructure)
94
+ // TODO: Remove this filtering logic when visible=false for SERVERLESS_PACKAGE
95
+ .filter(buildId => !hiddenComponentBuildIds.includes(buildId))
96
+ .map(key => {
82
97
  return {
83
98
  ...tasksById[key],
84
99
  subtasks: taskStructure[key]
@@ -0,0 +1,25 @@
1
+ import { PublicApp } from '@hubspot/local-dev-lib/types/Apps';
2
+ import { AppIRNode } from '../../../types/ProjectComponents';
3
+ import { LocalDevState } from '../../../types/LocalDev';
4
+ import LocalDevLogger from './LocalDevLogger';
5
+ type AppDevModeInterfaceConstructorOptions = {
6
+ localDevState: LocalDevState;
7
+ localDevLogger: LocalDevLogger;
8
+ };
9
+ declare class AppDevModeInterface {
10
+ localDevState: LocalDevState;
11
+ localDevLogger: LocalDevLogger;
12
+ _app?: AppIRNode | null;
13
+ marketplaceAppData?: PublicApp;
14
+ marketplaceAppInstalls?: number;
15
+ constructor(options: AppDevModeInterfaceConstructorOptions);
16
+ private get app();
17
+ private fetchMarketplaceAppData;
18
+ private checkMarketplaceAppInstalls;
19
+ private checkMarketplaceAppInstallation;
20
+ setup(args: any): Promise<void>;
21
+ start(): Promise<void>;
22
+ fileChange(filePath: string, event: string): Promise<void>;
23
+ cleanup(): Promise<void>;
24
+ }
25
+ export default AppDevModeInterface;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const localDevAuth_1 = require("@hubspot/local-dev-lib/api/localDevAuth");
4
+ const appsDev_1 = require("@hubspot/local-dev-lib/api/appsDev");
5
+ const ui_extensions_dev_server_1 = require("@hubspot/ui-extensions-dev-server");
6
+ const portManager_1 = require("@hubspot/local-dev-lib/portManager");
7
+ const constants_1 = require("../../constants");
8
+ const exitCodes_1 = require("../../enums/exitCodes");
9
+ const structure_1 = require("../../projects/structure");
10
+ const ui_1 = require("../../ui");
11
+ const index_1 = require("../../errorHandlers/index");
12
+ const installPublicAppPrompt_1 = require("../../prompts/installPublicAppPrompt");
13
+ const promptUtils_1 = require("../../prompts/promptUtils");
14
+ const en_1 = require("../../../lang/en");
15
+ const logger_1 = require("../../ui/logger");
16
+ class AppDevModeInterface {
17
+ localDevState;
18
+ localDevLogger;
19
+ _app;
20
+ marketplaceAppData;
21
+ marketplaceAppInstalls;
22
+ constructor(options) {
23
+ this.localDevState = options.localDevState;
24
+ this.localDevLogger = options.localDevLogger;
25
+ if (!this.localDevState.targetProjectAccountId ||
26
+ !this.localDevState.projectConfig ||
27
+ !this.localDevState.projectDir) {
28
+ logger_1.uiLogger.log(en_1.lib.LocalDevManager.failedToInitialize);
29
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
30
+ }
31
+ }
32
+ // Assumes only one app per project
33
+ get app() {
34
+ if (this._app === undefined) {
35
+ this._app =
36
+ Object.values(this.localDevState.projectNodes).find(structure_1.isAppIRNode) ||
37
+ null;
38
+ }
39
+ return this._app;
40
+ }
41
+ async fetchMarketplaceAppData() {
42
+ const { data: { results: portalMarketplaceApps }, } = await (0, appsDev_1.fetchPublicAppsForPortal)(this.localDevState.targetProjectAccountId);
43
+ const marketplaceAppData = portalMarketplaceApps.find(({ sourceId }) => sourceId === this.app?.uid);
44
+ if (!marketplaceAppData) {
45
+ return;
46
+ }
47
+ const { data: { uniquePortalInstallCount }, } = await (0, appsDev_1.fetchPublicAppProductionInstallCounts)(marketplaceAppData.id, this.localDevState.targetProjectAccountId);
48
+ this.marketplaceAppData = marketplaceAppData;
49
+ this.marketplaceAppInstalls = uniquePortalInstallCount;
50
+ }
51
+ async checkMarketplaceAppInstalls() {
52
+ if (!this.marketplaceAppData || !this.marketplaceAppInstalls) {
53
+ return;
54
+ }
55
+ (0, ui_1.uiLine)();
56
+ logger_1.uiLogger.warn(en_1.lib.LocalDevManager.activeInstallWarning.installCount(this.marketplaceAppData.name, this.marketplaceAppInstalls));
57
+ logger_1.uiLogger.log(en_1.lib.LocalDevManager.activeInstallWarning.explanation);
58
+ (0, ui_1.uiLine)();
59
+ const proceed = await (0, promptUtils_1.confirmPrompt)(en_1.lib.LocalDevManager.activeInstallWarning.confirmationPrompt, { defaultAnswer: false });
60
+ if (!proceed) {
61
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
62
+ }
63
+ this.localDevLogger.addUploadWarning(en_1.lib.AppDevModeInterface.defaultMarketplaceAppWarning(this.marketplaceAppInstalls));
64
+ }
65
+ async checkMarketplaceAppInstallation() {
66
+ if (!this.app || !this.marketplaceAppData) {
67
+ return;
68
+ }
69
+ const { data: { isInstalledWithScopeGroups, previouslyAuthorizedScopeGroups }, } = await (0, localDevAuth_1.fetchAppInstallationData)(this.localDevState.targetTestingAccountId, this.localDevState.projectId, this.app.uid, this.app.config.auth.requiredScopes, this.app.config.auth.optionalScopes);
70
+ const isReinstall = previouslyAuthorizedScopeGroups.length > 0;
71
+ if (!isInstalledWithScopeGroups) {
72
+ await (0, installPublicAppPrompt_1.installPublicAppPrompt)(this.localDevState.env, this.localDevState.targetTestingAccountId, this.marketplaceAppData.clientId, this.app.config.auth.requiredScopes, this.app.config.auth.redirectUrls, isReinstall);
73
+ }
74
+ }
75
+ // @ts-expect-error TODO: reconcile types between CLI and UIE Dev Server
76
+ // In the future, update UIE Dev Server to use LocalDevState
77
+ async setup(args) {
78
+ if (!this.app) {
79
+ return;
80
+ }
81
+ if (this.app?.config.distribution === constants_1.APP_DISTRIBUTION_TYPES.MARKETPLACE) {
82
+ try {
83
+ await this.fetchMarketplaceAppData();
84
+ await this.checkMarketplaceAppInstalls();
85
+ await this.checkMarketplaceAppInstallation();
86
+ }
87
+ catch (e) {
88
+ (0, index_1.logError)(e);
89
+ }
90
+ }
91
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.setup(args);
92
+ }
93
+ async start() {
94
+ if (!this.app) {
95
+ return;
96
+ }
97
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.start({
98
+ accountId: this.localDevState.targetTestingAccountId,
99
+ // @ts-expect-error TODO: reconcile types between CLI and UIE Dev Server
100
+ projectConfig: this.localDevState.projectConfig,
101
+ requestPorts: portManager_1.requestPorts,
102
+ });
103
+ }
104
+ async fileChange(filePath, event) {
105
+ if (!this.app) {
106
+ return;
107
+ }
108
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.fileChange(filePath, event);
109
+ }
110
+ async cleanup() {
111
+ if (!this.app) {
112
+ return;
113
+ }
114
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.cleanup();
115
+ }
116
+ }
117
+ exports.default = AppDevModeInterface;
@@ -1,33 +1,22 @@
1
- import { ProjectConfig } from '../../../types/Projects';
2
- import { IntermediateRepresentationNodeLocalDev } from '@hubspot/project-parsing-lib/src/lib/types';
3
- type DevServerInterface = {
4
- setup?: Function;
5
- start?: (options: object) => Promise<void>;
6
- fileChange?: (filePath: string, event: string) => Promise<void>;
7
- cleanup?: () => Promise<void>;
1
+ import { LocalDevState } from '../../../types/LocalDev';
2
+ import LocalDevLogger from './LocalDevLogger';
3
+ type DevServerManagerV2ConstructorOptions = {
4
+ localDevState: LocalDevState;
5
+ logger: LocalDevLogger;
8
6
  };
9
7
  declare class DevServerManagerV2 {
10
8
  private initialized;
11
9
  private started;
12
10
  private devServers;
13
- constructor();
14
- iterateDevServers(callback: (serverInterface: DevServerInterface) => Promise<void>): Promise<void>;
15
- setup({ projectNodes, accountId, setActiveApp, }: {
16
- projectNodes: {
17
- [key: string]: IntermediateRepresentationNodeLocalDev;
18
- };
19
- accountId: number;
20
- setActiveApp: (appUid: string | undefined) => Promise<void>;
21
- }): Promise<void>;
22
- start({ accountId, projectConfig, }: {
23
- accountId: number;
24
- projectConfig: ProjectConfig;
25
- }): Promise<void>;
11
+ private localDevState;
12
+ constructor(options: DevServerManagerV2ConstructorOptions);
13
+ private iterateDevServers;
14
+ setup(): Promise<void>;
15
+ start(): Promise<void>;
26
16
  fileChange({ filePath, event, }: {
27
17
  filePath: string;
28
18
  event: string;
29
19
  }): Promise<void>;
30
20
  cleanup(): Promise<void>;
31
21
  }
32
- declare const Manager: DevServerManagerV2;
33
- export default Manager;
22
+ export default DevServerManagerV2;
@@ -1,56 +1,61 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  const logger_1 = require("@hubspot/local-dev-lib/logger");
4
7
  const promptUtils_1 = require("../../prompts/promptUtils");
5
- const ui_extensions_dev_server_1 = require("@hubspot/ui-extensions-dev-server");
6
8
  const portManager_1 = require("@hubspot/local-dev-lib/portManager");
7
9
  const urls_1 = require("@hubspot/local-dev-lib/urls");
8
10
  const config_1 = require("@hubspot/local-dev-lib/config");
11
+ const AppDevModeInterface_1 = __importDefault(require("./AppDevModeInterface"));
9
12
  const en_1 = require("../../../lang/en");
10
13
  class DevServerManagerV2 {
11
14
  initialized;
12
15
  started;
13
16
  devServers;
14
- constructor() {
17
+ localDevState;
18
+ constructor(options) {
15
19
  this.initialized = false;
16
20
  this.started = false;
17
- this.devServers = [ui_extensions_dev_server_1.DevModeUnifiedInterface];
21
+ this.localDevState = options.localDevState;
22
+ const AppsDevServer = new AppDevModeInterface_1.default({
23
+ localDevState: options.localDevState,
24
+ localDevLogger: options.logger,
25
+ });
26
+ this.devServers = [AppsDevServer];
18
27
  }
19
28
  async iterateDevServers(callback) {
20
29
  await Promise.all(this.devServers.map(devServer => callback(devServer)));
21
30
  }
22
- async setup({ projectNodes, accountId, setActiveApp, }) {
31
+ async setup() {
23
32
  let env;
24
- const accountConfig = (0, config_1.getAccountConfig)(accountId);
33
+ const accountConfig = (0, config_1.getAccountConfig)(this.localDevState.targetTestingAccountId);
25
34
  if (accountConfig) {
26
35
  env = accountConfig.env;
27
36
  }
28
37
  await (0, portManager_1.startPortManagerServer)();
29
38
  await this.iterateDevServers(async (serverInterface) => {
30
39
  if (serverInterface.setup) {
40
+ // @TODO: In the future, update UIE Dev Server to use LocalDevState
31
41
  await serverInterface.setup({
32
- components: projectNodes,
42
+ components: this.localDevState.projectNodes,
33
43
  promptUser: promptUtils_1.promptUser,
34
44
  logger: logger_1.logger,
35
45
  urls: {
36
46
  api: (0, urls_1.getHubSpotApiOrigin)(env),
37
47
  web: (0, urls_1.getHubSpotWebsiteOrigin)(env),
38
48
  },
39
- setActiveApp,
40
49
  });
41
50
  }
42
51
  });
43
52
  this.initialized = true;
44
53
  }
45
- async start({ accountId, projectConfig, }) {
54
+ async start() {
46
55
  if (this.initialized) {
47
56
  await this.iterateDevServers(async (serverInterface) => {
48
57
  if (serverInterface.start) {
49
- await serverInterface.start({
50
- accountId,
51
- projectConfig,
52
- requestPorts: portManager_1.requestPorts,
53
- });
58
+ await serverInterface.start();
54
59
  }
55
60
  });
56
61
  }
@@ -79,5 +84,4 @@ class DevServerManagerV2 {
79
84
  }
80
85
  }
81
86
  }
82
- const Manager = new DevServerManagerV2();
83
- exports.default = Manager;
87
+ exports.default = DevServerManagerV2;
@@ -0,0 +1,30 @@
1
+ import { LocalDevState } from '../../../types/LocalDev';
2
+ declare class LocalDevLogger {
3
+ private state;
4
+ private mostRecentUploadWarning;
5
+ private uploadWarnings;
6
+ constructor(state: LocalDevState);
7
+ private logUploadInstructions;
8
+ private handleError;
9
+ getUploadCommand(): string;
10
+ uploadWarning(): void;
11
+ addUploadWarning(warning: string): void;
12
+ clearUploadWarnings(): void;
13
+ missingComponentsWarning(components: string[]): void;
14
+ fileChangeError(e: unknown): void;
15
+ devServerSetupError(e: unknown): void;
16
+ devServerStartError(e: unknown): void;
17
+ devServerCleanupError(e: unknown): void;
18
+ noDeployedBuild(): void;
19
+ resetSpinnies(): void;
20
+ startupMessage(): void;
21
+ cleanupStart(): void;
22
+ cleanupError(): void;
23
+ cleanupSuccess(): void;
24
+ uploadInitiated(): void;
25
+ projectConfigMismatch(): void;
26
+ uploadError(error: unknown): void;
27
+ uploadSuccess(): void;
28
+ monitorConsoleOutput(): void;
29
+ }
30
+ export default LocalDevLogger;
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const config_1 = require("@hubspot/local-dev-lib/config");
7
+ const config_2 = require("@hubspot/local-dev-lib/config");
8
+ const logger_1 = require("@hubspot/local-dev-lib/logger");
9
+ const logger_2 = require("../../ui/logger");
10
+ const ui_1 = require("../../ui");
11
+ const en_1 = require("../../../lang/en");
12
+ const SpinniesManager_1 = __importDefault(require("../../ui/SpinniesManager"));
13
+ const errorHandlers_1 = require("../../errorHandlers");
14
+ class LocalDevLogger {
15
+ state;
16
+ mostRecentUploadWarning;
17
+ uploadWarnings;
18
+ constructor(state) {
19
+ this.state = state;
20
+ this.mostRecentUploadWarning = null;
21
+ this.uploadWarnings = new Set();
22
+ }
23
+ logUploadInstructions(warning) {
24
+ logger_2.uiLogger.log('');
25
+ logger_2.uiLogger.warn(warning);
26
+ logger_2.uiLogger.log('');
27
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.instructionsHeader);
28
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.stopDev);
29
+ if (this.state.isGithubLinked) {
30
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.pushToGithub);
31
+ }
32
+ else {
33
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.runUpload(this.getUploadCommand()));
34
+ }
35
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.restartDev);
36
+ }
37
+ handleError(e, langFunction) {
38
+ if (this.state.debug) {
39
+ logger_1.logger.error(e);
40
+ }
41
+ logger_2.uiLogger.error(langFunction(e instanceof Error ? e.message : ''));
42
+ }
43
+ getUploadCommand() {
44
+ const currentDefaultAccount = (0, config_2.getConfigDefaultAccount)() || undefined;
45
+ return this.state.targetProjectAccountId !==
46
+ (0, config_1.getAccountId)(currentDefaultAccount)
47
+ ? (0, ui_1.uiCommandReference)(`hs project upload --account=${this.state.targetProjectAccountId}`)
48
+ : (0, ui_1.uiCommandReference)('hs project upload');
49
+ }
50
+ uploadWarning() {
51
+ // At the moment, there is only one additional warning. We may need to do this in a
52
+ // more robust way in the future
53
+ const additionalWarnings = Array.from(this.uploadWarnings).join('\n\n');
54
+ const warning = `${en_1.lib.LocalDevManager.uploadWarning.defaultWarning} ${additionalWarnings}`;
55
+ // Avoid logging the warning to the console if it is currently the most
56
+ // recently logged warning. We do not want to spam the console with the same message.
57
+ if (warning !== this.mostRecentUploadWarning) {
58
+ this.logUploadInstructions(warning);
59
+ this.mostRecentUploadWarning = warning;
60
+ }
61
+ }
62
+ addUploadWarning(warning) {
63
+ this.uploadWarnings.add(warning);
64
+ }
65
+ clearUploadWarnings() {
66
+ this.uploadWarnings.clear();
67
+ }
68
+ missingComponentsWarning(components) {
69
+ const warning = en_1.lib.LocalDevManager.uploadWarning.missingComponents(components.join(', '));
70
+ if (warning !== this.mostRecentUploadWarning) {
71
+ this.logUploadInstructions(warning);
72
+ this.mostRecentUploadWarning = warning;
73
+ }
74
+ }
75
+ fileChangeError(e) {
76
+ this.handleError(e, en_1.lib.LocalDevManager.devServer.fileChangeError);
77
+ }
78
+ devServerSetupError(e) {
79
+ this.handleError(e, en_1.lib.LocalDevManager.devServer.setupError);
80
+ }
81
+ devServerStartError(e) {
82
+ this.handleError(e, en_1.lib.LocalDevManager.devServer.startError);
83
+ }
84
+ devServerCleanupError(e) {
85
+ this.handleError(e, en_1.lib.LocalDevManager.devServer.cleanupError);
86
+ }
87
+ noDeployedBuild() {
88
+ logger_2.uiLogger.error(en_1.lib.LocalDevManager.noDeployedBuild(this.state.projectConfig.name, (0, ui_1.uiAccountDescription)(this.state.targetProjectAccountId), this.getUploadCommand()));
89
+ logger_2.uiLogger.log('');
90
+ }
91
+ resetSpinnies() {
92
+ SpinniesManager_1.default.stopAll();
93
+ SpinniesManager_1.default.init();
94
+ }
95
+ startupMessage() {
96
+ if (!this.state.debug) {
97
+ console.clear();
98
+ }
99
+ (0, ui_1.uiBetaTag)(en_1.lib.LocalDevManager.betaMessage);
100
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.learnMoreLocalDevServer);
101
+ logger_2.uiLogger.log('');
102
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.running(this.state.projectConfig.name, (0, ui_1.uiAccountDescription)(this.state.targetProjectAccountId)));
103
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.viewProjectLink(this.state.projectConfig.name, this.state.targetProjectAccountId));
104
+ logger_2.uiLogger.log('');
105
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.quitHelper);
106
+ (0, ui_1.uiLine)();
107
+ logger_2.uiLogger.log('');
108
+ }
109
+ cleanupStart() {
110
+ SpinniesManager_1.default.add('cleanupMessage', {
111
+ text: en_1.lib.LocalDevManager.exitingStart,
112
+ });
113
+ }
114
+ cleanupError() {
115
+ SpinniesManager_1.default.fail('cleanupMessage', {
116
+ text: en_1.lib.LocalDevManager.exitingFail,
117
+ });
118
+ }
119
+ cleanupSuccess() {
120
+ SpinniesManager_1.default.succeed('cleanupMessage', {
121
+ text: en_1.lib.LocalDevManager.exitingSucceed,
122
+ });
123
+ }
124
+ uploadInitiated() {
125
+ logger_2.uiLogger.log(en_1.lib.LocalDevProcess.uploadInitiated);
126
+ }
127
+ projectConfigMismatch() {
128
+ logger_2.uiLogger.log(en_1.lib.LocalDevProcess.projectConfigMismatch);
129
+ }
130
+ uploadError(error) {
131
+ logger_1.logger.log('');
132
+ (0, errorHandlers_1.logError)(error);
133
+ logger_2.uiLogger.log(en_1.lib.LocalDevProcess.uploadFailed);
134
+ logger_1.logger.log('');
135
+ }
136
+ uploadSuccess() {
137
+ logger_1.logger.log('');
138
+ logger_2.uiLogger.log(en_1.lib.LocalDevProcess.uploadSuccess);
139
+ (0, ui_1.uiLine)();
140
+ logger_1.logger.log('');
141
+ }
142
+ monitorConsoleOutput() {
143
+ const originalStdoutWrite = process.stdout.write.bind(process.stdout);
144
+ function customStdoutWrite(chunk, encoding, callback) {
145
+ // Reset the most recently logged warning
146
+ if (this.mostRecentUploadWarning) {
147
+ this.mostRecentUploadWarning = null;
148
+ }
149
+ if (typeof encoding === 'function') {
150
+ return originalStdoutWrite(chunk, callback);
151
+ }
152
+ return originalStdoutWrite(chunk, encoding, callback);
153
+ }
154
+ customStdoutWrite.bind(this);
155
+ process.stdout.write = customStdoutWrite;
156
+ }
157
+ }
158
+ exports.default = LocalDevLogger;
@@ -14,7 +14,6 @@ const constants_1 = require("../../constants");
14
14
  const SpinniesManager_1 = __importDefault(require("../../ui/SpinniesManager"));
15
15
  const DevServerManager_1 = __importDefault(require("./DevServerManager"));
16
16
  const exitCodes_1 = require("../../enums/exitCodes");
17
- const urls_1 = require("../../projects/urls");
18
17
  const helpers_1 = require("./helpers");
19
18
  const structure_1 = require("../../projects/structure");
20
19
  const Projects_1 = require("../../../types/Projects");
@@ -113,7 +112,7 @@ class LocalDevManager {
113
112
  return;
114
113
  }
115
114
  (0, ui_1.uiLine)();
116
- logger_2.uiLogger.warn(en_1.lib.LocalDevManager.activeInstallWarning.installCount(this.activePublicAppData.name, this.publicAppActiveInstalls, this.publicAppActiveInstalls === 1 ? 'account' : 'accounts'));
115
+ logger_2.uiLogger.warn(en_1.lib.LocalDevManager.activeInstallWarning.installCount(this.activePublicAppData.name, this.publicAppActiveInstalls));
117
116
  logger_2.uiLogger.log(en_1.lib.LocalDevManager.activeInstallWarning.explanation);
118
117
  (0, ui_1.uiLine)();
119
118
  const proceed = await (0, promptUtils_1.confirmPrompt)(en_1.lib.LocalDevManager.activeInstallWarning.confirmationPrompt, { defaultAnswer: false });
@@ -141,7 +140,7 @@ class LocalDevManager {
141
140
  logger_2.uiLogger.log((0, ui_1.uiLink)(en_1.lib.LocalDevManager.learnMoreLocalDevServer, 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
142
141
  logger_2.uiLogger.log('');
143
142
  logger_2.uiLogger.log(chalk_1.default.hex(ui_1.UI_COLORS.SORBET)(en_1.lib.LocalDevManager.running(this.projectConfig.name, (0, ui_1.uiAccountDescription)(this.targetAccountId))));
144
- logger_2.uiLogger.log((0, ui_1.uiLink)(en_1.lib.LocalDevManager.viewProjectLink, (0, urls_1.getProjectDetailUrl)(this.projectConfig.name, this.targetProjectAccountId) || ''));
143
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.viewProjectLink(this.projectConfig.name, this.targetProjectAccountId));
145
144
  if (this.activeApp?.type === Projects_1.ComponentTypes.PublicApp) {
146
145
  logger_2.uiLogger.log((0, ui_1.uiLink)(en_1.lib.LocalDevManager.viewTestAccountLink, (0, helpers_1.getAccountHomeUrl)(this.targetAccountId)));
147
146
  }