@hubspot/cli 7.4.7-experimental.0 → 7.4.7

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 (225) hide show
  1. package/api/migrate.d.ts +14 -4
  2. package/api/migrate.js +16 -2
  3. package/bin/cli.js +8 -183
  4. package/commands/account/auth.d.ts +10 -0
  5. package/commands/account/auth.js +188 -0
  6. package/commands/account/clean.js +38 -5
  7. package/commands/account/createOverride.d.ts +10 -0
  8. package/commands/account/createOverride.js +104 -0
  9. package/commands/account/info.js +38 -4
  10. package/commands/account/list.js +23 -5
  11. package/commands/account/remove.js +36 -2
  12. package/commands/account/removeOverride.d.ts +10 -0
  13. package/commands/account/removeOverride.js +76 -0
  14. package/commands/account/use.js +25 -3
  15. package/commands/account.js +7 -2
  16. package/commands/app/migrate.d.ts +6 -6
  17. package/commands/app/migrate.js +62 -45
  18. package/commands/app.js +0 -2
  19. package/commands/auth.js +14 -11
  20. package/commands/cms/lighthouseScore.js +7 -3
  21. package/commands/cms.js +1 -2
  22. package/commands/completion.js +2 -3
  23. package/commands/config/migrate.d.ts +10 -0
  24. package/commands/config/migrate.js +84 -0
  25. package/commands/config/set.d.ts +10 -0
  26. package/commands/config/set.js +34 -29
  27. package/commands/config.d.ts +4 -1
  28. package/commands/config.js +45 -11
  29. package/commands/create/api-sample.js +3 -1
  30. package/commands/create/website-theme.js +1 -1
  31. package/commands/create.js +7 -8
  32. package/commands/customObject/schema/delete.js +4 -1
  33. package/commands/customObject/schema/fetch-all.js +2 -1
  34. package/commands/customObject/schema/fetch.js +2 -1
  35. package/commands/customObject.js +3 -4
  36. package/commands/doctor.js +5 -6
  37. package/commands/feedback.js +7 -8
  38. package/commands/fetch.js +6 -7
  39. package/commands/filemanager.js +1 -2
  40. package/commands/function.js +1 -2
  41. package/commands/hubdb/clear.js +5 -6
  42. package/commands/hubdb/create.js +7 -8
  43. package/commands/hubdb/delete.js +8 -7
  44. package/commands/hubdb/fetch.js +4 -5
  45. package/commands/hubdb.js +1 -2
  46. package/commands/init.js +18 -20
  47. package/commands/lint.js +3 -4
  48. package/commands/list.js +5 -6
  49. package/commands/logs.js +12 -13
  50. package/commands/module/marketplace-validate.js +5 -6
  51. package/commands/module.js +1 -3
  52. package/commands/mv.js +4 -5
  53. package/commands/open.js +4 -5
  54. package/commands/project/add.d.ts +3 -7
  55. package/commands/project/add.js +28 -23
  56. package/commands/project/cloneApp.d.ts +6 -8
  57. package/commands/project/cloneApp.js +49 -45
  58. package/commands/project/create.d.ts +10 -1
  59. package/commands/project/create.js +85 -63
  60. package/commands/project/deploy.d.ts +3 -6
  61. package/commands/project/deploy.js +27 -25
  62. package/commands/project/dev/deprecatedFlow.js +32 -25
  63. package/commands/project/dev/index.d.ts +4 -2
  64. package/commands/project/dev/index.js +31 -18
  65. package/commands/project/dev/unifiedFlow.js +10 -11
  66. package/commands/project/download.d.ts +3 -7
  67. package/commands/project/download.js +18 -19
  68. package/commands/project/installDeps.d.ts +6 -1
  69. package/commands/project/installDeps.js +48 -32
  70. package/commands/project/listBuilds.d.ts +3 -7
  71. package/commands/project/listBuilds.js +32 -27
  72. package/commands/project/logs.d.ts +10 -1
  73. package/commands/project/logs.js +73 -65
  74. package/commands/project/migrate.d.ts +6 -0
  75. package/commands/project/migrate.js +71 -0
  76. package/commands/project/migrateApp.d.ts +3 -8
  77. package/commands/project/migrateApp.js +23 -20
  78. package/commands/project/open.d.ts +3 -7
  79. package/commands/project/open.js +29 -21
  80. package/commands/project/upload.d.ts +9 -1
  81. package/commands/project/upload.js +78 -54
  82. package/commands/project/watch.d.ts +6 -1
  83. package/commands/project/watch.js +95 -61
  84. package/commands/project.d.ts +3 -1
  85. package/commands/project.js +47 -35
  86. package/commands/remove.js +7 -5
  87. package/commands/sandbox/create.js +10 -11
  88. package/commands/sandbox/delete.js +18 -19
  89. package/commands/sandbox.js +1 -2
  90. package/commands/secret/addSecret.js +5 -6
  91. package/commands/secret/deleteSecret.js +12 -9
  92. package/commands/secret/listSecret.js +3 -4
  93. package/commands/secret/updateSecret.js +9 -8
  94. package/commands/secret.js +1 -2
  95. package/commands/theme/generate-selectors.js +5 -6
  96. package/commands/theme/marketplace-validate.js +5 -6
  97. package/commands/theme/preview.js +16 -16
  98. package/commands/theme.js +1 -2
  99. package/commands/upload.js +23 -24
  100. package/commands/watch.js +18 -19
  101. package/lang/en.d.ts +2806 -0
  102. package/lang/en.js +2659 -3300
  103. package/lang/en.lyaml +98 -41
  104. package/lib/accountTypes.d.ts +1 -0
  105. package/lib/accountTypes.js +12 -0
  106. package/lib/app/migrate.d.ts +10 -4
  107. package/lib/app/migrate.js +208 -94
  108. package/lib/app/migrate_legacy.d.ts +2 -2
  109. package/lib/app/migrate_legacy.js +10 -7
  110. package/lib/buildAccount.d.ts +1 -2
  111. package/lib/buildAccount.js +11 -10
  112. package/lib/commonOpts.d.ts +3 -4
  113. package/lib/commonOpts.js +46 -18
  114. package/lib/configMigrate.d.ts +2 -0
  115. package/lib/configMigrate.js +104 -0
  116. package/lib/configOptions.js +11 -10
  117. package/lib/constants.d.ts +4 -0
  118. package/lib/constants.js +5 -1
  119. package/lib/dependencyManagement.js +2 -2
  120. package/lib/doctor/Diagnosis.d.ts +1 -2
  121. package/lib/doctor/Diagnosis.js +19 -16
  122. package/lib/doctor/DiagnosticInfoBuilder.d.ts +2 -1
  123. package/lib/doctor/DiagnosticInfoBuilder.js +10 -9
  124. package/lib/doctor/Doctor.d.ts +1 -0
  125. package/lib/doctor/Doctor.js +57 -44
  126. package/lib/errorHandlers/index.js +6 -7
  127. package/lib/errorHandlers/suppressError.js +6 -7
  128. package/lib/generateSelectors.js +1 -2
  129. package/lib/hasFeature.d.ts +3 -1
  130. package/lib/middleware/__test__/configMiddleware.test.d.ts +1 -0
  131. package/lib/middleware/__test__/configMiddleware.test.js +194 -0
  132. package/lib/middleware/__test__/gitMiddleware.test.d.ts +1 -0
  133. package/lib/middleware/__test__/gitMiddleware.test.js +76 -0
  134. package/lib/middleware/__test__/notificationsMiddleware.test.d.ts +1 -0
  135. package/lib/middleware/__test__/notificationsMiddleware.test.js +10 -0
  136. package/lib/middleware/__test__/requestMiddleware.test.d.ts +1 -0
  137. package/lib/middleware/__test__/requestMiddleware.test.js +20 -0
  138. package/lib/middleware/__test__/utils.test.d.ts +1 -0
  139. package/lib/middleware/__test__/utils.test.js +53 -0
  140. package/lib/middleware/__test__/yargsChecksMiddleware.test.d.ts +1 -0
  141. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +81 -0
  142. package/lib/middleware/configMiddleware.d.ts +13 -0
  143. package/lib/middleware/configMiddleware.js +116 -0
  144. package/lib/middleware/fireAlarmMiddleware.d.ts +4 -0
  145. package/lib/middleware/fireAlarmMiddleware.js +123 -0
  146. package/lib/middleware/gitMiddleware.d.ts +2 -0
  147. package/lib/middleware/gitMiddleware.js +14 -0
  148. package/lib/middleware/notificationsMiddleware.d.ts +1 -0
  149. package/lib/middleware/notificationsMiddleware.js +38 -0
  150. package/lib/middleware/requestMiddleware.d.ts +1 -0
  151. package/lib/middleware/requestMiddleware.js +11 -0
  152. package/lib/middleware/utils.d.ts +8 -0
  153. package/lib/middleware/utils.js +17 -0
  154. package/lib/middleware/yargsChecksMiddleware.d.ts +4 -0
  155. package/lib/middleware/yargsChecksMiddleware.js +24 -0
  156. package/lib/oauth.js +1 -2
  157. package/lib/process.js +1 -2
  158. package/lib/projects/ProjectLogsManager.d.ts +1 -1
  159. package/lib/projects/ProjectLogsManager.js +16 -21
  160. package/lib/projects/buildAndDeploy.js +28 -39
  161. package/lib/projects/config.d.ts +9 -0
  162. package/lib/projects/config.js +79 -0
  163. package/lib/projects/create.js +5 -6
  164. package/lib/projects/ensureProjectExists.d.ts +11 -0
  165. package/lib/projects/ensureProjectExists.js +97 -0
  166. package/lib/{DevServerManager.d.ts → projects/localDev/DevServerManager.d.ts} +1 -1
  167. package/lib/{DevServerManager.js → projects/localDev/DevServerManager.js} +6 -6
  168. package/lib/{DevServerManagerV2.d.ts → projects/localDev/DevServerManagerV2.d.ts} +1 -1
  169. package/lib/{DevServerManagerV2.js → projects/localDev/DevServerManagerV2.js} +3 -4
  170. package/lib/{LocalDevManager.d.ts → projects/localDev/LocalDevManager.d.ts} +1 -1
  171. package/lib/{LocalDevManager.js → projects/localDev/LocalDevManager.js} +49 -82
  172. package/lib/{LocalDevManagerV2.d.ts → projects/localDev/LocalDevManagerV2.d.ts} +2 -2
  173. package/lib/{LocalDevManagerV2.js → projects/localDev/LocalDevManagerV2.js} +43 -75
  174. package/lib/{localDev.d.ts → projects/localDev/helpers.d.ts} +5 -4
  175. package/lib/{localDev.js → projects/localDev/helpers.js} +97 -114
  176. package/lib/projects/ui.d.ts +1 -0
  177. package/lib/projects/ui.js +15 -0
  178. package/lib/projects/upload.d.ts +13 -2
  179. package/lib/projects/upload.js +18 -34
  180. package/lib/projects/urls.d.ts +1 -0
  181. package/lib/projects/urls.js +6 -0
  182. package/lib/projects/watch.d.ts +1 -1
  183. package/lib/projects/watch.js +21 -18
  184. package/lib/prompts/accountNamePrompt.js +16 -13
  185. package/lib/prompts/accountsPrompt.js +1 -2
  186. package/lib/prompts/cmsFieldPrompt.js +1 -2
  187. package/lib/prompts/createApiSamplePrompt.js +4 -5
  188. package/lib/prompts/createFunctionPrompt.js +13 -14
  189. package/lib/prompts/createModulePrompt.js +8 -9
  190. package/lib/prompts/createProjectPrompt.d.ts +11 -4
  191. package/lib/prompts/createProjectPrompt.js +14 -9
  192. package/lib/prompts/createTemplatePrompt.js +1 -2
  193. package/lib/prompts/downloadProjectPrompt.js +3 -4
  194. package/lib/prompts/installPublicAppPrompt.js +6 -5
  195. package/lib/prompts/personalAccessKeyPrompt.js +17 -18
  196. package/lib/prompts/previewPrompt.js +5 -6
  197. package/lib/prompts/projectAddPrompt.js +4 -5
  198. package/lib/prompts/projectDevTargetAccountPrompt.js +11 -12
  199. package/lib/prompts/projectNamePrompt.js +5 -6
  200. package/lib/prompts/projectsLogsPrompt.js +3 -2
  201. package/lib/prompts/promptUtils.d.ts +1 -1
  202. package/lib/prompts/sandboxesPrompt.js +5 -6
  203. package/lib/prompts/secretPrompt.js +2 -3
  204. package/lib/prompts/selectHubDBTablePrompt.js +11 -8
  205. package/lib/prompts/selectPublicAppPrompt.js +6 -7
  206. package/lib/prompts/setAsDefaultAccountPrompt.js +1 -2
  207. package/lib/prompts/uploadPrompt.js +4 -5
  208. package/lib/sandboxSync.js +15 -14
  209. package/lib/sandboxes.js +12 -13
  210. package/lib/serverlessLogs.js +4 -6
  211. package/lib/ui/SpinniesManager.d.ts +1 -1
  212. package/lib/ui/boxen.d.ts +5 -0
  213. package/lib/ui/boxen.js +30 -0
  214. package/lib/ui/git.js +8 -9
  215. package/lib/ui/index.d.ts +4 -2
  216. package/lib/ui/index.js +16 -16
  217. package/lib/ui/logger.d.ts +10 -0
  218. package/lib/ui/logger.js +15 -0
  219. package/lib/ui/serverlessFunctionLogs.js +2 -3
  220. package/lib/ui/spinniesUtils.d.ts +5 -5
  221. package/lib/yargsUtils.d.ts +1 -1
  222. package/package.json +7 -6
  223. package/types/Yargs.d.ts +5 -11
  224. package/lib/projects/index.d.ts +0 -20
  225. package/lib/projects/index.js +0 -195
