@hubspot/cli 7.4.8 → 7.4.9-beta.1

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 (206) hide show
  1. package/commands/account/auth.d.ts +3 -7
  2. package/commands/account/auth.js +19 -9
  3. package/commands/account/clean.d.ts +3 -7
  4. package/commands/account/clean.js +16 -9
  5. package/commands/account/createOverride.d.ts +3 -7
  6. package/commands/account/createOverride.js +23 -6
  7. package/commands/account/info.d.ts +3 -7
  8. package/commands/account/info.js +13 -5
  9. package/commands/account/list.d.ts +3 -7
  10. package/commands/account/list.js +15 -8
  11. package/commands/account/remove.d.ts +3 -7
  12. package/commands/account/remove.js +21 -9
  13. package/commands/account/removeOverride.d.ts +3 -7
  14. package/commands/account/removeOverride.js +23 -6
  15. package/commands/account/rename.d.ts +3 -7
  16. package/commands/account/rename.js +16 -9
  17. package/commands/account/use.d.ts +5 -9
  18. package/commands/account/use.js +14 -6
  19. package/commands/account.d.ts +3 -4
  20. package/commands/account.js +35 -58
  21. package/commands/cms/convertFields.d.ts +7 -1
  22. package/commands/cms/convertFields.js +57 -41
  23. package/commands/cms/getReactModule.d.ts +7 -1
  24. package/commands/cms/getReactModule.js +52 -34
  25. package/commands/cms/lighthouseScore.d.ts +8 -1
  26. package/commands/cms/lighthouseScore.js +129 -100
  27. package/commands/cms.d.ts +3 -1
  28. package/commands/cms.js +24 -15
  29. package/commands/completion.d.ts +3 -1
  30. package/commands/completion.js +25 -12
  31. package/commands/config/migrate.d.ts +1 -1
  32. package/commands/config/migrate.js +16 -12
  33. package/commands/create/api-sample.d.ts +3 -1
  34. package/commands/create/api-sample.js +34 -38
  35. package/commands/create/app.d.ts +3 -1
  36. package/commands/create/app.js +9 -7
  37. package/commands/create/function.d.ts +3 -1
  38. package/commands/create/function.js +11 -10
  39. package/commands/create/index.d.ts +5 -1
  40. package/commands/create/index.js +23 -11
  41. package/commands/create/module.d.ts +3 -1
  42. package/commands/create/module.js +14 -13
  43. package/commands/create/react-app.d.ts +3 -1
  44. package/commands/create/react-app.js +10 -7
  45. package/commands/create/template.d.ts +3 -1
  46. package/commands/create/template.js +14 -14
  47. package/commands/create/vue-app.d.ts +3 -1
  48. package/commands/create/vue-app.js +10 -7
  49. package/commands/create/webpack-serverless.d.ts +3 -1
  50. package/commands/create/webpack-serverless.js +10 -7
  51. package/commands/create/website-theme.d.ts +3 -1
  52. package/commands/create/website-theme.js +10 -9
  53. package/commands/create.d.ts +4 -24
  54. package/commands/create.js +63 -74
  55. package/commands/customObject/create.d.ts +4 -9
  56. package/commands/customObject/create.js +17 -10
  57. package/commands/customObject/schema/create.d.ts +4 -9
  58. package/commands/customObject/schema/create.js +18 -11
  59. package/commands/customObject/schema/delete.d.ts +4 -9
  60. package/commands/customObject/schema/delete.js +17 -10
  61. package/commands/customObject/schema/fetch-all.d.ts +4 -9
  62. package/commands/customObject/schema/fetch-all.js +17 -10
  63. package/commands/customObject/schema/fetch.d.ts +4 -9
  64. package/commands/customObject/schema/fetch.js +17 -10
  65. package/commands/customObject/schema/list.d.ts +4 -8
  66. package/commands/customObject/schema/list.js +17 -10
  67. package/commands/customObject/schema/update.d.ts +4 -9
  68. package/commands/customObject/schema/update.js +18 -11
  69. package/commands/customObject/schema.d.ts +3 -5
  70. package/commands/customObject/schema.js +27 -54
  71. package/commands/customObject.d.ts +3 -4
  72. package/commands/customObject.js +20 -45
  73. package/commands/feedback.d.ts +4 -1
  74. package/commands/feedback.js +40 -47
  75. package/commands/fetch.d.ts +12 -1
  76. package/commands/fetch.js +49 -33
  77. package/commands/filemanager/fetch.d.ts +4 -9
  78. package/commands/filemanager/fetch.js +18 -11
  79. package/commands/filemanager/upload.d.ts +4 -9
  80. package/commands/filemanager/upload.js +17 -11
  81. package/commands/filemanager.d.ts +3 -4
  82. package/commands/filemanager.js +20 -41
  83. package/commands/function/deploy.d.ts +6 -1
  84. package/commands/function/deploy.js +70 -50
  85. package/commands/function/list.d.ts +6 -1
  86. package/commands/function/list.js +44 -32
  87. package/commands/function/server.d.ts +10 -1
  88. package/commands/function/server.js +49 -38
  89. package/commands/function.d.ts +5 -1
  90. package/commands/function.js +24 -10
  91. package/commands/hubdb/clear.d.ts +4 -9
  92. package/commands/hubdb/clear.js +17 -10
  93. package/commands/hubdb/create.d.ts +4 -9
  94. package/commands/hubdb/create.js +17 -10
  95. package/commands/hubdb/delete.d.ts +4 -9
  96. package/commands/hubdb/delete.js +17 -10
  97. package/commands/hubdb/fetch.d.ts +4 -9
  98. package/commands/hubdb/fetch.js +17 -10
  99. package/commands/hubdb.d.ts +3 -2
  100. package/commands/hubdb.js +23 -45
  101. package/commands/lint.d.ts +6 -4
  102. package/commands/lint.js +44 -43
  103. package/commands/logs.d.ts +10 -1
  104. package/commands/logs.js +53 -44
  105. package/commands/module/marketplace-validate.d.ts +6 -1
  106. package/commands/module/marketplace-validate.js +39 -27
  107. package/commands/module.d.ts +3 -1
  108. package/commands/module.js +22 -10
  109. package/commands/project/cloneApp.d.ts +1 -1
  110. package/commands/project/create.js +3 -3
  111. package/commands/project/deploy.d.ts +1 -0
  112. package/commands/project/deploy.js +40 -12
  113. package/commands/project/dev/index.d.ts +1 -4
  114. package/commands/project/dev/index.js +44 -15
  115. package/commands/project/dev/unifiedFlow.d.ts +2 -1
  116. package/commands/project/dev/unifiedFlow.js +52 -20
  117. package/commands/project/migrate.d.ts +1 -0
  118. package/commands/project/profile/add.d.ts +7 -0
  119. package/commands/project/profile/add.js +190 -0
  120. package/commands/project/profile/remove.d.ts +6 -0
  121. package/commands/project/profile/remove.js +119 -0
  122. package/commands/project/profile.d.ts +3 -0
  123. package/commands/project/profile.js +25 -0
  124. package/commands/project/upload.d.ts +1 -0
  125. package/commands/project/upload.js +38 -8
  126. package/commands/project.js +2 -0
  127. package/commands/sandbox/create.d.ts +4 -9
  128. package/commands/sandbox/create.js +18 -11
  129. package/commands/sandbox/delete.d.ts +4 -9
  130. package/commands/sandbox/delete.js +18 -11
  131. package/commands/sandbox.d.ts +3 -4
  132. package/commands/sandbox.js +20 -43
  133. package/commands/secret/addSecret.d.ts +4 -9
  134. package/commands/secret/addSecret.js +17 -10
  135. package/commands/secret/deleteSecret.d.ts +4 -9
  136. package/commands/secret/deleteSecret.js +17 -10
  137. package/commands/secret/listSecret.d.ts +4 -9
  138. package/commands/secret/listSecret.js +17 -10
  139. package/commands/secret/updateSecret.d.ts +4 -9
  140. package/commands/secret/updateSecret.js +17 -10
  141. package/commands/secret.d.ts +3 -4
  142. package/commands/secret.js +25 -48
  143. package/commands/theme/generate-selectors.d.ts +3 -7
  144. package/commands/theme/generate-selectors.js +14 -6
  145. package/commands/theme/marketplace-validate.d.ts +4 -9
  146. package/commands/theme/marketplace-validate.js +17 -10
  147. package/commands/theme/preview.d.ts +4 -9
  148. package/commands/theme/preview.js +16 -9
  149. package/commands/theme.d.ts +3 -4
  150. package/commands/theme.js +23 -46
  151. package/commands/upload.d.ts +12 -1
  152. package/commands/upload.js +118 -97
  153. package/commands/watch.d.ts +14 -1
  154. package/commands/watch.js +76 -65
  155. package/lang/en.d.ts +654 -558
  156. package/lang/en.js +443 -353
  157. package/lang/en.lyaml +23 -13
  158. package/lib/app/migrate.d.ts +23 -0
  159. package/lib/app/migrate.js +14 -3
  160. package/lib/app/migrate_legacy.js +5 -5
  161. package/lib/configMigrate.js +24 -10
  162. package/lib/constants.d.ts +6 -0
  163. package/lib/constants.js +7 -1
  164. package/lib/errorHandlers/suppressError.js +12 -19
  165. package/lib/filesystem.d.ts +1 -1
  166. package/lib/interpolation.d.ts +2 -3
  167. package/lib/lang.d.ts +2 -3
  168. package/lib/middleware/configMiddleware.js +8 -0
  169. package/lib/projectProfiles.d.ts +6 -0
  170. package/lib/projectProfiles.js +65 -0
  171. package/lib/projects/buildAndDeploy.js +17 -2
  172. package/lib/projects/localDev/AppDevModeInterface.d.ts +25 -0
  173. package/lib/projects/localDev/AppDevModeInterface.js +117 -0
  174. package/lib/projects/localDev/DevServerManagerV2.d.ts +11 -22
  175. package/lib/projects/localDev/DevServerManagerV2.js +19 -15
  176. package/lib/projects/localDev/LocalDevLogger.d.ts +30 -0
  177. package/lib/projects/localDev/LocalDevLogger.js +158 -0
  178. package/lib/projects/localDev/LocalDevManager.js +2 -3
  179. package/lib/projects/localDev/LocalDevProcess.d.ts +27 -0
  180. package/lib/projects/localDev/LocalDevProcess.js +171 -0
  181. package/lib/projects/localDev/LocalDevState.d.ts +37 -0
  182. package/lib/projects/localDev/LocalDevState.js +78 -0
  183. package/lib/projects/localDev/LocalDevWatcher.d.ts +10 -0
  184. package/lib/projects/localDev/LocalDevWatcher.js +56 -0
  185. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +17 -0
  186. package/lib/projects/localDev/LocalDevWebsocketServer.js +92 -0
  187. package/lib/projects/localDev/helpers.d.ts +1 -1
  188. package/lib/projects/localDev/helpers.js +2 -1
  189. package/lib/projects/upload.d.ts +2 -1
  190. package/lib/projects/upload.js +2 -2
  191. package/lib/prompts/createApiSamplePrompt.d.ts +2 -10
  192. package/lib/prompts/createTemplatePrompt.d.ts +22 -4
  193. package/lib/testUtils.d.ts +3 -3
  194. package/lib/testUtils.js +8 -9
  195. package/lib/upload.d.ts +1 -1
  196. package/lib/validation.js +4 -5
  197. package/lib/yargsUtils.d.ts +4 -0
  198. package/lib/yargsUtils.js +6 -0
  199. package/package.json +5 -3
  200. package/types/Cms.d.ts +30 -0
  201. package/types/Cms.js +2 -0
  202. package/types/LocalDev.d.ts +24 -0
  203. package/types/LocalDev.js +2 -0
  204. package/types/Yargs.d.ts +8 -1
  205. package/lib/projects/localDev/LocalDevManagerV2.d.ts +0 -64
  206. package/lib/projects/localDev/LocalDevManagerV2.js +0 -345
