@hubspot/cli 7.7.1-experimental.0 → 7.7.2-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 (59) hide show
  1. package/commands/account/auth.js +51 -82
  2. package/commands/auth.js +2 -15
  3. package/commands/config/migrate.js +17 -36
  4. package/commands/init.js +1 -2
  5. package/commands/module/marketplace-validate.js +6 -8
  6. package/commands/module.js +2 -1
  7. package/commands/project/add.d.ts +5 -2
  8. package/commands/project/add.js +43 -80
  9. package/commands/project/create.d.ts +2 -8
  10. package/commands/project/create.js +84 -55
  11. package/commands/project/dev/unifiedFlow.js +1 -0
  12. package/commands/remove.js +6 -12
  13. package/commands/theme/generate-selectors.js +7 -10
  14. package/commands/theme/marketplace-validate.js +6 -8
  15. package/commands/theme/preview.js +17 -18
  16. package/commands/theme.js +2 -2
  17. package/commands/upload.js +26 -63
  18. package/commands/watch.js +20 -32
  19. package/lang/en.d.ts +140 -92
  20. package/lang/en.js +143 -98
  21. package/lang/en.lyaml +3 -186
  22. package/lib/configMigrate.d.ts +2 -2
  23. package/lib/configMigrate.js +34 -69
  24. package/lib/constants.d.ts +23 -5
  25. package/lib/constants.js +24 -6
  26. package/lib/generateSelectors.js +3 -5
  27. package/lib/marketplaceValidate.d.ts +12 -2
  28. package/lib/marketplaceValidate.js +22 -29
  29. package/lib/middleware/configMiddleware.js +1 -0
  30. package/lib/projects/add/legacyAddComponent.d.ts +5 -0
  31. package/lib/projects/add/legacyAddComponent.js +48 -0
  32. package/lib/projects/add/v3AddComponent.d.ts +8 -0
  33. package/lib/projects/add/v3AddComponent.js +85 -0
  34. package/lib/projects/components.d.ts +2 -0
  35. package/lib/projects/components.js +82 -0
  36. package/lib/projects/create/index.d.ts +23 -0
  37. package/lib/projects/create/index.js +33 -0
  38. package/lib/projects/create/legacy.d.ts +6 -0
  39. package/lib/projects/{create.js → create/legacy.js} +20 -11
  40. package/lib/projects/create/v3.d.ts +27 -0
  41. package/lib/projects/create/v3.js +158 -0
  42. package/lib/projects/localDev/AppDevModeInterface.d.ts +3 -2
  43. package/lib/projects/localDev/AppDevModeInterface.js +38 -2
  44. package/lib/projects/localDev/LocalDevProcess.d.ts +12 -5
  45. package/lib/projects/localDev/LocalDevProcess.js +47 -17
  46. package/lib/projects/localDev/LocalDevState.d.ts +16 -3
  47. package/lib/projects/localDev/LocalDevState.js +43 -2
  48. package/lib/projects/localDev/LocalDevWatcher.js +3 -6
  49. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +3 -0
  50. package/lib/projects/localDev/LocalDevWebsocketServer.js +48 -9
  51. package/lib/prompts/createProjectPrompt.d.ts +14 -5
  52. package/lib/prompts/createProjectPrompt.js +36 -13
  53. package/lib/prompts/projectAddPrompt.d.ts +5 -1
  54. package/lib/prompts/projectAddPrompt.js +35 -7
  55. package/lib/prompts/setAsDefaultAccountPrompt.js +10 -0
  56. package/package.json +6 -5
  57. package/types/LocalDev.d.ts +11 -1
  58. package/types/Projects.d.ts +19 -2
  59. package/lib/projects/create.d.ts +0 -5
@@ -9,7 +9,6 @@ const uploadFolder_1 = require("@hubspot/local-dev-lib/cms/uploadFolder");
9
9
  const fileMapper_1 = require("@hubspot/local-dev-lib/fileMapper");
10
10
  const fileMapper_2 = require("@hubspot/local-dev-lib/api/fileMapper");
11
11
  const path_2 = require("@hubspot/local-dev-lib/path");
12
- const logger_1 = require("@hubspot/local-dev-lib/logger");
13
12
  const modules_1 = require("@hubspot/local-dev-lib/cms/modules");
14
13
  const ignoreRules_1 = require("@hubspot/local-dev-lib/ignoreRules");
15
14
  const themes_1 = require("@hubspot/local-dev-lib/cms/themes");
@@ -21,18 +20,17 @@ const promptUtils_1 = require("../lib/prompts/promptUtils");
21
20
  const validation_1 = require("../lib/validation");
