@hubspot/cli 7.10.0 → 7.11.0-experimental.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/bin/cli.js +5 -4
  2. package/commands/__tests__/getStarted.test.js +10 -0
  3. package/commands/__tests__/project.test.js +3 -0
  4. package/commands/account/__tests__/rename.test.js +10 -3
  5. package/commands/account/auth.js +10 -14
  6. package/commands/account/clean.js +11 -19
  7. package/commands/account/createOverride.js +15 -11
  8. package/commands/account/info.js +8 -5
  9. package/commands/account/list.js +15 -19
  10. package/commands/account/remove.js +23 -22
  11. package/commands/account/removeOverride.js +6 -6
  12. package/commands/account/rename.js +2 -2
  13. package/commands/account/use.js +19 -8
  14. package/commands/app/__tests__/migrate.test.js +8 -4
  15. package/commands/app/migrate.js +2 -2
  16. package/commands/auth.js +18 -14
  17. package/commands/config/migrate.js +5 -5
  18. package/commands/customObject/createSchema.js +2 -3
  19. package/commands/customObject/updateSchema.js +2 -3
  20. package/commands/getStarted.js +2 -3
  21. package/commands/hubdb/__tests__/list.test.js +1 -0
  22. package/commands/hubdb/list.js +2 -2
  23. package/commands/init.js +36 -32
  24. package/commands/project/__tests__/deploy.test.js +15 -10
  25. package/commands/project/__tests__/devUnifiedFlow.test.js +6 -4
  26. package/commands/project/__tests__/lint.test.js +709 -0
  27. package/commands/project/__tests__/logs.test.js +4 -0
  28. package/commands/project/__tests__/validate.test.js +2 -2
  29. package/commands/project/cloneApp.js +2 -2
  30. package/commands/project/create.js +20 -14
  31. package/commands/project/deploy.js +2 -2
  32. package/commands/project/dev/deprecatedFlow.js +4 -5
  33. package/commands/project/dev/index.js +6 -3
  34. package/commands/project/dev/unifiedFlow.js +11 -6
  35. package/commands/project/lint.d.ts +6 -0
  36. package/commands/project/lint.js +178 -0
  37. package/commands/project/logs.js +2 -3
  38. package/commands/project/migrate.js +4 -13
  39. package/commands/project/profile/add.js +6 -7
  40. package/commands/project/profile/delete.js +2 -2
  41. package/commands/project/upload.js +2 -2
  42. package/commands/project/validate.js +2 -2
  43. package/commands/project.js +2 -0
  44. package/commands/sandbox/__tests__/create.test.js +14 -5
  45. package/commands/sandbox/create.js +4 -5
  46. package/commands/sandbox/delete.js +23 -20
  47. package/commands/testAccount/create.js +2 -2
  48. package/commands/testAccount/delete.js +9 -8
  49. package/lang/en.d.ts +53 -12
  50. package/lang/en.js +63 -16
  51. package/lib/__tests__/buildAccount.test.js +22 -30
  52. package/lib/__tests__/commonOpts.test.js +9 -13
  53. package/lib/__tests__/developerTestAccounts.test.js +29 -17
  54. package/lib/__tests__/importData.test.js +20 -10
  55. package/lib/__tests__/oauth.test.js +19 -8
  56. package/lib/__tests__/sandboxSync.test.js +33 -11
  57. package/lib/__tests__/sandboxes.test.js +30 -19
  58. package/lib/__tests__/usageTracking.test.js +10 -10
  59. package/lib/__tests__/validation.test.js +32 -32
  60. package/lib/accountTypes.d.ts +9 -9
  61. package/lib/accountTypes.js +2 -4
  62. package/lib/app/__tests__/migrate.test.js +15 -0
  63. package/lib/app/__tests__/migrate_legacy.test.js +9 -0
  64. package/lib/app/migrate_legacy.d.ts +2 -2
  65. package/lib/buildAccount.d.ts +4 -4
  66. package/lib/buildAccount.js +7 -14
  67. package/lib/commonOpts.js +3 -3
  68. package/lib/configMigrate.d.ts +2 -2
  69. package/lib/configMigrate.js +42 -18
  70. package/lib/configOptions.js +3 -2
  71. package/lib/developerTestAccounts.d.ts +3 -3
  72. package/lib/developerTestAccounts.js +4 -7
  73. package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
  74. package/lib/doctor/DiagnosticInfoBuilder.js +9 -6
  75. package/lib/doctor/Doctor.js +4 -3
  76. package/lib/doctor/__tests__/Diagnosis.test.js +4 -3
  77. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +17 -9
  78. package/lib/doctor/__tests__/Doctor.test.js +14 -0
  79. package/lib/errorHandlers/index.js +8 -3
  80. package/lib/importData.js +8 -7
  81. package/lib/links.js +5 -5
  82. package/lib/middleware/{__test__ → __tests__}/commandTargetingUtils.test.js +3 -3
  83. package/lib/middleware/{__test__ → __tests__}/configMiddleware.test.js +23 -22
  84. package/lib/middleware/{__test__ → __tests__}/gitMiddleware.test.js +9 -7
  85. package/lib/middleware/autoUpdateMiddleware.js +34 -23
  86. package/lib/middleware/commandTargetingUtils.js +3 -2
  87. package/lib/middleware/configMiddleware.d.ts +6 -1
  88. package/lib/middleware/configMiddleware.js +36 -15
  89. package/lib/middleware/fireAlarmMiddleware.js +4 -15
  90. package/lib/middleware/gitMiddleware.js +8 -4
  91. package/lib/oauth.d.ts +2 -2
  92. package/lib/oauth.js +8 -10
  93. package/lib/projects/__tests__/AppDevModeInterface.test.js +17 -6
  94. package/lib/projects/__tests__/DevServerManager.test.js +1 -0
  95. package/lib/projects/__tests__/LocalDevProcess.test.js +1 -0
  96. package/lib/projects/__tests__/components.test.js +2 -22
  97. package/lib/projects/__tests__/deploy.test.js +16 -13
  98. package/lib/projects/__tests__/uieLinting.test.js +640 -0
  99. package/lib/projects/add/__tests__/legacyAddComponent.test.js +1 -1
  100. package/lib/projects/add/__tests__/v2AddComponent.test.js +30 -4
  101. package/lib/projects/add/legacyAddComponent.js +1 -1
  102. package/lib/projects/add/v2AddComponent.js +16 -5
  103. package/lib/projects/components.d.ts +8 -1
  104. package/lib/projects/components.js +91 -8
  105. package/lib/projects/create/__tests__/v2.test.js +11 -0
  106. package/lib/projects/deploy.js +21 -8
  107. package/lib/projects/localDev/AppDevModeInterface.js +2 -2
  108. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +11 -3
  109. package/lib/projects/localDev/LocalDevLogger.js +4 -4
  110. package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +3 -3
  111. package/lib/projects/localDev/helpers/account.d.ts +10 -10
  112. package/lib/projects/localDev/helpers/account.js +6 -11
  113. package/lib/projects/localDev/helpers/process.js +5 -3
  114. package/lib/projects/uieLinting.d.ts +33 -0
  115. package/lib/projects/uieLinting.js +222 -0
  116. package/lib/projects/urls.js +5 -6
  117. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +7 -5
  118. package/lib/prompts/accountNamePrompt.js +3 -3
  119. package/lib/prompts/accountsPrompt.d.ts +1 -1
  120. package/lib/prompts/accountsPrompt.js +6 -7
  121. package/lib/prompts/confirmImportDataPrompt.js +2 -2
  122. package/lib/prompts/downloadProjectPrompt.d.ts +1 -0
  123. package/lib/prompts/downloadProjectPrompt.js +5 -2
  124. package/lib/prompts/importDataTestAccountSelectPrompt.js +4 -5
  125. package/lib/prompts/personalAccessKeyPrompt.js +2 -2
  126. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +3 -3
  127. package/lib/prompts/projectDevTargetAccountPrompt.js +5 -7
  128. package/lib/prompts/sandboxesPrompt.js +7 -8
  129. package/lib/prompts/setAsDefaultAccountPrompt.js +7 -6
  130. package/lib/sandboxSync.d.ts +2 -2
  131. package/lib/sandboxSync.js +3 -9
  132. package/lib/sandboxes.d.ts +4 -4
  133. package/lib/sandboxes.js +6 -11
  134. package/lib/serverlessLogs.js +2 -2
  135. package/lib/theme/__tests__/migrate.test.js +15 -0
  136. package/lib/ui/SpinniesManager.d.ts +5 -7
  137. package/lib/ui/SpinniesManager.js +9 -12
  138. package/lib/ui/__tests__/SpinniesManager.test.d.ts +1 -0
  139. package/lib/ui/__tests__/SpinniesManager.test.js +489 -0
  140. package/lib/ui/index.js +6 -3
  141. package/lib/usageTracking.js +15 -8
  142. package/lib/validation.js +13 -11
  143. package/mcp-server/tools/cms/HsCreateFunctionTool.js +4 -2
  144. package/mcp-server/tools/cms/HsCreateModuleTool.js +4 -2
  145. package/mcp-server/tools/cms/HsCreateTemplateTool.js +4 -2
  146. package/mcp-server/tools/cms/HsFunctionLogsTool.js +4 -2
  147. package/mcp-server/tools/cms/HsListFunctionsTool.js +3 -1
  148. package/mcp-server/tools/cms/HsListTool.js +3 -1
  149. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +1 -0
  150. package/mcp-server/tools/index.js +4 -0
  151. package/mcp-server/tools/project/AddFeatureToProjectTool.js +4 -2
  152. package/mcp-server/tools/project/CreateProjectTool.js +4 -2
  153. package/mcp-server/tools/project/CreateTestAccountTool.js +17 -7
  154. package/mcp-server/tools/project/DeployProjectTool.js +3 -1
  155. package/mcp-server/tools/project/DocFetchTool.js +6 -4
  156. package/mcp-server/tools/project/DocsSearchTool.d.ts +1 -1
  157. package/mcp-server/tools/project/DocsSearchTool.js +10 -8
  158. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +1 -1
  159. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +9 -7
  160. package/mcp-server/tools/project/GetApplicationInfoTool.js +8 -6
  161. package/mcp-server/tools/project/GetBuildLogsTool.d.ts +26 -0
  162. package/mcp-server/tools/project/GetBuildLogsTool.js +125 -0
  163. package/mcp-server/tools/project/GetBuildStatusTool.d.ts +26 -0
  164. package/mcp-server/tools/project/GetBuildStatusTool.js +166 -0
  165. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +1 -1
  166. package/mcp-server/tools/project/GetConfigValuesTool.js +9 -7
  167. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +1 -1
  168. package/mcp-server/tools/project/GuidedWalkthroughTool.js +5 -3
  169. package/mcp-server/tools/project/UploadProjectTools.js +3 -1
  170. package/mcp-server/tools/project/ValidateProjectTool.js +4 -2
  171. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +12 -2
  172. package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +5 -1
  173. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +23 -11
  174. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +7 -5
  175. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +7 -5
  176. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.d.ts +1 -0
  177. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.js +305 -0
  178. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.d.ts +1 -0
  179. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.js +240 -0
  180. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -6
  181. package/mcp-server/utils/__tests__/content.test.js +21 -20
  182. package/mcp-server/utils/__tests__/feedbackTracking.test.js +34 -28
  183. package/mcp-server/utils/config.d.ts +1 -0
  184. package/mcp-server/utils/config.js +10 -0
  185. package/mcp-server/utils/content.d.ts +1 -1
  186. package/mcp-server/utils/content.js +2 -2
  187. package/mcp-server/utils/feedbackTracking.d.ts +1 -1
  188. package/mcp-server/utils/feedbackTracking.js +3 -3
  189. package/mcp-server/utils/toolUsageTracking.js +4 -3
  190. package/package.json +9 -9
  191. package/ui/components/BoxWithTitle.d.ts +2 -1
  192. package/ui/components/BoxWithTitle.js +2 -2
  193. package/ui/components/StatusMessageBoxes.d.ts +5 -4
  194. package/ui/components/StatusMessageBoxes.js +8 -8
  195. package/lib/middleware/__test__/notificationsMiddleware.test.js +0 -8
  196. package/lib/middleware/notificationsMiddleware.d.ts +0 -1
  197. package/lib/middleware/notificationsMiddleware.js +0 -28
  198. package/lib/ui/boxen.d.ts +0 -5
  199. package/lib/ui/boxen.js +0 -26
  200. package/mcp-server/utils/__tests__/cliConfig.test.js +0 -110
  201. package/mcp-server/utils/cliConfig.d.ts +0 -1
  202. package/mcp-server/utils/cliConfig.js +0 -12
  203. /package/{lib/middleware/__test__/commandTargetingUtils.test.d.ts → commands/project/__tests__/lint.test.d.ts} +0 -0
  204. /package/lib/middleware/{__test__/configMiddleware.test.d.ts → __tests__/commandTargetingUtils.test.d.ts} +0 -0
  205. /package/lib/middleware/{__test__/gitMiddleware.test.d.ts → __tests__/configMiddleware.test.d.ts} +0 -0
  206. /package/lib/middleware/{__test__/notificationsMiddleware.test.d.ts → __tests__/gitMiddleware.test.d.ts} +0 -0
  207. /package/lib/middleware/{__test__ → __tests__}/requestMiddleware.test.d.ts +0 -0
  208. /package/lib/middleware/{__test__ → __tests__}/requestMiddleware.test.js +0 -0
  209. /package/lib/middleware/{__test__ → __tests__}/yargsChecksMiddleware.test.d.ts +0 -0
  210. /package/lib/middleware/{__test__ → __tests__}/yargsChecksMiddleware.test.js +0 -0
  211. /package/{mcp-server/utils/__tests__/cliConfig.test.d.ts → lib/projects/__tests__/uieLinting.test.d.ts} +0 -0