@@ -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
+ _appNode;
20
+ appData;
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 appNode() {
34
+ if (this._appNode === undefined) {
35
+ this._appNode =
36
+ Object.values(this.localDevState.projectNodes).find(structure_1.isAppIRNode) ||
37
+ null;
38
+ }
39
+ return this._appNode;
40
+ }
41
+ async fetchAppData() {
42
+ const { data: { results: portalApps }, } = await (0, appsDev_1.fetchPublicAppsForPortal)(this.localDevState.targetProjectAccountId);
43
+ const appData = portalApps.find(({ sourceId }) => sourceId === this.appNode?.uid);
44
+ if (!appData) {
45
+ return;
46
+ }
47
+ const { data: { uniquePortalInstallCount }, } = await (0, appsDev_1.fetchPublicAppProductionInstallCounts)(appData.id, this.localDevState.targetProjectAccountId);
48
+ this.appData = appData;
49
+ this.marketplaceAppInstalls = uniquePortalInstallCount;
50
+ }
51
+ async checkMarketplaceAppInstalls() {
52
+ if (!this.appData || !this.marketplaceAppInstalls) {
53
+ return;
54
+ }
55
+ (0, ui_1.uiLine)();
56
+ logger_1.uiLogger.warn(en_1.lib.LocalDevManager.activeInstallWarning.installCount(this.appData.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 checkTestAccountAppInstallation() {
66
+ if (!this.appNode || !this.appData) {
67
+ return;
68
+ }
69
+ const { data: { isInstalledWithScopeGroups, previouslyAuthorizedScopeGroups }, } = await (0, localDevAuth_1.fetchAppInstallationData)(this.localDevState.targetTestingAccountId, this.localDevState.projectId, this.appNode.uid, this.appNode.config.auth.requiredScopes, this.appNode.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.appData.clientId, this.appNode.config.auth.requiredScopes, this.appNode.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.appNode) {
79
+ return;
80
+ }
81
+ try {
82
+ await this.fetchAppData();
83
+ if (this.appNode.config.distribution === constants_1.APP_DISTRIBUTION_TYPES.MARKETPLACE) {
84
+ await this.checkMarketplaceAppInstalls();
85
+ }
86
+ await this.checkTestAccountAppInstallation();
87
+ }
88
+ catch (e) {
89
+ (0, index_1.logError)(e);
90
+ }
91
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.setup(args);
92
+ }
93
+ async start() {
94
+ if (!this.appNode) {
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.appNode) {
106
+ return;
107
+ }
108
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.fileChange(filePath, event);
109
+ }
110
+ async cleanup() {
111
+ if (!this.appNode) {
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 './LocalDevState';
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 './LocalDevState';
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
  }
@@ -0,0 +1,27 @@
1
+ import { IntermediateRepresentationNodeLocalDev } from '@hubspot/project-parsing-lib/src/lib/types';
2
+ import LocalDevState from './LocalDevState';
3
+ import LocalDevLogger from './LocalDevLogger';
4
+ import { LocalDevStateConstructorOptions, LocalDevStateListener } from '../../../types/LocalDev';
5
+ declare class LocalDevProcess {
6
+ private state;
7
+ private _logger;
8
+ private devServerManager;
9
+ constructor(options: LocalDevStateConstructorOptions);
10
+ get projectDir(): string;
11
+ get projectNodes(): {
12
+ [key: string]: IntermediateRepresentationNodeLocalDev;
13
+ };
14
+ get logger(): LocalDevLogger;
15
+ private setupDevServers;
16
+ private startDevServers;
17
+ private cleanupDevServers;
18
+ private compareLocalProjectToDeployed;
19
+ private projectConfigValidForUpload;
20
+ handleFileChange(filePath: string, event: string): void;
21
+ start(): Promise<void>;
22
+ stop(showProgress?: boolean): Promise<void>;
23
+ updateProjectNodes(): Promise<void>;
24
+ uploadProject(): Promise<void>;
25
+ addStateListener<K extends keyof LocalDevState>(key: K, listener: LocalDevStateListener<K>): void;
26
+ }
27
+ export default LocalDevProcess;
@@ -0,0 +1,171 @@
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 project_parsing_lib_1 = require("@hubspot/project-parsing-lib");
7
+ const path_1 = __importDefault(require("path"));
8
+ const LocalDevState_1 = __importDefault(require("./LocalDevState"));
9
+ const LocalDevLogger_1 = __importDefault(require("./LocalDevLogger"));
10
+ const DevServerManagerV2_1 = __importDefault(require("./DevServerManagerV2"));
11
+ const exitCodes_1 = require("../../enums/exitCodes");
12
+ const transform_1 = require("@hubspot/project-parsing-lib/src/lib/transform");
13
+ const config_1 = require("../config");
14
+ const upload_1 = require("../upload");
15
+ const buildAndDeploy_1 = require("../buildAndDeploy");
16
+ class LocalDevProcess {
17
+ state;
18
+ _logger;
19
+ devServerManager;
20
+ constructor(options) {
21
+ this.state = new LocalDevState_1.default(options);
22
+ this._logger = new LocalDevLogger_1.default(this.state);
23
+ this.devServerManager = new DevServerManagerV2_1.default({
24
+ localDevState: this.state,
25
+ logger: this._logger,
26
+ });
27
+ }
28
+ get projectDir() {
29
+ return this.state.projectDir;
30
+ }
31
+ get projectNodes() {
32
+ return this.state.projectNodes;
33
+ }
34
+ get logger() {
35
+ return this._logger;
36
+ }
37
+ async setupDevServers() {
38
+ try {
39
+ await this.devServerManager.setup();
40
+ return true;
41
+ }
42
+ catch (e) {
43
+ this.logger.devServerSetupError(e);
44
+ return false;
45
+ }
46
+ }
47
+ async startDevServers() {
48
+ try {
49
+ await this.devServerManager.start();
50
+ }
51
+ catch (e) {
52
+ this.logger.devServerStartError(e);
53
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
54
+ }
55
+ }
56
+ async cleanupDevServers() {
57
+ try {
58
+ await this.devServerManager.cleanup();
59
+ return true;
60
+ }
61
+ catch (e) {
62
+ this.logger.devServerCleanupError(e);
63
+ return false;
64
+ }
65
+ }
66
+ compareLocalProjectToDeployed() {
67
+ const deployedComponentNames = this.state.deployedBuild.subbuildStatuses.map(subbuildStatus => subbuildStatus.buildName);
68
+ const missingProjectNodes = [];
69
+ Object.values(this.projectNodes).forEach(node => {
70
+ if (!deployedComponentNames.includes(node.uid)) {
71
+ const userFriendlyName = (0, transform_1.mapToUserFriendlyName)(node.componentType);
72
+ const label = userFriendlyName ? `[${userFriendlyName}] ` : '';
73
+ missingProjectNodes.push(`${label}${node.uid}`);
74
+ }
75
+ });
76
+ if (missingProjectNodes.length) {
77
+ this.logger.missingComponentsWarning(missingProjectNodes);
78
+ }
79
+ }
80
+ async projectConfigValidForUpload() {
81
+ const { projectConfig } = await (0, config_1.getProjectConfig)();
82
+ if (!projectConfig) {
83
+ return false;
84
+ }
85
+ Object.keys(projectConfig).forEach(key => {
86
+ const field = key;
87
+ if (projectConfig[field] !== this.state.projectConfig[field]) {
88
+ return false;
89
+ }
90
+ });
91
+ return true;
92
+ }
93
+ handleFileChange(filePath, event) {
94
+ try {
95
+ this.devServerManager.fileChange({ filePath, event });
96
+ }
97
+ catch (e) {
98
+ this.logger.fileChangeError(e);
99
+ }
100
+ }
101
+ async start() {
102
+ this.logger.resetSpinnies();
103
+ // Local dev currently relies on the existence of a deployed build in the target account
104
+ if (!this.state.deployedBuild) {
105
+ this.logger.noDeployedBuild();
106
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
107
+ }
108
+ const setupSucceeded = await this.setupDevServers();
109
+ if (!setupSucceeded) {
110
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
111
+ }
112
+ this.logger.startupMessage();
113
+ await this.startDevServers();
114
+ this.logger.monitorConsoleOutput();
115
+ // Verify that there are no mismatches between components in the local project
116
+ // and components in the deployed build of the project.
117
+ this.compareLocalProjectToDeployed();
118
+ }
119
+ async stop(showProgress = true) {
120
+ if (showProgress) {
121
+ this.logger.cleanupStart();
122
+ }
123
+ const cleanupSucceeded = await this.cleanupDevServers();
124
+ if (!cleanupSucceeded) {
125
+ if (showProgress) {
126
+ this.logger.cleanupError();
127
+ }
128
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
129
+ }
130
+ if (showProgress) {
131
+ this.logger.cleanupSuccess();
132
+ }
133
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
134
+ }
135
+ async updateProjectNodes() {
136
+ const intermediateRepresentation = await (0, project_parsing_lib_1.translateForLocalDev)({
137
+ projectSourceDir: path_1.default.join(this.state.projectDir, this.state.projectConfig.srcDir),
138
+ platformVersion: this.state.projectConfig.platformVersion,
139
+ accountId: this.state.targetProjectAccountId,
140
+ });
141
+ this.state.projectNodes =
142
+ intermediateRepresentation.intermediateNodesIndexedByUid;
143
+ }
144
+ async uploadProject() {
145
+ this.logger.uploadInitiated();
146
+ const isUploadable = await this.projectConfigValidForUpload();
147
+ if (!isUploadable) {
148
+ this.logger.projectConfigMismatch();
149
+ return;
150
+ }
151
+ const { uploadError } = await (0, upload_1.handleProjectUpload)({
152
+ accountId: this.state.targetProjectAccountId,
153
+ projectConfig: this.state.projectConfig,
154
+ projectDir: this.state.projectDir,
155
+ callbackFunc: buildAndDeploy_1.pollProjectBuildAndDeploy,
156
+ sendIR: true,
157
+ skipValidation: true,
158
+ });
159
+ if (uploadError) {
160
+ this.logger.uploadError(uploadError);
161
+ }
162
+ else {
163
+ this.logger.uploadSuccess();
164
+ this.logger.clearUploadWarnings();
165
+ }
166
+ }
167
+ addStateListener(key, listener) {
168
+ this.state.addListener(key, listener);
169
+ }
170
+ }
171
+ exports.default = LocalDevProcess;