22
21
  const usageTracking_1 = require("../lib/usageTracking");
23
22
  const upload_1 = require("../lib/upload");
24
- const lang_1 = require("../lib/lang");
23
+ const en_1 = require("../lang/en");
25
24
  const exitCodes_1 = require("../lib/enums/exitCodes");
26
25
  const yargsUtils_1 = require("../lib/yargsUtils");
26
+ const logger_1 = require("../lib/ui/logger");
27
27
  const command = 'upload [src] [dest]';
28
- const describe = (0, lang_1.i18n)('commands.upload.describe');
28
+ const describe = en_1.commands.upload.describe;
29
29
  function logThemePreview(filePath, accountId) {
30
30
  const previewUrl = (0, themes_1.getThemePreviewUrl)(filePath, accountId);
31
31
  // Only log if we are actually in a theme
32
32
  if (previewUrl) {
33
- logger_1.logger.log((0, lang_1.i18n)('commands.upload.previewUrl', {
34
- previewUrl,
35
- }));
33
+ logger_1.uiLogger.log(en_1.commands.upload.previewUrl(previewUrl));
36
34
  }
37
35
  }
38
36
  async function handler(args) {
@@ -47,7 +45,7 @@ async function handler(args) {
47
45
  let dest = args.dest || uploadPromptAnswers.dest;
48
46
  let absoluteSrcPath = path_1.default.resolve((0, path_2.getCwd)(), src);
49
47
  if (!dest) {
50
- logger_1.logger.error((0, lang_1.i18n)('commands.upload.errors.destinationRequired'));
48
+ logger_1.uiLogger.error(en_1.commands.upload.errors.destinationRequired);
51
49
  return;
52
50
  }
53
51
  // Check for theme.json file and determine the root path for the project based on it if it exists
@@ -72,52 +70,37 @@ async function handler(args) {
72
70
  try {
73
71
  stats = fs_1.default.statSync(absoluteSrcPath);
74
72
  if (!stats.isFile() && !stats.isDirectory()) {
75
- logger_1.logger.error((0, lang_1.i18n)('commands.upload.errors.invalidPath', {
76
- path: src,
77
- }));
73
+ logger_1.uiLogger.error(en_1.commands.upload.errors.invalidPath(src));
78
74
  return;
79
75
  }
80
76
  }
81
77
  catch (e) {
82
- logger_1.logger.error((0, lang_1.i18n)('commands.upload.errors.invalidPath', {
83
- path: src,
84
- }));
78
+ logger_1.uiLogger.error(en_1.commands.upload.errors.invalidPath(src));
85
79
  return;
86
80
  }
87
81
  const normalizedDest = (0, path_2.convertToUnixPath)(dest);
88
82
  (0, usageTracking_1.trackCommandUsage)('upload', { mode: cmsPublishMode, type: stats.isFile() ? 'file' : 'folder' }, derivedAccountId);
89
83
  const srcDestIssues = await (0, modules_1.validateSrcAndDestPaths)({ isLocal: true, path: src }, { isHubSpot: true, path: dest });
90
84
  if (srcDestIssues.length) {
91
- srcDestIssues.forEach(({ message }) => logger_1.logger.error(message));
85
+ srcDestIssues.forEach(({ message }) => logger_1.uiLogger.error(message));
92
86
  process.exit(exitCodes_1.EXIT_CODES.WARNING);
93
87
  }
94
88
  if (stats.isFile()) {
95
89
  if (!(0, path_2.isAllowedExtension)(src) && !convertFields) {
96
- logger_1.logger.error((0, lang_1.i18n)('commands.upload.errors.invalidPath', {
97
- path: src,
98
- }));
90
+ logger_1.uiLogger.error(en_1.commands.upload.errors.invalidPath(src));
99
91
  return;
100
92
  }
101
93
  if ((0, ignoreRules_1.shouldIgnoreFile)(absoluteSrcPath)) {
102
- logger_1.logger.error((0, lang_1.i18n)('commands.upload.errors.fileIgnored', {
103
- path: src,
104
- }));
94
+ logger_1.uiLogger.error(en_1.commands.upload.errors.fileIgnored(src));
105
95
  return;
106
96
  }
107
97
  (0, fileMapper_2.upload)(derivedAccountId, absoluteSrcPath, normalizedDest, (0, fileMapper_1.getFileMapperQueryValues)(cmsPublishMode))
108
98
  .then(() => {
109
- logger_1.logger.success((0, lang_1.i18n)('commands.upload.success.fileUploaded', {
110
- accountId: derivedAccountId,
111
- dest: normalizedDest,
112
- src,
113
- }));
99
+ logger_1.uiLogger.success(en_1.commands.upload.success.fileUploaded(src, normalizedDest, derivedAccountId));
114
100
  logThemePreview(src, derivedAccountId);
115
101
  })
116
102
  .catch(error => {
117
- logger_1.logger.error((0, lang_1.i18n)('commands.upload.errors.uploadFailed', {
118
- dest: normalizedDest,
119
- src,
120
- }));
103
+ logger_1.uiLogger.error(en_1.commands.upload.errors.uploadFailed(src, normalizedDest));
121
104
  (0, index_1.logError)(error, new index_1.ApiErrorContext({
122
105
  accountId: derivedAccountId,
123
106
  request: normalizedDest,
@@ -137,35 +120,22 @@ async function handler(args) {
137
120
  });
138
121
  }
139
122
  else {
140
- logger_1.logger.log((0, lang_1.i18n)('commands.upload.uploading', {
141
- accountId: derivedAccountId,
142
- dest,
143
- src,
144
- }));
123
+ logger_1.uiLogger.log(en_1.commands.upload.uploading(src, dest, derivedAccountId));
145
124
  // Generate the first-pass file list in here, and pass to uploadFolder.
146
125
  const filePaths = await (0, upload_1.getUploadableFileList)(absoluteSrcPath, args.convertFields ?? false);
147
126
  if (args.clean) {
148
127
  // If clean is true, will first delete the dest folder and then upload src. Cleans up files that only exist on HS.
149
128
  let cleanUpload = args.force;
150
129
  if (!args.force) {
151
- cleanUpload = await (0, promptUtils_1.confirmPrompt)((0, lang_1.i18n)('commands.upload.confirmCleanUpload', {
152
- accountId: derivedAccountId,
153
- path: dest,
154
- }), { defaultAnswer: false });
130
+ cleanUpload = await (0, promptUtils_1.confirmPrompt)(en_1.commands.upload.confirmCleanUpload(dest, derivedAccountId), { defaultAnswer: false });
155
131
  }
156
132
  if (cleanUpload) {
157
133
  try {
158
134
  await (0, fileMapper_2.deleteFile)(derivedAccountId, dest);
159
- logger_1.logger.log((0, lang_1.i18n)('commands.upload.cleaning', {
160
- accountId: derivedAccountId,
161
- filePath: dest,
162
- }));
135
+ logger_1.uiLogger.log(en_1.commands.upload.cleaning(dest, derivedAccountId));
163
136
  }
164
137
  catch (error) {
165
- logger_1.logger.error((0, lang_1.i18n)('commands.upload.errors.deleteFailed', {
166
- accountId: derivedAccountId,
167
- path: dest,
168
- }));
138
+ logger_1.uiLogger.error(en_1.commands.upload.errors.deleteFailed(dest, derivedAccountId));
169
139
  }
170
140
  }
171
141
  }
@@ -177,23 +147,16 @@ async function handler(args) {
177
147
  }, filePaths)
178
148
  .then(results => {
179
149
  if (!(0, uploadFolder_1.hasUploadErrors)(results)) {
180
- logger_1.logger.success((0, lang_1.i18n)('commands.upload.success.uploadComplete', {
181
- dest,
182
- }));
150
+ logger_1.uiLogger.success(en_1.commands.upload.success.uploadComplete(dest));
183
151
  logThemePreview(src, derivedAccountId);
184
152
  }
185
153
  else {
186
- logger_1.logger.error((0, lang_1.i18n)('commands.upload.errors.someFilesFailed', {
187
- dest,
188
- }));
154
+ logger_1.uiLogger.error(en_1.commands.upload.errors.someFilesFailed(dest));
189
155
  process.exit(exitCodes_1.EXIT_CODES.WARNING);
190
156
  }
191
157
  })
192
158
  .catch(error => {
193
- logger_1.logger.error((0, lang_1.i18n)('commands.upload.errors.uploadFailed', {
194
- dest,
195
- src,
196
- }));
159
+ logger_1.uiLogger.error(en_1.commands.upload.errors.uploadFailed(src, dest));
197
160
  (0, index_1.logError)(error, {
198
161
  accountId: derivedAccountId,
199
162
  });
@@ -203,36 +166,36 @@ async function handler(args) {
203
166
  }
204
167
  function uploadBuilder(yargs) {
205
168
  yargs.positional('src', {
206
- describe: (0, lang_1.i18n)('commands.upload.positionals.src.describe'),
169
+ describe: en_1.commands.upload.positionals.src,
207
170
  type: 'string',
208
171
  });
209
172
  yargs.positional('dest', {
210
- describe: (0, lang_1.i18n)('commands.upload.positionals.dest.describe'),
173
+ describe: en_1.commands.upload.positionals.dest,
211
174
  type: 'string',
212
175
  });
213
176
  yargs.option('fieldOptions', {
214
- describe: (0, lang_1.i18n)('commands.upload.options.options.describe'),
177
+ describe: en_1.commands.upload.options.options,
215
178
  type: 'array',
216
179
  default: [''],
217
180
  hidden: true,
218
181
  });
219
182
  yargs.option('saveOutput', {
220
- describe: (0, lang_1.i18n)('commands.upload.options.saveOutput.describe'),
183
+ describe: en_1.commands.upload.options.saveOutput,
221
184
  type: 'boolean',
222
185
  default: false,
223
186
  });
224
187
  yargs.option('convertFields', {
225
- describe: (0, lang_1.i18n)('commands.upload.options.convertFields.describe'),
188
+ describe: en_1.commands.upload.options.convertFields,
226
189
  type: 'boolean',
227
190
  default: false,
228
191
  });
229
192
  yargs.option('clean', {
230
- describe: (0, lang_1.i18n)('commands.upload.options.clean.describe'),
193
+ describe: en_1.commands.upload.options.clean,
231
194
  type: 'boolean',
232
195
  default: false,
233
196
  });
234
197
  yargs.option('force', {
235
- describe: (0, lang_1.i18n)('commands.upload.options.force.describe'),
198
+ describe: en_1.commands.upload.options.force,
236
199
  type: 'boolean',
237
200
  default: false,
238
201
  });
package/commands/watch.js CHANGED
@@ -7,18 +7,18 @@ const fs_1 = __importDefault(require("fs"));
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const watch_1 = require("@hubspot/local-dev-lib/cms/watch");
9
9
  const path_2 = require("@hubspot/local-dev-lib/path");
10
- const logger_1 = require("@hubspot/local-dev-lib/logger");
11
10
  const commonOpts_1 = require("../lib/commonOpts");
12
11
  const uploadPrompt_1 = require("../lib/prompts/uploadPrompt");
13
12
  const validation_1 = require("../lib/validation");
14
13
  const usageTracking_1 = require("../lib/usageTracking");
15
- const lang_1 = require("../lib/lang");
14
+ const en_1 = require("../lang/en");
16
15
  const upload_1 = require("../lib/upload");
17
16
  const errorHandlers_1 = require("../lib/errorHandlers");
18
17
  const exitCodes_1 = require("../lib/enums/exitCodes");
19
18
  const yargsUtils_1 = require("../lib/yargsUtils");
19
+ const logger_1 = require("../lib/ui/logger");
20
20
  const command = 'watch [src] [dest]';
21
- const describe = (0, lang_1.i18n)(`commands.watch.describe`);
21
+ const describe = en_1.commands.watch.describe;
22
22
  const handler = async (args) => {
23
23
  const { remove, initialUpload, disableInitial, notify, derivedAccountId } = args;
24
24
  if (!(0, validation_1.validateCmsPublishMode)(args)) {
@@ -32,50 +32,38 @@ const handler = async (args) => {
32
32
  try {
33
33
  const stats = fs_1.default.statSync(absoluteSrcPath);
34
34
  if (!stats.isDirectory()) {
35
- logger_1.logger.log((0, lang_1.i18n)(`commands.watch.errors.invalidPath`, {
36
- path: src,
37
- }));
35
+ logger_1.uiLogger.log(en_1.commands.watch.errors.invalidPath(src));
38
36
  return;
39
37
  }
40
38
  }
41
39
  catch (e) {
42
- logger_1.logger.log((0, lang_1.i18n)(`commands.watch.errors.invalidPath`, {
43
- path: src,
44
- }));
40
+ logger_1.uiLogger.log(en_1.commands.watch.errors.invalidPath(src));
45
41
  return;
46
42
  }
47
43
  if (!dest) {
48
- logger_1.logger.log((0, lang_1.i18n)(`commands.watch.errors.destinationRequired`));
44
+ logger_1.uiLogger.log(en_1.commands.watch.errors.destinationRequired);
49
45
  return;
50
46
  }
51
47
  let filesToUpload = [];
52
48
  if (disableInitial) {
53
- logger_1.logger.info((0, lang_1.i18n)(`commands.watch.warnings.disableInitial`));
49
+ logger_1.uiLogger.info(en_1.commands.watch.warnings.disableInitial);
54
50
  }
55
51
  else if (!initialUpload) {
56
- logger_1.logger.info((0, lang_1.i18n)(`commands.watch.warnings.notUploaded`, { path: src }));
57
- logger_1.logger.info((0, lang_1.i18n)(`commands.watch.warnings.initialUpload`));
52
+ logger_1.uiLogger.info(en_1.commands.watch.warnings.notUploaded(src));
53
+ logger_1.uiLogger.info(en_1.commands.watch.warnings.initialUpload);
58
54
  }
59
55
  if (initialUpload) {
60
56
  filesToUpload = await (0, upload_1.getUploadableFileList)(absoluteSrcPath, args.convertFields);
61
57
  }
62
58
  (0, usageTracking_1.trackCommandUsage)('watch', { mode: cmsPublishMode }, derivedAccountId);
63
59
  const onUploadFolderError = (error) => {
64
- logger_1.logger.error((0, lang_1.i18n)(`commands.watch.errors.folderFailed`, {
65
- src,
66
- dest,
67
- accountId: derivedAccountId,
68
- }));
60
+ logger_1.uiLogger.error(en_1.commands.watch.errors.folderFailed(src, dest, derivedAccountId));
69
61
  (0, errorHandlers_1.logError)(error, {
70
62
  accountId: derivedAccountId,
71
63
  });
72
64
  };
73
65
  const onUploadFileError = (file, destPath, accountId) => (error) => {
74
- logger_1.logger.error((0, lang_1.i18n)(`commands.watch.errors.fileFailed`, {
75
- file,
76
- dest: destPath,
77
- accountId,
78
- }));
66
+ logger_1.uiLogger.error(en_1.commands.watch.errors.fileFailed(file, destPath, accountId));
79
67
  (0, errorHandlers_1.logError)(error, new errorHandlers_1.ApiErrorContext({
80
68
  accountId,
81
69
  request: destPath,
@@ -93,47 +81,47 @@ const handler = async (args) => {
93
81
  };
94
82
  function watchBuilder(yargs) {
95
83
  yargs.positional('src', {
96
- describe: (0, lang_1.i18n)(`commands.watch.positionals.src.describe`),
84
+ describe: en_1.commands.watch.positionals.src,
97
85
  type: 'string',
98
86
  });
99
87
  yargs.positional('dest', {
100
- describe: (0, lang_1.i18n)(`commands.watch.positionals.dest.describe`),
88
+ describe: en_1.commands.watch.positionals.dest,
101
89
  type: 'string',
102
90
  });
103
91
  yargs.option('fieldOptions', {
104
- describe: (0, lang_1.i18n)(`commands.watch.options.options.describe`),
92
+ describe: en_1.commands.watch.options.options,
105
93
  type: 'array',
106
94
  default: [''],
107
95
  hidden: true,
108
96
  });
109
97
  yargs.option('remove', {
110
98
  alias: 'r',
111
- describe: (0, lang_1.i18n)(`commands.watch.options.remove.describe`),
99
+ describe: en_1.commands.watch.options.remove,
112
100
  type: 'boolean',
113
101
  });
114
102
  yargs.option('initial-upload', {
115
103
  alias: 'i',
116
- describe: (0, lang_1.i18n)(`commands.watch.options.initialUpload.describe`),
104
+ describe: en_1.commands.watch.options.initialUpload,
117
105
  type: 'boolean',
118
106
  });
119
107
  yargs.option('disable-initial', {
120
- describe: (0, lang_1.i18n)(`commands.watch.options.disableInitial.describe`),
108
+ describe: en_1.commands.watch.options.disableInitial,
121
109
  type: 'boolean',
122
110
  hidden: true,
123
111
  });
124
112
  yargs.option('notify', {
125
113
  alias: 'n',
126
- describe: (0, lang_1.i18n)(`commands.watch.options.notify.describe`),
114
+ describe: en_1.commands.watch.options.notify,
127
115
  type: 'string',
128
116
  requiresArg: true,
129
117
  });
130
118
  yargs.option('convertFields', {
131
- describe: (0, lang_1.i18n)(`commands.watch.options.convertFields.describe`),
119
+ describe: en_1.commands.watch.options.convertFields,
132
120
  type: 'boolean',
133
121
  default: false,
134
122
  });
135
123
  yargs.option('saveOutput', {
136
- describe: (0, lang_1.i18n)(`commands.watch.options.saveOutput.describe`),
124
+ describe: en_1.commands.watch.options.saveOutput,
137
125
  type: 'boolean',
138
126
  default: false,
139
127
  });