@@ -0,0 +1,222 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import util from 'util';
4
+ import semver from 'semver';
5
+ import { exec as execAsync } from 'node:child_process';
6
+ import { getProjectPackageJsonLocations, isPackageInstalled, } from '../dependencyManagement.js';
7
+ import { commands } from '../../lang/en.js';
8
+ import { uiLogger } from '../ui/logger.js';
9
+ export const REQUIRED_PACKAGES_AND_MIN_VERSIONS = {
10
+ eslint: '9.0.0',
11
+ '@typescript-eslint/eslint-plugin': '8.46.4',
12
+ '@typescript-eslint/parser': '8.46.4',
13
+ 'typescript-eslint': '8.46.4',
14
+ jiti: '2.6.1',
15
+ };
16
+ const ESLINT_CONFIG_FILES = [
17
+ 'eslint.config.mts',
18
+ 'eslint.config.ts',
19
+ 'eslint.config.cts',
20
+ 'eslint.config.js',
21
+ 'eslint.config.mjs',
22
+ 'eslint.config.cjs',
23
+ ];
24
+ const DEPRECATED_ESLINT_CONFIG_FILES = [
25
+ '.eslintrc.js',
26
+ '.eslintrc.cjs',
27
+ '.eslintrc.yaml',
28
+ '.eslintrc.yml',
29
+ '.eslintrc.json',
30
+ '.eslintrc',
31
+ ];
32
+ const ESLINT_CONFIG_TEMPLATE = `import { defineConfig } from "eslint/config";
33
+ import tsParser from "@typescript-eslint/parser";
34
+
35
+ export default defineConfig([
36
+ {
37
+ files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
38
+ languageOptions: {
39
+ parser: tsParser,
40
+ parserOptions: {
41
+ ecmaVersion: "latest",
42
+ sourceType: "module",
43
+ ecmaFeatures: {
44
+ jsx: true
45
+ }
46
+ }
47
+ },
48
+ rules: {
49
+ "no-console": ["warn", { allow: ["warn", "error"] }]
50
+ }
51
+ },
52
+ ]);
53
+ `;
54
+ function getPackageVersionFromPackageJson(directory, packageName) {
55
+ const packageJsonPath = path.join(directory, 'package.json');
56
+ try {
57
+ const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8');
58
+ const packageJson = JSON.parse(packageJsonContent);
59
+ const version = packageJson.dependencies?.[packageName] ||
60
+ packageJson.devDependencies?.[packageName];
61
+ return version || null;
62
+ }
63
+ catch (error) {
64
+ return null;
65
+ }
66
+ }
67
+ function isPackageVersionValid(directory, packageName) {
68
+ const versionRange = getPackageVersionFromPackageJson(directory, packageName);
69
+ if (!versionRange) {
70
+ return false;
71
+ }
72
+ const minimumVersion = REQUIRED_PACKAGES_AND_MIN_VERSIONS[packageName];
73
+ if (!minimumVersion) {
74
+ // If no minimum version specified, any version is valid
75
+ return true;
76
+ }
77
+ try {
78
+ // Check if the version range satisfies the minimum version
79
+ // For ranges like ^9.0.0, ~8.5.0, >=9.0.0, etc.
80
+ const minVersionSatisfied = semver.satisfies(minimumVersion, versionRange, {
81
+ includePrerelease: true,
82
+ });
83
+ const coercedVersion = semver.minVersion(versionRange);
84
+ if (coercedVersion) {
85
+ return semver.gte(coercedVersion, minimumVersion);
86
+ }
87
+ return minVersionSatisfied;
88
+ }
89
+ catch (error) {
90
+ return false;
91
+ }
92
+ }
93
+ export function isEslintInstalled(directory) {
94
+ return isPackageInstalled(directory, 'eslint');
95
+ }
96
+ export function areAllLintPackagesInstalled(directory) {
97
+ return Object.keys(REQUIRED_PACKAGES_AND_MIN_VERSIONS).every(pkg => {
98
+ const installed = isPackageInstalled(directory, pkg);
99
+ const validVersion = isPackageVersionValid(directory, pkg);
100
+ return installed && validVersion;
101
+ });
102
+ }
103
+ export function getMissingLintPackages(directory) {
104
+ const missingPackages = [];
105
+ for (const packageName of Object.keys(REQUIRED_PACKAGES_AND_MIN_VERSIONS)) {
106
+ const isInstalled = isPackageInstalled(directory, packageName);
107
+ const isValidVersion = isPackageVersionValid(directory, packageName);
108
+ if (!isInstalled || !isValidVersion) {
109
+ missingPackages.push(packageName);
110
+ }
111
+ }
112
+ return { missingPackages };
113
+ }
114
+ export function hasEslintConfig(directory) {
115
+ return ESLINT_CONFIG_FILES.some(configFile => {
116
+ const configPath = path.join(directory, configFile);
117
+ return fs.existsSync(configPath);
118
+ });
119
+ }
120
+ export function hasDeprecatedEslintConfig(directory) {
121
+ return DEPRECATED_ESLINT_CONFIG_FILES.some(configFile => {
122
+ const configPath = path.join(directory, configFile);
123
+ return fs.existsSync(configPath);
124
+ });
125
+ }
126
+ export function getDeprecatedEslintConfigFiles(directory) {
127
+ return DEPRECATED_ESLINT_CONFIG_FILES.filter(configFile => {
128
+ const configPath = path.join(directory, configFile);
129
+ return fs.existsSync(configPath);
130
+ });
131
+ }
132
+ export function createEslintConfig(directory) {
133
+ const configPath = path.join(directory, 'eslint.config.mts');
134
+ try {
135
+ fs.writeFileSync(configPath, ESLINT_CONFIG_TEMPLATE, 'utf-8');
136
+ return path.relative(process.cwd(), configPath);
137
+ }
138
+ catch (error) {
139
+ uiLogger.error(commands.project.lint.failedToCreateEslintConfig(configPath));
140
+ throw error;
141
+ }
142
+ }
143
+ export async function lintPackagesInDirectory(directory, projectDir) {
144
+ const displayPath = projectDir
145
+ ? path.relative(projectDir, directory)
146
+ : directory;
147
+ const exec = util.promisify(execAsync);
148
+ const lintCommand = 'npx eslint . --color';
149
+ try {
150
+ const { stdout, stderr } = await exec(lintCommand, {
151
+ cwd: directory,
152
+ maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large outputs
153
+ });
154
+ let output = `\n${displayPath}:\n`;
155
+ if (stdout && stdout.trim()) {
156
+ output += stdout;
157
+ }
158
+ else {
159
+ output += ' No linting issues found.\n';
160
+ }
161
+ if (stderr && stderr.trim()) {
162
+ output += stderr;
163
+ }
164
+ return { success: true, output };
165
+ }
166
+ catch (error) {
167
+ // ESLint returns exit code 1 when there are linting errors
168
+ // but still provides useful output in stdout/stderr
169
+ let output = `\n${displayPath}:\n`;
170
+ if (error && typeof error === 'object' && 'stdout' in error) {
171
+ const execError = error;
172
+ if (execError.stdout) {
173
+ output += execError.stdout;
174
+ }
175
+ if (execError.stderr) {
176
+ output += execError.stderr;
177
+ }
178
+ }
179
+ return { success: false, output };
180
+ }
181
+ }
182
+ export async function lintPackages(lintLocations, projectDir) {
183
+ const locations = lintLocations || (await getProjectPackageJsonLocations());
184
+ const results = [];
185
+ for (const location of locations) {
186
+ const result = await lintPackagesInDirectory(location, projectDir);
187
+ const displayPath = projectDir
188
+ ? path.relative(projectDir, location)
189
+ : location;
190
+ results.push({ location: displayPath, ...result });
191
+ }
192
+ const failedLocations = results.filter(r => !r.success);
193
+ return {
194
+ success: failedLocations.length === 0,
195
+ results,
196
+ };
197
+ }
198
+ export function displayLintResults(results) {
199
+ // Display all output
200
+ results.forEach(r => {
201
+ uiLogger.log(r.output);
202
+ });
203
+ // Summary
204
+ const failedLocations = results.filter(r => !r.success);
205
+ const passedLocations = results.filter(r => r.success);
206
+ uiLogger.log('\n' + '='.repeat(50));
207
+ if (passedLocations.length > 0) {
208
+ uiLogger.success(`Linting passed in ${passedLocations.length} ${passedLocations.length === 1 ? 'directory' : 'directories'}:`);
209
+ passedLocations.forEach(r => {
210
+ uiLogger.log(` ✓ ${r.location}`);
211
+ });
212
+ }
213
+ if (failedLocations.length > 0) {
214
+ if (passedLocations.length > 0) {
215
+ uiLogger.log('');
216
+ }
217
+ uiLogger.error(`Linting failed in ${failedLocations.length} ${failedLocations.length === 1 ? 'directory' : 'directories'}:`);
218
+ failedLocations.forEach(r => {
219
+ uiLogger.log(` ✗ ${r.location}`);
220
+ });
221
+ }
222
+ }
@@ -1,18 +1,17 @@
1
1
  import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
