@hubspot/cli 5.2.1-beta.6 → 5.2.1-beta.8

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 (78) hide show
  1. package/commands/accounts/clean.js +4 -4
  2. package/commands/accounts/info.js +2 -2
  3. package/commands/accounts/list.js +2 -2
  4. package/commands/accounts/rename.js +2 -2
  5. package/commands/accounts.js +2 -2
  6. package/commands/auth.js +2 -2
  7. package/commands/cms/lighthouseScore.js +3 -3
  8. package/commands/cms.js +2 -2
  9. package/commands/config.js +2 -2
  10. package/commands/customObject/schema/create.js +1 -1
  11. package/commands/customObject/schema/update.js +1 -1
  12. package/commands/customObject.js +2 -2
  13. package/commands/fetch.js +5 -5
  14. package/commands/filemanager/fetch.js +3 -3
  15. package/commands/filemanager/upload.js +3 -3
  16. package/commands/filemanager.js +3 -3
  17. package/commands/functions/deploy.js +6 -22
  18. package/commands/functions/list.js +3 -3
  19. package/commands/functions/server.js +3 -3
  20. package/commands/functions.js +2 -2
  21. package/commands/hubdb/clear.js +3 -3
  22. package/commands/hubdb/create.js +3 -3
  23. package/commands/hubdb/delete.js +3 -3
  24. package/commands/hubdb/fetch.js +3 -3
  25. package/commands/hubdb.js +2 -2
  26. package/commands/init.js +2 -2
  27. package/commands/lint.js +2 -2
  28. package/commands/list.js +3 -3
  29. package/commands/logs.js +3 -3
  30. package/commands/module/marketplace-validate.js +3 -3
  31. package/commands/module.js +2 -2
  32. package/commands/mv.js +3 -3
  33. package/commands/open.js +3 -3
  34. package/commands/project/create.js +3 -3
  35. package/commands/project/deploy.js +3 -3
  36. package/commands/project/dev.js +12 -4
  37. package/commands/project/download.js +2 -2
  38. package/commands/project/listBuilds.js +3 -3
  39. package/commands/project/logs.js +3 -3
  40. package/commands/project/migrateApp.js +210 -0
  41. package/commands/project/open.js +4 -4
  42. package/commands/project/upload.js +11 -6
  43. package/commands/project/watch.js +3 -3
  44. package/commands/project.js +4 -2
  45. package/commands/remove.js +3 -3
  46. package/commands/sandbox/create.js +7 -7
  47. package/commands/sandbox/delete.js +4 -4
  48. package/commands/sandbox/sync.js +4 -4
  49. package/commands/sandbox.js +2 -2
  50. package/commands/secrets/addSecret.js +3 -3
  51. package/commands/secrets/deleteSecret.js +3 -3
  52. package/commands/secrets/listSecrets.js +3 -3
  53. package/commands/secrets/updateSecret.js +3 -3
  54. package/commands/secrets.js +2 -2
  55. package/commands/theme/marketplace-validate.js +3 -3
  56. package/commands/theme/preview.js +4 -3
  57. package/commands/upload.js +4 -4
  58. package/commands/watch.js +61 -18
  59. package/jest.config.js +1 -0
  60. package/lang/en.lyaml +75 -29
  61. package/lib/LocalDevManager.js +8 -0
  62. package/lib/__tests__/{commonOpts.js → commonOpts.test.js} +3 -0
  63. package/lib/__tests__/downloadProjectPrompt.test.js +31 -0
  64. package/lib/__tests__/projects.test.js +13 -17
  65. package/lib/__tests__/{serverlessLogs.js → serverlessLogs.test.js} +1 -0
  66. package/lib/{developerTestAccountCreate.js → buildAccount.js} +91 -80
  67. package/lib/constants.js +9 -0
  68. package/lib/developerTestAccounts.js +52 -4
  69. package/lib/localDev.js +11 -10
  70. package/lib/polling.js +25 -0
  71. package/lib/projects.js +49 -4
  72. package/lib/prompts/createProjectPrompt.js +19 -7
  73. package/lib/prompts/downloadProjectPrompt.js +4 -5
  74. package/lib/prompts/selectPublicAppPrompt.js +74 -0
  75. package/lib/sandboxes.js +160 -1
  76. package/package.json +6 -6
  77. package/lib/sandboxCreate.js +0 -318
  78. /package/lib/__tests__/{validation.js → validation.test.js} +0 -0
