@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.
- package/api/migrate.d.ts +14 -4
- package/api/migrate.js +16 -2
- package/bin/cli.js +8 -183
- package/commands/account/auth.d.ts +10 -0
- package/commands/account/auth.js +188 -0
- package/commands/account/clean.js +38 -5
- package/commands/account/createOverride.d.ts +10 -0
- package/commands/account/createOverride.js +104 -0
- package/commands/account/info.js +38 -4
- package/commands/account/list.js +23 -5
- package/commands/account/remove.js +36 -2
- package/commands/account/removeOverride.d.ts +10 -0
- package/commands/account/removeOverride.js +76 -0
- package/commands/account/use.js +25 -3
- package/commands/account.js +7 -2
- package/commands/app/migrate.d.ts +6 -6
- package/commands/app/migrate.js +62 -45
- package/commands/app.js +0 -2
- package/commands/auth.js +14 -11
- package/commands/cms/lighthouseScore.js +7 -3
- package/commands/cms.js +1 -2
- package/commands/completion.js +2 -3
- package/commands/config/migrate.d.ts +10 -0
- package/commands/config/migrate.js +84 -0
- package/commands/config/set.d.ts +10 -0
- package/commands/config/set.js +34 -29
- package/commands/config.d.ts +4 -1
- package/commands/config.js +45 -11
- package/commands/create/api-sample.js +3 -1
- package/commands/create/website-theme.js +1 -1
- package/commands/create.js +7 -8
- package/commands/customObject/schema/delete.js +4 -1
- package/commands/customObject/schema/fetch-all.js +2 -1
- package/commands/customObject/schema/fetch.js +2 -1
- package/commands/customObject.js +3 -4
- package/commands/doctor.js +5 -6
- package/commands/feedback.js +7 -8
- package/commands/fetch.js +6 -7
- package/commands/filemanager.js +1 -2
- package/commands/function.js +1 -2
- package/commands/hubdb/clear.js +5 -6
- package/commands/hubdb/create.js +7 -8
- package/commands/hubdb/delete.js +8 -7
- package/commands/hubdb/fetch.js +4 -5
- package/commands/hubdb.js +1 -2
- package/commands/init.js +18 -20
- package/commands/lint.js +3 -4
- package/commands/list.js +5 -6
- package/commands/logs.js +12 -13
- package/commands/module/marketplace-validate.js +5 -6
- package/commands/module.js +1 -3
- package/commands/mv.js +4 -5
- package/commands/open.js +4 -5
- package/commands/project/add.d.ts +3 -7
- package/commands/project/add.js +28 -23
- package/commands/project/cloneApp.d.ts +6 -8
- package/commands/project/cloneApp.js +49 -45
- package/commands/project/create.d.ts +10 -1
- package/commands/project/create.js +85 -63
- package/commands/project/deploy.d.ts +3 -6
- package/commands/project/deploy.js +27 -25
- package/commands/project/dev/deprecatedFlow.js +32 -25
- package/commands/project/dev/index.d.ts +4 -2
- package/commands/project/dev/index.js +31 -18
- package/commands/project/dev/unifiedFlow.js +10 -11
- package/commands/project/download.d.ts +3 -7
- package/commands/project/download.js +18 -19
- package/commands/project/installDeps.d.ts +6 -1
- package/commands/project/installDeps.js +48 -32
- package/commands/project/listBuilds.d.ts +3 -7
- package/commands/project/listBuilds.js +32 -27
- package/commands/project/logs.d.ts +10 -1
- package/commands/project/logs.js +73 -65
- package/commands/project/migrate.d.ts +6 -0
- package/commands/project/migrate.js +71 -0
- package/commands/project/migrateApp.d.ts +3 -8
- package/commands/project/migrateApp.js +23 -20
- package/commands/project/open.d.ts +3 -7
- package/commands/project/open.js +29 -21
- package/commands/project/upload.d.ts +9 -1
- package/commands/project/upload.js +78 -54
- package/commands/project/watch.d.ts +6 -1
- package/commands/project/watch.js +95 -61
- package/commands/project.d.ts +3 -1
- package/commands/project.js +47 -35
- package/commands/remove.js +7 -5
- package/commands/sandbox/create.js +10 -11
- package/commands/sandbox/delete.js +18 -19
- package/commands/sandbox.js +1 -2
- package/commands/secret/addSecret.js +5 -6
- package/commands/secret/deleteSecret.js +12 -9
- package/commands/secret/listSecret.js +3 -4
- package/commands/secret/updateSecret.js +9 -8
- package/commands/secret.js +1 -2
- package/commands/theme/generate-selectors.js +5 -6
- package/commands/theme/marketplace-validate.js +5 -6
- package/commands/theme/preview.js +16 -16
- package/commands/theme.js +1 -2
- package/commands/upload.js +23 -24
- package/commands/watch.js +18 -19
- package/lang/en.d.ts +2806 -0
- package/lang/en.js +2659 -3300
- package/lang/en.lyaml +98 -41
- package/lib/accountTypes.d.ts +1 -0
- package/lib/accountTypes.js +12 -0
- package/lib/app/migrate.d.ts +10 -4
- package/lib/app/migrate.js +208 -94
- package/lib/app/migrate_legacy.d.ts +2 -2
- package/lib/app/migrate_legacy.js +10 -7
- package/lib/buildAccount.d.ts +1 -2
- package/lib/buildAccount.js +11 -10
- package/lib/commonOpts.d.ts +3 -4
- package/lib/commonOpts.js +46 -18
- package/lib/configMigrate.d.ts +2 -0
- package/lib/configMigrate.js +104 -0
- package/lib/configOptions.js +11 -10
- package/lib/constants.d.ts +4 -0
- package/lib/constants.js +5 -1
- package/lib/dependencyManagement.js +2 -2
- package/lib/doctor/Diagnosis.d.ts +1 -2
- package/lib/doctor/Diagnosis.js +19 -16
- package/lib/doctor/DiagnosticInfoBuilder.d.ts +2 -1
- package/lib/doctor/DiagnosticInfoBuilder.js +10 -9
- package/lib/doctor/Doctor.d.ts +1 -0
- package/lib/doctor/Doctor.js +57 -44
- package/lib/errorHandlers/index.js +6 -7
- package/lib/errorHandlers/suppressError.js +6 -7
- package/lib/generateSelectors.js +1 -2
- package/lib/hasFeature.d.ts +3 -1
- package/lib/middleware/__test__/configMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/configMiddleware.test.js +194 -0
- package/lib/middleware/__test__/gitMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/gitMiddleware.test.js +76 -0
- package/lib/middleware/__test__/notificationsMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/notificationsMiddleware.test.js +10 -0
- package/lib/middleware/__test__/requestMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/requestMiddleware.test.js +20 -0
- package/lib/middleware/__test__/utils.test.d.ts +1 -0
- package/lib/middleware/__test__/utils.test.js +53 -0
- package/lib/middleware/__test__/yargsChecksMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/yargsChecksMiddleware.test.js +81 -0
- package/lib/middleware/configMiddleware.d.ts +13 -0
- package/lib/middleware/configMiddleware.js +116 -0
- package/lib/middleware/fireAlarmMiddleware.d.ts +4 -0
- package/lib/middleware/fireAlarmMiddleware.js +123 -0
- package/lib/middleware/gitMiddleware.d.ts +2 -0
- package/lib/middleware/gitMiddleware.js +14 -0
- package/lib/middleware/notificationsMiddleware.d.ts +1 -0
- package/lib/middleware/notificationsMiddleware.js +38 -0
- package/lib/middleware/requestMiddleware.d.ts +1 -0
- package/lib/middleware/requestMiddleware.js +11 -0
- package/lib/middleware/utils.d.ts +8 -0
- package/lib/middleware/utils.js +17 -0
- package/lib/middleware/yargsChecksMiddleware.d.ts +4 -0
- package/lib/middleware/yargsChecksMiddleware.js +24 -0
- package/lib/oauth.js +1 -2
- package/lib/process.js +1 -2
- package/lib/projects/ProjectLogsManager.d.ts +1 -1
- package/lib/projects/ProjectLogsManager.js +16 -21
- package/lib/projects/buildAndDeploy.js +28 -39
- package/lib/projects/config.d.ts +9 -0
- package/lib/projects/config.js +79 -0
- package/lib/projects/create.js +5 -6
- package/lib/projects/ensureProjectExists.d.ts +11 -0
- package/lib/projects/ensureProjectExists.js +97 -0
- package/lib/{DevServerManager.d.ts → projects/localDev/DevServerManager.d.ts} +1 -1
- package/lib/{DevServerManager.js → projects/localDev/DevServerManager.js} +6 -6
- package/lib/{DevServerManagerV2.d.ts → projects/localDev/DevServerManagerV2.d.ts} +1 -1
- package/lib/{DevServerManagerV2.js → projects/localDev/DevServerManagerV2.js} +3 -4
- package/lib/{LocalDevManager.d.ts → projects/localDev/LocalDevManager.d.ts} +1 -1
- package/lib/{LocalDevManager.js → projects/localDev/LocalDevManager.js} +49 -82
- package/lib/{LocalDevManagerV2.d.ts → projects/localDev/LocalDevManagerV2.d.ts} +2 -2
- package/lib/{LocalDevManagerV2.js → projects/localDev/LocalDevManagerV2.js} +43 -75
- package/lib/{localDev.d.ts → projects/localDev/helpers.d.ts} +5 -4
- package/lib/{localDev.js → projects/localDev/helpers.js} +97 -114
- package/lib/projects/ui.d.ts +1 -0
- package/lib/projects/ui.js +15 -0
- package/lib/projects/upload.d.ts +13 -2
- package/lib/projects/upload.js +18 -34
- package/lib/projects/urls.d.ts +1 -0
- package/lib/projects/urls.js +6 -0
- package/lib/projects/watch.d.ts +1 -1
- package/lib/projects/watch.js +21 -18
- package/lib/prompts/accountNamePrompt.js +16 -13
- package/lib/prompts/accountsPrompt.js +1 -2
- package/lib/prompts/cmsFieldPrompt.js +1 -2
- package/lib/prompts/createApiSamplePrompt.js +4 -5
- package/lib/prompts/createFunctionPrompt.js +13 -14
- package/lib/prompts/createModulePrompt.js +8 -9
- package/lib/prompts/createProjectPrompt.d.ts +11 -4
- package/lib/prompts/createProjectPrompt.js +14 -9
- package/lib/prompts/createTemplatePrompt.js +1 -2
- package/lib/prompts/downloadProjectPrompt.js +3 -4
- package/lib/prompts/installPublicAppPrompt.js +6 -5
- package/lib/prompts/personalAccessKeyPrompt.js +17 -18
- package/lib/prompts/previewPrompt.js +5 -6
- package/lib/prompts/projectAddPrompt.js +4 -5
- package/lib/prompts/projectDevTargetAccountPrompt.js +11 -12
- package/lib/prompts/projectNamePrompt.js +5 -6
- package/lib/prompts/projectsLogsPrompt.js +3 -2
- package/lib/prompts/promptUtils.d.ts +1 -1
- package/lib/prompts/sandboxesPrompt.js +5 -6
- package/lib/prompts/secretPrompt.js +2 -3
- package/lib/prompts/selectHubDBTablePrompt.js +11 -8
- package/lib/prompts/selectPublicAppPrompt.js +6 -7
- package/lib/prompts/setAsDefaultAccountPrompt.js +1 -2
- package/lib/prompts/uploadPrompt.js +4 -5
- package/lib/sandboxSync.js +15 -14
- package/lib/sandboxes.js +12 -13
- package/lib/serverlessLogs.js +4 -6
- package/lib/ui/SpinniesManager.d.ts +1 -1
- package/lib/ui/boxen.d.ts +5 -0
- package/lib/ui/boxen.js +30 -0
- package/lib/ui/git.js +8 -9
- package/lib/ui/index.d.ts +4 -2
- package/lib/ui/index.js +16 -16
- package/lib/ui/logger.d.ts +10 -0
- package/lib/ui/logger.js +15 -0
- package/lib/ui/serverlessFunctionLogs.js +2 -3
- package/lib/ui/spinniesUtils.d.ts +5 -5
- package/lib/yargsUtils.d.ts +1 -1
- package/package.json +7 -6
- package/types/Yargs.d.ts +5 -11
- package/lib/projects/index.d.ts +0 -20
- package/lib/projects/index.js +0 -195
package/lib/doctor/Doctor.js
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
83
|
-
secondaryMessaging: i18n(
|
|
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(
|
|
96
|
-
secondaryMessaging: i18n(
|
|
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(
|
|
123
|
+
message: i18n(`lib.doctor.accountChecks.active`),
|
|
109
124
|
});
|
|
110
|
-
const linkToPakUI = uiLink(i18n(
|
|
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(
|
|
115
|
-
secondaryMessaging: i18n(
|
|
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(
|
|
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(
|
|
143
|
-
secondaryMessaging: i18n(
|
|
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(
|
|
172
|
+
message: i18n(`lib.doctor.accountChecks.active`),
|
|
156
173
|
});
|
|
157
174
|
this.diagnosis?.addCLIConfigSection({
|
|
158
175
|
type: 'error',
|
|
159
|
-
message: i18n(
|
|
160
|
-
secondaryMessaging: i18n(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
219
|
+
message: i18n(`lib.doctor.npmChecks.notInstalled`),
|
|
205
220
|
});
|
|
206
221
|
}
|
|
207
222
|
this.diagnosis?.addCliSection({
|
|
208
223
|
type: 'success',
|
|
209
|
-
message: i18n(
|
|
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(
|
|
226
|
-
secondaryMessaging: i18n(
|
|
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(
|
|
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(
|
|
251
|
+
message: i18n(`lib.doctor.hsChecks.notLatest`, {
|
|
237
252
|
hsVersion: package_json_1.default.version,
|
|
238
253
|
}),
|
|
239
|
-
secondaryMessaging: i18n(
|
|
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(
|
|
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(
|
|
279
|
+
message: i18n(`lib.doctor.projectDependenciesChecks.missingDependencies`, {
|
|
266
280
|
dir: packageDirName,
|
|
267
281
|
}),
|
|
268
|
-
secondaryMessaging: i18n(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
360
|
+
message: i18n(`lib.doctor.port.inUse`, {
|
|
348
361
|
port: ports_1.PORT_MANAGER_SERVER_PORT,
|
|
349
362
|
}),
|
|
350
|
-
secondaryMessaging: i18n(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
32
|
-
logger_1.logger.log((0, lang_1.i18n)(
|
|
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)(
|
|
36
|
-
logger_1.logger.log((0, lang_1.i18n)(
|
|
37
|
-
docsLink: (0, ui_1.uiLink)((0, lang_1.i18n)(
|
|
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)(
|
|
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
|
: '',
|
package/lib/generateSelectors.js
CHANGED
|
@@ -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)(
|
|
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);
|
package/lib/hasFeature.d.ts
CHANGED
|
@@ -1 +1,3 @@
|
|
|
1
|
-
|
|
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 {};
|