2
- import { getEnv } from '@hubspot/local-dev-lib/config';
3
- import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
2
+ import { getConfigAccountEnvironment } from '@hubspot/local-dev-lib/config';
4
3
  function getBaseUrl(accountId) {
5
- return getHubSpotWebsiteOrigin(getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD);
4
+ return getHubSpotWebsiteOrigin(getConfigAccountEnvironment(accountId));
6
5
  }
7
6
  function getProjectHomeUrl(accountId) {
8
7
  return `${getBaseUrl(accountId)}/developer-projects/${accountId}`;
9
8
  }
10
9
  export function getProjectComponentDistributionUrl(projectName, componentName, accountId) {
11
- const baseUrl = getHubSpotWebsiteOrigin(getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD);
10
+ const baseUrl = getHubSpotWebsiteOrigin(getConfigAccountEnvironment(accountId));
12
11
  return `${baseUrl}/developer-projects/${accountId}/project/${projectName}/component/${componentName}/distribution`;
13
12
  }
14
13
  export function getDeveloperOverviewUrl(accountId) {
15
- const baseUrl = getHubSpotWebsiteOrigin(getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD);
14
+ const baseUrl = getHubSpotWebsiteOrigin(getConfigAccountEnvironment(accountId));
16
15
  return `${baseUrl}/developer-overview/${accountId}`;
17
16
  }