@@ -0,0 +1,210 @@
1
+ const path = require('path');
2
+ const {
3
+ addAccountOptions,
4
+ addConfigOptions,
5
+ getAccountId,
6
+ addUseEnvironmentOptions,
7
+ } = require('../../lib/commonOpts');
8
+ const { trackCommandUsage } = require('../../lib/usageTracking');
9
+ const { loadAndValidateOptions } = require('../../lib/validation');
10
+ const {
11
+ createProjectPrompt,
12
+ } = require('../../lib/prompts/createProjectPrompt');
13
+ const { i18n } = require('../../lib/lang');
14
+ const {
15
+ fetchPublicAppOptions,
16
+ selectPublicAppPrompt,
17
+ } = require('../../lib/prompts/selectPublicAppPrompt');
18
+ const { poll } = require('../../lib/polling');
19
+ const {
20
+ uiBetaTag,
21
+ uiLine,
22
+ uiLink,
23
+ uiCommandReference,
24
+ uiAccountDescription,
25
+ } = require('../../lib/ui');
26
+ const SpinniesManager = require('../../lib/ui/SpinniesManager');
27
+ const {
28
+ logApiErrorInstance,
29
+ ApiErrorContext,
30
+ } = require('../../lib/errorHandlers/apiErrors');
31
+ const { EXIT_CODES } = require('../../lib/enums/exitCodes');
32
+ const { promptUser } = require('../../lib/prompts/promptUtils');
33
+ const { isAppDeveloperAccount } = require('../../lib/accountTypes');
34
+ const { ensureProjectExists } = require('../../lib/projects');
35
+ const {
36
+ migrateApp,
37
+ checkMigrationStatus,
38
+ } = require('@hubspot/local-dev-lib/api/projects');
39
+ const { getCwd } = require('@hubspot/local-dev-lib/path');
40
+ const { logger } = require('@hubspot/local-dev-lib/logger');
41
+ const { getAccountConfig } = require('@hubspot/local-dev-lib/config');
42
+ const { downloadProject } = require('@hubspot/local-dev-lib/api/projects');
43
+ const { extractZipArchive } = require('@hubspot/local-dev-lib/archive');
44
+ const { getHubSpotWebsiteOrigin } = require('@hubspot/local-dev-lib/urls');
45
+
46
+ const i18nKey = 'commands.project.subcommands.migrateApp';
47
+
48
+ exports.command = 'migrate-app';
49
+ exports.describe = null; // uiBetaTag(i18n(`${i18nKey}.describe`), false);
50
+
51
+ exports.handler = async options => {
52
+ await loadAndValidateOptions(options);
53
+
54
+ const accountId = getAccountId(options);
55
+ const accountConfig = getAccountConfig(accountId);
56
+ const accountName = uiAccountDescription(accountId);
57
+
58
+ trackCommandUsage('migrate-app', {}, accountId);
59
+
60
+ if (!isAppDeveloperAccount(accountConfig)) {
61
+ logger.error(
62
+ i18n(`${i18nKey}.errors.invalidAccountType`, {
63
+ accountName,
64
+ accountType: accountConfig.accountType,
65
+ useCommand: uiCommandReference('hs accounts use'),
66
+ authCommand: uiCommandReference('hs auth'),
67
+ })
68
+ );
69
+ process.exit(EXIT_CODES.ERROR);
70
+ }
71
+
72
+ const { appId } =
73
+ 'appId' in options
74
+ ? options
75
+ : await selectPublicAppPrompt({
76
+ accountId,
77
+ accountName,
78
+ options,
79
+ migrateApp: true,
80
+ });
81
+
82
+ const publicApps = await fetchPublicAppOptions(accountId, accountName);
83
+ if (!publicApps.find(a => a.id === appId)) {
84
+ logger.error(i18n(`${i18nKey}.errors.invalidAppId`, { appId }));
85
+ process.exit(EXIT_CODES.ERROR);
86
+ }
87
+
88
+ const { name, location } = await createProjectPrompt('', options, true);
89
+
90
+ const projectName = options.name || name;
91
+ const projectLocation = options.location || location;
92
+
93
+ const { projectExists } = await ensureProjectExists(accountId, projectName, {
94
+ allowCreate: false,
95
+ noLogs: true,
96
+ });
97
+
98
+ if (projectExists) {
99
+ logger.error(
100
+ i18n(`${i18nKey}.errors.projectAlreadyExists`, {
101
+ projectName,
102
+ })
103
+ );
104
+ process.exit(EXIT_CODES.ERROR);
105
+ }
106
+
107
+ logger.log('');
108
+ uiLine();
109
+ logger.log(uiBetaTag(i18n(`${i18nKey}.warning.title`), false));
110
+ logger.log(i18n(`${i18nKey}.warning.projectConversion`));
111
+ logger.log(i18n(`${i18nKey}.warning.appConfig`));
112
+ logger.log('');
113
+ logger.log(i18n(`${i18nKey}.warning.buildAndDeploy`));
114
+ logger.log('');
115
+ logger.log(i18n(`${i18nKey}.warning.existingApps`));
116
+ logger.log('');
117
+ logger.log(i18n(`${i18nKey}.warning.copyApp`));
118
+ uiLine();
119
+
120
+ const { shouldCreateApp } = await promptUser({
121
+ name: 'shouldCreateApp',
122
+ type: 'confirm',
123
+ message: i18n(`${i18nKey}.createAppPrompt`),
124
+ });
125
+
126
+ if (!shouldCreateApp) {
127
+ process.exit(EXIT_CODES.SUCCESS);
128
+ }
129
+
130
+ try {
131
+ SpinniesManager.init();
132
+
133
+ SpinniesManager.add('migrateApp', {
134
+ text: i18n(`${i18nKey}.migrationStatus.inProgress`),
135
+ });
136
+
137
+ const migrateResponse = await migrateApp(accountId, appId, projectName);
138
+ const { id } = migrateResponse;
139
+ const pollResponse = await poll(checkMigrationStatus, accountId, id);
140
+ const { status, project } = pollResponse;
141
+ if (status === 'SUCCESS') {
142
+ const absoluteDestPath = path.resolve(getCwd(), projectLocation);
143
+ const { env } = getAccountConfig(accountId);
144
+ const baseUrl = getHubSpotWebsiteOrigin(env);
145
+
146
+ const zippedProject = await downloadProject(accountId, projectName, 1);
147
+
148
+ await extractZipArchive(
149
+ zippedProject,
150
+ projectName,
151
+ path.resolve(absoluteDestPath),
152
+ { includesRootDir: true, hideLogs: true }
153
+ );
154
+
155
+ SpinniesManager.succeed('migrateApp', {
156
+ text: i18n(`${i18nKey}.migrationStatus.done`),
157
+ succeedColor: 'white',
158
+ });
159
+ logger.log('');
160
+ uiLine();
161
+ logger.success(i18n(`${i18nKey}.migrationStatus.success`));
162
+ logger.log('');
163
+ logger.log(
164
+ uiLink(
165
+ i18n(`${i18nKey}.projectDetailsLink`),
166
+ `${baseUrl}/developer-projects/${accountId}/project/${project.name}`
167
+ )
168
+ );
169
+ process.exit(EXIT_CODES.SUCCESS);
170
+ }
171
+ } catch (error) {
172
+ SpinniesManager.fail('migrateApp', {
173
+ text: i18n(`${i18nKey}.migrationStatus.failure`),
174
+ failColor: 'white',
175
+ });
176
+ logApiErrorInstance(
177
+ error.error || error,
178
+ new ApiErrorContext({ accountId })
179
+ );
180
+
181
+ process.exit(EXIT_CODES.ERROR);
182
+ }
183
+ };
184
+
185
+ exports.builder = yargs => {
186
+ yargs.options({
187
+ name: {
188
+ describe: i18n(`${i18nKey}.options.name.describe`),
189
+ type: 'string',
190
+ },
191
+ location: {
192
+ describe: i18n(`${i18nKey}.options.location.describe`),
193
+ type: 'string',
194
+ },
195
+ appId: {
196
+ describe: i18n(`${i18nKey}.options.appId.describe`),
197
+ type: 'number',
198
+ },
199
+ });
200
+
201
+ yargs.example([
202
+ ['$0 project migrate-app', i18n(`${i18nKey}.examples.default`)],
203
+ ]);
204
+
205
+ addConfigOptions(yargs);
206
+ addAccountOptions(yargs);
207
+ addUseEnvironmentOptions(yargs);
208
+
209
+ return yargs;
210
+ };
@@ -66,10 +66,10 @@ exports.handler = async options => {
66
66
  };