@@ -23,7 +23,6 @@ const package_json_1 = __importDefault(require("../../package.json"));
23
23
  const { i18n } = require('../lang');
24
24
  const { uiLink } = require('../ui');
25
25
  const minMajorNodeVersion = 18;
26
- const i18nKey = `lib.doctor`;
27
26
  class Doctor {
28
27
  accountId;
29
28
  diagnosis;
@@ -37,7 +36,7 @@ class Doctor {
37
36
  }
38
37
  async diagnose() {
39
38
  SpinniesManager_1.default.add('runningDiagnostics', {
40
- text: i18n(`${i18nKey}.runningDiagnostics`),
39
+ text: i18n(`lib.doctor.runningDiagnostics`),
41
40
  });
42
41
  this.diagnosticInfo =
43
42
  await this.diagnosticInfoBuilder.generateDiagnosticInfo();
@@ -51,9 +50,10 @@ class Doctor {
51
50
  ...this.performCliConfigChecks(),
52
51
  ...(this.projectConfig?.projectConfig ? this.performProjectChecks() : []),
53
52
  ]);
53
+ this.performDefaultAccountOverrideFileChecks();
54
54
  this.performCliConfigSettingsChecks();
55
55
  SpinniesManager_1.default.succeed('runningDiagnostics', {
56
- text: i18n(`${i18nKey}.diagnosticsComplete`),
56
+ text: i18n(`lib.doctor.diagnosticsComplete`),
57
57
  succeedColor: 'white',
58
58
  });
59
59
  this.diagnosticInfo.diagnosis = this.diagnosis.toString();
@@ -79,8 +79,8 @@ class Doctor {
79
79
  if (!this.diagnosticInfo?.config) {
80
80
  this.diagnosis?.addCLIConfigSection({
81
81
  type: 'error',
82
- message: i18n(`${i18nKey}.diagnosis.cliConfig.noConfigFile`),
83
- secondaryMessaging: i18n(`${i18nKey}.diagnosis.cliConfig.noConfigFileSecondary`, {
82
+ message: i18n(`lib.doctor.diagnosis.cliConfig.noConfigFile`),
83
+ secondaryMessaging: i18n(`lib.doctor.diagnosis.cliConfig.noConfigFileSecondary`, {
84
84
  command: (0, ui_1.uiCommandReference)('hs init'),
85
85
  }),
86
86
  });
@@ -88,31 +88,46 @@ class Doctor {
88
88
  }
89
89
  return [this.checkIfAccessTokenValid()];
90
90
  }
91
+ performDefaultAccountOverrideFileChecks() {
92
+ if (this.diagnosticInfo?.defaultAccountOverrideFile) {
93
+ this.diagnosis?.addDefaultAccountOverrideFileSection({
94
+ type: 'warning',
95
+ message: i18n(`lib.doctor.defaultAccountOverrideFileChecks.overrideActive`, {
96
+ defaultAccountOverrideFile: this.diagnosticInfo.defaultAccountOverrideFile,
97
+ }),
98
+ });
99
+ this.diagnosis?.addDefaultAccountOverrideFileSection({
100
+ type: 'warning',
101
+ message: i18n(`lib.doctor.defaultAccountOverrideFileChecks.overrideAccountId`, {
102
+ overrideAccountId: (0, config_1.getCWDAccountOverride)(),
103
+ }),
104
+ });
105
+ }
106
+ }
91
107
  performCliConfigSettingsChecks() {
92
108
  if (this.diagnosticInfo?.configSettings.httpUseLocalhost) {
93
109
  this.diagnosis?.addCLIConfigSection({
94
110
  type: 'warning',
95
- message: i18n(`${i18nKey}.diagnosis.cliConfig.settings.httpUseLocalhost`),
96
- secondaryMessaging: i18n(`${i18nKey}.diagnosis.cliConfig.settings.httpUseLocalhostSecondary`),
111
+ message: i18n(`lib.doctor.diagnosis.cliConfig.settings.httpUseLocalhost`),
112
+ secondaryMessaging: i18n(`lib.doctor.diagnosis.cliConfig.settings.httpUseLocalhostSecondary`),
97
113
  });
98
114
  }
99
115
  }
100
116
  async checkIfAccessTokenValid() {
101
- const localI18nKey = `${i18nKey}.accountChecks`;
102
117
  try {
103
118
  await (0, personalAccessKey_1.accessTokenForPersonalAccessKey)(this.accountId, true);
104
119
  const pakScopes = new Set(await (0, personalAccessKey_1.scopesOnAccessToken)(this.accountId));
105
120
  const missingScopes = (await (0, personalAccessKey_1.authorizedScopesForPortalAndUser)(this.accountId)).filter((data) => data.userAuthorized && !pakScopes.has(data.scopeGroup.name));
106
121
  this.diagnosis?.addCLIConfigSection({
107
122
  type: 'success',
108
- message: i18n(`${localI18nKey}.active`),
123
+ message: i18n(`lib.doctor.accountChecks.active`),
109
124
  });
110
- const linkToPakUI = uiLink(i18n(`${localI18nKey}.pak.viewScopes`), `${(0, urls_1.getHubSpotWebsiteOrigin)(this.diagnosticInfoBuilder?.env || 'PROD')}/personal-access-key/${this.diagnosticInfo?.account.accountId}`);
125
+ const linkToPakUI = uiLink(i18n(`lib.doctor.accountChecks.pak.viewScopes`), `${(0, urls_1.getHubSpotWebsiteOrigin)(this.diagnosticInfoBuilder?.env || 'PROD')}/personal-access-key/${this.diagnosticInfo?.account.accountId}`);
111
126
  if (missingScopes.length > 0) {
112
127
  this.diagnosis?.addCLIConfigSection({
113
128
  type: 'warning',
114
- message: i18n(`${localI18nKey}.pak.incomplete`),
115
- secondaryMessaging: i18n(`${localI18nKey}.pak.incompleteSecondary`, {
129
+ message: i18n(`lib.doctor.accountChecks.pak.incomplete`),
130
+ secondaryMessaging: i18n(`lib.doctor.accountChecks.pak.incompleteSecondary`, {
116
131
  command: (0, ui_1.uiCommandReference)(`hs auth`),
117
132
  link: linkToPakUI,
118
133
  }),
@@ -121,7 +136,9 @@ class Doctor {
121
136
  else {
122
137
  this.diagnosis?.addCLIConfigSection({
123
138
  type: 'success',
124
- message: i18n(`${localI18nKey}.pak.valid`, { link: linkToPakUI }),
139
+ message: i18n(`lib.doctor.accountChecks.pak.valid`, {
140
+ link: linkToPakUI,
141
+ }),
125
142
  });
126
143
  }
127
144
  }
@@ -139,8 +156,8 @@ class Doctor {
139
156
  if (portalNotActive) {
140
157
  this.diagnosis?.addCLIConfigSection({
141
158
  type: 'error',
142
- message: i18n(`${localI18nKey}.inactive`),
143
- secondaryMessaging: i18n(`${localI18nKey}.inactiveSecondary`, {
159
+ message: i18n(`lib.doctor.accountChecks.inactive`),
160
+ secondaryMessaging: i18n(`lib.doctor.accountChecks.inactiveSecondary`, {
144
161
  command: (0, ui_1.uiCommandReference)(`hs accounts clean`),
145
162
  }),
146
163
  });
@@ -152,12 +169,12 @@ class Doctor {
152
169
  })) {
153
170
  this.diagnosis?.addCLIConfigSection({
154
171
  type: 'success',
155
- message: i18n(`${localI18nKey}.active`),
172
+ message: i18n(`lib.doctor.accountChecks.active`),
156
173
  });
157
174
  this.diagnosis?.addCLIConfigSection({
158
175
  type: 'error',
159
- message: i18n(`${localI18nKey}.pak.invalid`),
160
- secondaryMessaging: i18n(`${localI18nKey}.pak.invalidSecondary`, {
176
+ message: i18n(`lib.doctor.accountChecks.pak.invalid`),
177
+ secondaryMessaging: i18n(`lib.doctor.accountChecks.pak.invalidSecondary`, {
161
178
  command: (0, ui_1.uiCommandReference)(`hs auth`),
162
179
  }),
163
180
  });
@@ -165,17 +182,16 @@ class Doctor {
165
182
  else {
166
183
  this.diagnosis?.addCLIConfigSection({
167
184
  type: 'error',
168
- message: i18n(`${localI18nKey}.unableToDetermine`),
185
+ message: i18n(`lib.doctor.accountChecks.unableToDetermine`),
169
186
  });
170
187
  }
171
188
  }
172
189
  }
173
190
  async checkIfNodeIsInstalled() {
174
- const localI18nKey = `${i18nKey}.nodeChecks`;
175
191
  if (!this.diagnosticInfo?.versions.node) {
176
192
  return this.diagnosis?.addCliSection({
177
193
  type: 'error',
178
- message: i18n(`${localI18nKey}.unableToDetermine`),
194
+ message: i18n(`lib.doctor.nodeChecks.unableToDetermine`),
179
195
  });
180
196
  }
181
197
  const nodeVersion = this.diagnosticInfo?.versions.node?.split('.');
@@ -183,30 +199,29 @@ class Doctor {
183
199
  if (!currentNodeMajor || parseInt(currentNodeMajor) < minMajorNodeVersion) {
184
200
  return this.diagnosis?.addCliSection({
185
201
  type: 'warning',
186
- message: i18n(`${localI18nKey}.minimumNotMet`, {
202
+ message: i18n(`lib.doctor.nodeChecks.minimumNotMet`, {
187
203
  nodeVersion: this.diagnosticInfo?.versions.node,
188
204
  }),
189
205
  });
190
206
  }
191
207
  this.diagnosis?.addCliSection({
192
208
  type: 'success',
193
- message: i18n(`${localI18nKey}.success`, {
209
+ message: i18n(`lib.doctor.nodeChecks.success`, {
194
210
  nodeVersion: this.diagnosticInfo?.versions.node,
195
211
  }),
196
212
  });
197
213
  }
198
214
  async checkIfNpmIsInstalled() {
199
- const localI18nKey = `${i18nKey}.npmChecks`;
200
215
  const npmVersion = this.diagnosticInfo?.versions?.npm;
201
216
  if (!npmVersion) {
202
217
  return this.diagnosis?.addCliSection({
203
218
  type: 'error',
204
- message: i18n(`${localI18nKey}.notInstalled`),
219
+ message: i18n(`lib.doctor.npmChecks.notInstalled`),
205
220
  });
206
221
  }
207
222
  this.diagnosis?.addCliSection({
208
223
  type: 'success',
209
- message: i18n(`${localI18nKey}.installed`, {
224
+ message: i18n(`lib.doctor.npmChecks.installed`, {
210
225
  npmVersion,
211
226
  }),
212
227
  });
@@ -222,10 +237,10 @@ class Doctor {
222
237
  catch (e) {
223
238
  return this.diagnosis?.addCliSection({
224
239
  type: 'error',
225
- message: i18n(`${i18nKey}.hsChecks.unableToDetermine`),
226
- secondaryMessaging: i18n(`${i18nKey}.hsChecks.unableToDetermineSecondary`, {
240
+ message: i18n(`lib.doctor.hsChecks.unableToDetermine`),
241
+ secondaryMessaging: i18n(`lib.doctor.hsChecks.unableToDetermineSecondary`, {
227
242
  command: (0, ui_1.uiCommandReference)(`hs --version`),
228
- link: uiLink(i18n(`${i18nKey}.hsChecks.unableToDetermineSecondaryLink`), `https://www.npmjs.com/package/${package_json_1.default.name}?activeTab=versions`),
243
+ link: uiLink(i18n(`lib.doctor.hsChecks.unableToDetermineSecondaryLink`), `https://www.npmjs.com/package/${package_json_1.default.name}?activeTab=versions`),
229
244
  }),
230
245
  });
231
246
  }
@@ -233,10 +248,10 @@ class Doctor {
233
248
  const onNextTag = package_json_1.default.version.includes('beta');
234
249
  this.diagnosis?.addCliSection({
235
250
  type: 'warning',
236
- message: i18n(`${i18nKey}.hsChecks.notLatest`, {
251
+ message: i18n(`lib.doctor.hsChecks.notLatest`, {
237
252
  hsVersion: package_json_1.default.version,
238
253
  }),
239
- secondaryMessaging: i18n(`${i18nKey}.hsChecks.notLatestSecondary`, {
254
+ secondaryMessaging: i18n(`lib.doctor.hsChecks.notLatestSecondary`, {
240
255
  hsVersion: onNextTag ? nextCliVersion : latestCLIVersion,
241
256
  command: (0, ui_1.uiCommandReference)(`npm install -g ${package_json_1.default.name}`),
242
257
  }),
@@ -245,7 +260,7 @@ class Doctor {
245
260
  else {
246
261
  this.diagnosis?.addCliSection({
247
262
  type: 'success',
248
- message: i18n(`${i18nKey}.hsChecks.latest`, {
263
+ message: i18n(`lib.doctor.hsChecks.latest`, {
249
264
  hsVersion: latestCLIVersion,
250
265
  }),
251
266
  });
@@ -253,7 +268,6 @@ class Doctor {
253
268
  }
254
269
  async checkIfNpmInstallRequired() {
255
270
  let foundError = false;
256
- const localI18nKey = `${i18nKey}.projectDependenciesChecks`;
257
271
  for (const packageFile of this.diagnosticInfo?.packageFiles || []) {
258
272
  const packageDirName = path_1.default.dirname(packageFile);
259
273
  try {
@@ -262,10 +276,10 @@ class Doctor {
262
276
  foundError = true;
263
277
  this.diagnosis?.addProjectSection({
264
278
  type: 'warning',
265
- message: i18n(`${localI18nKey}.missingDependencies`, {
279
+ message: i18n(`lib.doctor.projectDependenciesChecks.missingDependencies`, {
266
280
  dir: packageDirName,
267
281
  }),
268
- secondaryMessaging: i18n(`${localI18nKey}.missingDependenciesSecondary`, {
282
+ secondaryMessaging: i18n(`lib.doctor.projectDependenciesChecks.missingDependenciesSecondary`, {
269
283
  command: (0, ui_1.uiCommandReference)('hs project install-deps'),
270
284
  }),
271
285
  });
@@ -276,7 +290,7 @@ class Doctor {
276
290
  if (!(await this.isValidJsonFile(packageFile))) {
277
291
  this.diagnosis?.addProjectSection({
278
292
  type: 'error',
279
- message: i18n(`${i18nKey}.files.invalidJson`, {
293
+ message: i18n(`lib.doctor.files.invalidJson`, {
280
294
  filename: packageFile,
281
295
  }),
282
296
  });
@@ -284,7 +298,7 @@ class Doctor {
284
298
  else {
285
299
  this.diagnosis?.addProjectSection({
286
300
  type: 'error',
287
- message: i18n(`${localI18nKey}.unableToDetermine`, {
301
+ message: i18n(`lib.doctor.projectDependenciesChecks.unableToDetermine`, {
288
302
  dir: packageDirName,
289
303
  }),
290
304
  });
@@ -295,7 +309,7 @@ class Doctor {
295
309
  if (!foundError) {
296
310
  this.diagnosis?.addProjectSection({
297
311
  type: 'success',
298
- message: i18n(`${localI18nKey}.success`),
312
+ message: i18n(`lib.doctor.projectDependenciesChecks.success`),
299
313
  });
300
314
  }
301
315
  }
@@ -318,7 +332,7 @@ class Doctor {
318
332
  foundError = true;
319
333
  this.diagnosis?.addProjectSection({
320
334
  type: 'error',
321
- message: i18n(`${i18nKey}.files.invalidJson`, {
335
+ message: i18n(`lib.doctor.files.invalidJson`, {
322
336
  filename: jsonFile,
323
337
  }),
324
338
  });
@@ -327,16 +341,15 @@ class Doctor {
327
341
  if (!foundError) {
328
342
  this.diagnosis?.addProjectSection({
329
343
  type: 'success',
330
- message: i18n(`${i18nKey}.files.validJson`),
344
+ message: i18n(`lib.doctor.files.validJson`),
331
345
  });
332
346
  }
333
347
  }
334
348
  async checkIfPortsAreAvailable() {
335
- const localI18nKey = `${i18nKey}.port`;
336
349
  if (await (0, portManager_1.isPortManagerPortAvailable)()) {
337
350
  this.diagnosis?.addProjectSection({
338
351
  type: 'success',
339
- message: i18n(`${localI18nKey}.available`, {
352
+ message: i18n(`lib.doctor.port.available`, {
340
353
  port: ports_1.PORT_MANAGER_SERVER_PORT,
341
354
  }),
342
355
  });
@@ -344,10 +357,10 @@ class Doctor {
344
357
  }
345
358
  this.diagnosis?.addProjectSection({
346
359
  type: 'warning',
347
- message: i18n(`${localI18nKey}.inUse`, {
360
+ message: i18n(`lib.doctor.port.inUse`, {
348
361
  port: ports_1.PORT_MANAGER_SERVER_PORT,
349
362
  }),
350
- secondaryMessaging: i18n(`${localI18nKey}.inUseSecondary`, {
363
+ secondaryMessaging: i18n(`lib.doctor.port.inUseSecondary`, {
351
364
  command: (0, ui_1.uiCommandReference)('hs project dev'),
352
365
  }),
353
366
  });
@@ -13,7 +13,6 @@ const suppressError_1 = require("./suppressError");
13
13
  const lang_1 = require("../lang");
14
14
  const util_1 = __importDefault(require("util"));
15
15
  const ui_1 = require("../ui");
16
- const i18nKey = 'lib.errorHandlers.index';
17
16
  function logError(error, context) {
18
17
  debugError(error, context);
19
18
  if ((0, suppressError_1.shouldSuppressError)(error, context)) {
@@ -41,21 +40,21 @@ function logError(error, context) {
41
40
  }
42
41
  else {
43
42
  // Unknown errors
44
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.unknownErrorOccurred`));
43
+ logger_1.logger.error((0, lang_1.i18n)(`lib.errorHandlers.index.unknownErrorOccurred`));
45
44
  }
46
45
  if ((0, index_1.isHubSpotHttpError)(error) && error.code === 'ETIMEDOUT') {
47
46
  const config = (0, config_1.getConfig)();
48
47
  const defaultTimeout = config?.httpTimeout;
49
48
  // Timeout was caused by the default timeout
50
49
  if (error.timeout && defaultTimeout === error.timeout) {
51
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.configTimeoutErrorOccurred`, {
50
+ logger_1.logger.error((0, lang_1.i18n)(`lib.errorHandlers.index.configTimeoutErrorOccurred`, {
52
51
  timeout: error.timeout,
53
52
  configSetCommand: (0, ui_1.uiCommandReference)('hs config set'),
54
53
  }));
55
54
  }
56
55
  // Timeout was caused by a custom timeout set by the CLI or LDL
57
56
  else {
58
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.genericTimeoutErrorOccurred`));
57
+ logger_1.logger.error((0, lang_1.i18n)(`lib.errorHandlers.index.genericTimeoutErrorOccurred`));
59
58
  }
60
59
  }
61
60
  }
@@ -64,15 +63,15 @@ function debugError(error, context) {
64
63
  logger_1.logger.debug(error.toString());
65
64
  }
66
65
  else {
67
- logger_1.logger.debug((0, lang_1.i18n)(`${i18nKey}.errorOccurred`, { error: String(error) }));
66
+ logger_1.logger.debug((0, lang_1.i18n)(`lib.errorHandlers.index.errorOccurred`, { error: String(error) }));
68
67
  }
69
68
  if (error instanceof Error && error.cause && !(0, index_1.isHubSpotHttpError)(error)) {
70
- logger_1.logger.debug((0, lang_1.i18n)(`${i18nKey}.errorCause`, {
69
+ logger_1.logger.debug((0, lang_1.i18n)(`lib.errorHandlers.index.errorCause`, {
71
70
  cause: util_1.default.inspect(error.cause, false, null, true),
72
71
  }));
73
72
  }
74
73
  if (context) {
75
- logger_1.logger.debug((0, lang_1.i18n)(`${i18nKey}.errorContext`, {
74
+ logger_1.logger.debug((0, lang_1.i18n)(`lib.errorHandlers.index.errorContext`, {
76
75
  context: util_1.default.inspect(context, false, null, true),
77
76
  }));
78
77
  }
@@ -6,7 +6,6 @@ const logger_1 = require("@hubspot/local-dev-lib/logger");
6
6
  const constants_1 = require("../constants");
7
7
  const lang_1 = require("../lang");
8
8
  const ui_1 = require("../ui");
9
- const i18nKey = 'lib.errorHandlers.suppressErrors';
10
9
  function createPlatformVersionError(err, subCategory) {
11
10
  let translationKey = 'unspecifiedPlatformVersion';
12
11
  let platformVersion = 'unspecified platformVersion';
@@ -28,19 +27,19 @@ function createPlatformVersionError(err, subCategory) {
28
27
  break;
29
28
  }
30
29
  (0, ui_1.uiLine)();
31
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.platformVersionErrors.header`));
32
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.platformVersionErrors.${translationKey}`, {
30
+ logger_1.logger.error((0, lang_1.i18n)(`lib.errorHandlers.suppressErrors.platformVersionErrors.header`));
31
+ logger_1.logger.log((0, lang_1.i18n)(`lib.errorHandlers.suppressErrors.platformVersionErrors.${translationKey}`, {
33
32
  platformVersion,
34
33
  }));
35
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.platformVersionErrors.updateProject`));
36
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.platformVersionErrors.betaLink`, {
37
- docsLink: (0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.platformVersionErrors.docsLink`), 'https://developers.hubspot.com/docs/platform/platform-versioning'),
34
+ logger_1.logger.log((0, lang_1.i18n)(`lib.errorHandlers.suppressErrors.platformVersionErrors.updateProject`));
35
+ logger_1.logger.log((0, lang_1.i18n)(`lib.errorHandlers.suppressErrors.platformVersionErrors.betaLink`, {
36
+ docsLink: (0, ui_1.uiLink)((0, lang_1.i18n)(`lib.errorHandlers.suppressErrors.platformVersionErrors.docsLink`), 'https://developers.hubspot.com/docs/platform/platform-versioning'),
38
37
  }));
39
38
  (0, ui_1.uiLine)();
40
39
  }
41
40
  function shouldSuppressError(err, context) {
42
41
  if ((0, index_1.isMissingScopeError)(err)) {
43
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.missingScopeError`, {
42
+ logger_1.logger.error((0, lang_1.i18n)(`lib.errorHandlers.suppressErrors.missingScopeError`, {
44
43
  accountName: context?.accountId
45
44
  ? (0, ui_1.uiAccountDescription)(context.accountId)
46
45
  : '',
@@ -15,7 +15,6 @@ const exitCodes_1 = require("./enums/exitCodes");
15
15
  const lang_1 = require("./lang");
16
16
  const CSS_COMMENTS_REGEX = new RegExp(/\/\*.*\*\//, 'g');
17
17
  const CSS_PSEUDO_CLASS_REGEX = new RegExp(/:active|:checked|:disabled|:empty|:enabled|:first-of-type|:focus|:hover|:in-range|:invalid|:link|:optional|:out-of-range|:read-only|:read-write|:required|:target|:valid|:visited/, 'g');
18
- const i18nKey = 'commands.theme.subcommands.generateSelectors';
19
18
  let maxFieldsDepth = 0;
20
19
  function getMaxFieldsDepth() {
21
20
  return maxFieldsDepth;
@@ -23,7 +22,7 @@ function getMaxFieldsDepth() {
23
22
  function findFieldsJsonPath(basePath) {
24
23
  const _path = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;
25
24
  if (!fs_1.default.existsSync(_path)) {
26
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.invalidPath`, {
25
+ logger_1.logger.error((0, lang_1.i18n)(`commands.theme.subcommands.generateSelectors.errors.invalidPath`, {
27
26
  themePath: basePath,
28
27
  }));
29
28
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
@@ -1 +1,3 @@
1
- export declare function hasFeature(accountId: number, feature: string): Promise<boolean>;
1
+ import { FEATURES } from './constants';
2
+ import { ValueOf } from '@hubspot/local-dev-lib/types/Utils';
3
+ export declare function hasFeature(accountId: number, feature: ValueOf<typeof FEATURES>): Promise<boolean>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const logger_1 = require("@hubspot/local-dev-lib/logger");
37
+ const cliConfig = __importStar(require("@hubspot/local-dev-lib/config"));
38
+ const validation = __importStar(require("../../validation"));
39
+ const exitCodes_1 = require("../../enums/exitCodes");
40
+ const configMiddleware_1 = require("../configMiddleware");
41
+ jest.mock('@hubspot/local-dev-lib/logger', () => ({
42
+ logger: {
43
+ error: jest.fn(),
44
+ log: jest.fn(),
45
+ },
46
+ }));
47
+ jest.mock('@hubspot/local-dev-lib/config');
48
+ jest.mock('../../validation');
49
+ const validateAccountSpy = jest.spyOn(validation, 'validateAccount');
50
+ const loadConfigSpy = jest.spyOn(cliConfig, 'loadConfig');
51
+ const getAccountIdSpy = jest.spyOn(cliConfig, 'getAccountId');
52
+ const configFileExistsSpy = jest.spyOn(cliConfig, 'configFileExists');
53
+ const getConfigPathSpy = jest.spyOn(cliConfig, 'getConfigPath');
54
+ const validateConfigSpy = jest.spyOn(cliConfig, 'validateConfig');
55
+ const processExitSpy = jest.spyOn(process, 'exit');
56
+ describe('lib/middleware/configMiddleware', () => {
57
+ beforeEach(() => {
58
+ processExitSpy.mockImplementation(code => {
59
+ throw new Error(`Process.exit called with code ${code}`);
60
+ });
61
+ getConfigPathSpy.mockReturnValue('/path/to/config');
62
+ });
63
+ describe('handleDeprecatedEnvVariables()', () => {
64
+ it('should handle deprecated HUBSPOT_PORTAL_ID environment variable', () => {
65
+ const originalEnv = process.env;
66
+ process.env = {
67
+ ...originalEnv,
68
+ HUBSPOT_PORTAL_ID: '123',
69
+ HUBSPOT_ACCOUNT_ID: undefined,
70
+ };
71
+ const argv = {
72
+ _: ['some-command'],
73
+ useEnv: true,
74
+ $0: 'hs',
75
+ };
76
+ (0, configMiddleware_1.handleDeprecatedEnvVariables)(argv);
77
+ expect(logger_1.logger.log).toHaveBeenCalledWith(expect.stringContaining('The HUBSPOT_PORTAL_ID environment variable is deprecated. Please use HUBSPOT_ACCOUNT_ID instead.'));
78
+ expect(process.env.HUBSPOT_ACCOUNT_ID).toBe('123');
79
+ process.env = originalEnv;
80
+ });
81
+ it('should not handle HUBSPOT_PORTAL_ID if HUBSPOT_ACCOUNT_ID is set', () => {
82
+ const originalEnv = process.env;
83
+ process.env = {
84
+ ...originalEnv,
85
+ HUBSPOT_PORTAL_ID: '123',
86
+ HUBSPOT_ACCOUNT_ID: '456',
87
+ };
88
+ const argv = {
89
+ _: ['some-command'],
90
+ useEnv: true,
91
+ $0: 'hs',
92
+ };
93
+ (0, configMiddleware_1.handleDeprecatedEnvVariables)(argv);
94
+ expect(logger_1.logger.log).not.toHaveBeenCalled();
95
+ expect(process.env.HUBSPOT_ACCOUNT_ID).toBe('456');
96
+ process.env = originalEnv;
97
+ });
98
+ });
99
+ describe('injectAccountIdMiddleware()', () => {
100
+ it('should use HUBSPOT_ACCOUNT_ID from environment when useEnv is true', async () => {
101
+ const originalEnv = process.env;
102
+ process.env = {
103
+ ...originalEnv,
104
+ HUBSPOT_ACCOUNT_ID: '123',
105
+ };
106
+ const argv = {
107
+ _: ['some-command'],
108
+ useEnv: true,
109
+ $0: 'hs',
110
+ };
111
+ await (0, configMiddleware_1.injectAccountIdMiddleware)(argv);
112
+ expect(argv.providedAccountId).toBeUndefined();
113
+ expect(argv.derivedAccountId).toBe(123);
114
+ expect(getAccountIdSpy).not.toHaveBeenCalled();
115
+ process.env = originalEnv;
116
+ });
117
+ it('should use getAccountId when useEnv is false', async () => {
118
+ getAccountIdSpy.mockReturnValue(456);
119
+ const argv = {
120
+ _: ['some-command'],
121
+ account: 'test-account',
122
+ useEnv: false,
123
+ $0: 'hs',
124
+ };
125
+ await (0, configMiddleware_1.injectAccountIdMiddleware)(argv);
126
+ expect(argv.providedAccountId).toBe('test-account');
127
+ expect(argv.derivedAccountId).toBe(456);
128
+ expect(getAccountIdSpy).toHaveBeenCalledWith('test-account');
129
+ });
130
+ });
131
+ describe('loadConfigMiddleware()', () => {
132
+ it('should exit with error when config file exists and --config flag is used', async () => {
133
+ configFileExistsSpy.mockReturnValue(true);
134
+ const argv = {
135
+ _: ['some-command'],
136
+ config: 'custom-config.json',
137
+ $0: 'hs',
138
+ };
139
+ await expect((0, configMiddleware_1.loadConfigMiddleware)(argv)).rejects.toThrow();
140
+ expect(processExitSpy).toHaveBeenCalledWith(exitCodes_1.EXIT_CODES.ERROR);
141
+ expect(logger_1.logger.error).toHaveBeenCalledWith('A configuration file already exists at /path/to/config. To specify a new configuration file, delete the existing one and try again.');
142
+ });
143
+ it('should load config and validate for non-init commands', async () => {
144
+ configFileExistsSpy.mockReturnValue(false);
145
+ loadConfigSpy.mockReturnValue({});
146
+ validateConfigSpy.mockReturnValue(true);
147
+ const argv = {
148
+ _: ['some-command'],
149
+ $0: 'hs',
150
+ };
151
+ await (0, configMiddleware_1.loadConfigMiddleware)(argv);
152
+ expect(loadConfigSpy).toHaveBeenCalled();
153
+ expect(validateConfigSpy).toHaveBeenCalled();
154
+ });
155
+ it('should skip validation for init command', async () => {
156
+ configFileExistsSpy.mockReturnValue(false);
157
+ const argv = {
158
+ _: ['init'],
159
+ $0: 'hs',
160
+ };
161
+ await (0, configMiddleware_1.loadConfigMiddleware)(argv);
162
+ expect(loadConfigSpy).not.toHaveBeenCalled();
163
+ expect(validateConfigSpy).not.toHaveBeenCalled();
164
+ });
165
+ });
166
+ describe('validateAccountOptions()', () => {
167
+ it('should validate account for non-skipped commands', async () => {
168
+ validateAccountSpy.mockResolvedValue(true);
169
+ const argv = {
170
+ _: ['some-command'],
171
+ $0: 'hs',
172
+ };
173
+ await (0, configMiddleware_1.validateAccountOptions)(argv);
174
+ expect(validateAccountSpy).toHaveBeenCalledWith(argv);
175
+ });
176
+ it('should skip validation for init command', async () => {
177
+ const argv = {
178
+ _: ['init'],
179
+ $0: 'hs',
180
+ };
181
+ await (0, configMiddleware_1.validateAccountOptions)(argv);
182
+ expect(validateAccountSpy).not.toHaveBeenCalled();
183
+ });
184
+ it('should exit with error when account validation fails', async () => {
185
+ validateAccountSpy.mockResolvedValue(false);
186
+ const argv = {
187
+ _: ['some-command'],
188
+ $0: 'hs',
189
+ };
190
+ await expect((0, configMiddleware_1.validateAccountOptions)(argv)).rejects.toThrow();
191
+ expect(processExitSpy).toHaveBeenCalledWith(exitCodes_1.EXIT_CODES.ERROR);
192
+ });
193
+ });
194
+ });
@@ -0,0 +1 @@
1
+ export {};