18
17
  export function getProjectDetailUrl(projectName, accountId) {
@@ -38,6 +37,6 @@ export function getLocalDevUiUrl(accountId, showWelcomeScreen) {
38
37
  return `${getBaseUrl(accountId)}/developer-projects-local-dev/${accountId}${showWelcomeScreen ? '?welcome' : ''}`;
39
38
  }
40
39
  export function getAccountHomeUrl(accountId) {
41
- const baseUrl = getHubSpotWebsiteOrigin(getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD);
40
+ const baseUrl = getHubSpotWebsiteOrigin(getConfigAccountEnvironment(accountId));
42
41
  return `${baseUrl}/home?portalId=${accountId}`;
43
42
  }
@@ -1,4 +1,4 @@
1
- import { getAccountId } from '@hubspot/local-dev-lib/config';
1
+ import { getConfigAccountIfExists } from '@hubspot/local-dev-lib/config';
2
2
  import { fetchProjects } from '@hubspot/local-dev-lib/api/projects';
3
3
  import { downloadProjectPrompt } from '../downloadProjectPrompt.js';
4
4
  vi.mock('../promptUtils', () => ({
@@ -10,15 +10,17 @@ vi.mock('@hubspot/local-dev-lib/api/projects', () => ({
10
10
  }),
11
11
  }));
12
12
  vi.mock('@hubspot/local-dev-lib/config', () => ({
13
- getAccountId: vi.fn().mockImplementation(() => 123456789),
14
- configFileExists: vi.fn().mockImplementation(() => true),
13
+ getConfigAccountIfExists: vi
14
+ .fn()
15
+ .mockImplementation(() => ({ accountId: 123456789 })),
16
+ globalConfigFileExists: vi.fn().mockReturnValue(true),
15
17
  }));
16
18
  describe('lib/prompts/downloadProjectPrompt', () => {
17
19
  it('should honor the account passed as an option', async () => {
18
20
  const account = 'Prod';
19
21
  await downloadProjectPrompt({ account });
20
- expect(getAccountId).toHaveBeenCalledTimes(1);
21
- expect(getAccountId).toHaveBeenCalledWith(account);
22
+ expect(getConfigAccountIfExists).toHaveBeenCalledTimes(1);
23
+ expect(getConfigAccountIfExists).toHaveBeenCalledWith(account);
22
24
  });
23
25
  it('should fetch the projects for the correct accountId', async () => {
24
26
  const account = 'Prod';
@@ -1,4 +1,4 @@
1
- import { accountNameExistsInConfig } from '@hubspot/local-dev-lib/config';
1
+ import { getConfigAccountIfExists } from '@hubspot/local-dev-lib/config';
2
2
  import { promptUser } from './promptUtils.js';
3
3
  import { lib } from '../../lang/en.js';
4
4
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
@@ -17,7 +17,7 @@ export function getCliAccountNamePromptConfig(defaultName) {
17
17
  else if (val.indexOf(' ') >= 0) {
18
18
  return lib.prompts.accountNamePrompt.errors.spacesInName;
19
19
  }
20
- return accountNameExistsInConfig(val)
20
+ return getConfigAccountIfExists(val)
21
21
  ? lib.prompts.accountNamePrompt.errors.accountNameExists(val)
22
22
  : true;
23
23
  },
@@ -54,7 +54,7 @@ export function hubspotAccountNamePrompt({ accountType, currentPortalCount = 0,
54
54
  else if (!val.trim().length) {
55
55
  return lib.prompts.accountNamePrompt.errors.nameRequired;
56
56
  }
57
- return accountNameExistsInConfig(val)
57
+ return getConfigAccountIfExists(val)
58
58
  ? lib.prompts.accountNamePrompt.errors.accountNameExists(val)
59
59
  : true;
60
60
  },
@@ -1 +1 @@
1
- export declare function selectAccountFromConfig(prompt?: string): Promise<string>;
1
+ export declare function selectAccountFromConfig(prompt?: string): Promise<number>;
@@ -1,17 +1,16 @@
1
- import { getConfigDefaultAccount, getConfigAccounts, } from '@hubspot/local-dev-lib/config';
2
- import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
1
+ import { getConfigDefaultAccountIfExists, getAllConfigAccounts, } from '@hubspot/local-dev-lib/config';
3
2
  import { promptUser } from './promptUtils.js';
4
3
  import { commands } from '../../lang/en.js';
5
4
  import { uiAccountDescription } from '../ui/index.js';
6
5
  function mapAccountChoices(portals) {
7
6
  return (portals?.map(p => ({
8
- name: uiAccountDescription(getAccountIdentifier(p), false),
9
- value: String(p.name || getAccountIdentifier(p)),
7
+ name: uiAccountDescription(p.accountId, false),
8
+ value: p.accountId,
10
9
  })) || []);
11
10
  }
12
11
  export async function selectAccountFromConfig(prompt = '') {
13
- const accountsList = getConfigAccounts();
14
- const defaultAccount = getConfigDefaultAccount();
12
+ const accountsList = getAllConfigAccounts();
13
+ const defaultAccount = getConfigDefaultAccountIfExists();
15
14
  const { default: selectedDefault } = await promptUser([
16
15
  {
17
16
  type: 'list',
@@ -19,7 +18,7 @@ export async function selectAccountFromConfig(prompt = '') {
19
18
  pageSize: 20,
20
19
  message: prompt || commands.account.subcommands.use.promptMessage,
21
20
  choices: mapAccountChoices(accountsList),
22
- default: defaultAccount ?? undefined,
21
+ default: defaultAccount?.accountId ?? undefined,
23
22
  },
24
23
  ]);
25
24
  return selectedDefault;
@@ -1,8 +1,8 @@
1
- import { getAccountConfig } from '@hubspot/local-dev-lib/config';
1
+ import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
2
2
  import { promptUser } from './promptUtils.js';
3
3
  import { lib } from '../../lang/en.js';
4
4
  export async function confirmImportDataPrompt(targetAccountId, dataFileNames) {
5
- const account = getAccountConfig(targetAccountId);
5
+ const account = getConfigAccountById(targetAccountId);
6
6
  const { confirmImportData } = await promptUser({
7
7
  type: 'confirm',
8
8
  name: 'confirmImportData',
@@ -3,6 +3,7 @@ type DownloadProjectPromptResponse = {
3
3
  };
4
4
  export declare function downloadProjectPrompt(promptOptions: {
5
5
  account?: string;
6
+ derivedAccountId?: number;
6
7
  project?: string;
7
8
  name?: string;
8
9
  }): Promise<DownloadProjectPromptResponse>;
@@ -1,5 +1,5 @@
1
1
  import { promptUser } from './promptUtils.js';
2
- import { getAccountId } from '@hubspot/local-dev-lib/config';
2
+ import { getConfigAccountIfExists } from '@hubspot/local-dev-lib/config';
3
3
  import { fetchProjects } from '@hubspot/local-dev-lib/api/projects';
4
4
  import { logError, ApiErrorContext } from '../errorHandlers/index.js';
5
5
  import { uiLogger } from '../ui/logger.js';
@@ -20,7 +20,10 @@ async function createProjectsList(accountId) {
20
20
  }
21
21
  }
22
22
  export async function downloadProjectPrompt(promptOptions) {
23
- const accountId = getAccountId(promptOptions.account);
23
+ const account = promptOptions.account
24
+ ? getConfigAccountIfExists(promptOptions.account)
25
+ : undefined;
26
+ const accountId = account?.accountId || promptOptions.derivedAccountId || null;
24
27
  const projectsList = await createProjectsList(accountId);
25
28
  const response = await promptUser([
26
29
  {
@@ -1,10 +1,9 @@
1
- import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
2
1
  import { promptUser } from './promptUtils.js';
3
- import { getConfigAccounts } from '@hubspot/local-dev-lib/config';
2
+ import { getAllConfigAccounts } from '@hubspot/local-dev-lib/config';
4
3
  import { uiAccountDescription } from '../ui/index.js';
5
4
  import { lib } from '../../lang/en.js';
6
5
  export async function importDataTestAccountSelectPrompt(parentAccountId) {
7
- const accounts = getConfigAccounts();
6
+ const accounts = getAllConfigAccounts();
8
7
  if (!accounts) {
9
8
  throw new Error(lib.prompts.importDataTestAccountSelectPrompt.errors.noAccountsFound);
10
9
  }
@@ -12,8 +11,8 @@ export async function importDataTestAccountSelectPrompt(parentAccountId) {
12
11
  .filter(account => account.parentAccountId === parentAccountId)
13
12
  .map(account => {
14
13
  return {
15
- name: uiAccountDescription(getAccountIdentifier(account)),
16
- value: getAccountIdentifier(account),
14
+ name: uiAccountDescription(account.accountId),
15
+ value: account.accountId,
17
16
  };
18
17
  })
19
18
  .filter(account => account.value !== undefined && account.name !== undefined);
@@ -1,6 +1,6 @@
1
1
  import open from 'open';
2
2
  import { OAUTH_SCOPES, DEFAULT_OAUTH_SCOPES, } from '@hubspot/local-dev-lib/constants/auth';
3
- import { deleteEmptyConfigFile } from '@hubspot/local-dev-lib/config';
3
+ import { deleteConfigFileIfEmpty } from '@hubspot/local-dev-lib/config';
4
4
  import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
5
5
  import { uiLogger } from '../ui/logger.js';
6
6
  import { promptUser } from './promptUtils.js';
@@ -26,7 +26,7 @@ export async function personalAccessKeyPrompt({ env, account, }) {
26
26
  PERSONAL_ACCESS_KEY_BROWSER_OPEN_PREP,
27
27
  ]);
28
28
  if (!choice) {
29
- deleteEmptyConfigFile();
29
+ deleteConfigFileIfEmpty();
30
30
  process.exit(EXIT_CODES.SUCCESS);
31
31
  }
32
32
  if (choice ===
@@ -1,4 +1,4 @@
1
- import { CLIAccount } from '@hubspot/local-dev-lib/types/Accounts';
1
+ import { HubSpotConfigAccount } from '@hubspot/local-dev-lib/types/Accounts';
2
2
  import { DeveloperTestAccount } from '@hubspot/local-dev-lib/types/developerTestAccounts.js';
3
3
  export type ProjectDevTargetAccountPromptResponse = {
4
4
  targetAccountId: number | null;
@@ -6,7 +6,7 @@ export type ProjectDevTargetAccountPromptResponse = {
6
6
  parentAccountId?: number | null;
7
7
  notInConfigAccount?: DeveloperTestAccount | null;
8
8
  };
9
- export declare function selectSandboxTargetAccountPrompt(accounts: CLIAccount[], defaultAccountConfig: CLIAccount): Promise<ProjectDevTargetAccountPromptResponse>;
10
- export declare function selectDeveloperTestTargetAccountPrompt(accounts: CLIAccount[], defaultAccountConfig: CLIAccount): Promise<ProjectDevTargetAccountPromptResponse>;
9
+ export declare function selectSandboxTargetAccountPrompt(accounts: HubSpotConfigAccount[], defaultAccountConfig: HubSpotConfigAccount): Promise<ProjectDevTargetAccountPromptResponse>;
10
+ export declare function selectDeveloperTestTargetAccountPrompt(accounts: HubSpotConfigAccount[], defaultAccountConfig: HubSpotConfigAccount): Promise<ProjectDevTargetAccountPromptResponse>;
11
11
  export declare function confirmDefaultAccountPrompt(accountName: string, accountType: string): Promise<boolean>;
12
12
  export declare function confirmUseExistingDeveloperTestAccountPrompt(account: DeveloperTestAccount): Promise<boolean>;
@@ -1,7 +1,5 @@
1
- import { getAccountId } from '@hubspot/local-dev-lib/config';
2
1
  import { getSandboxUsageLimits } from '@hubspot/local-dev-lib/api/sandboxHubs';
3
2
  import { HUBSPOT_ACCOUNT_TYPES, HUBSPOT_ACCOUNT_TYPE_STRINGS, } from '@hubspot/local-dev-lib/constants/config';
4
- import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
5
3
  import { fetchDeveloperTestAccounts } from '@hubspot/local-dev-lib/api/developerTestAccounts';
6
4
  import { promptUser } from './promptUtils.js';
7
5
  import { lib } from '../../lang/en.js';
@@ -12,9 +10,9 @@ import { EXIT_CODES } from '../enums/exitCodes.js';
12
10
  function mapNestedAccount(accountConfig) {
13
11
  const parentAccountId = accountConfig.parentAccountId ?? null;
14
12
  return {
15
- name: uiAccountDescription(getAccountIdentifier(accountConfig), false),
13
+ name: uiAccountDescription(accountConfig.accountId, false),
16
14
  value: {
17
- targetAccountId: getAccountId(accountConfig.name),
15
+ targetAccountId: accountConfig.accountId,
18
16
  createNestedAccount: false,
19
17
  parentAccountId,
20
18
  },
@@ -24,7 +22,7 @@ function getNonConfigDeveloperTestAccountName(account) {
24
22
  return `${account.accountName} [${HUBSPOT_ACCOUNT_TYPE_STRINGS[HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST]}] (${account.id})`;
25
23
  }
26
24
  export async function selectSandboxTargetAccountPrompt(accounts, defaultAccountConfig) {
27
- const defaultAccountId = getAccountId(defaultAccountConfig.name);
25
+ const defaultAccountId = defaultAccountConfig.accountId;
28
26
  let choices = [];
29
27
  let sandboxUsage = {
30
28
  STANDARD: { used: 0, available: 0, limit: 0 },
@@ -84,7 +82,7 @@ export async function selectSandboxTargetAccountPrompt(accounts, defaultAccountC
84
82
  return selectTargetAccountPrompt(defaultAccountId, 'sandbox account', choices);
85
83
  }
86
84
  export async function selectDeveloperTestTargetAccountPrompt(accounts, defaultAccountConfig) {
87
- const defaultAccountId = getAccountId(defaultAccountConfig.name);
85
+ const defaultAccountId = defaultAccountConfig.accountId;
88
86
  let devTestAccountsResponse;
89
87
  try {
90
88
  if (defaultAccountId) {
@@ -108,7 +106,7 @@ export async function selectDeveloperTestTargetAccountPrompt(accounts, defaultAc
108
106
  }
109
107
  const devTestAccounts = [];
110
108
  if (devTestAccountsResponse && devTestAccountsResponse.results) {
111
- const accountIds = accounts.map(account => getAccountIdentifier(account));
109
+ const accountIds = accounts.map(account => account.accountId);
112
110
  devTestAccountsResponse.results.forEach(acct => {
113
111
  const inConfig = accountIds.includes(acct.id);
114
112
  devTestAccounts.push({
@@ -2,23 +2,22 @@ import { promptUser } from './promptUtils.js';
2
2
  import { lib } from '../../lang/en.js';
3
3
  import { uiAccountDescription } from '../ui/index.js';
4
4
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
5
- import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
6
5
  import { isSandbox } from '../accountTypes.js';
7
- import { getConfigDefaultAccount, getConfigAccounts, } from '@hubspot/local-dev-lib/config';
6
+ import { getConfigDefaultAccountIfExists, getAllConfigAccounts, } from '@hubspot/local-dev-lib/config';
8
7
  function mapSandboxAccountChoices(portals) {
9
8
  return (portals
10
9
  ?.filter(p => isSandbox(p))
11
10
  .map(p => ({
12
- name: uiAccountDescription(getAccountIdentifier(p), false),
13
- value: p.name || getAccountIdentifier(p),
11
+ name: uiAccountDescription(p.accountId, false),
12
+ value: p.accountId,
14
13
  })) || []);
15
14
  }
16
15
  function mapNonSandboxAccountChoices(portals) {
17
16
  return (portals
18
17
  ?.filter(p => !isSandbox(p))
19
18
  .map(p => ({
20
- name: `${p.name} (${getAccountIdentifier(p)})`,
21
- value: p.name || getAccountIdentifier(p),
19
+ name: `${p.name} (${p.accountId})`,
20
+ value: p.accountId,
22
21
  })) || []);
23
22
  }
24
23
  export async function sandboxTypePrompt() {
@@ -42,7 +41,7 @@ export async function sandboxTypePrompt() {
42
41
  ]);
43
42
  }
44
43
  export function deleteSandboxPrompt(promptParentAccount = false) {
45
- const accountsList = getConfigAccounts();
44
+ const accountsList = getAllConfigAccounts();
46
45
  const choices = promptParentAccount
47
46
  ? mapNonSandboxAccountChoices(accountsList)
48
47
  : mapSandboxAccountChoices(accountsList);
@@ -58,7 +57,7 @@ export function deleteSandboxPrompt(promptParentAccount = false) {
58
57
  type: 'list',
59
58
  pageSize: 20,
60
59
  choices,
61
- default: getConfigDefaultAccount(),
60
+ default: getConfigDefaultAccountIfExists()?.accountId,
62
61
  },
63
62
  ]);
64
63
  }
@@ -1,25 +1,26 @@
1
- import { updateDefaultAccount, getConfigDefaultAccount, } from '@hubspot/local-dev-lib/config';
1
+ import { setConfigAccountAsDefault, getConfigDefaultAccountIfExists, getAllConfigAccounts, } from '@hubspot/local-dev-lib/config';
2
2
  import { promptUser } from './promptUtils.js';
3
3
  import { lib } from '../../lang/en.js';
4
4
  import { uiLogger } from '../ui/logger.js';
5
5
  export async function setAsDefaultAccountPrompt(accountName) {
6
6
  // Accounts for deprecated and new config
7
- const defaultAccount = getConfigDefaultAccount();
7
+ const defaultAccount = getConfigDefaultAccountIfExists();
8
+ const accounts = getAllConfigAccounts() || [];
8
9
  const { setAsDefault } = await promptUser([
9
10
  {
10
11
  name: 'setAsDefault',
11
12
  type: 'confirm',
12
- when: defaultAccount !== accountName,
13
+ when: accounts.length >= 1 && defaultAccount?.name !== accountName,
13
14
  message: lib.prompts.setAsDefaultAccountPrompt.setAsDefaultAccountMessage,
14
15
  },
15
16
  ]);
16
17
  uiLogger.log('');
17
18
  if (setAsDefault) {
18
- updateDefaultAccount(accountName);
19
+ setConfigAccountAsDefault(accountName);
19
20
  uiLogger.success(lib.prompts.setAsDefaultAccountPrompt.setAsDefaultAccount(accountName));
20
21
  }
21
- else {
22
- uiLogger.log(lib.prompts.setAsDefaultAccountPrompt.keepingCurrentDefault(getConfigDefaultAccount()));
22
+ else if (defaultAccount) {
23
+ uiLogger.log(lib.prompts.setAsDefaultAccountPrompt.keepingCurrentDefault(defaultAccount.name));
23
24
  }
24
25
  return setAsDefault;
25
26
  }
@@ -1,4 +1,4 @@
1
- import { CLIAccount } from '@hubspot/local-dev-lib/types/Accounts';
1
+ import { HubSpotConfigAccount } from '@hubspot/local-dev-lib/types/Accounts';
2
2
  import { Environment } from '@hubspot/local-dev-lib/types/Config';
3
3
  import { SandboxSyncTask } from '../types/Sandboxes.js';
4
- export declare function syncSandbox(accountConfig: CLIAccount, parentAccountConfig: CLIAccount, env: Environment, syncTasks: Array<SandboxSyncTask>, slimInfoMessage?: boolean): Promise<void>;
4
+ export declare function syncSandbox(accountConfig: HubSpotConfigAccount, parentAccountConfig: HubSpotConfigAccount, env: Environment, syncTasks: Array<SandboxSyncTask>, slimInfoMessage?: boolean): Promise<void>;
@@ -3,23 +3,17 @@ import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
3
3
  import { uiLogger } from './ui/logger.js';
4
4
  import { initiateSync } from '@hubspot/local-dev-lib/api/sandboxSync';
5
5
  import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
6
- import { getAccountId } from '@hubspot/local-dev-lib/config';
7
- import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
8
6
  import { lib } from '../lang/en.js';
9
7
  import { getAvailableSyncTypes, getSandboxTypeAsString } from './sandboxes.js';
10
8
  import { debugError, logError, ApiErrorContext, } from './errorHandlers/index.js';
11
9
  import { uiAccountDescription, uiLine, uiCommandDisabledBanner, } from './ui/index.js';
12
10
  import { isDevelopmentSandbox } from './accountTypes.js';
13
11
  export async function syncSandbox(accountConfig, parentAccountConfig, env, syncTasks, slimInfoMessage = false) {
14
- const id = getAccountIdentifier(accountConfig);
15
- const accountId = getAccountId(id);
16
- const parentId = getAccountIdentifier(parentAccountConfig);
17
- const parentAccountId = getAccountId(parentId);
12
+ const accountId = accountConfig.accountId;
13
+ const parentAccountId = parentAccountConfig.accountId;
18
14
  const isDevSandbox = isDevelopmentSandbox(accountConfig);
19
15
  if (!accountId || !parentAccountId) {
20
- throw new Error(lib.sandbox.sync.failure.invalidUser(accountId ? uiAccountDescription(accountId) : id.toString(), parentAccountId
21
- ? uiAccountDescription(parentAccountId)
22
- : parentId.toString()));
16
+ throw new Error(lib.sandbox.sync.failure.invalidUser(uiAccountDescription(accountId), uiAccountDescription(parentAccountId)));
23
17
  }
24
18
  SpinniesManager.init({
25
19
  succeedColor: 'white',
@@ -1,4 +1,4 @@
1
- import { AccountType, CLIAccount } from '@hubspot/local-dev-lib/types/Accounts';
1
+ import { AccountType, HubSpotConfigAccount } from '@hubspot/local-dev-lib/types/Accounts';
2
2
  import { Environment } from '@hubspot/local-dev-lib/types/Config';
3
3
  import { SandboxSyncTask, SandboxAccountType } from '../types/Sandboxes.js';
4
4
  export declare const SYNC_TYPES: {
@@ -16,7 +16,7 @@ export declare const SANDBOX_TYPE_MAP_V2: {
16
16
  readonly DEVELOPMENT_SANDBOX: "DEVELOPER";
17
17
  };
18
18
  export declare function getSandboxTypeAsString(accountType?: AccountType): string;
19
- export declare function getHasSandboxesByType(parentAccountConfig: CLIAccount, type: AccountType): boolean;
20
- export declare function getAvailableSyncTypes(parentAccountConfig: CLIAccount, config: CLIAccount): Promise<Array<SandboxSyncTask>>;
21
- export declare function validateSandboxUsageLimits(accountConfig: CLIAccount, sandboxType: AccountType, env: Environment): Promise<void>;
19
+ export declare function getHasSandboxesByType(parentAccountConfig: HubSpotConfigAccount, type: AccountType): boolean;
20
+ export declare function getAvailableSyncTypes(parentAccountConfig: HubSpotConfigAccount, config: HubSpotConfigAccount): Promise<Array<SandboxSyncTask>>;
21
+ export declare function validateSandboxUsageLimits(accountConfig: HubSpotConfigAccount, sandboxType: AccountType, env: Environment): Promise<void>;
22
22
  export declare function handleSandboxCreateError(err: unknown, env: Environment, name: string, accountId: number): never;