67
67
 
68
68
  exports.builder = yargs => {
69
- addConfigOptions(yargs, true);
70
- addAccountOptions(yargs, true);
71
- addUseEnvironmentOptions(yargs, true);
72
- addTestingOptions(yargs, true);
69
+ addConfigOptions(yargs);
70
+ addAccountOptions(yargs);
71
+ addUseEnvironmentOptions(yargs);
72
+ addTestingOptions(yargs);
73
73
 
74
74
  yargs.options({
75
75
  project: {
@@ -6,7 +6,7 @@ const {
6
6
  } = require('../../lib/commonOpts');
7
7
  const chalk = require('chalk');
8
8
  const { logger } = require('@hubspot/local-dev-lib/logger');
9
- const { uiBetaTag, uiLine } = require('../../lib/ui');
9
+ const { uiBetaTag, uiCommandReference } = require('../../lib/ui');
10
10
  const { trackCommandUsage } = require('../../lib/usageTracking');
11
11
  const { loadAndValidateOptions } = require('../../lib/validation');
12
12
  const {
@@ -82,7 +82,6 @@ exports.handler = async options => {
82
82
  process.exit(EXIT_CODES.ERROR);
83
83
  }
84
84
  if (result.succeeded && !result.buildResult.isAutoDeployEnabled) {
85
- uiLine();
86
85
  logger.log(
87
86
  chalk.bold(
88
87
  i18n(`${i18nKey}.logs.buildSucceeded`, {
@@ -90,7 +89,13 @@ exports.handler = async options => {
90
89
  })
91
90
  )
92
91
  );
93
- uiLine();
92
+ logger.log(
93
+ i18n(`${i18nKey}.logs.autoDeployDisabled`, {
94
+ deployCommand: uiCommandReference(
95
+ `hs project deploy --buildId=${result.buildId}`
96
+ ),
97
+ })
98
+ );
94
99
  logFeedbackMessage(result.buildId);
95
100
 
96
101
  await displayWarnLogs(accountId, projectConfig.name, result.buildId);
@@ -126,9 +131,9 @@ exports.builder = yargs => {
126
131
  ['$0 project upload myProjectFolder', i18n(`${i18nKey}.examples.default`)],
127
132
  ]);
128
133
 
129
- addConfigOptions(yargs, true);
130
- addAccountOptions(yargs, true);
131
- addUseEnvironmentOptions(yargs, true);
134
+ addConfigOptions(yargs);
135
+ addAccountOptions(yargs);
136
+ addUseEnvironmentOptions(yargs);
132
137
 
133
138
  return yargs;
134
139
  };
@@ -179,9 +179,9 @@ exports.builder = yargs => {
179
179
  ['$0 project watch myProjectFolder', i18n(`${i18nKey}.examples.default`)],
180
180
  ]);
181
181
 
182
- addConfigOptions(yargs, true);
183
- addAccountOptions(yargs, true);
184
- addUseEnvironmentOptions(yargs, true);
182
+ addConfigOptions(yargs);
183
+ addAccountOptions(yargs);
184
+ addUseEnvironmentOptions(yargs);
185
185
 
186
186
  return yargs;
187
187
  };
@@ -11,6 +11,7 @@ const download = require('./project/download');
11
11
  const open = require('./project/open');
12
12
  const dev = require('./project/dev');
13
13
  const add = require('./project/add');
14
+ const migrateApp = require('./project/migrateApp');
14
15
 
15
16
  const i18nKey = 'commands.project';
16
17
 
@@ -18,8 +19,8 @@ exports.command = 'project';
18
19
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
19
20
 
20
21
  exports.builder = yargs => {
21
- addConfigOptions(yargs, true);
22
- addAccountOptions(yargs, true);
22
+ addConfigOptions(yargs);
23
+ addAccountOptions(yargs);
23
24
 
24
25
  // TODO: deploy must be updated
25
26
  yargs.command(create).demandCommand(0, '');
@@ -32,6 +33,7 @@ exports.builder = yargs => {
32
33
  yargs.command(listBuilds).demandCommand(0, '');
33
34
  yargs.command(download).demandCommand(0, '');
34
35
  yargs.command(open).demandCommand(0, '');
36
+ yargs.command(migrateApp).demandCommand(0, '');
35
37
 
36
38
  return yargs;
37
39
  };
@@ -47,9 +47,9 @@ exports.handler = async options => {
47
47
  };
48
48
 
49
49
  exports.builder = yargs => {
50
- addConfigOptions(yargs, true);
51
- addAccountOptions(yargs, true);
52
- addUseEnvironmentOptions(yargs, true);
50
+ addConfigOptions(yargs);
51
+ addAccountOptions(yargs);
52
+ addUseEnvironmentOptions(yargs);
53
53
  yargs.positional('path', {
54
54
  describe: i18n(`${i18nKey}.positionals.path.describe`),
55
55
  type: 'string',
@@ -9,7 +9,6 @@ const { loadAndValidateOptions } = require('../../lib/validation');
9
9
  const { i18n } = require('../../lib/lang');
10
10
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
11
11
  const { getAccountConfig, getEnv } = require('@hubspot/local-dev-lib/config');
12
- const { buildSandbox } = require('../../lib/sandboxCreate');
13
12
  const { uiFeatureHighlight, uiAccountDescription } = require('../../lib/ui');
14
13
  const {
15
14
  sandboxTypeMap,
@@ -38,6 +37,7 @@ const {
38
37
  HUBSPOT_ACCOUNT_TYPES,
39
38
  HUBSPOT_ACCOUNT_TYPE_STRINGS,
40
39
  } = require('@hubspot/local-dev-lib/constants/config');
40
+ const { buildNewAccount } = require('../../lib/buildAccount');
41
41
 
42
42
  const i18nKey = 'commands.sandbox.subcommands.create';
43
43
 
@@ -155,9 +155,9 @@ exports.handler = async options => {
155
155
  }
156
156
 
157
157
  try {
158
- const { result } = await buildSandbox({
158
+ const { result } = await buildNewAccount({
159
159
  name: sandboxName,
160
- type: sandboxType,
160
+ accountType: sandboxType,
161
161
  accountConfig,
162
162
  env,
163
163
  force,
@@ -238,10 +238,10 @@ exports.builder = yargs => {
238
238
  ],
239
239
  ]);
240
240
 
241
- addConfigOptions(yargs, true);
242
- addAccountOptions(yargs, true);
243
- addUseEnvironmentOptions(yargs, true);
244
- addTestingOptions(yargs, true);
241
+ addConfigOptions(yargs);
242
+ addAccountOptions(yargs);
243
+ addUseEnvironmentOptions(yargs);
244
+ addTestingOptions(yargs);
245
245
 
246
246
  return yargs;
247
247
  };
@@ -242,10 +242,10 @@ exports.builder = yargs => {
242
242
  ],
243
243
  ]);
244
244
 
245
- addConfigOptions(yargs, true);
246
- addAccountOptions(yargs, true);
247
- addUseEnvironmentOptions(yargs, true);
248
- addTestingOptions(yargs, true);
245
+ addConfigOptions(yargs);
246
+ addAccountOptions(yargs);
247
+ addUseEnvironmentOptions(yargs);
248
+ addTestingOptions(yargs);
249
249
 
250
250
  return yargs;
251
251
  };
@@ -206,10 +206,10 @@ exports.builder = yargs => {
206
206
 
207
207
  yargs.example([['$0 sandbox sync', i18n(`${i18nKey}.examples.default`)]]);
208
208
 
209
- addConfigOptions(yargs, true);
210
- addAccountOptions(yargs, true);
211
- addUseEnvironmentOptions(yargs, true);
212
- addTestingOptions(yargs, true);
209
+ addConfigOptions(yargs);
210
+ addAccountOptions(yargs);
211
+ addUseEnvironmentOptions(yargs);
212
+ addTestingOptions(yargs);
213
213
 
214
214
  return yargs;
215
215
  };
@@ -10,8 +10,8 @@ exports.command = 'sandbox';
10
10
  exports.describe = i18n(`${i18nKey}.describe`);
11
11
 
12
12
  exports.builder = yargs => {
13
- addConfigOptions(yargs, true);
14
- addAccountOptions(yargs, true);
13
+ addConfigOptions(yargs);
14
+ addAccountOptions(yargs);
15
15
 
16
16
  yargs
17
17
  .command(create)
@@ -58,9 +58,9 @@ exports.handler = async options => {
58
58
  };
59
59
 
60
60
  exports.builder = yargs => {
61
- addConfigOptions(yargs, true);
62
- addAccountOptions(yargs, true);
63
- addUseEnvironmentOptions(yargs, true);
61
+ addConfigOptions(yargs);
62
+ addAccountOptions(yargs);
63
+ addUseEnvironmentOptions(yargs);
64
64
  yargs.positional('name', {
65
65
  describe: i18n(`${i18nKey}.positionals.name.describe`),
66
66
  type: 'string',
@@ -55,9 +55,9 @@ exports.handler = async options => {
55
55
  };
56
56
 
57
57
  exports.builder = yargs => {
58
- addConfigOptions(yargs, true);
59
- addAccountOptions(yargs, true);
60
- addUseEnvironmentOptions(yargs, true);
58
+ addConfigOptions(yargs);
59
+ addAccountOptions(yargs);
60
+ addUseEnvironmentOptions(yargs);
61
61
  yargs.positional('name', {
62
62
  describe: i18n(`${i18nKey}.positionals.name.describe`),
63
63
  type: 'string',
@@ -49,8 +49,8 @@ exports.handler = async options => {
49
49
  };
50
50
 
51
51
  exports.builder = yargs => {
52
- addConfigOptions(yargs, true);
53
- addAccountOptions(yargs, true);
54
- addUseEnvironmentOptions(yargs, true);
52
+ addConfigOptions(yargs);
53
+ addAccountOptions(yargs);
54
+ addUseEnvironmentOptions(yargs);
55
55
  return yargs;
56
56
  };
@@ -59,9 +59,9 @@ exports.handler = async options => {
59
59
  };
60
60
 
61
61
  exports.builder = yargs => {
62
- addConfigOptions(yargs, true);
63
- addAccountOptions(yargs, true);
64
- addUseEnvironmentOptions(yargs, true);
62
+ addConfigOptions(yargs);
63
+ addAccountOptions(yargs);
64
+ addUseEnvironmentOptions(yargs);
65
65
  yargs.positional('name', {
66
66
  describe: i18n(`${i18nKey}.positionals.name.describe`),
67
67
  type: 'string',
@@ -12,8 +12,8 @@ exports.command = 'secrets';
12
12
  exports.describe = i18n(`${i18nKey}.describe`);
13
13
 
14
14
  exports.builder = yargs => {
15
- addConfigOptions(yargs, true);
16
- addAccountOptions(yargs, true);
15
+ addConfigOptions(yargs);
16
+ addAccountOptions(yargs);
17
17
  yargs
18
18
  .command(listSecretsCommand)
19
19
  .command(addSecretCommand)
@@ -55,9 +55,9 @@ exports.handler = async options => {
55
55
  };
56
56
 
57
57
  exports.builder = yargs => {
58
- addConfigOptions(yargs, true);
59
- addAccountOptions(yargs, true);
60
- addUseEnvironmentOptions(yargs, true);
58
+ addConfigOptions(yargs);
59
+ addAccountOptions(yargs);
60
+ addUseEnvironmentOptions(yargs);
61
61
 
62
62
  yargs.positional('src', {
63
63
  describe: i18n(`${i18nKey}.positionals.src.describe`),
@@ -33,7 +33,8 @@ const {
33
33
  COMPONENT_TYPES,
34
34
  } = require('../../lib/projectStructure');
35
35
 
36
- const i18nKey = 'commands.preview';
36
+ const i18nKey = 'commands.theme.subcommands.preview';
37
+
37
38
  exports.command = 'preview [--src] [--dest]';
38
39
  exports.describe = i18n(`${i18nKey}.describe`);
39
40
 
@@ -187,8 +188,8 @@ exports.handler = async options => {
187
188
  };
188
189
 
189
190
  exports.builder = yargs => {
190
- addConfigOptions(yargs, true);
191
- addAccountOptions(yargs, true);
191
+ addConfigOptions(yargs);
192
+ addAccountOptions(yargs);
192
193
 
193
194
  yargs.option('src', {
194
195
  describe: i18n(`${i18nKey}.options.src.describe`),
@@ -279,10 +279,10 @@ exports.handler = async options => {
279
279
  };
280
280
 
281
281
  exports.builder = yargs => {
282
- addConfigOptions(yargs, true);
283
- addAccountOptions(yargs, true);
284
- addModeOptions(yargs, { write: true }, true);
285
- addUseEnvironmentOptions(yargs, true);
282
+ addConfigOptions(yargs);
283
+ addAccountOptions(yargs);
284
+ addModeOptions(yargs, { write: true });
285
+ addUseEnvironmentOptions(yargs);
286
286
 
287
287
  yargs.positional('src', {
288
288
  describe: i18n(`${i18nKey}.positionals.src.describe`),
package/commands/watch.js CHANGED
@@ -18,8 +18,13 @@ const { validateMode, loadAndValidateOptions } = require('../lib/validation');
18
18
  const { trackCommandUsage } = require('../lib/usageTracking');
19
19
  const { i18n } = require('../lib/lang');
20
20
  const { getUploadableFileList } = require('../lib/upload');
21
-
21
+ const { logErrorInstance } = require('../lib/errorHandlers/standardErrors');
22
+ const {
23
+ logApiUploadErrorInstance,
24
+ ApiErrorContext,
25
+ } = require('../lib/errorHandlers/apiErrors');
22
26
  const i18nKey = 'commands.watch';
27
+
23
28
  const { EXIT_CODES } = require('../lib/enums/exitCodes');
24
29
 
25
30
  exports.command = 'watch [--src] [--dest]';
@@ -71,12 +76,9 @@ exports.handler = async options => {
71
76
 
72
77
  if (disableInitial) {
73
78
  logger.info(i18n(`${i18nKey}.warnings.disableInitial`));
74
- } else {
79
+ } else if (!initialUpload) {
75
80
  logger.info(i18n(`${i18nKey}.warnings.notUploaded`, { path: src }));
76
-
77
- if (!initialUpload) {
78
- logger.info(i18n(`${i18nKey}.warnings.initialUpload`));
79
- }
81
+ logger.info(i18n(`${i18nKey}.warnings.initialUpload`));
80
82
  }
81
83
 
82
84
  if (initialUpload) {
@@ -87,21 +89,62 @@ exports.handler = async options => {
87
89
  }
88
90
 
89
91
  trackCommandUsage('watch', { mode }, accountId);
90
- watch(accountId, absoluteSrcPath, dest, {
91
- mode,
92
- remove,
93
- disableInitial: initialUpload ? false : true,
94
- notify,
95
- commandOptions: options,
96
- filePaths: filesToUpload,
97
- });
92
+
93
+ const postInitialUploadCallback = null;
94
+ const onUploadFolderError = error => {
95
+ logger.error(
96
+ i18n(`${i18nKey}.errors.folderFailed`, {
97
+ src,
98
+ dest,
99
+ accountId,
100
+ })
101
+ );
102
+ logErrorInstance(error, {
103
+ accountId,
104
+ });
105
+ };
106
+ const onQueueAddError = null;
107
+ const onUploadFileError = (file, dest, accountId) => error => {
108
+ logger.error(
109
+ i18n(`${i18nKey}.errors.fileFailed`, {
110
+ file,
111
+ dest,
112
+ accountId,
113
+ })
114
+ );
115
+ logApiUploadErrorInstance(
116
+ error,
117
+ new ApiErrorContext({
118
+ accountId,
119
+ request: dest,
120
+ payload: file,
121
+ })
122
+ );
123
+ };
124
+ watch(
125
+ accountId,
126
+ absoluteSrcPath,
127
+ dest,
128
+ {
129
+ mode,
130
+ remove,
131
+ disableInitial: initialUpload ? false : true,
132
+ notify,
133
+ commandOptions: options,
134
+ filePaths: filesToUpload,
135
+ },
136
+ postInitialUploadCallback,
137
+ onUploadFolderError,
138
+ onQueueAddError,
139
+ onUploadFileError
140
+ );
98
141
  };
99
142
 
100
143
  exports.builder = yargs => {
101
- addConfigOptions(yargs, true);
102
- addAccountOptions(yargs, true);
103
- addModeOptions(yargs, { write: true }, true);
104
- addUseEnvironmentOptions(yargs, true);
144
+ addConfigOptions(yargs);
145
+ addAccountOptions(yargs);
146
+ addModeOptions(yargs, { write: true });
147
+ addUseEnvironmentOptions(yargs);
105
148
 
106
149
  yargs.positional('src', {
107
150
  describe: i18n(`${i18nKey}.positionals.src.describe`),
package/jest.config.js CHANGED
@@ -1,3 +1,4 @@
1
1
  module.exports = {
2
2
  testPathIgnorePatterns: ['commands/functions/test.js'],
3
+ clearMocks: true,
3
4
  };